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+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU4MGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKTkkgR2VuZXJhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IlNsZWFrIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iTmF0aXZlU3RhdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJNb3ppbGxhIEdlbmVyYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJJY29uIEV4ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQ1MjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LnRvb2xzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUuYW50PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5zd3Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NGIzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxMzoyNCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ljb25FeGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JY29uRXhlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjI2YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ljb25FeGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEN1c3RvbWl6ZSB0aGUgaWNvbiBvZiBhIFdpbmRvd3MgZXhlCi0gKiAKLSAqIFdBUk5JTkchIFRoaXMgY2xhc3MgaXMgbm90IHBhcnQgb2YgU1dUIEFQSS4gSXQgaXMgTk9UIEFQSS4gSXQgaXMgYW4gaW50ZXJuYWwKLSAqIHRvb2wgdGhhdCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIGF0IGFueXRpbWUuCi0gKiAKLSAqIEJhc2VkIG9uIE1TRE4gIkFuIEluLURlcHRoIExvb2sgaW50byB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZSBGaWxlIEZvcm1hdCIKLSAqLwotcHVibGljIGNsYXNzIEljb25FeGUgewotCQotCSAvKioKLQkgKiBSZXBsYWNlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbQotCSAqIHdpdGggbWF0Y2hpbmcgaWNvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JICoKLSAJICogVGFrZXMgMiBhcmd1bWVudHMKLQkgKiBhcmd1bWVudCAwOiB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogYXJndW1lbnQgMTogVGhlIC5pY28gZmlsZSB0byB3cml0ZSB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBlLmcuIGM6L215QXBwLmljbwotCSAqCi0JICogTm90ZSAxLiBXcml0ZSBhY2Nlc3MgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyByZXF1aXJlZC4gQXMgYSByZXN1bHQsIHRoYXQKLQkgKiBwcm9ncmFtIG11c3Qgbm90IGJlIGN1cnJlbnRseSBydW5uaW5nIG9yIGVkaXRlZCBlbHNld2hlcmUuCi0JICogCi0JICogTm90ZSAyLiAgVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIGEgLmljbyBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyA2IGltYWdlcwotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIEEgdXNlciBpY29uIG1hdGNoaW5nIGV4YWN0bHkgdGhlIHdpZHRoL2hlaWdodC9kZXB0aCBvZiBhbiBleGVjdXRhYmxlIGljb24gd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGV4ZWN1dGFibGUgYW5kIHdpbGwgcmVwbGFjZSB0aGF0IGV4ZWN1dGFibGUgaWNvbi4gSWYgYW4gZXhlY3V0YWJsZSBpY29uCi0JICogZG9lcyBub3QgbWF0Y2ggYSB1c2VyIGljb24sIGl0IGlzIHNpbGVudGx5IGxlZnQgYXMgaXMuCi0JICogCi0JICogTm90ZSAzLiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogSWNvbkV4ZSA8d2luZG93cyBleGVjdXRhYmxlPiA8aWNvIGZpbGU+Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCXRyeSB7Ci0JCQlJbWFnZURhdGFbXSBkYXRhID0gbnVsbDsKLQkJCQotCQkJaWYgKGFyZ3MubGVuZ3RoID09IDIpIHsKLQkJCQkvKiBJQ08gY2FzZSAqLwotCQkJCWRhdGEgPSBsb2FkZXIubG9hZChhcmdzWzFdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQk1QIGNhc2UgLSBlYWNoIGZvbGxvd2luZyBhcmd1bWVudCBpcyBhIHNpbmdsZSBCTVAgZmlsZQotCQkJCSAqIEJNUCBpcyBoYW5kbGVkIGZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seS4gVGhlIElDTyBmaWxlIGlzIHRoZQotCQkJCSAqIG9mZmljaWFsIE1pY3Jvc29mdCBmb3JtYXQgZm9yIGltYWdlIHJlc291cmNlcy4KLQkJCQkgKi8KLQkJCQlkYXRhID0gbmV3IEltYWdlRGF0YVthcmdzLmxlbmd0aCAtIDFdOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCQlJbWFnZURhdGFbXSBjdXJyZW50ID0gbG9hZGVyLmxvYWQoYXJnc1tpXSk7Ci0JCQkJCWRhdGFbaSAtIDFdID0gY3VycmVudFswXTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgbk1pc3NpbmcgPSB1bmxvYWRJY29ucyhhcmdzWzBdLCBkYXRhKTsKLQkJCWlmIChuTWlzc2luZyAhPSAwKSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIC0gIituTWlzc2luZysiIGljb24ocykgbm90IHJlcGxhY2VkIGluICIrYXJnc1swXSsiIHVzaW5nICIrYXJnc1sxXSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qIEltcGxlbWVudGF0aW9uICovCi0KLQkvKiogCi0JICogUmV0cmlldmUgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtLgotCSAqIFRoZXNlIGljb25zIGFyZSB0eXBpY2FsbHkgc2hvd24gaW4gdmFyaW91cyBwbGFjZXMgb2YgdGhlIFdpbmRvd3MgZGVza3RvcC4KLQkgKiAKLQkgKiBOb3RlLiAgVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJldHVybnMgdGhlIGZvbGxvd2luZyA2IGltYWdlcwotCSAqIDEuIDMyeDMyLCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAyLiAxNngxNiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMy4gMTZ4MTYsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDQuIDMyeDMyLCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA1LiA0OHg0OCwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogNi4gNDh4NDgsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIAotCSAqIEBwYXJhbSBwcm9ncmFtIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgZS5nIGM6L2VjbGlwc2UvZWNsaXBzZS5leGUKLQkgKi8JCi0Jc3RhdGljIEltYWdlRGF0YVtdIGxvYWRJY29ucyhTdHJpbmcgcHJvZ3JhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHByb2dyYW0sICJyIik7Ci0JCUljb25FeGUgaWNvbkV4ZSA9IG5ldyBJY29uRXhlKCk7Ci0JCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBpY29uRXhlLmdldEljb25zKHJhZik7Ci0JCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VEYXRhW2ljb25JbmZvLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgZGF0YVtpXSA9IGljb25JbmZvW2ldLmRhdGE7Ci0JCXJhZi5jbG9zZSgpOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJlcGxhY2UgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtCi0JICogd2l0aCBpY29ucyBwcm92aWRlZCBieSB0aGUgdXNlci4KLQkgKiAKLQkgKiBOb3RlIDEuIFdyaXRlIGFjY2VzcyB0byB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGlzIHJlcXVpcmVkLiBBcyBhIHJlc3VsdCwgdGhhdAotCSAqIHByb2dyYW0gbXVzdCBub3QgYmUgY3VycmVudGx5IHJ1bm5pbmcgb3IgZWRpdGVkIGVsc2V3aGVyZS4KLQkgKiAKLQkgKiBOb3RlIDIuIFVzZSBsb2FkSWNvbnMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBpY29ucyAod2lkdGgsIGhlaWdodCwgZGVwdGgpCi0JICogaXMgcmVxdWlyZWQgdG8gcmVwbGFjZSB0aGUgaWNvbnMgaW4gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbS4gQSB1c2VyIGljb24KLQkgKiBtYXRjaGluZyBleGFjdGx5IHRoZSB3aWR0aC9oZWlnaHQvZGVwdGggb2YgYW4gZXhlY3V0YWJsZSBpY29uIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB3aWxsIHJlcGxhY2UgdGhhdCBleGVjdXRhYmxlIGljb24uIElmIGFuIGV4ZWN1dGFibGUgaWNvbgotCSAqIGRvZXMgbm90IG1hdGNoIGEgdXNlciBpY29uLCBpdCBpcyBsZWZ0IGFzIGlzLiBWZXJpZnkgdGhlIHJldHVybiB2YWx1ZSBtYXRjaGVzCi0JICogdGhlIG51bWJlciBvZiBpY29ucyB0byB3cml0ZS4gRmluYWxseSwgdXNlIGxvYWRJY29ucyBhZnRlciB0aGlzIG9wZXJhdGlvbgotCSAqIHRvIHZlcmlmeSB0aGUgaWNvbnMgaGF2ZSBjaGFuZ2VkIGFzIGV4cGVjdGVkLgotCSAqIAotCSAqIE5vdGUgMy4gVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMgKGluIGFueSBvcmRlcikuCi0JICogMS4gMzJ4MzIsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDIuIDE2eDE2LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAzLiAxNngxNiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNC4gMzJ4MzIsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDUuIDQ4eDQ4LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiA2LiA0OHg0OCwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogCi0JICogTm90ZSA0LiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogQHBhcmFtIGljb25zIHRvIHdyaXRlIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGljb25zIGZyb20gdGhlIG9yaWdpbmFsIHByb2dyYW0gdGhhdCB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgcmVwbGFjZWQgKDAgaWYgc3VjY2VzcykKLQkgKi8JCi0Jc3RhdGljIGludCB1bmxvYWRJY29ucyhTdHJpbmcgcHJvZ3JhbSwgSW1hZ2VEYXRhW10gaWNvbnMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAicnciKTsKLQkJSWNvbkV4ZSBpY29uRXhlID0gbmV3IEljb25FeGUoKTsKLQkJSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IGljb25FeGUuZ2V0SWNvbnMocmFmKTsKLQkJaW50IGNudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWNvbkluZm8ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaWNvbnMubGVuZ3RoOyBqKyspCi0JCQlpZiAoaWNvbkluZm9baV0uZGF0YS53aWR0aCA9PSBpY29uc1tqXS53aWR0aCAmJiAKLQkJCQlpY29uSW5mb1tpXS5kYXRhLmhlaWdodCA9PSBpY29uc1tqXS5oZWlnaHQgJiYgCi0JCQkJaWNvbkluZm9baV0uZGF0YS5kZXB0aCA9PSBpY29uc1tqXS5kZXB0aCkgewotCQkJCXJhZi5zZWVrKGljb25JbmZvW2ldLm9mZnNldCk7Ci0JCQkJdW5sb2FkSWNvbihyYWYsIGljb25zW2pdKTsKLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyYWYuY2xvc2UoKTsKLQkJcmV0dXJuIGljb25JbmZvLmxlbmd0aCAtIGNudDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIyMDA1MDEyNCI7Ci0JCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEljb25SZXNJbmZvIHsKLQkJSW1hZ2VEYXRhIGRhdGE7Ci0JCWludCBvZmZzZXQ7Ci0JCWludCBzaXplOwotCX0KLQkKLQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gbnVsbDsKLQlpbnQgaWNvbkNudDsKLQkKLQlJY29uUmVzSW5mb1tdIGdldEljb25zKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpY29uSW5mbyA9IG5ldyBJY29uUmVzSW5mb1s0XTsKLQkJaWNvbkNudCA9IDA7Ci0JCUlNQUdFX0RPU19IRUFERVIgaW1hZ2VEb3NIZWFkZXIgPSBuZXcgSU1BR0VfRE9TX0hFQURFUigpOwotCQlyZWFkKHJhZiwgaW1hZ2VEb3NIZWFkZXIpOwotCQlpZiAoaW1hZ2VEb3NIZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKSByZXR1cm4gbnVsbDsKLQkJaW50IGltYWdlTnRIZWFkZXJzT2Zmc2V0ID0gaW1hZ2VEb3NIZWFkZXIuZV9sZmFuZXc7Ci0JCXJhZi5zZWVrKGltYWdlTnRIZWFkZXJzT2Zmc2V0KTsKLQkJSU1BR0VfTlRfSEVBREVSUyBpbWFnZU50SGVhZGVycyA9IG5ldyBJTUFHRV9OVF9IRUFERVJTKCk7Ci0JCXJlYWQocmFmLCBpbWFnZU50SGVhZGVycyk7Ci0JCWlmIChpbWFnZU50SGVhZGVycy5TaWduYXR1cmUgIT0gSU1BR0VfTlRfU0lHTkFUVVJFKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vIER1bXBSZXNvdXJjZXMKLQkJaW50IHJlc291cmNlc1JWQSA9IGltYWdlTnRIZWFkZXJzLk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFXS5WaXJ0dWFsQWRkcmVzczsKLQkJaWYgKHJlc291cmNlc1JWQSA9PSAwKSByZXR1cm4gbnVsbDsKLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIiogUmVzb3VyY2VzIChSVkE9ICIrcmVzb3VyY2VzUlZBKyIpIik7Ci0JCUlNQUdFX1NFQ1RJT05fSEVBREVSIGltYWdlU2VjdGlvbkhlYWRlciA9IG5ldyBJTUFHRV9TRUNUSU9OX0hFQURFUigpOwotCQlpbnQgZmlyc3RTZWN0aW9uT2Zmc2V0ID0gaW1hZ2VOdEhlYWRlcnNPZmZzZXQgKyBJTUFHRV9OVF9IRUFERVJTLkZJRUxEX09GRlNFVF9PcHRpb25hbEhlYWRlciArIGltYWdlTnRIZWFkZXJzLkZpbGVIZWFkZXIuU2l6ZU9mT3B0aW9uYWxIZWFkZXI7Ci0JCXJhZi5zZWVrKGZpcnN0U2VjdGlvbk9mZnNldCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZU50SGVhZGVycy5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7IGkrKykgewotCQkJcmVhZChyYWYsIGltYWdlU2VjdGlvbkhlYWRlcik7Ci0JCQlpZiAocmVzb3VyY2VzUlZBID49IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyAmJiByZXNvdXJjZXNSVkEgPCBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgKyBpbWFnZVNlY3Rpb25IZWFkZXIuTWlzY19WaXJ0dWFsU2l6ZSkgewotCQkJCS8vIGNvdWxkIGNoZWNrIHRoZSBpbWFnZVNlY3Rpb25IZWFkZXIgbmFtZSBpcyAucnNyYwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWZvdW5kKSByZXR1cm4gbnVsbDsKLQkJaW50IGRlbHRhID0gaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzIC0gaW1hZ2VTZWN0aW9uSGVhZGVyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JCWludCBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0ID0gcmVzb3VyY2VzUlZBIC0gZGVsdGE7Ci0JCWR1bXBSZXNvdXJjZURpcmVjdG9yeShyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGRlbHRhLCAwLCAwLCBmYWxzZSk7Ci0JCWlmIChpY29uQ250IDwgaWNvbkluZm8ubGVuZ3RoKSB7Ci0JCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25DbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShpY29uSW5mbywgMCwgbmV3QXJyYXksIDAsIGljb25DbnQpOwotCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJfQotCQlyZXR1cm4gaWNvbkluZm87Ci0JfQotCi12b2lkIGR1bXBSZXNvdXJjZURpcmVjdG9yeShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQsIGludCByZXNvdXJjZUJhc2UsIGludCBkZWx0YSwgaW50IHR5cGUsIGludCBsZXZlbCwgYm9vbGVhbiBydF9pY29uX3Jvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIExFVkVMICIrbGV2ZWwpOwotCi0JSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIGltYWdlUmVzb3VyY2VEaXJlY3RvcnkgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKCk7Ci0JcmFmLnNlZWsoaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCk7Ci0JcmVhZChyYWYsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnkpOwotCi0JaWYgKERFQlVHKSB7Ci0JCVN0cmluZyBzVHlwZSA9ICIiK3R5cGU7Ci0JCS8vIGxldmVsIDEgcmVzb3VyY2VzIGFyZSByZXNvdXJjZSB0eXBlcwotCQlpZiAobGV2ZWwgPT0gMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJfX19fX19fX19fX19fX19fX19fX19fX19fX18iKTsKLQkJCWlmICh0eXBlID09IFJUX0lDT04pIHNUeXBlID0gIlJUX0lDT04iOwotCQkJaWYgKHR5cGUgPT0gUlRfR1JPVVBfSUNPTikgc1R5cGUgPSAiUlRfR1JPVVBfSUNPTiI7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBEaXJlY3RvcnkgWyIrc1R5cGUrIl0iKyIgKE5hbWVkICIraW1hZ2VSZXNvdXJjZURpcmVjdG9yeS5OdW1iZXJPZk5hbWVkRW50cmllcysiLCBJRCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZJZEVudHJpZXMrIikiKTsKLQl9Ci0JaW50IElSREVfU3RhcnRPZmZzZXQgPSBpbWFnZVJlc291cmNlRGlyZWN0b3J5T2Zmc2V0ICsgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZLlNJWkVPRjsJCi0JSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZW10gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZW2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZJZEVudHJpZXNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0gPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZKCk7Ci0JCXJlYWQocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLkRhdGFJc0RpcmVjdG9yeSkgewotCQkJZHVtcFJlc291cmNlRGlyZWN0b3J5KHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uT2Zmc2V0VG9EaXJlY3RvcnkgKyByZXNvdXJjZUJhc2UsIHJlc291cmNlQmFzZSwgZGVsdGEsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLklkLCBsZXZlbCArIDEsIHJ0X2ljb25fcm9vdCA/IHRydWUgOiB0eXBlID09IFJUX0lDT04pOwotCQl9IGVsc2UgewotCQkJLy8gUmVzb3VyY2UgZm91bmQKLQkJCS8vLyBwUmVzRGlyRW50cnktPk5hbWUKLQkJCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSBpcmRlID0gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV07Ci0JCQlJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIGRhdGEgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSgpOwotCQkJcmFmLnNlZWsoaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uT2Zmc2V0VG9EYXRhICsgcmVzb3VyY2VCYXNlKTsKLQkJCXJlYWQocmFmLCBkYXRhKTsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBJZCAiK2lyZGUuSWQrIiBEYXRhIE9mZnNldCBSVkEgIitkYXRhLk9mZnNldFRvRGF0YSsiLCBTaXplICIrZGF0YS5TaXplKTsKLQkJCWlmIChydF9pY29uX3Jvb3QpIHsKLQkJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiaWNvbmNudCAiK2ljb25DbnQrIiB8IitpY29uSW5mby5sZW5ndGgpOwotCQkJCWljb25JbmZvW2ljb25DbnRdID0gbmV3IEljb25SZXNJbmZvKCk7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0uZGF0YSA9IHBhcnNlSWNvbihyYWYsIGRhdGEuT2Zmc2V0VG9EYXRhIC0gZGVsdGEsIGRhdGEuU2l6ZSk7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0ub2Zmc2V0ID0gZGF0YS5PZmZzZXRUb0RhdGEgLSBkZWx0YTsKLQkJCQlpY29uSW5mb1tpY29uQ250XS5zaXplID0gZGF0YS5TaXplOwkKLQkJCQlpY29uQ250Kys7Ci0JCQkJaWYgKGljb25DbnQgPT0gaWNvbkluZm8ubGVuZ3RoKSB7Ci0JCQkJCUljb25SZXNJbmZvW10gbmV3QXJyYXkgPSBuZXcgSWNvblJlc0luZm9baWNvbkluZm8ubGVuZ3RoICsgNF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbkluZm8sIDAsIG5ld0FycmF5LCAwLCBpY29uSW5mby5sZW5ndGgpOwotCQkJCQlpY29uSW5mbyA9IG5ld0FycmF5OwotCQkJCX0KLQkJCX0KLQkJfQotIAl9Ci19Ci0KLXN0YXRpYyBJbWFnZURhdGEgcGFyc2VJY29uKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYuc2VlayhvZmZzZXQpOwotCUJJVE1BUElORk8gYml0bWFwSW5mbyA9IG5ldyBCSVRNQVBJTkZPKCk7Ci0JcmVhZChyYWYsIGJpdG1hcEluZm8pOwotCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0IC89IDI7Ci0JaW50IHdpZHRoID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aDsKLQlpbnQgaGVpZ2h0ID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQ7Ci0JaW50IGRlcHRoID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudDsKLQotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBsb2FkUGFsZXR0ZShiaXRtYXBJbmZvLmJtaUhlYWRlciwgcmFmKTsKLQlieXRlW10gc2hhcGVEYXRhID0gbG9hZERhdGEoYml0bWFwSW5mby5ibWlIZWFkZXIsIHJhZik7Ci0JYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDE7Ci0JYnl0ZVtdIG1hc2tEYXRhID0gbG9hZERhdGEoYml0bWFwSW5mby5ibWlIZWFkZXIsIHJhZik7Ci0JbWFza0RhdGEgPSBjb252ZXJ0UGFkKG1hc2tEYXRhLCB3aWR0aCwgaGVpZ2h0LCAxLCA0LCAyKTsKLQliaXRJbnZlcnREYXRhKG1hc2tEYXRhLCAwLCBtYXNrRGF0YS5sZW5ndGgpOwotCXJldHVybiBJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQl3aWR0aCwKLQkJaGVpZ2h0LAotCQlkZXB0aCwKLQkJcGFsZXR0ZSwKLQkJNCwKLQkJc2hhcGVEYXRhLAotCQkyLAotCQltYXNrRGF0YSwKLQkJbnVsbCwKLQkJLTEsCi0JCS0xLAotCQlTV1QuSU1BR0VfSUNPLAotCQkwLAotCQkwLAotCQkwLAotCQkwKTsKLX0KLQotc3RhdGljIGJ5dGVbXSBiaXRJbnZlcnREYXRhKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JLy8gRGVzdHJ1Y3RpdmVseSBiaXQgaW52ZXJ0IGRhdGEgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCi0JZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7Ci0JCWRhdGFbaV0gPSAoYnl0ZSkoMjU1IC0gZGF0YVtpIC0gc3RhcnRJbmRleF0pOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0UGFkKGJ5dGVbXSBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBhZCwgaW50IG5ld1BhZCkgewotCWlmIChwYWQgPT0gbmV3UGFkKSByZXR1cm4gZGF0YTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0JaW50IGJwbCA9IChzdHJpZGUgKyAocGFkIC0gMSkpIC8gcGFkICogcGFkOwotCWludCBuZXdCcGwgPSAoc3RyaWRlICsgKG5ld1BhZCAtIDEpKSAvIG5ld1BhZCAqIG5ld1BhZDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2hlaWdodCAqIG5ld0JwbF07Ci0JaW50IHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgbmV3QnBsKTsKLQkJc3JjSW5kZXggKz0gYnBsOwotCQlkZXN0SW5kZXggKz0gbmV3QnBsOwotCX0KLQlyZXR1cm4gbmV3RGF0YTsKLX0KLXN0YXRpYyBQYWxldHRlRGF0YSBsb2FkUGFsZXR0ZShCSVRNQVBJTkZPSEVBREVSIGJpaCwgUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGRlcHRoID0gYmloLmJpQml0Q291bnQ7Ci0JaWYgKGRlcHRoIDw9IDgpIHsKLQkJaW50IG51bUNvbG9ycyA9IGJpaC5iaUNsclVzZWQ7Ci0JCWlmIChudW1Db2xvcnMgPT0gMCkgewotCQkJbnVtQ29sb3JzID0gMSA8PCBkZXB0aDsKLQkJfSBlbHNlIHsKLQkJCWlmIChudW1Db2xvcnMgPiAyNTYpCi0JCQkJbnVtQ29sb3JzID0gMjU2OwotCQl9Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtudW1Db2xvcnMgKiA0XTsKLQkJcmFmLnJlYWQoYnVmKTsKLQkJcmV0dXJuIHBhbGV0dGVGcm9tQnl0ZXMoYnVmLCBudW1Db2xvcnMpOwotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHg3QzAwLCAweDNFMCwgMHgxRik7Ci0JaWYgKGRlcHRoID09IDI0KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYsIDB4RkYwMCwgMHhGRjAwMDApOwotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwLCAweEZGMDAwMCwgMHhGRjAwMDAwMCk7Ci19Ci1zdGF0aWMgUGFsZXR0ZURhdGEgcGFsZXR0ZUZyb21CeXRlcyhieXRlW10gYnl0ZXMsIGludCBudW1Db2xvcnMpIHsKLQlpbnQgYnl0ZXNPZmZzZXQgPSAwOwotCVJHQltdIGNvbG9ycyA9IG5ldyBSR0JbbnVtQ29sb3JzXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbG9yczsgaSsrKSB7Ci0JCWNvbG9yc1tpXSA9IG5ldyBSR0IoYnl0ZXNbYnl0ZXNPZmZzZXQgKyAyXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldCArIDFdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0XSAmIDB4RkYpOwotCQlieXRlc09mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKGNvbG9ycyk7Ci19Ci1zdGF0aWMgYnl0ZVtdIGxvYWREYXRhKEJJVE1BUElORk9IRUFERVIgYmloLCBSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgc3RyaWRlID0gKGJpaC5iaVdpZHRoICogYmloLmJpQml0Q291bnQgKyA3KSAvIDg7Ci0Jc3RyaWRlID0gKHN0cmlkZSArIDMpIC8gNCAqIDQ7IC8vIFJvdW5kIHVwIHRvIDQgYnl0ZSBtdWx0aXBsZQotCWJ5dGVbXSBkYXRhID0gbG9hZERhdGEoYmloLCByYWYsIHN0cmlkZSk7Ci0JZmxpcFNjYW5MaW5lcyhkYXRhLCBzdHJpZGUsIGJpaC5iaUhlaWdodCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci1zdGF0aWMgdm9pZCBmbGlwU2NhbkxpbmVzKGJ5dGVbXSBkYXRhLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0KSB7Ci0JaW50IGkxID0gMDsKLQlpbnQgaTIgPSAoaGVpZ2h0IC0gMSkgKiBzdHJpZGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyBpKyspIHsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN0cmlkZTsgaW5kZXgrKykgewotCQkJYnl0ZSBiID0gZGF0YVtpbmRleCArIGkxXTsKLQkJCWRhdGFbaW5kZXggKyBpMV0gPSBkYXRhW2luZGV4ICsgaTJdOwotCQkJZGF0YVtpbmRleCArIGkyXSA9IGI7Ci0JCX0KLQkJaTEgKz0gc3RyaWRlOwotCQlpMiAtPSBzdHJpZGU7Ci0JfQotfQotc3RhdGljIGJ5dGVbXSBsb2FkRGF0YShCSVRNQVBJTkZPSEVBREVSIGJpaCwgUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCBzdHJpZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGRhdGFTaXplID0gYmloLmJpSGVpZ2h0ICogc3RyaWRlOwotCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbZGF0YVNpemVdOwotCWludCBjbXAgPSBiaWguYmlDb21wcmVzc2lvbjsKLQlpZiAoY21wID09IDApIHsgLy8gQk1QX05PX0NPTVBSRVNTSU9OCi0JCXJhZi5yZWFkKGRhdGEpOwotCX0gZWxzZSB7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJJQ08gY2Fubm90IGJlIGNvbXByZXNzZWQ/Iik7Ci0JfQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdm9pZCB1bmxvYWRJY29uKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJbWFnZURhdGEgaWNvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgc2l6ZUltYWdlID0gKCgoaWNvbi53aWR0aCAqIGljb24uZGVwdGggKyAzMSkgLyAzMiAqIDQpICsKLQkJKChpY29uLndpZHRoICsgMzEpIC8gMzIgKiA0KSkgKiBpY29uLmhlaWdodDsKLQl3cml0ZTQocmFmLCBCTVBIZWFkZXJGaXhlZFNpemUpOwotCXdyaXRlNChyYWYsIGljb24ud2lkdGgpOwotCXdyaXRlNChyYWYsIGljb24uaGVpZ2h0ICogMik7Ci0Jd3JpdGVVMihyYWYsIDEpOwotCXdyaXRlVTIocmFmLCBpY29uLmRlcHRoKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCBzaXplSW1hZ2UpOwotCXdyaXRlNChyYWYsIDApOwotCXdyaXRlNChyYWYsIDApOwotCXdyaXRlNChyYWYsIGljb24ucGFsZXR0ZS5jb2xvcnMgIT0gbnVsbCA/IGljb24ucGFsZXR0ZS5jb2xvcnMubGVuZ3RoIDogMCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0JCi0JYnl0ZVtdIHJnYnMgPSBwYWxldHRlVG9CeXRlcyhpY29uLnBhbGV0dGUpOwotCXJhZi53cml0ZShyZ2JzKTsKLQl1bmxvYWRTaGFwZURhdGEocmFmLCBpY29uKTsKLQl1bmxvYWRNYXNrRGF0YShyYWYsIGljb24pOwotfQotc3RhdGljIGJ5dGVbXSBwYWxldHRlVG9CeXRlcyhQYWxldHRlRGF0YSBwYWwpIHsKLQlpbnQgbiA9IHBhbC5jb2xvcnMgPT0gbnVsbCA/IDAgOiAocGFsLmNvbG9ycy5sZW5ndGggPCAyNTYgPyBwYWwuY29sb3JzLmxlbmd0aCA6IDI1Nik7Ci0JYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbiAqIDRdOwotCWludCBvZmZzZXQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVJHQiBjb2wgPSBwYWwuY29sb3JzW2ldOwotCQlieXRlc1tvZmZzZXRdID0gKGJ5dGUpY29sLmJsdWU7Ci0JCWJ5dGVzW29mZnNldCArIDFdID0gKGJ5dGUpY29sLmdyZWVuOwotCQlieXRlc1tvZmZzZXQgKyAyXSA9IChieXRlKWNvbC5yZWQ7Ci0JCW9mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci1zdGF0aWMgdm9pZCB1bmxvYWRNYXNrRGF0YShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHsKLQlJbWFnZURhdGEgbWFzayA9IGljb24uZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWludCBicGwgPSAoaWNvbi53aWR0aCArIDcpIC8gODsKLQlpbnQgcGFkID0gbWFzay5zY2FubGluZVBhZDsKLQlpbnQgc3JjQnBsID0gKGJwbCArIHBhZCAtIDEpIC8gcGFkICogcGFkOwotCWludCBkZXN0QnBsID0gKGJwbCArIDMpIC8gNCAqIDQ7Ci0JYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2Rlc3RCcGxdOwotCWludCBvZmZzZXQgPSAoaWNvbi5oZWlnaHQgLSAxKSAqIHNyY0JwbDsKLQlieXRlW10gZGF0YSA9IG1hc2suZGF0YTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb24uaGVpZ2h0OyBpKyspIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBidWYsIDAsIGJwbCk7Ci0JCQliaXRJbnZlcnREYXRhKGJ1ZiwgMCwgYnBsKTsKLQkJCXJhZi53cml0ZShidWYsIDAsIGRlc3RCcGwpOwotCQkJb2Zmc2V0IC09IHNyY0JwbDsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotfQotc3RhdGljIHZvaWQgdW5sb2FkU2hhcGVEYXRhKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJbWFnZURhdGEgaWNvbikgewotCWludCBicGwgPSAoaWNvbi53aWR0aCAqIGljb24uZGVwdGggKyA3KSAvIDg7Ci0JaW50IHBhZCA9IGljb24uc2NhbmxpbmVQYWQ7Ci0JaW50IHNyY0JwbCA9IChicGwgKyBwYWQgLSAxKSAvIHBhZCAqIHBhZDsKLQlpbnQgZGVzdEJwbCA9IChicGwgKyAzKSAvIDQgKiA0OwotCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtkZXN0QnBsXTsKLQlpbnQgb2Zmc2V0ID0gKGljb24uaGVpZ2h0IC0gMSkgKiBzcmNCcGw7Ci0JYnl0ZVtdIGRhdGEgPSBpY29uLmRhdGE7Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uLmhlaWdodDsgaSsrKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgYnVmLCAwLCBicGwpOwotCQkJcmFmLndyaXRlKGJ1ZiwgMCwgZGVzdEJwbCk7Ci0JCQlvZmZzZXQgLT0gc3JjQnBsOwotCQl9Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci19Ci1zdGF0aWMgYm9vbGVhbiByZWFkSWNvbkdyb3VwKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYuc2VlayhvZmZzZXQpOwotCU5FV0hFQURFUiBuZXdIZWFkZXIgPSBuZXcgTkVXSEVBREVSKCk7Ci0JcmVhZChyYWYsIG5ld0hlYWRlcik7Ci0JaWYgKG5ld0hlYWRlci5SZXNUeXBlICE9IFJFU19JQ09OKSByZXR1cm4gZmFsc2U7Ci0JUkVTRElSW10gcmVzRGlyID0gbmV3IFJFU0RJUltuZXdIZWFkZXIuUmVzQ291bnRdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3SGVhZGVyLlJlc0NvdW50OyBpKyspIHsKLQkJcmVzRGlyW2ldID0gbmV3IFJFU0RJUigpOwotCQlyZWFkKHJhZiwgcmVzRGlyW2ldKTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzcmMsIFN0cmluZyBkc3QpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmMpOwotCUZpbGUgZHN0RmlsZSA9IG5ldyBGaWxlKGRzdCk7Ci0JRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRzdEZpbGUpOwotCWludCBjOwotCXdoaWxlICgoYyA9IGluLnJlYWQoKSkgIT0gLTEpIG91dC53cml0ZShjKTsgCi0JaW4uY2xvc2UoKTsKLQlvdXQuY2xvc2UoKTsKLX0KLQotLyogSU8gdXRpbGl0aWVzIHRvIHBhcnNlIFdpbmRvd3MgZXhlY3V0YWJsZSAqLwotc3RhdGljIGZpbmFsIGludCBJTUFHRV9ET1NfU0lHTkFUVVJFID0gMHg1YTRkOwotc3RhdGljIGZpbmFsIGludCBJTUFHRV9OVF9TSUdOQVRVUkUgPSAweDAwMDA0NTUwOwotc3RhdGljIGZpbmFsIGludCBJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0UgPSAyOwotc3RhdGljIGZpbmFsIGludCBSRVNfSUNPTiA9IDE7Ci1zdGF0aWMgZmluYWwgaW50IFJUX0lDT04gPSAzOwotc3RhdGljIGZpbmFsIGludCBSVF9HUk9VUF9JQ09OID0gMTQ7Ci1zdGF0aWMgZmluYWwgaW50IEJNUEhlYWRlckZpeGVkU2l6ZSA9IDQwOwotCQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9ET1NfSEVBREVSIHsKLQlpbnQgZV9tYWdpYzsgLy8gV09SRAotCWludCBlX2NibHA7IC8vIFdPUkQKLQlpbnQgZV9jcDsgLy8gV09SRAotCWludCBlX2NybGM7IC8vIFdPUkQKLQlpbnQgZV9jcGFyaGRyOyAvLyBXT1JECi0JaW50IGVfbWluYWxsb2M7IC8vIFdPUkQKLQlpbnQgZV9tYXhhbGxvYzsgLy8gV09SRAotCWludCBlX3NzOyAvLyBXT1JECi0JaW50IGVfc3A7IC8vIFdPUkQKLQlpbnQgZV9jc3VtOyAvLyBXT1JECi0JaW50IGVfaXA7IC8vIFdPUkQKLQlpbnQgZV9jczsgLy8gV09SRAotCWludCBlX2xmYXJsYzsgLy8gV09SRAotCWludCBlX292bm87IC8vIFdPUkQKLQlpbnRbXSBlX3JlcyA9IG5ldyBpbnRbNF07IC8vIFdPUkRbNF0KLQlpbnQgZV9vZW1pZDsgLy8gV09SRAotCWludCBlX29lbWluZm87IC8vIFdPUkQKLQlpbnRbXSBlX3JlczIgPSBuZXcgaW50WzEwXTsgLy8gV09SRFsxMF0KLQlpbnQgZV9sZmFuZXc7IC8vIExPTkcKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9GSUxFX0hFQURFUiB7Ci0JaW50IE1hY2hpbmU7IC8vIFdPUkQKLQlpbnQgTnVtYmVyT2ZTZWN0aW9uczsgLy8gV09SRAotCWludCBUaW1lRGF0ZVN0YW1wOyAvLyBEV09SRAotCWludCBQb2ludGVyVG9TeW1ib2xUYWJsZTsgLy8gRFdPUkQKLQlpbnQgTnVtYmVyT2ZTeW1ib2xzOyAvLyBEV09SRAotCWludCBTaXplT2ZPcHRpb25hbEhlYWRlcjsgLy8gV09SRAotCWludCBDaGFyYWN0ZXJpc3RpY3M7IC8vIFdPUkQKLX07Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfREFUQV9ESVJFQ1RPUlkgewotCWludCBWaXJ0dWFsQWRkcmVzczsgLy8gRFdPUkQKLQlpbnQgU2l6ZTsgLy8gRFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9PUFRJT05BTF9IRUFERVIgewotCWludCBNYWdpYzsgLy8gV09SRAotCWludCBNYWpvckxpbmtlclZlcnNpb247IC8vIEJZVEUKLQlpbnQgTWlub3JMaW5rZXJWZXJzaW9uOyAvLyBCWVRFCi0JaW50IFNpemVPZkNvZGU7IC8vIERXT1JECi0JaW50IFNpemVPZkluaXRpYWxpemVkRGF0YTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7IC8vIERXT1JECi0JaW50IEFkZHJlc3NPZkVudHJ5UG9pbnQ7IC8vIERXT1JECi0JaW50IEJhc2VPZkNvZGU7IC8vIERXT1JECi0JaW50IEJhc2VPZkRhdGE7IC8vIERXT1JECi0JaW50IEltYWdlQmFzZTsgLy8gRFdPUkQKLQlpbnQgU2VjdGlvbkFsaWdubWVudDsgLy8gRFdPUkQKLQlpbnQgRmlsZUFsaWdubWVudDsgLy8gRFdPUkQKLQlpbnQgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNYWpvckltYWdlVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vckltYWdlVmVyc2lvbjsgLy8gV09SRAotCWludCBNYWpvclN1YnN5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IFdpbjMyVmVyc2lvblZhbHVlOyAvLyBEV09SRAotCWludCBTaXplT2ZJbWFnZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSGVhZGVyczsgLy8gRFdPUkQKLQlpbnQgQ2hlY2tTdW07IC8vIERXT1JECi0JaW50IFN1YnN5c3RlbTsgLy8gV09SRAotCWludCBEbGxDaGFyYWN0ZXJpc3RpY3M7IC8vIFdPUkQKLQlpbnQgU2l6ZU9mU3RhY2tSZXNlcnZlOyAvLyBEV09SRAotCWludCBTaXplT2ZTdGFja0NvbW1pdDsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSGVhcFJlc2VydmU7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYXBDb21taXQ7IC8vIERXT1JECi0JaW50IExvYWRlckZsYWdzOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlJ2YUFuZFNpemVzOyAvLyBEV09SRAotCUlNQUdFX0RBVEFfRElSRUNUT1JZW10gRGF0YURpcmVjdG9yeSA9IG5ldyBJTUFHRV9EQVRBX0RJUkVDVE9SWVsxNl07Ci19Ci1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX05UX0hFQURFUlMgewotCWludCBTaWduYXR1cmU7IC8vIERXT1JECi0JSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlciA9IG5ldyBJTUFHRV9GSUxFX0hFQURFUigpOwotCUlNQUdFX09QVElPTkFMX0hFQURFUiBPcHRpb25hbEhlYWRlciA9IG5ldyBJTUFHRV9PUFRJT05BTF9IRUFERVIoKTsKLQlmaW5hbCBzdGF0aWMgaW50IEZJRUxEX09GRlNFVF9PcHRpb25hbEhlYWRlciA9IDI0OyAgCi19Ci0JCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1NFQ1RJT05fSEVBREVSIHsKLQlpbnRbXSBOYW1lID0gbmV3IGludFs4XTsgLy8gQllURVs4XQotCWludCBNaXNjX1ZpcnR1YWxTaXplOyAvLyBEV09SRCAodW5pb24gTWlzYyB7IERXT1JEIFBoeXNpY2FsQWRkcmVzczsgRFdPUkQgVmlydHVhbFNpemUgfQotCWludCBWaXJ0dWFsQWRkcmVzczsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mUmF3RGF0YTsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvUmF3RGF0YTsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvUmVsb2NhdGlvbnM7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb0xpbmVudW1iZXJzOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlJlbG9jYXRpb25zOyAvLyBXT1JECi0JaW50IE51bWJlck9mTGluZW51bWJlcnM7IC8vIFdPUkQKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBEV09SRAotfTsKLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgewotCWludCBDaGFyYWN0ZXJpc3RpY3M7IC8vIERXT1JECi0JaW50IFRpbWVEYXRlU3RhbXA7IC8vIERXT1JECi0JaW50IE1ham9yVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vclZlcnNpb247IC8vIFdPUkQKLQlpbnQgTnVtYmVyT2ZOYW1lZEVudHJpZXM7IC8vIFdPUkQgLSB1c2VkCi0JaW50IE51bWJlck9mSWRFbnRyaWVzOyAvLyBXT1JEIC0gdXNlZAotCWZpbmFsIHN0YXRpYyBpbnQgU0laRU9GID0gMTY7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIHsKLQkvLyB1bmlvbgotCWludCBOYW1lT2Zmc2V0OyAvLyBEV09SRCAzMSBiaXRzCi0JYm9vbGVhbiBOYW1lSXNTdHJpbmc7IC8vIERXT1JEIDEgYml0Ci0JaW50IE5hbWU7IC8vIERXT1JECi0JaW50IElkOyAvLyBXT1JECi0JLy8gdW5pb24KLQlpbnQgT2Zmc2V0VG9EYXRhOyAvLyBEV09SRAotCWludCBPZmZzZXRUb0RpcmVjdG9yeTsgLy8gRFdPUkQgMzEgYml0cwotCWJvb2xlYW4gRGF0YUlzRGlyZWN0b3J5OyAvLyBEV09SRCAxIGJpdAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkgewotCWludCBPZmZzZXRUb0RhdGE7IC8vIERXT1JECi0JaW50IFNpemU7IC8vIERXT1JECi0JaW50IENvZGVQYWdlOyAvLyBEV09SRAotCWludCBSZXNlcnZlZDsgLy8gRFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBORVdIRUFERVIgewotCWludCBSZXNlcnZlZDsgLy8gV09SRAotCWludCBSZXNUeXBlOyAvLyBXT1JECi0JaW50IFJlc0NvdW50OyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSUNPTlJFU0RJUiB7Ci0JaW50IFdpZHRoOyAvLyBCWVRFCi0JaW50IEhlaWdodDsgLy8gQllURQotCWludCBDb2xvckNvdW50OyAvLyBCWVRFCi0JaW50IHJlc2VydmVkOyAvLyBCWVRFCi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgQ1VSU09SRElSIHsKLQlpbnQgV2lkdGg7IC8vIFdPUkQKLQlpbnQgSGVpZ2h0OyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgUkVTRElSIHsKLQkvLyB1bmlvbgotCUlDT05SRVNESVIgSWNvbiA9IG5ldyBJQ09OUkVTRElSKCk7Ci0JQ1VSU09SRElSIEN1cnNvciA9IG5ldyBDVVJTT1JESVIoKTsKLQlpbnQgUGxhbmVzOyAvLyBXT1JECi0JaW50IEJpdENvdW50OyAvLyBXT1JECi0JaW50IEJ5dGVzSW5SZXM7IC8vIERXT1JECi0JaW50IEljb25DdXJzb3JJZDsgLy8gV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIEJJVE1BUElORk9IRUFERVIgewotCWludCBiaVNpemU7IC8vIERXT1JECi0JaW50IGJpV2lkdGg7IC8vIExPTkcKLQlpbnQgYmlIZWlnaHQ7IC8vIExPTkcKLQlpbnQgYmlQbGFuZXM7IC8vIFdPUkQKLQlpbnQgYmlCaXRDb3VudDsgLy8gV09SRAotCWludCBiaUNvbXByZXNzaW9uOyAvLyBEV09SRAotCWludCBiaVNpemVJbWFnZTsgLy8gRFdPUkQKLQlpbnQgYmlYUGVsc1Blck1ldGVyOyAvLyBMT05HCi0JaW50IGJpWVBlbHNQZXJNZXRlcjsgLy8gTE9ORwotCWludCBiaUNsclVzZWQ7IC8vIERXT1JECi0JaW50IGJpQ2xySW1wb3J0YW50OyAvLyBEV09SRAotfQotCi1zdGF0aWMgY2xhc3MgUkdCUVVBRCB7Ci0JaW50IHJnQmx1ZTsgLy8gQllURQotCWludCByZ2JHcmVlbjsgLy8gQllURQotCWludCByZ2JSZWQ7IC8vIEJZVEUKLQlpbnQgcmdiUmVzZXJ2ZWQ7IC8vIEJZVEUKLX0KLXN0YXRpYyBjbGFzcyBCSVRNQVBJTkZPIHsKLQlCSVRNQVBJTkZPSEVBREVSIGJtaUhlYWRlciA9IG5ldyBCSVRNQVBJTkZPSEVBREVSKCk7Ci0JUkdCUVVBRFtdIGJtaUNvbG9ycyA9IG51bGw7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBCSVRNQVBJTkZPSEVBREVSIGJpaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQliaWguYmlTaXplID0gcmVhZDQocmFmKTsKLQliaWguYmlXaWR0aCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpSGVpZ2h0ID0gcmVhZDQocmFmKTsKLQliaWguYmlQbGFuZXMgPSByZWFkVTIocmFmKTsKLQliaWguYmlCaXRDb3VudCA9IHJlYWRVMihyYWYpOwotCWJpaC5iaUNvbXByZXNzaW9uID0gcmVhZDQocmFmKTsKLQliaWguYmlTaXplSW1hZ2UgPSByZWFkNChyYWYpOwotCWJpaC5iaVhQZWxzUGVyTWV0ZXIgPSByZWFkNChyYWYpOwotCWJpaC5iaVlQZWxzUGVyTWV0ZXIgPSByZWFkNChyYWYpOwotCWJpaC5iaUNsclVzZWQgPSByZWFkNChyYWYpOwotCWJpaC5iaUNsckltcG9ydGFudCA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBCSVRNQVBJTkZPIGJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJlYWQocmFmLCBiaS5ibWlIZWFkZXIpOwotfQotLyogTGl0dGxlIEVuZGlhbiBoZWxwZXJzICovCi1zdGF0aWMgaW50IHJlYWRVMihSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgYjAgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JaW50IGIxID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCXJldHVybiAoYjEgPDwgOCB8IGIwKTsKLX0KLXN0YXRpYyBpbnQgcmVhZDQoUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IGIwID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOzsKLQlpbnQgYjEgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7OwotCWludCBiMiA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjs7Ci0JaW50IGIzID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOzsKLQlyZXR1cm4gYjMgPDwgMjQgfCBiMiA8PCAxNiB8IGIxIDw8IDggfCBiMDsKLX0KLXN0YXRpYyB2b2lkIHdyaXRlNChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi53cml0ZSh2YWx1ZSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gOCkgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDE2KSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gMjQpICYgMHhGRik7Ci19Ci1zdGF0aWMgdm9pZCB3cml0ZVUyKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLndyaXRlKHZhbHVlICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfRE9TX0hFQURFUiBpZGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWRoLmVfbWFnaWMgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jYmxwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3AgPSByZWFkVTIocmFmKTsKLQlpZGguZV9jcmxjID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3BhcmhkciA9IHJlYWRVMihyYWYpOwotCWlkaC5lX21pbmFsbG9jID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbWF4YWxsb2MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9zcyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX3NwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3N1bSA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2lwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9sZmFybGMgPSByZWFkVTIocmFmKTsKLQlpZGguZV9vdm5vID0gcmVhZFUyKHJhZik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZGguZV9yZXMubGVuZ3RoOyBpKyspIGlkaC5lX3Jlc1tpXSA9IHJlYWRVMihyYWYpOwotCWlkaC5lX29lbWlkID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb2VtaW5mbyA9IHJlYWRVMihyYWYpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRoLmVfcmVzMi5sZW5ndGg7IGkrKykgaWRoLmVfcmVzMltpXSA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2xmYW5ldyA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9GSUxFX0hFQURFUiBpZmgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWZoLk1hY2hpbmUgPSByZWFkVTIocmFmKTsKLQlpZmguTnVtYmVyT2ZTZWN0aW9ucyA9IHJlYWRVMihyYWYpOwotCWlmaC5UaW1lRGF0ZVN0YW1wID0gcmVhZDQocmFmKTsKLQlpZmguUG9pbnRlclRvU3ltYm9sVGFibGUgPSByZWFkNChyYWYpOwotCWlmaC5OdW1iZXJPZlN5bWJvbHMgPSByZWFkNChyYWYpOwotCWlmaC5TaXplT2ZPcHRpb25hbEhlYWRlciA9IHJlYWRVMihyYWYpOwotCWlmaC5DaGFyYWN0ZXJpc3RpY3MgID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9EQVRBX0RJUkVDVE9SWSBpZGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaWRkLlZpcnR1YWxBZGRyZXNzID0gcmVhZDQocmFmKTsKLQlpZGQuU2l6ZSA9IHJlYWQ0KHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9PUFRJT05BTF9IRUFERVIgaW9oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlvaC5NYWdpYyA9IHJlYWRVMihyYWYpOwotCWlvaC5NYWpvckxpbmtlclZlcnNpb24gPSByYWYucmVhZCgpOwotCWlvaC5NaW5vckxpbmtlclZlcnNpb24gPSByYWYucmVhZCgpOwotCWlvaC5TaXplT2ZDb2RlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSW5pdGlhbGl6ZWREYXRhID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mVW5pbml0aWFsaXplZERhdGEgPSByZWFkNChyYWYpOwotCWlvaC5BZGRyZXNzT2ZFbnRyeVBvaW50ID0gcmVhZDQocmFmKTsKLQlpb2guQmFzZU9mQ29kZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLkJhc2VPZkRhdGEgPSByZWFkNChyYWYpOwotCWlvaC5JbWFnZUJhc2UgPSByZWFkNChyYWYpOwotCWlvaC5TZWN0aW9uQWxpZ25tZW50ID0gcmVhZDQocmFmKTsKLQlpb2guRmlsZUFsaWdubWVudCA9IHJlYWQ0KHJhZik7Ci0JaW9oLk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWFqb3JJbWFnZVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JJbWFnZVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWFqb3JTdWJzeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5XaW4zMlZlcnNpb25WYWx1ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkltYWdlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSGVhZGVycyA9IHJlYWQ0KHJhZik7Ci0JaW9oLkNoZWNrU3VtID0gcmVhZDQocmFmKTsKLQlpb2guU3Vic3lzdGVtID0gcmVhZFUyKHJhZik7Ci0JaW9oLkRsbENoYXJhY3RlcmlzdGljcyA9IHJlYWRVMihyYWYpOwotCWlvaC5TaXplT2ZTdGFja1Jlc2VydmUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZTdGFja0NvbW1pdCA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYXBSZXNlcnZlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mSGVhcENvbW1pdCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkxvYWRlckZsYWdzID0gcmVhZDQocmFmKTsKLQlpb2guTnVtYmVyT2ZSdmFBbmRTaXplcyA9IHJlYWQ0KHJhZik7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgaW9oLkRhdGFEaXJlY3RvcnkubGVuZ3RoOyBpKyspIHsKLQkJaW9oLkRhdGFEaXJlY3RvcnlbaV0gPSBuZXcgSU1BR0VfREFUQV9ESVJFQ1RPUlkoKTsKLQkJcmVhZChyYWYsIGlvaC5EYXRhRGlyZWN0b3J5W2ldKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9OVF9IRUFERVJTIGluaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbmguU2lnbmF0dXJlID0gcmVhZDQocmFmKTsKLQlyZWFkKHJhZiwgaW5oLkZpbGVIZWFkZXIpOwotCXJlYWQocmFmLCBpbmguT3B0aW9uYWxIZWFkZXIpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfU0VDVElPTl9IRUFERVIgaXNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZvciAoaW50IGkgPSAwIDsgaSA8IGlzaC5OYW1lLmxlbmd0aDsgaSsrKSBpc2guTmFtZVtpXSA9IHJhZi5yZWFkKCk7Ci0JaXNoLk1pc2NfVmlydHVhbFNpemUgPSByZWFkNChyYWYpOwotCWlzaC5WaXJ0dWFsQWRkcmVzcyA9IHJlYWQ0KHJhZik7Ci0JaXNoLlNpemVPZlJhd0RhdGEgPSByZWFkNChyYWYpOwotCWlzaC5Qb2ludGVyVG9SYXdEYXRhID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvUmVsb2NhdGlvbnMgPSByZWFkNChyYWYpOwotCWlzaC5Qb2ludGVyVG9MaW5lbnVtYmVycyA9IHJlYWQ0KHJhZik7Ci0JaXNoLk51bWJlck9mUmVsb2NhdGlvbnMgPSByZWFkVTIocmFmKTsKLQlpc2guTnVtYmVyT2ZMaW5lbnVtYmVycyA9IHJlYWRVMihyYWYpOwotCWlzaC5DaGFyYWN0ZXJpc3RpY3MgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIGlyZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmQuQ2hhcmFjdGVyaXN0aWNzID0gcmVhZDQocmFmKTsKLQlpcmQuVGltZURhdGVTdGFtcCA9IHJlYWQ0KHJhZik7Ci0JaXJkLk1ham9yVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlyZC5NaW5vclZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpcmQuTnVtYmVyT2ZOYW1lZEVudHJpZXMgPSByZWFkVTIocmFmKTsKLQlpcmQuTnVtYmVyT2ZJZEVudHJpZXMgPSByZWFkVTIocmFmKTsKLX07Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgaXJkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmRlLk5hbWUgPSByZWFkNChyYWYpOwotCWlyZGUuT2Zmc2V0VG9EYXRhID0gcmVhZDQocmFmKTsKLQkvLyBjb25zdHJ1Y3Qgb3RoZXIgdW5pb24gbWVtYmVycwotCWlyZGUuTmFtZU9mZnNldCA9IGlyZGUuTmFtZSAmIH4gKDEgPDwgMzEpOwotCWlyZGUuTmFtZUlzU3RyaW5nID0gKGlyZGUuTmFtZSAmICgxIDw8IDMxKSkgIT0gMDsKLQlpcmRlLklkID0gaXJkZS5OYW1lICYgMHhGRkZGOwotCWlyZGUuT2Zmc2V0VG9EaXJlY3RvcnkgPSBpcmRlLk9mZnNldFRvRGF0YSAmIH4gKDEgPDwgMzEpOwotCWlyZGUuRGF0YUlzRGlyZWN0b3J5ID0gKGlyZGUuT2Zmc2V0VG9EYXRhICYgKDEgPDwgMzEpKSAhPSAwOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSBpcmRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlyZGUuT2Zmc2V0VG9EYXRhID0gcmVhZDQocmFmKTsKLQlpcmRlLlNpemUgPSByZWFkNChyYWYpOwotCWlyZGUuQ29kZVBhZ2UgPSByZWFkNChyYWYpOwotCWlyZGUuUmVzZXJ2ZWQgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgTkVXSEVBREVSIG5oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCW5oLlJlc2VydmVkID0gcmVhZFUyKHJhZik7Ci0JbmguUmVzVHlwZSA9IHJlYWRVMihyYWYpOwotCW5oLlJlc0NvdW50ID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJQ09OUkVTRElSIGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaS5XaWR0aCA9IHJhZi5yZWFkKCk7Ci0JaS5IZWlnaHQgPSByYWYucmVhZCgpOwotCWkuQ29sb3JDb3VudCA9IHJhZi5yZWFkKCk7Ci0JaS5yZXNlcnZlZCA9IHJhZi5yZWFkKCk7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBDVVJTT1JESVIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQljLldpZHRoID0gcmVhZFUyKHJhZik7Ci0JYy5IZWlnaHQgPSByZWFkVTIocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIFJFU0RJUiBycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlsb25nIHN0YXJ0ID0gcmFmLmdldEZpbGVQb2ludGVyKCk7Ci0JcmVhZChyYWYsIHJzLkljb24pOwotCXJhZi5zZWVrKHN0YXJ0KTsKLQlyZWFkKHJhZiwgcnMuQ3Vyc29yKTsKLQlycy5QbGFuZXMgPSByZWFkVTIocmFmKTsKLQlycy5CaXRDb3VudCA9IHJlYWRVMihyYWYpOwotCXJzLkJ5dGVzSW5SZXMgPSByZWFkNChyYWYpOwotCXJzLkljb25DdXJzb3JJZCA9IHJlYWRVMihyYWYpOwotfQotCi0vKiBJbWFnZURhdGEgYW5kIEltYWdlIERlY29kZXIgaW5saW5pbmcgdG8gYXZvaWQgZGVwZW5kZW5jeSBvbiBTV1QgCi0gKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gY2FuIGJlIGVudGlyZWx5IHJlbW92ZWQgaWYgU1dUIGNhbiBiZSB1c2VkLgotICovCi0KLXN0YXRpYyBjbGFzcyBSR0IgewotCQotCS8qKgotCSAqIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBSR0IKLQkgKi8KLQlwdWJsaWMgaW50IHJlZDsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBSR0IKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuOwotCQotCS8qKgotCSAqIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCBibHVlOwotCQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDE1MDIzNDYxMjQ5MDc0TDsKLQkKLS8qKgotICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuCi0gKiByZWQsIGdyZWVuIGFuZCBibHVlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gcmVkIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UKLSAqIEBwYXJhbSBncmVlbiB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UKLSAqIEBwYXJhbSBibHVlIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUkdCKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpIHsKLQlpZiAoKHJlZCA+IDI1NSkgfHwgKHJlZCA8IDApIHx8Ci0JCShncmVlbiA+IDI1NSkgfHwgKGdyZWVuIDwgMCkgfHwKLQkJKGJsdWUgPiAyNTUpIHx8IChibHVlIDwgMCkpCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCXRoaXMucmVkID0gcmVkOwotCXRoaXMuZ3JlZW4gPSBncmVlbjsKLQl0aGlzLmJsdWUgPSBibHVlOwotfQotCi0vKioKLSAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUKLSAqIGlmIHRoZXkgcmVwcmVzZW50IHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzCi0gKiBzcGVjaWZpYyBjb21wYXJpc29uLgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICoKLSAqIEBzZWUgI2hhc2hDb2RlKCkKLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzIChPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBSR0IpKSByZXR1cm4gZmFsc2U7Ci0JUkdCIHJnYiA9IChSR0Ipb2JqZWN0OwotCXJldHVybiAocmdiLnJlZCA9PSB0aGlzLnJlZCkgJiYgKHJnYi5ncmVlbiA9PSB0aGlzLmdyZWVuKSAmJiAocmdiLmJsdWUgPT0gdGhpcy5ibHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gCi0gKiBvYmplY3RzIHdoaWNoIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byAKLSAqIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMKLSAqIG1ldGhvZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAqCi0gKiBAc2VlICNlcXVhbHMoT2JqZWN0KQotICovCi1wdWJsaWMgaW50IGhhc2hDb2RlICgpIHsKLQlyZXR1cm4gKGJsdWUgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgcmVkOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlCi0gKiBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+UkdCPC9jb2RlPgotICovCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpIHsKLQlyZXR1cm4gIlJHQiB7IiArIHJlZCArICIsICIgKyBncmVlbiArICIsICIgKyBibHVlICsgIn0iOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCi0vLyROT04tTkxTLTQkCi19Ci0KLX0KLXN0YXRpYyBjbGFzcyBQYWxldHRlRGF0YSB7Ci0JCi0JLyoqCi0JICogdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBkaXJlY3QgcGFsZXR0ZSwgCi0JICogYW5kIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0OwotCQotCS8qKgotCSAqIHRoZSBSR0IgdmFsdWVzIGZvciBhbiBpbmRleGVkIHBhbGV0dGUsIHdoZXJlIHRoZQotCSAqIGluZGljZXMgb2YgdGhlIGFycmF5IGNvcnJlc3BvbmQgdG8gcGl4ZWwgdmFsdWVzCi0JICovCi0JcHVibGljIFJHQltdIGNvbG9yczsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IHJlZE1hc2s7Ci0JCi0JLyoqCi0JICogdGhlIGdyZWVuIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBtYXNrIGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCBibHVlTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgcmVkIHNoaWZ0IGZvciBhIGRpcmVjdCBwYWxldHRlCi0JICovCi0JcHVibGljIGludCByZWRTaGlmdDsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2hpZnQ7Ci0JCi0JLyoqCi0JICogdGhlIGJsdWUgc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGJsdWVTaGlmdDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluZGV4ZWQgcGFsZXR0ZSBnaXZlbiBhbiBhcnJheSBvZiBSR0IgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBjb2xvcnMgdGhlIGFycmF5IG9mIDxjb2RlPlJHQjwvY29kZT5zIGZvciB0aGUgcGFsZXR0ZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFBhbGV0dGVEYXRhKFJHQltdIGNvbG9ycykgewotCWlmIChjb2xvcnMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0aGlzLmNvbG9ycyA9IGNvbG9yczsKLQl0aGlzLmlzRGlyZWN0ID0gZmFsc2U7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldyBkaXJlY3QgcGFsZXR0ZSBnaXZlbiB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBtYXNrcy4KLSAqCi0gKiBAcGFyYW0gcmVkTWFzayB0aGUgcmVkIG1hc2sKLSAqIEBwYXJhbSBncmVlbk1hc2sgdGhlIGdyZWVuIG1hc2sKLSAqIEBwYXJhbSBibHVlTWFzayB0aGUgYmx1ZSBtYXNrCi0gKi8KLXB1YmxpYyBQYWxldHRlRGF0YShpbnQgcmVkTWFzaywgaW50IGdyZWVuTWFzaywgaW50IGJsdWVNYXNrKSB7Ci0JdGhpcy5yZWRNYXNrID0gcmVkTWFzazsKLQl0aGlzLmdyZWVuTWFzayA9IGdyZWVuTWFzazsKLQl0aGlzLmJsdWVNYXNrID0gYmx1ZU1hc2s7Ci0JdGhpcy5pc0RpcmVjdCA9IHRydWU7Ci0JdGhpcy5yZWRTaGlmdCA9IHNoaWZ0Rm9yTWFzayhyZWRNYXNrKTsKLQl0aGlzLmdyZWVuU2hpZnQgPSBzaGlmdEZvck1hc2soZ3JlZW5NYXNrKTsKLQl0aGlzLmJsdWVTaGlmdCA9IHNoaWZ0Rm9yTWFzayhibHVlTWFzayk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcGl4ZWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gPGNvZGU+UkJHPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gcmdiIHRoZSBSR0IgdG8gZ2V0IHRoZSBwaXhlbCB2YWx1ZSBmb3IKLSAqIEByZXR1cm4gdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgZ2l2ZW4gUkdCCi0gKiAKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgUkdCIGlzIG5vdCBmb3VuZCBpbiB0aGUgcGFsZXR0ZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldFBpeGVsKFJHQiByZ2IpIHsKLQlpZiAocmdiID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGlzRGlyZWN0KSB7Ci0JCWludCBwaXhlbCA9IDA7Ci0JCXBpeGVsIHw9IChyZWRTaGlmdCA8IDAgPyByZ2IucmVkIDw8IC1yZWRTaGlmdCA6IHJnYi5yZWQgPj4+IHJlZFNoaWZ0KSAmIHJlZE1hc2s7Ci0JCXBpeGVsIHw9IChncmVlblNoaWZ0IDwgMCA/IHJnYi5ncmVlbiA8PCAtZ3JlZW5TaGlmdCA6IHJnYi5ncmVlbiA+Pj4gZ3JlZW5TaGlmdCkgJiBncmVlbk1hc2s7Ci0JCXBpeGVsIHw9IChibHVlU2hpZnQgPCAwID8gcmdiLmJsdWUgPDwgLWJsdWVTaGlmdCA6IHJnYi5ibHVlID4+PiBibHVlU2hpZnQpICYgYmx1ZU1hc2s7Ci0JCXJldHVybiBwaXhlbDsKLQl9IGVsc2UgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbG9yc1tpXS5lcXVhbHMocmdiKSkgcmV0dXJuIGk7Ci0JCX0KLQkJLyogVGhlIFJHQiBkaWQgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlICovCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIDxjb2RlPlJHQjwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcGl4ZWwgdmFsdWUuCi0gKgotICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbCB0byBnZXQgdGhlIFJHQiB2YWx1ZSBmb3IKLSAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBpeGVsCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBwaXhlbCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUkdCIGdldFJHQihpbnQgcGl4ZWwpIHsKLQlpZiAoaXNEaXJlY3QpIHsKLQkJaW50IHIgPSBwaXhlbCAmIHJlZE1hc2s7Ci0JCXIgPSAocmVkU2hpZnQgPCAwKSA/IHIgPj4+IC1yZWRTaGlmdCA6IHIgPDwgcmVkU2hpZnQ7Ci0JCWludCBnID0gcGl4ZWwgJiBncmVlbk1hc2s7Ci0JCWcgPSAoZ3JlZW5TaGlmdCA8IDApID8gZyA+Pj4gLWdyZWVuU2hpZnQgOiBnIDw8IGdyZWVuU2hpZnQ7Ci0JCWludCBiID0gcGl4ZWwgJiBibHVlTWFzazsKLQkJYiA9IChibHVlU2hpZnQgPCAwKSA/IGIgPj4+IC1ibHVlU2hpZnQgOiBiIDw8IGJsdWVTaGlmdDsKLQkJcmV0dXJuIG5ldyBSR0IociwgZywgYik7Ci0JfSBlbHNlIHsKLQkJaWYgKHBpeGVsIDwgMCB8fCBwaXhlbCA+PSBjb2xvcnMubGVuZ3RoKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCQl9Ci0JCXJldHVybiBjb2xvcnNbcGl4ZWxdOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFsbCB0aGUgUkdCIHZhbHVlcyBpbiB0aGUgcmVjZWl2ZXIgaWYgaXQgaXMgYW4KLSAqIGluZGV4ZWQgcGFsZXR0ZSwgb3IgbnVsbCBpZiBpdCBpcyBhIGRpcmVjdCBwYWxldHRlLgotICoKLSAqIEByZXR1cm4gdGhlIDxjb2RlPlJHQjwvY29kZT5zIGZvciB0aGUgcmVjZWl2ZXIgb3IgbnVsbAotICovCi1wdWJsaWMgUkdCW10gZ2V0UkdCcygpIHsKLQlyZXR1cm4gY29sb3JzOwotfQotCi0vKioKLSAqIENvbXB1dGVzIHRoZSBzaGlmdCB2YWx1ZSBmb3IgYSBnaXZlbiBtYXNrLgotICoKLSAqIEBwYXJhbSBtYXNrIHRoZSBtYXNrIHRvIGNvbXB1dGUgdGhlIHNoaWZ0IGZvcgotICogQHJldHVybiB0aGUgc2hpZnQgYW1vdW50Ci0gKgotICogQHNlZSBQYWxldHRlRGF0YQotICovCi1pbnQgc2hpZnRGb3JNYXNrKGludCBtYXNrKSB7Ci0JZm9yIChpbnQgaSA9IDMxOyBpID49IDA7IGktLSkgeyAKLQkJaWYgKCgobWFzayA+PiBpKSAmIDB4MSkgIT0gMCkgcmV0dXJuIDcgLSBpOwotCX0KLQlyZXR1cm4gMzI7Ci19Ci0KLX0KLXN0YXRpYyBjbGFzcyBJbWFnZUxvYWRlciB7Ci0JCi0JLyoqCi0JICogdGhlIGFycmF5IG9mIEltYWdlRGF0YSBvYmplY3RzIGluIHRoaXMgSW1hZ2VMb2FkZXIuCi0JICogVGhpcyBhcnJheSBpcyByZWFkIGluIHdoZW4gdGhlIGxvYWQgbWV0aG9kIGlzIGNhbGxlZCwKLQkgKiBhbmQgaXQgaXMgd3JpdHRlbiBvdXQgd2hlbiB0aGUgc2F2ZSBtZXRob2QgaXMgY2FsbGVkCi0JICovCi0JcHVibGljIEltYWdlRGF0YVtdIGRhdGE7Ci0JCi0JLyoqCi0JICogdGhlIHdpZHRoIG9mIHRoZSBsb2dpY2FsIHNjcmVlbiBvbiB3aGljaCB0aGUgaW1hZ2VzCi0JICogcmVzaWRlLCBpbiBwaXhlbHMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIExvZ2ljYWwgU2NyZWVuIFdpZHRoIHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgbG9naWNhbFNjcmVlbldpZHRoOwotCi0JLyoqCi0JICogdGhlIGhlaWdodCBvZiB0aGUgbG9naWNhbCBzY3JlZW4gb24gd2hpY2ggdGhlIGltYWdlcwotCSAqIHJlc2lkZSwgaW4gcGl4ZWxzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBMb2dpY2FsIFNjcmVlbiBIZWlnaHQgdmFsdWUpCi0JICovCi0JcHVibGljIGludCBsb2dpY2FsU2NyZWVuSGVpZ2h0OwotCi0JLyoqCi0JICogdGhlIGJhY2tncm91bmQgcGl4ZWwgZm9yIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyAKLQkgKiBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhIEJhY2tncm91bmQgQ29sb3IgSW5kZXggdmFsdWUpLgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICd1bnNwZWNpZmllZCBiYWNrZ3JvdW5kJwotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgYmFja2dyb3VuZFBpeGVsOwotCi0JLyoqCi0JICogdGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGRpc3BsYXkgb2YgYSBzZXF1ZW5jZQotCSAqIG9mIGFuaW1hdGVkIGltYWdlcyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgY29tbW9ubHktdXNlZAotCSAqIEdJRiBhcHBsaWNhdGlvbiBleHRlbnNpb24gZm9yICJORVRTQ0FQRSAyLjAgMDEiKQotCSAqLwotCXB1YmxpYyBpbnQgcmVwZWF0Q291bnQ7Ci0JCQotCS8qCi0JICogdGhlIHNldCBvZiBJbWFnZUxvYWRlciBldmVudCBsaXN0ZW5lcnMsIGNyZWF0ZWQgb24gZGVtYW5kCi0JICovCi0JVmVjdG9yIGltYWdlTG9hZGVyTGlzdGVuZXJzOwotCi0vKioKLSAqIENvbnN0cnVjdCBhIG5ldyBlbXB0eSBJbWFnZUxvYWRlci4KLSAqLwotcHVibGljIEltYWdlTG9hZGVyKCkgewotCXJlc2V0KCk7Ci19Ci0KLS8qKgotICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgdGhlIEltYWdlTG9hZGVyLCBleGNlcHQgZm9yIHRoZQotICogPGNvZGU+aW1hZ2VMb2FkZXJMaXN0ZW5lcnM8L2NvZGU+IGZpZWxkLgotICovCi12b2lkIHJlc2V0KCkgewotCWRhdGEgPSBudWxsOwotCWxvZ2ljYWxTY3JlZW5XaWR0aCA9IDA7Ci0JbG9naWNhbFNjcmVlbkhlaWdodCA9IDA7Ci0JYmFja2dyb3VuZFBpeGVsID0gLTE7Ci0JcmVwZWF0Q291bnQgPSAxOwotfQotCi0vKioKLSAqIExvYWRzIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBmcm9tIHRoZQotICogc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gVGhyb3dzIGFuIGVycm9yIGlmIGVpdGhlciBhbiBlcnJvcgotICogb2NjdXJzIHdoaWxlIGxvYWRpbmcgdGhlIGltYWdlcywgb3IgaWYgdGhlIGltYWdlcyBhcmUgbm90Ci0gKiBvZiBhIHN1cHBvcnRlZCB0eXBlLiBSZXR1cm5zIHRoZSBsb2FkZWQgaW1hZ2UgZGF0YSBhcnJheS4KLSAqCi0gKiBAcGFyYW0gc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0gdG8gbG9hZCB0aGUgaW1hZ2VzIGZyb20KLSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyZWFtIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyAtIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGFbXSBsb2FkKElucHV0U3RyZWFtIHN0cmVhbSkgewotCWlmIChzdHJlYW0gPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZXNldCgpOwotCWRhdGEgPSBGaWxlRm9ybWF0LmxvYWQoc3RyZWFtLCB0aGlzKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBMb2FkcyBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUKLSAqIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRocm93cyBhbiBlcnJvciBpZiBlaXRoZXIKLSAqIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBpbWFnZXMsIG9yIGlmIHRoZSBpbWFnZXMgYXJlCi0gKiBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZS4gUmV0dXJucyB0aGUgbG9hZGVkIGltYWdlIGRhdGEgYXJyYXkuCi0gKgotICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQgdGhlIGltYWdlcyBmcm9tCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBmaWxlIG5hbWUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfSU1BR0UgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBpbnZhbGlkIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX0lPIC0gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZChTdHJpbmcgZmlsZW5hbWUpIHsKLQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotCQlyZXR1cm4gbG9hZChzdHJlYW0pOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZSBlcnJvcgotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotfQotc3RhdGljIGNsYXNzIEltYWdlRGF0YSB7Ci0JCi0JLyoqCi0JICogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSwgaW4gcGl4ZWxzLgotCSAqLwotCXB1YmxpYyBpbnQgd2lkdGg7Ci0KLQkvKioKLQkgKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSwgaW4gcGl4ZWxzLgotCSAqLwotCXB1YmxpYyBpbnQgaGVpZ2h0OwotCi0JLyoqCi0JICogVGhlIGNvbG9yIGRlcHRoIG9mIHRoZSBpbWFnZSwgaW4gYml0cyBwZXIgcGl4ZWwuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGEgZGVwdGggb2YgOCBvciBsZXNzIGRvZXMgbm90IG5lY2Vzc2FyaWx5Ci0JICogbWVhbiB0aGF0IHRoZSBpbWFnZSBpcyBwYWxldHRlIGluZGV4ZWQsIG9yCi0JICogY29udmVyc2VseSB0aGF0IGEgZGVwdGggZ3JlYXRlciB0aGFuIDggbWVhbnMgdGhhdAotCSAqIHRoZSBpbWFnZSBpcyBkaXJlY3QgY29sb3IuICBDaGVjayB0aGUgYXNzb2NpYXRlZAotCSAqIFBhbGV0dGVEYXRhJ3MgaXNEaXJlY3QgZmllbGQgZm9yIHN1Y2ggZGV0ZXJtaW5hdGlvbnMuCi0JICovCi0JcHVibGljIGludCBkZXB0aDsKLQotCS8qKgotCSAqIFRoZSBzY2FubGluZSBwYWRkaW5nLgotCSAqIDxwPgotCSAqIElmIG9uZSBzY2FubGluZSBvZiB0aGUgaW1hZ2UgaXMgbm90IGEgbXVsdGlwbGUgb2YKLQkgKiB0aGlzIG51bWJlciwgaXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB1bnRpbCBpdCBpcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBzY2FubGluZVBhZDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBtdWx0aXBsZSBvZiB0aGUgc2NhbmxpbmUgcGFkZGluZy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBieXRlc1BlckxpbmU7Ci0KLQkvKioKLQkgKiBUaGUgcGl4ZWwgZGF0YSBvZiB0aGUgaW1hZ2UuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGZvciAxNiBiaXQgZGVwdGggaW1hZ2VzIHRoZSBwaXhlbCBkYXRhIGlzIHN0b3JlZAotCSAqIGluIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb3JkZXI7IGhvd2V2ZXIsIGZvciAyNGJpdCBhbmQKLQkgKiAzMmJpdCBkZXB0aCBpbWFnZXMgdGhlIHBpeGVsIGRhdGEgaXMgc3RvcmVkIGluIG1vc3QKLQkgKiBzaWduaWZpY2FudCBieXRlIG9yZGVyLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGRhdGE7Ci0KLQkvKioKLQkgKiBUaGUgY29sb3IgdGFibGUgZm9yIHRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQotCS8qKgotCSAqIFRoZSB0cmFuc3BhcmVudCBwaXhlbC4KLQkgKiA8cD4KLQkgKiBQaXhlbHMgd2l0aCB0aGlzIHZhbHVlIGFyZSB0cmFuc3BhcmVudC4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgJ25vIHRyYW5zcGFyZW50IHBpeGVsJy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCB0cmFuc3BhcmVudFBpeGVsOwotCi0JLyoqCi0JICogQW4gaWNvbi1zcGVjaWZpYyBmaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlIGljb24gbWFzay4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgMSBiaXQgYml0bWFwIHN0b3JlZCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0JICogYml0IGZpcnN0LiAgVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUgaXMKLQkgKiAnKCh3aWR0aCArIDcpIC8gOCArIChtYXNrUGFkIC0gMSkpIC8gbWFza1BhZCAqIG1hc2tQYWQnLgotCSAqIDwvcD48cD4KLQkgKiBUaGUgZGVmYXVsdCBpcyBudWxsIHdoaWNoIG1lYW5zICdubyB0cmFuc3BhcmVuY3kgbWFzaycuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBieXRlW10gbWFza0RhdGE7Ci0KLQkvKioKLQkgKiBBbiBpY29uLXNwZWNpZmljIGZpZWxkIGNvbnRhaW5pbmcgdGhlIHNjYW5saW5lIHBhZCBvZiB0aGUgbWFzay4KLQkgKiA8cD4KLQkgKiBJZiBvbmUgc2NhbmxpbmUgb2YgdGhlIHRyYW5zcGFyZW5jeSBtYXNrIGlzIG5vdCBhCi0JICogbXVsdGlwbGUgb2YgdGhpcyBudW1iZXIsIGl0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdW50aWwKLQkgKiBpdCBpcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBtYXNrUGFkOwotCQotCS8qKgotCSAqIFRoZSBhbHBoYSBkYXRhIG9mIHRoZSBpbWFnZS4KLQkgKiA8cD4KLQkgKiBFdmVyeSBwaXhlbCBjYW4gaGF2ZSBhbiA8ZW0+YWxwaGEgYmxlbmRpbmc8L2VtPiB2YWx1ZSB0aGF0Ci0JICogdmFyaWVzIGZyb20gMCwgbWVhbmluZyBmdWxseSB0cmFuc3BhcmVudCwgdG8gMjU1IG1lYW5pbmcKLQkgKiBmdWxseSBvcGFxdWUuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZSBpcwotCSAqICd3aWR0aCcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBieXRlW10gYWxwaGFEYXRhOwotCQotCS8qKgotCSAqIFRoZSBnbG9iYWwgYWxwaGEgdmFsdWUgdG8gYmUgdXNlZCBmb3IgZXZlcnkgcGl4ZWwuCi0JICogPHA+Ci0JICogSWYgdGhpcyB2YWx1ZSBpcyBzZXQsIHRoZSA8Y29kZT5hbHBoYURhdGE8L2NvZGU+IGZpZWxkCi0JICogaXMgaWdub3JlZCBhbmQgd2hlbiB0aGUgaW1hZ2UgaXMgcmVuZGVyZWQgZWFjaCBwaXhlbAotCSAqIHdpbGwgYmUgYmxlbmRlZCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGFuIGFtb3VudAotCSAqIHByb3BvcnRpb25hbCB0byB0aGlzIHZhbHVlLgotCSAqIDwvcD48cD4KLQkgKiBUaGUgZGVmYXVsdCBpcyAtMSB3aGljaCBtZWFucyAnbm8gZ2xvYmFsIGFscGhhIHZhbHVlJwotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGFscGhhOwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgZmlsZSBmcm9tIHdoaWNoIHRoZSBpbWFnZSB3YXMgcmVhZC4KLQkgKiAKLQkgKiBJdCBpcyBleHByZXNzZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCSAqIDxkbD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfQk1QPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgQk1QIGZpbGUgZm9ybWF0LCBubyBjb21wcmVzc2lvbjwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0JNUF9STEU8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+V2luZG93cyBCTVAgZmlsZSBmb3JtYXQsIFJMRSBjb21wcmVzc2lvbiBpZiBhcHByb3ByaWF0ZTwvZGQ+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0dJRjwvY29kZT48L2R0PgotCSAqIDxkZD5HSUYgZmlsZSBmb3JtYXQ8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9JQ088L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+V2luZG93cyBJQ08gZmlsZSBmb3JtYXQ8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9KUEVHPC9jb2RlPjwvZHQ+Ci0JICogPGRkPkpQRUcgZmlsZSBmb3JtYXQ8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9QTkc8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+UE5HIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8L2RsPgotCSAqLwotCXB1YmxpYyBpbnQgdHlwZTsKLQotCS8qKgotCSAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UKLQkgKiB3aXRoaW4gdGhlIGxvZ2ljYWwgc2NyZWVuICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvCi0JICogdGhlIEdJRjg5YSBJbWFnZSBMZWZ0IFBvc2l0aW9uIHZhbHVlKS4KLQkgKi8KLQlwdWJsaWMgaW50IHg7Ci0KLQkvKioKLQkgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlCi0JICogd2l0aGluIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0bwotCSAqIHRoZSBHSUY4OWEgSW1hZ2UgVG9wIFBvc2l0aW9uIHZhbHVlKS4KLQkgKi8KLQlwdWJsaWMgaW50IHk7Ci0KLQkvKioKLQkgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyB0byBkaXNwb3NlIG9mIHRoZSBjdXJyZW50IGltYWdlCi0JICogYmVmb3JlIGRpc3BsYXlpbmcgdGhlIG5leHQuCi0JICogCi0JICogSXQgaXMgZXhwcmVzc2VkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQkgKiA8ZGw+Ci0JICogPGR0Pjxjb2RlPkRNX1VOU1BFQ0lGSUVEPC9jb2RlPjwvZHQ+Ci0JICogPGRkPmRpc3Bvc2FsIG1ldGhvZCBub3Qgc3BlY2lmaWVkPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+RE1fRklMTF9OT05FPC9jb2RlPjwvZHQ+Ci0JICogPGRkPmRvIG5vdGhpbmcgLSBsZWF2ZSB0aGUgaW1hZ2UgaW4gcGxhY2U8L2RkPgotCSAqIDxkdD48Y29kZT5ETV9GSUxMX0JBQ0tHUk9VTkQ8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+ZmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+RE1fRklMTF9QUkVWSU9VUzwvY29kZT48L2R0PgotCSAqIDxkZD5yZXN0b3JlIHRoZSBwcmV2aW91cyBwaWN0dXJlPC9kZD4KLQkgKiA8L2RsPgotCSAqICh0aGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEgRGlzcG9zYWwgTWV0aG9kIHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgZGlzcG9zYWxNZXRob2Q7Ci0KLQkvKioKLQkgKiBUaGUgdGltZSB0byBkZWxheSBiZWZvcmUgZGlzcGxheWluZyB0aGUgbmV4dCBpbWFnZQotCSAqIGluIGFuIGFuaW1hdGlvbiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhCi0JICogRGVsYXkgVGltZSB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCBkZWxheVRpbWU7Ci0KLQkvKioKLQkgKiBBcmJpdHJhcnkgY2hhbm5lbCB3aWR0aCBkYXRhIHRvIDgtYml0IGNvbnZlcnNpb24gdGFibGUuCi0JICovCi0Jc3RhdGljIGZpbmFsIGJ5dGVbXVtdIEFOWV9UT19FSUdIVCA9IG5ldyBieXRlWzldW107Ci0Jc3RhdGljIHsKLQkJZm9yIChpbnQgYiA9IDA7IGIgPCA5OyArK2IpIHsKLQkJCWJ5dGVbXSBkYXRhID0gQU5ZX1RPX0VJR0hUW2JdID0gbmV3IGJ5dGVbMSA8PCBiXTsKLQkJCWlmIChiID09IDApIGNvbnRpbnVlOwotCQkJaW50IGluYyA9IDA7Ci0JCQlmb3IgKGludCBiaXQgPSAweDEwMDAwOyAoYml0ID4+PSBiKSAhPSAwOykgaW5jIHw9IGJpdDsKLQkJCWZvciAoaW50IHYgPSAwLCBwID0gMDsgdiA8IDB4MTAwMDA7IHYrPSBpbmMpIGRhdGFbcCsrXSA9IChieXRlKSh2ID4+IDgpOwotCQl9Ci0JfQotCXN0YXRpYyBmaW5hbCBieXRlW10gT05FX1RPX09ORV9NQVBQSU5HID0gQU5ZX1RPX0VJR0hUWzhdOwotCi0JLyoqCi0JICogU2NhbGVkIDh4OCBCYXllciBkaXRoZXIgbWF0cml4LgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnRbXVtdIERJVEhFUl9NQVRSSVggPSB7Ci0JCXsgMHhmYzAwMDAsIDB4N2MwMDAwLCAweGRjMDAwMCwgMHg1YzAwMDAsIDB4ZjQwMDAwLCAweDc0MDAwMCwgMHhkNDAwMDAsIDB4NTQwMDAwIH0sCi0JCXsgMHgzYzAwMDAsIDB4YmMwMDAwLCAweDFjMDAwMCwgMHg5YzAwMDAsIDB4MzQwMDAwLCAweGI0MDAwMCwgMHgxNDAwMDAsIDB4OTQwMDAwIH0sCi0JCXsgMHhjYzAwMDAsIDB4NGMwMDAwLCAweGVjMDAwMCwgMHg2YzAwMDAsIDB4YzQwMDAwLCAweDQ0MDAwMCwgMHhlNDAwMDAsIDB4NjQwMDAwIH0sCi0JCXsgMHgwYzAwMDAsIDB4OGMwMDAwLCAweDJjMDAwMCwgMHhhYzAwMDAsIDB4MDQwMDAwLCAweDg0MDAwMCwgMHgyNDAwMDAsIDB4YTQwMDAwIH0sCi0JCXsgMHhmMDAwMDAsIDB4NzAwMDAwLCAweGQwMDAwMCwgMHg1MDAwMDAsIDB4ZjgwMDAwLCAweDc4MDAwMCwgMHhkODAwMDAsIDB4NTgwMDAwIH0sCi0JCXsgMHgzMDAwMDAsIDB4YjAwMDAwLCAweDEwMDAwMCwgMHg5MDAwMDAsIDB4MzgwMDAwLCAweGI4MDAwMCwgMHgxODAwMDAsIDB4OTgwMDAwIH0sCi0JCXsgMHhjMDAwMDAsIDB4NDAwMDAwLCAweGUwMDAwMCwgMHg2MDAwMDAsIDB4YzgwMDAwLCAweDQ4MDAwMCwgMHhlODAwMDAsIDB4NjgwMDAwIH0sCi0JCXsgMHgwMDAwMDAsIDB4ODAwMDAwLCAweDIwMDAwMCwgMHhhMDAwMDAsIDB4MDgwMDAwLCAweDg4MDAwMCwgMHgyODAwMDAsIDB4YTgwMDAwIH0KLQl9OwotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IEltYWdlRGF0YSB3aXRoIHRoZSBnaXZlbiB3aWR0aCwgaGVpZ2h0LAotICogZGVwdGggYW5kIHBhbGV0dGUuIFRoZSBkYXRhIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gYW4gKGFsbCB6ZXJvKQotICogYXJyYXkgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUuCi0gKgotICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBkZXB0aCB0aGUgZGVwdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gcGFsZXR0ZSB0aGUgcGFsZXR0ZSBvZiB0aGUgaW1hZ2UgKG11c3Qgbm90IGJlIG51bGwpCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGlzIG5lZ2F0aXZlLCBvciBpZiB0aGUgZGVwdGggaXMgbm90Ci0gKiAgICAgICAgCW9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFsZXR0ZSBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUpIHsKLQl0aGlzKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLAotCQk0LCBudWxsLCAwLCBudWxsLAotCQludWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IEltYWdlRGF0YSB3aXRoIHRoZSBnaXZlbiB3aWR0aCwgaGVpZ2h0LAotICogZGVwdGgsIHBhbGV0dGUsIHNjYW5saW5lUGFkIGFuZCBkYXRhLgotICoKLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gZGVwdGggdGhlIGRlcHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHBhbGV0dGUgdGhlIHBhbGV0dGUgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gc2NhbmxpbmVQYWQgdGhlIHBhZGRpbmcgb2YgZWFjaCBsaW5lLCBpbiBieXRlcwotICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgb2YgdGhlIGltYWdlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGlzIG5lZ2F0aXZlLCBvciBpZiB0aGUgZGVwdGggaXMgbm90Ci0gKiAgICAgICAgCW9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFsZXR0ZSBvciBkYXRhIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0NBTk5PVF9CRV9aRVJPIC0gaWYgdGhlIHNjYW5saW5lUGFkIGlzIHplcm88L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwgaW50IHNjYW5saW5lUGFkLCBieXRlW10gZGF0YSkgewotCXRoaXMod2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUsCi0JCXNjYW5saW5lUGFkLCBjaGVja0RhdGEoZGF0YSksIDAsIG51bGwsCi0JCW51bGwsIC0xLCAtMSwgU1dULklNQUdFX1VOREVGSU5FRCwKLQkJMCwgMCwgMCwgMCk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhbiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IGxvYWRlZCBmcm9tIGEgZmlsZSB3aXRoIHRoZQotICogc3BlY2lmaWVkIG5hbWUuIFRocm93cyBhbiBlcnJvciBpZiBhbiBlcnJvciBvY2N1cnMgbG9hZGluZyB0aGUKLSAqIGltYWdlLCBvciBpZiB0aGUgaW1hZ2UgaGFzIGFuIHVuc3VwcG9ydGVkIHR5cGUuCi0gKiA8cD4KLSAqIFRoaXMgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIHdoZW4gbG9hZGluZyBhIHNpbmdsZQotICogaW1hZ2Ugb25seS4gSWYgdGhlIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgaW1hZ2VzLCBvbmx5IHRoZSBmaXJzdAotICogb25lIHdpbGwgYmUgbG9hZGVkLiBUbyBsb2FkIG11bHRpcGxlIGltYWdlcywgdXNlIAotICogPGNvZGU+SW1hZ2VMb2FkZXIubG9hZCgpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9hZCB0aGUgaW1hZ2UgZnJvbSAobXVzdCBub3QgYmUgbnVsbCkKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBmaWxlIG5hbWUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfSU1BR0UgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBpbnZhbGlkIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX0lPIGlmIGFuIElPIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCAtIGlmIHRoZSBpbWFnZSBmaWxlIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmb3JtYXQ8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEltYWdlRGF0YShTdHJpbmcgZmlsZW5hbWUpIHsKLQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlTG9hZGVyKCkubG9hZChmaWxlbmFtZSk7Ci0JaWYgKGRhdGEubGVuZ3RoIDwgMSkgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlJbWFnZURhdGEgaSA9IGRhdGFbMF07Ci0Jc2V0QWxsRmllbGRzKAotCQlpLndpZHRoLAotCQlpLmhlaWdodCwKLQkJaS5kZXB0aCwKLQkJaS5zY2FubGluZVBhZCwKLQkJaS5ieXRlc1BlckxpbmUsCi0JCWkuZGF0YSwKLQkJaS5wYWxldHRlLAotCQlpLnRyYW5zcGFyZW50UGl4ZWwsCi0JCWkubWFza0RhdGEsCi0JCWkubWFza1BhZCwKLQkJaS5hbHBoYURhdGEsCi0JCWkuYWxwaGEsCi0JCWkudHlwZSwKLQkJaS54LAotCQlpLnksCi0JCWkuZGlzcG9zYWxNZXRob2QsCi0JCWkuZGVsYXlUaW1lKTsKLX0KLQotLyoqCi0gKiBQcmV2ZW50cyB1bmluaXRpYWxpemVkIGluc3RhbmNlcyBmcm9tIGJlaW5nIGNyZWF0ZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4KLSAqLwotSW1hZ2VEYXRhKCkgewotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gaW1hZ2UgZGF0YSBieSBnaXZpbmcgdmFsdWVzIGZvciBhbGwgbm9uLWNvbXB1dGFibGUgZmllbGRzLgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi1JbWFnZURhdGEoCi0JaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsCi0JaW50IHNjYW5saW5lUGFkLCBieXRlW10gZGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBtYXNrRGF0YSwKLQlieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsIGludCB0cmFuc3BhcmVudFBpeGVsLCBpbnQgdHlwZSwKLQlpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkKLXsKLQotCWlmIChwYWxldHRlID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKCEoZGVwdGggPT0gMSB8fCBkZXB0aCA9PSAyIHx8IGRlcHRoID09IDQgfHwgZGVwdGggPT0gOAotCQl8fCBkZXB0aCA9PSAxNiB8fCBkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JaWYgKHNjYW5saW5lUGFkID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLQotCWludCBieXRlc1BlckxpbmUgPSAoKCh3aWR0aCAqIGRlcHRoICsgNykgLyA4KSArIChzY2FubGluZVBhZCAtIDEpKQotCQkvIHNjYW5saW5lUGFkICogc2NhbmxpbmVQYWQ7Ci0Jc2V0QWxsRmllbGRzKAotCQl3aWR0aCwKLQkJaGVpZ2h0LAotCQlkZXB0aCwKLQkJc2NhbmxpbmVQYWQsCi0JCWJ5dGVzUGVyTGluZSwKLQkJZGF0YSAhPSBudWxsID8gZGF0YSA6IG5ldyBieXRlW2J5dGVzUGVyTGluZSAqIGhlaWdodF0sCi0JCXBhbGV0dGUsCi0JCXRyYW5zcGFyZW50UGl4ZWwsCi0JCW1hc2tEYXRhLAotCQltYXNrUGFkLAotCQlhbHBoYURhdGEsCi0JCWFscGhhLAotCQl0eXBlLAotCQl4LAotCQl5LAotCQlkaXNwb3NhbE1ldGhvZCwKLQkJZGVsYXlUaW1lKTsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXplcyBhbGwgZmllbGRzIGluIHRoZSByZWNlaXZlci4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKLSAqIGJ5IGFsbCBwdWJsaWMgY29uc3RydWN0b3JzIHRvIGVuc3VyZSB0aGF0IGFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkCi0gKiBmb3IgYSBuZXcgSW1hZ2VEYXRhIG9iamVjdC4gSWYgYSBuZXcgZmllbGQgaXMgYWRkZWQgdG8gdGhlIGNsYXNzLAotICogdGhlbiBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoaXMgbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi12b2lkIHNldEFsbEZpZWxkcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHNjYW5saW5lUGFkLAotCWludCBieXRlc1BlckxpbmUsIGJ5dGVbXSBkYXRhLCBQYWxldHRlRGF0YSBwYWxldHRlLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwKLQlieXRlW10gbWFza0RhdGEsIGludCBtYXNrUGFkLCBieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsCi0JaW50IHR5cGUsIGludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKSB7Ci0KLQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JdGhpcy5kZXB0aCA9IGRlcHRoOwotCXRoaXMuc2NhbmxpbmVQYWQgPSBzY2FubGluZVBhZDsKLQl0aGlzLmJ5dGVzUGVyTGluZSA9IGJ5dGVzUGVyTGluZTsKLQl0aGlzLmRhdGEgPSBkYXRhOwotCXRoaXMucGFsZXR0ZSA9IHBhbGV0dGU7Ci0JdGhpcy50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQl0aGlzLm1hc2tEYXRhID0gbWFza0RhdGE7Ci0JdGhpcy5tYXNrUGFkID0gbWFza1BhZDsKLQl0aGlzLmFscGhhRGF0YSA9IGFscGhhRGF0YTsKLQl0aGlzLmFscGhhID0gYWxwaGE7Ci0JdGhpcy50eXBlID0gdHlwZTsKLQl0aGlzLnggPSB4OwotCXRoaXMueSA9IHk7Ci0JdGhpcy5kaXNwb3NhbE1ldGhvZCA9IGRpc3Bvc2FsTWV0aG9kOwotCXRoaXMuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotfQotCi0vKioJIAotICogSW52b2tlcyBpbnRlcm5hbCBTV1QgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YKLSAqIHRoaXMgY2xhc3MuCi0gKiA8cD4KLSAqIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLSAqIEFQSSBmb3IgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPi4gSXQgaXMgbWFya2VkIHB1YmxpYyBvbmx5IHNvIHRoYXQgaXQKLSAqIGNhbiBiZSBzaGFyZWQgd2l0aGluIHRoZSBwYWNrYWdlcyBwcm92aWRlZCBieSBTV1QuIEl0IGlzIHN1YmplY3QKLSAqIHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZnJvbQotICogYXBwbGljYXRpb24gY29kZS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSwgYW5kIGlzIG5vdCBkZXNjcmliZWQgZnVydGhlci4KLSAqIDwvcD4KLSAqLwotcHVibGljIHN0YXRpYyBJbWFnZURhdGEgaW50ZXJuYWxfbmV3KAotCWludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlLAotCWludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEsIGludCBtYXNrUGFkLCBieXRlW10gbWFza0RhdGEsCi0JYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhLCBpbnQgdHJhbnNwYXJlbnRQaXhlbCwgaW50IHR5cGUsCi0JaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpCi17Ci0JcmV0dXJuIG5ldyBJbWFnZURhdGEoCi0JCXdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLCBzY2FubGluZVBhZCwgZGF0YSwgbWFza1BhZCwgbWFza0RhdGEsCi0JCWFscGhhRGF0YSwgYWxwaGEsIHRyYW5zcGFyZW50UGl4ZWwsIHR5cGUsIHgsIHksIGRpc3Bvc2FsTWV0aG9kLCBkZWxheVRpbWUpOwotfQotCi1JbWFnZURhdGEgY29sb3JNYXNrSW1hZ2UoaW50IHBpeGVsKSB7Ci0JSW1hZ2VEYXRhIG1hc2sgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDEsIGJ3UGFsZXR0ZSgpLAotCQkyLCBudWxsLCAwLCBudWxsLCBudWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotCWludFtdIHJvdyA9IG5ldyBpbnRbd2lkdGhdOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZ2V0UGl4ZWxzKDAsIHksIHdpZHRoLCByb3csIDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLQkJCWlmIChwaXhlbCAhPSAtMSAmJiByb3dbaV0gPT0gcGl4ZWwpIHsKLQkJCQlyb3dbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlyb3dbaV0gPSAxOwotCQkJfQotCQl9Ci0JCW1hc2suc2V0UGl4ZWxzKDAsIHksIHdpZHRoLCByb3csIDApOwotCX0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGJ5dGVbXSBjaGVja0RhdGEoYnl0ZSBbXSBkYXRhKSB7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPmdldFdpZHRoPC9jb2RlPiBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gKiA8Y29kZT54PC9jb2RlPiBpbiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncwotICogZGF0YSBzdGFydGluZyBhdCA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0gZ2V0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkYXRhIHRvIGdldAotICogQHBhcmFtIHBpeGVscyB0aGUgYnVmZmVyIGluIHdoaWNoIHRvIHB1dCB0aGUgcGl4ZWxzCi0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ5dGUgYXJyYXkgdG8gYmVnaW4gc3RvcmluZyBwaXhlbHMKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZ2V0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBnZXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCBvciA4Ci0gKiAgICAgICAgKEZvciBoaWdoZXIgZGVwdGhzLCB1c2UgdGhlIGludFtdIHZlcnNpb24gb2YgdGhpcyBtZXRob2QuKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgZ2V0V2lkdGgsIGJ5dGVbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yCi0KLShTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2sgPSAwOwotCWludCBuID0gZ2V0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHRoZUJ5dGUgJiBtYXNrKSA9PSAwKSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCWludCBvZmZzZXQ7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJb2Zmc2V0ID0gMyAtIChzcmNYICUgNCk7Ci0JCQltYXNrID0gMyA8PCAob2Zmc2V0ICogMik7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkoKHRoZUJ5dGUgJiBtYXNrKSA+PiAob2Zmc2V0ICogMikpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJaWYgKCh4ICYgMHgxKSA9PSAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgJiAweDBGKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQl3aGlsZSAobiA+IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSA+PiA0KTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgJiAweDBGKTsKLQkJCQlpKys7Ci0JCQkJbi0tOwotCQkJCXNyY1grKzsKLQkJCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCQlzcmNZKys7Ci0JCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQkJc3JjWCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKHRoZUJ5dGUgPj4gNCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gZGF0YVtpbmRleF07Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPmdldFdpZHRoPC9jb2RlPiBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0Ci0gKiA8Y29kZT54PC9jb2RlPiBpbiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncwotICogZGF0YSBzdGFydGluZyBhdCA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gZ2V0Ci0gKiBAcGFyYW0gZ2V0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkYXRhIHRvIGdldAotICogQHBhcmFtIHBpeGVscyB0aGUgYnVmZmVyIGluIHdoaWNoIHRvIHB1dCB0aGUgcGl4ZWxzCi0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciB0byBiZWdpbiBzdG9yaW5nIHBpeGVscwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBnZXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGdldFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggLSBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IGdldFdpZHRoLCBpbnRbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChnZXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yCi0KLShTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBnZXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgodGhlQnl0ZSAmIG1hc2spID09IDApIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9CQkKLQlpZiAoZGVwdGggPT0gMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQlpbnQgb2Zmc2V0OwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW9mZnNldCA9IDMgLSAoc3JjWCAlIDQpOwotCQkJbWFzayA9IDMgPDwgKG9mZnNldCAqIDIpOwotCQkJcGl4ZWxzW2ldID0gKGJ5dGUpKCh0aGVCeXRlICYgbWFzaykgPj4gKG9mZnNldCAqIDIpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvZmZzZXQgPT0gMCkgewotCQkJCQlpbmRleCsrOwotCQkJCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMSk7Ci0JCWlmICgoeCAmIDB4MSkgPT0gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgJiAweDBGOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXdoaWxlIChuID4gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgPj4gNDsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSAmIDB4MEY7Ci0JCQkJaSsrOwotCQkJCW4tLTsKLQkJCQlzcmNYKys7Ci0JCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQkJc3JjWSsrOwotCQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJCXNyY1ggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IHRoZUJ5dGUgPj4gNDsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDgpICsgKGRhdGFbaW5kZXhdICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMjQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDMpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleF0gJiAweEZGKSA8PCAxNikgfCAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCA4KQotCQkJCXwgKGRhdGFbaW5kZXgrMl0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAzMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogNCk7Ci0JCWkgPSBzdGFydEluZGV4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9ICgoZGF0YVtpbmRleF0gJiAweEZGKSA8PCAyNCkgfCAoKGRhdGFbaW5kZXgrMV0gJiAweEZGKSA8PCAxNikKLQkJCQl8ICgoZGF0YVtpbmRleCsyXSAmIDB4RkYpIDw8IDgpIHwgKGRhdGFbaW5kZXgrM10gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gNDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgPGNvZGU+UkdCPC9jb2RlPnMgd2hpY2ggY29tcHJpc2UgdGhlCi0gKiBpbmRleGVkIGNvbG9yIHRhYmxlIG9mIHRoZSByZWNlaXZlciwgb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIKLSAqIGhhcyBhIGRpcmVjdCBjb2xvciBtb2RlbC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBSR0IgdmFsdWVzIGZvciB0aGUgaW1hZ2Ugb3IgbnVsbCBpZiBkaXJlY3QgY29sb3IKLSAqCi0gKiBAc2VlIFBhbGV0dGVEYXRhI2dldFJHQnMoKQotICovCi1wdWJsaWMgUkdCW10gZ2V0UkdCcygpIHsKLQlyZXR1cm4gcGFsZXR0ZS5nZXRSR0JzKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IHdoaWNoIHNwZWNpZmllcyB0aGUKLSAqIHRyYW5zcGFyZW5jeSBtYXNrIGluZm9ybWF0aW9uIGZvciB0aGUgcmVjZWl2ZXIsIG9yIG51bGwgaWYgdGhlCi0gKiByZWNlaXZlciBoYXMgbm8gdHJhbnNwYXJlbmN5IGFuZCBpcyBub3QgYW4gaWNvbi4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0cmFuc3BhcmVuY3kgbWFzayBvciBudWxsIGlmIG5vbmUgZXhpc3RzCi0gKi8KLXB1YmxpYyBJbWFnZURhdGEgZ2V0VHJhbnNwYXJlbmN5TWFzaygpIHsKLQlpZiAoZ2V0VHJhbnNwYXJlbmN5VHlwZSgpID09IFNXVC5UUkFOU1BBUkVOQ1lfTUFTSykgewotCQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAxLCBid1BhbGV0dGUoKSwgbWFza1BhZCwgbWFza0RhdGEpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBjb2xvck1hc2tJbWFnZSh0cmFuc3BhcmVudFBpeGVsKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgaW1hZ2UgdHJhbnNwYXJlbmN5IHR5cGUuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB0cmFuc3BhcmVuY3kgdHlwZQotICovCi1wdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeVR5cGUoKSB7Ci0JaWYgKG1hc2tEYXRhICE9IG51bGwpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX01BU0s7Ci0JaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEpIHJldHVybiBTV1QuVFJBTlNQQVJFTkNZX1BJWEVMOwotCWlmIChhbHBoYURhdGEgIT0gbnVsbCkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfQUxQSEE7Ci0JcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBieXRlIG9yZGVyIG9mIHRoZSByZWNlaXZlci4KLSAqIAotICogQHJldHVybiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUCi0gKi8KLWludCBnZXRCeXRlT3JkZXIoKSB7Ci0JcmV0dXJuIGRlcHRoICE9IDE2ID8gTVNCX0ZJUlNUIDogTFNCX0ZJUlNUOwotfQotCi0vKioKLSAqIFNldHMgdGhlIHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQgPGNvZGU+eDwvY29kZT4gaW4KLSAqIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzIGRhdGEgdG8gdGhlCi0gKiB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgPGNvZGU+cGl4ZWxzPC9jb2RlPiBzdGFydGluZyBhdAotICogPGNvZGU+c3RhcnRJbmRleDwvY29kZT4uCi0gKgotICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIHNldAotICogQHBhcmFtIHB1dFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzIHRvIHNldAotICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHNldHRpbmcKLSAqCi0gKiBAZXhjZXB0aW9uIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgcHV0V2lkdGggaXMgdG9vIGxhcmdlCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHBpeGVscyBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgeCBvciB5IGlzIG91dCBvZiBib3VuZHM8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBwdXRXaWR0aCBpcyBuZWdhdGl2ZTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgKLSAqICAgICAgICAoRm9yIGhpZ2hlciBkZXB0aHMsIHVzZSB0aGUgaW50W10gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBwdXRXaWR0aCwgYnl0ZVtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA9PSAwKSByZXR1cm47Ci0JaW50IGluZGV4OwotCWludCB0aGVCeXRlOwotCWludCBtYXNrOwotCWludCBuID0gcHV0V2lkdGg7Ci0JaW50IGkgPSBzdGFydEluZGV4OwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHBpeGVsc1tpXSAmIDB4MSkgPT0gMSkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpIHwgbWFzayk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpICYgKG1hc2sgXiAtMSkpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJYnl0ZSBbXSBtYXNrcyA9IHsgKGJ5dGUpMHhGQywgKGJ5dGUpMHhGMywgKGJ5dGUpMHhDRiwgKGJ5dGUpMHgzRiB9OwotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQlpbnQgb2Zmc2V0ID0gMyAtICh4ICUgNCk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MzsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIG1hc2tzW29mZnNldF0pIHwgKHRoZUJ5dGUgPDwgKG9mZnNldCAqIDIpKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCW9mZnNldCA9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0LS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJYm9vbGVhbiBoaWdoID0gKHggJiAweDEpID09IDA7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MEY7Ci0JCQlpZiAoaGlnaCkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4MEYpIHwgKHRoZUJ5dGUgPDwgNCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEYwKSB8IHRoZUJ5dGUpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWhpZ2ggPSB0cnVlOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhpZ2gpIGluZGV4Kys7Ci0JCQkJaGlnaCA9ICFoaWdoOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsc1tpXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT54PC9jb2RlPiBpbgotICogc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MgZGF0YSB0byB0aGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBhcnJheSA8Y29kZT5waXhlbHM8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gKiA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0gcHV0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gc2V0dGluZwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwdXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHB1dFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBwdXRXaWR0aCwgaW50W10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBwdXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHBpeGVsOwotCWludCBzcmNYID0geCwgc3JjWSA9IHk7Ci0JaWYgKGRlcHRoID09IDEpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAzKTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQltYXNrID0gMSA8PCAoNyAtIChzcmNYICYgMHg3KSk7Ci0JCQlpZiAoKHBpeGVsc1tpXSAmIDB4MSkgPT0gMSkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpIHwgbWFzayk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RkYpICYgKG1hc2sgXiAtMSkpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJYnl0ZSBbXSBtYXNrcyA9IHsgKGJ5dGUpMHhGQywgKGJ5dGUpMHhGMywgKGJ5dGUpMHhDRiwgKGJ5dGUpMHgzRiB9OwotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDIpOwotCQlpbnQgb2Zmc2V0ID0gMyAtICh4ICUgNCk7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MzsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIG1hc2tzW29mZnNldF0pIHwgKHRoZUJ5dGUgPDwgKG9mZnNldCAqIDIpKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJb2Zmc2V0ID0gMzsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCW9mZnNldCA9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0LS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJYm9vbGVhbiBoaWdoID0gKHggJiAweDEpID09IDA7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJdGhlQnl0ZSA9IHBpeGVsc1tpXSAmIDB4MEY7Ci0JCQlpZiAoaGlnaCkgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4MEYpIHwgKHRoZUJ5dGUgPDwgNCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhW2luZGV4XSA9IChieXRlKSgoZGF0YVtpbmRleF0gJiAweEYwKSB8IHRoZUJ5dGUpOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWhpZ2ggPSB0cnVlOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhpZ2gpIGluZGV4Kys7Ci0JCQkJaGlnaCA9ICFoaWdoOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKHBpeGVsc1tpXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCAqIDIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHB1dFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsID0gcGl4ZWxzW2ldOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgocGl4ZWwgPj4gMTYpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMl0gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAzMikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogNCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKSgocGl4ZWwgPj4gMjQpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMV0gPSAoYnl0ZSkoKHBpeGVsID4+IDE2KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDJdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDNdID0gKGJ5dGUpKHBpeGVsICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IDQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgcGFsZXR0ZSB3aXRoIDIgY29sb3JzOiBibGFjayAmIHdoaXRlLgotICovCi1zdGF0aWMgUGFsZXR0ZURhdGEgYndQYWxldHRlKCkgewotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBmb3IKLSAqIHRoZSBnaXZlbiBtYXNrLgotICovCi1zdGF0aWMgaW50IGdldE1TQk9mZnNldChpbnQgbWFzaykgewotCWZvciAoaW50IGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKCgobWFzayA+PiBpKSAmIDB4MSkgIT0gMCkgcmV0dXJuIGkgKyAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaC4KLSAqLwotc3RhdGljIGludCBjbG9zZXN0TWF0Y2goaW50IGRlcHRoLCBieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlLCBpbnQgcmVkTWFzaywgaW50IGdyZWVuTWFzaywgaW50IGJsdWVNYXNrLCBieXRlW10gcmVkcywgYnl0ZVtdIGdyZWVucywgYnl0ZVtdIGJsdWVzKSB7Ci0JaWYgKGRlcHRoID4gOCkgewotCQlpbnQgcnNoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQocmVkTWFzayk7Ci0JCWludCBnc2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChncmVlbk1hc2spOwotCQlpbnQgYnNoaWZ0ID0gMzIgLSBnZXRNU0JPZmZzZXQoYmx1ZU1hc2spOwotCQlyZXR1cm4gKCgocmVkIDw8IDI0KSA+Pj4gcnNoaWZ0KSAmIHJlZE1hc2spIHwKLQkJCSgoKGdyZWVuIDw8IDI0KSA+Pj4gZ3NoaWZ0KSAmIGdyZWVuTWFzaykgfAotCQkJKCgoYmx1ZSA8PCAyNCkgPj4+IGJzaGlmdCkgJiBibHVlTWFzayk7Ci0JfQotCWludCByLCBnLCBiOwotCWludCBtaW5EaXN0YW5jZSA9IDB4N2ZmZmZmZmY7Ci0JaW50IG5lYXJlc3RQaXhlbCA9IDA7Ci0JaW50IG4gPSByZWRzLmxlbmd0aDsKLQlmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotCQlyID0gKHJlZHNbal0gJiAweEZGKSAtIChyZWQgJiAweEZGKTsKLQkJZyA9IChncmVlbnNbal0gJiAweEZGKSAtIChncmVlbiAmIDB4RkYpOwotCQliID0gKGJsdWVzW2pdICYgMHhGRikgLSAoYmx1ZSAmIDB4RkYpOwotCQlpbnQgZGlzdGFuY2UgPSByKnIgKyBnKmcgKyBiKmI7Ci0JCWlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7Ci0JCQluZWFyZXN0UGl4ZWwgPSBqOwotCQkJaWYgKGRpc3RhbmNlID09IDApIGJyZWFrOwotCQkJbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKLQkJfQotCX0KLQlyZXR1cm4gbmVhcmVzdFBpeGVsOwotfQotCi1zdGF0aWMgZmluYWwgSW1hZ2VEYXRhIGNvbnZlcnRNYXNrKEltYWdlRGF0YSBtYXNrKSB7Ci0JaWYgKG1hc2suZGVwdGggPT0gMSkgcmV0dXJuIG1hc2s7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LDI1NSwyNTUpfSk7Ci0JSW1hZ2VEYXRhIG5ld01hc2sgPSBuZXcgSW1hZ2VEYXRhKG1hc2sud2lkdGgsIG1hc2suaGVpZ2h0LCAxLCBwYWxldHRlKTsKLQkvKiBGaW5kIGluZGV4IG9mIGJsYWNrIGluIG1hc2sgcGFsZXR0ZSAqLwotCWludCBibGFja0luZGV4ID0gMDsKLQlSR0JbXSByZ2JzID0gbWFzay5nZXRSR0JzKCk7Ci0JaWYgKHJnYnMgIT0gbnVsbCkgewotCQl3aGlsZSAoYmxhY2tJbmRleCA8IHJnYnMubGVuZ3RoKSB7Ci0JCQlpZiAocmdic1tibGFja0luZGV4XS5lcXVhbHMocGFsZXR0ZS5jb2xvcnNbMF0pKSBicmVhazsKLQkJCWJsYWNrSW5kZXgrKzsKLQkJfQotCX0KLQlpbnRbXSBwaXhlbHMgPSBuZXcgaW50W21hc2sud2lkdGhdOwotCWZvciAoaW50IHkgPSAwOyB5IDwgbWFzay5oZWlnaHQ7IHkrKykgewotCQltYXNrLmdldFBpeGVscygwLCB5LCBtYXNrLndpZHRoLCBwaXhlbHMsIDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBpeGVsc1tpXSA9PSBibGFja0luZGV4KSB7Ci0JCQkJcGl4ZWxzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGl4ZWxzW2ldID0gMTsKLQkJCX0KLQkJfQotCQluZXdNYXNrLnNldFBpeGVscygwLCB5LCBtYXNrLndpZHRoLCBwaXhlbHMsIDApOwotCX0KLQlyZXR1cm4gbmV3TWFzazsKLX0KLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0UGFkKGJ5dGVbXSBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBhZCwgaW50IG5ld1BhZCkgewotCWlmIChwYWQgPT0gbmV3UGFkKSByZXR1cm4gZGF0YTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0JaW50IGJwbCA9IChzdHJpZGUgKyAocGFkIC0gMSkpIC8gcGFkICogcGFkOwkKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIHN0cmlkZSk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci0KLS8qKgotICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGZpbmFsIGludAotCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCUJMSVRfQUxQSEEgPSAyLCAgIC8vIGVuYWJsZSBhbHBoYSBibGVuZGluZwotCUJMSVRfRElUSEVSID0gNDsgIC8vIGVuYWJsZSBkaXRoZXJpbmcgaW4gbG93IGNvbG9yIG1vZGVzCi0KLS8qKgotICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLSAqLwotc3RhdGljIGZpbmFsIGludAotCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQlBTFBIQV9UUkFOU1BBUkVOVCA9IDAsICAgICAgICAvLyBGdWxseSB0cmFuc3BhcmVudCAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQlBTFBIQV9DSEFOTkVMX1NFUEFSQVRFID0gLTEsICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBmcm9tIHNlcGFyYXRlIGFscGhhRGF0YQotCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQlBTFBIQV9NQVNLX1VOUEFDS0VEID0gLTMsICAgICAvLyBVc2UgdHJhbnNwYXJlbmN5IG1hc2sgZm9ybWVkIGJ5IGJ5dGVzIGluIGFscGhhRGF0YSAobm9uLXplcm8gaXMgb3BhcXVlKQotCUFMUEhBX01BU0tfUEFDS0VEID0gLTQsICAgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgcGFja2VkIGJpdHMgaW4gYWxwaGFEYXRhCi0JQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQlBTFBIQV9NQVNLX1JHQiA9IC02OyAgICAgICAgICAvLyBDb25zaWRlciBzb3VyY2UgUkdCcyB0cmFuc3BhcmVudCBpZiBpbiBSR0I4ODggZm9ybWF0IGFscGhhRGF0YSBhcnJheQotCi0vKioKLSAqIEJ5dGUgYW5kIGJpdCBvcmRlciBjb25zdGFudHMuCi0gKi8KLXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQotLyoqCi0gKiBEYXRhIHR5cGVzIChpbnRlcm5hbCkKLSAqLwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JLy8gZGlyZWN0IC8gdHJ1ZSBjb2xvciBmb3JtYXRzIHdpdGggYXJiaXRyYXJ5IG1hc2tzICYgc2hpZnRzCi0JVFlQRV9HRU5FUklDXzggPSAwLAotCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCVRZUEVfR0VORVJJQ18xNl9MU0IgPSAyLAotCVRZUEVfR0VORVJJQ18yNCA9IDMsCi0JVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JVFlQRV9HRU5FUklDXzMyX0xTQiA9IDUsCi0JLy8gcGFsZXR0ZSBpbmRleGVkIGNvbG9yIGZvcm1hdHMKLQlUWVBFX0lOREVYXzggPSA2LAotCVRZUEVfSU5ERVhfNCA9IDcsCi0JVFlQRV9JTkRFWF8yID0gOCwKLQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQlUWVBFX0lOREVYXzFfTFNCID0gMTA7Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFNoaWZ0KGludCBtYXNrKSB7Ci0JaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgKChtYXNrICYgMSkgPT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQltYXNrID4+Pj0gMTsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qKgotICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLSAqLwotc3RhdGljIGludCBnZXRDaGFubmVsV2lkdGgoaW50IG1hc2ssIGludCBzaGlmdCkgewotCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCWludCBpOwotCW1hc2sgPj4+PSBzaGlmdDsKLQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQltYXNrID4+Pj0gMTsKLQl9Ci0JcmV0dXJuIGkgLSBzaGlmdDsKLX0KLQotLyoqCi0gKiBFeHRyYWN0cyBhIGZpZWxkIGZyb20gcGFja2VkIFJHQiBkYXRhIGdpdmVuIGEgbWFzayBmb3IgdGhhdCBmaWVsZC4KLSAqLwotc3RhdGljIGJ5dGUgZ2V0Q2hhbm5lbEZpZWxkKGludCBkYXRhLCBpbnQgbWFzaykgewotCWZpbmFsIGludCBzaGlmdCA9IGdldENoYW5uZWxTaGlmdChtYXNrKTsKLQlyZXR1cm4gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChtYXNrLCBzaGlmdCldWyhkYXRhICYgbWFzaykgPj4+IHNoaWZ0XTsKLX0KLQotLyogCi0gKiBGaWxsIGluIGRpdGhlcmVkIGdyYWRhdGVkIHZhbHVlcyBmb3IgYSBjb2xvciBjaGFubmVsCi0gKi8KLXN0YXRpYyBmaW5hbCB2b2lkIGJ1aWxkRGl0aGVyZWRHcmFkaWVudENoYW5uZWwoaW50IGZyb20sIGludCB0bywgaW50IHN0ZXBzLAotCWludCBiYW5kV2lkdGgsIGludCBiYW5kSGVpZ2h0LCBib29sZWFuIHZlcnRpY2FsLAotCWJ5dGVbXSBiaXRtYXBEYXRhLCBpbnQgZHAsIGludCBieXRlc1BlckxpbmUsIGludCBiaXRzKSB7Ci0JZmluYWwgaW50IG1hc2sgPSAweGZmMDAgPj4+IGJpdHM7Ci0JaW50IHZhbCA9IGZyb20gPDwgMTY7Ci0JZmluYWwgaW50IGluYyA9ICgodG8gPDwgMTYpIC0gdmFsKSAvIHN0ZXBzICsgMTsKLQlpZiAodmVydGljYWwpIHsKLQkJZm9yIChpbnQgZHkgPSAwOyBkeSA8IGJhbmRIZWlnaHQ7ICsrZHksIGRwICs9IGJ5dGVzUGVyTGluZSkgewotCQkJZm9yIChpbnQgZHggPSAwLCBkcHRyID0gZHA7IGR4IDwgYmFuZFdpZHRoOyArK2R4LCBkcHRyICs9IDQpIHsKLQkJCQlmaW5hbCBpbnQgdGhyZXNoID0gRElUSEVSX01BVFJJWFtkeSAmIDddW2R4XSA+Pj4gYml0czsKLQkJCQlpbnQgdGVtcCA9IHZhbCArIHRocmVzaDsKLQkJCQlpZiAodGVtcCA+IDB4ZmZmZmZmKSBiaXRtYXBEYXRhW2RwdHJdID0gLTE7Ci0JCQkJZWxzZSBiaXRtYXBEYXRhW2RwdHJdID0gKGJ5dGUpKCh0ZW1wID4+PiAxNikgJiBtYXNrKTsKLQkJCX0KLQkJCXZhbCArPSBpbmM7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGludCBkeCA9IDA7IGR4IDwgYmFuZFdpZHRoOyArK2R4LCBkcCArPSA0KSB7Ci0JCQlmb3IgKGludCBkeSA9IDAsIGRwdHIgPSBkcDsgZHkgPCBiYW5kSGVpZ2h0OyArK2R5LCBkcHRyICs9IGJ5dGVzUGVyTGluZSkgewotCQkJCWZpbmFsIGludCB0aHJlc2ggPSBESVRIRVJfTUFUUklYW2R5XVtkeCAmIDddID4+PiBiaXRzOwotCQkJCWludCB0ZW1wID0gdmFsICsgdGhyZXNoOwotCQkJCWlmICh0ZW1wID4gMHhmZmZmZmYpIGJpdG1hcERhdGFbZHB0cl0gPSAtMTsKLQkJCQllbHNlIGJpdG1hcERhdGFbZHB0cl0gPSAoYnl0ZSkoKHRlbXAgPj4+IDE2KSAmIG1hc2spOwotCQkJfQotCQkJdmFsICs9IGluYzsKLQkJfQotCX0KLX0KLX0KLQotc3RhdGljIGNsYXNzIExFRGF0YUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCWludCBwb3NpdGlvbjsKLQlJbnB1dFN0cmVhbSBpbjsKLQotCS8qKgotCSAqIFRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHJlYWQuCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBidWY7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBieXRlIGFycmF5IDxjb2RlPmJ1ZjwvY29kZT4uIEEgdmFsdWUKLQkgKiBlcXVhbCB0byBidWYubGVuZ3RoIGluZGljYXRlcyBubyBieXRlcyBhdmFpbGFibGUuICBBIHZhbHVlIG9mCi0JICogMCBpbmRpY2F0ZXMgdGhlIGJ1ZmZlciBpcyBmdWxsLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcG9zOwotCQotCi0JcHVibGljIExFRGF0YUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCXRoaXMoaW5wdXQsIDUxMik7Ci0JfQotCQotCXB1YmxpYyBMRURhdGFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgaW50IGJ1ZmZlclNpemUpIHsKLQkJdGhpcy5pbiA9IGlucHV0OwotCQlpZiAoYnVmZmVyU2l6ZSA+IDApIHsKLQkJCWJ1ZiA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwotCQkJcG9zID0gYnVmZmVyU2l6ZTsKLQkJfSAKLQkJZWxzZSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnVmID0gbnVsbDsKLQkJaWYgKGluICE9IG51bGwpIHsKLQkJCWluLmNsb3NlKCk7Ci0JCQlpbiA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlcnMgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyB3aXRob3V0IGJsb2NraW5nCi0JICovCi0JcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gKGJ1Zi5sZW5ndGggLSBwb3MpICsgaW4uYXZhaWxhYmxlKCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgbmV4dCBieXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJcG9zaXRpb24rKzsKLQkJaWYgKHBvcyA8IGJ1Zi5sZW5ndGgpIHJldHVybiAoYnVmW3BvcysrXSAmIDB4RkYpOwotCQlyZXR1cm4gaW4ucmVhZCgpOwotCX0KLQkKLQkvKioKLQkgKiBEb24ndCBpbWl0YXRlIHRoZSBKREsgYmVoYXZpb3VyIG9mIHJlYWRpbmcgYSByYW5kb20gbnVtYmVyCi0JICogb2YgYnl0ZXMgd2hlbiB5b3UgY2FuIGFjdHVhbGx5IHJlYWQgdGhlbSBhbGwuCi0JICovCi0JcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0OwotCQlpbnQgbGVmdCA9IGxlbjsKLQkJcmVzdWx0ID0gcmVhZERhdGEoYiwgb2ZmLCBsZW4pOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlc3VsdCA9PSAtMSkgcmV0dXJuIC0xOwotCQkJcG9zaXRpb24gKz0gcmVzdWx0OwotCQkJaWYgKHJlc3VsdCA9PSBsZWZ0KSByZXR1cm4gbGVuOwotCQkJbGVmdCAtPSByZXN1bHQ7Ci0JCQlvZmYgKz0gcmVzdWx0OwotCQkJcmVzdWx0ID0gcmVhZERhdGEoYiwgb2ZmLCBsZWZ0KTsKLQkJfQotCX0KLQkKLQkvKioKLSAJICogUmVhZHMgYXQgbW9zdCA8Y29kZT5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhpcyBMRURhdGFJbnB1dFN0cmVhbSBhbmQgCi0gCSAqIHN0b3JlcyB0aGVtIGluIGJ5dGUgYXJyYXkgPGNvZGU+YnVmZmVyPC9jb2RlPiBzdGFydGluZyBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+LgotIAkgKiA8cD4KLSAJICogQW5zd2VyIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCBvciAtMSBpZiBubyBieXRlcyB3ZXJlIHJlYWQgYW5kIAotIAkgKiBlbmQgb2Ygc3RyZWFtIHdhcyBlbmNvdW50ZXJlZC4gIFRoaXMgaW1wbGVtZW50YXRpb24gcmVhZHMgYnl0ZXMgZnJvbSAKLSAJICogdGhlIHB1c2hiYWNrIGJ1ZmZlciBmaXJzdCwgdGhlbiB0aGUgdGFyZ2V0IHN0cmVhbSBpZiBtb3JlIGJ5dGVzIGFyZSByZXF1aXJlZAotIAkgKiB0byBzYXRpc2Z5IDxjb2RlPmNvdW50PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGJ1ZmZlciB0aGUgYnl0ZSBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+YnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgcmVhZCBieXRlcy4KLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiA8Y29kZT5idWZmZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0uCi0JICoKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgotCSAqLwotCXByaXZhdGUgaW50IHJlYWREYXRhKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWYgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwKLSAgCQkgCWxlbmd0aCA8IDAgfHwgKGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpKSB7Ci0JIAkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQkgCX0KLQkJCQkKLQkJaW50IGNhY2hlQ29waWVkID0gMDsKLQkJaW50IG5ld09mZnNldCA9IG9mZnNldDsKLQkKLQkJLy8gQXJlIHRoZXJlIHB1c2hiYWNrIGJ5dGVzIGF2YWlsYWJsZT8KLQkJaW50IGF2YWlsYWJsZSA9IGJ1Zi5sZW5ndGggLSBwb3M7Ci0JCWlmIChhdmFpbGFibGUgPiAwKSB7Ci0JCQljYWNoZUNvcGllZCA9IChhdmFpbGFibGUgPj0gbGVuZ3RoKSA/IGxlbmd0aCA6IGF2YWlsYWJsZTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCBwb3MsIGJ1ZmZlciwgbmV3T2Zmc2V0LCBjYWNoZUNvcGllZCk7Ci0JCQluZXdPZmZzZXQgKz0gY2FjaGVDb3BpZWQ7Ci0JCQlwb3MgKz0gY2FjaGVDb3BpZWQ7Ci0JCX0KLQkKLQkJLy8gSGF2ZSB3ZSBjb3BpZWQgZW5vdWdoPwotCQlpZiAoY2FjaGVDb3BpZWQgPT0gbGVuZ3RoKSByZXR1cm4gbGVuZ3RoOwotCi0JCWludCBpbkNvcGllZCA9IGluLnJlYWQoYnVmZmVyLCBuZXdPZmZzZXQsIGxlbmd0aCAtIGNhY2hlQ29waWVkKTsKLQotCQlpZiAoaW5Db3BpZWQgPiAwKSByZXR1cm4gaW5Db3BpZWQgKyBjYWNoZUNvcGllZDsKLQkJaWYgKGNhY2hlQ29waWVkID09IDApIHJldHVybiBpbkNvcGllZDsKLQkJcmV0dXJuIGNhY2hlQ29waWVkOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYW4gaW50ZWdlciBjb21wcmlzZWQgb2YgdGhlIG5leHQKLQkgKiBmb3VyIGJ5dGVzIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIGludCByZWFkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOwotCQlyZWFkKGJ1Zik7Ci0JCXJldHVybiAoKCgoKChidWZbM10gJiAweEZGKSA8PCA4KSB8IAotCQkJKGJ1ZlsyXSAmIDB4RkYpKSA8PCA4KSB8IAotCQkJKGJ1ZlsxXSAmIDB4RkYpKSA8PCA4KSB8IAotCQkJKGJ1ZlswXSAmIDB4RkYpOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSBzaG9ydCBjb21wcmlzZWQgb2YgdGhlIG5leHQKLQkgKiB0d28gYnl0ZXMgb2YgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzJdOwotCQlyZWFkKGJ1Zik7Ci0JCXJldHVybiAoc2hvcnQpKCgoYnVmWzFdICYgMHhGRikgPDwgOCkgfCAoYnVmWzBdICYgMHhGRikpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIGJhY2sgdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBnaXZlbiBidWZmZXIgPGNvZGU+YjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhlIGJ5dGVzIGFyZSBwdXNoZWQgc28gdGhhdCB0aGV5IHdvdWxkIGJlIHJlYWQgYmFjayBiWzBdLCBiWzFdLCBldGMuIAotCSAqIElmIHRoZSBwdXNoIGJhY2sgYnVmZmVyIGNhbm5vdCBoYW5kbGUgdGhlIGJ5dGVzIGNvcGllZCBmcm9tIDxjb2RlPmI8L2NvZGU+LCAKLQkgKiBhbiBJT0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBhbmQgbm8gYnl0ZSB3aWxsIGJlIHB1c2hlZCBiYWNrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheSBjb250YWluaW5nIGJ5dGVzIHRvIHB1c2ggYmFjayBpbnRvIHRoZSBzdHJlYW0KLQkgKgotCSAqIEBleGNlcHRpb24gCWphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlIHB1c2hiYWNrIGJ1ZmZlciBpcyB0b28gc21hbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBiLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA+IHBvcykgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCXBvc2l0aW9uIC09IGxlbmd0aDsKLQkJcG9zIC09IGxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBidWYsIHBvcywgbGVuZ3RoKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZpbGVGb3JtYXQgewkKLQlMRURhdGFJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlJbWFnZUxvYWRlciBsb2FkZXI7Ci0JaW50IGNvbXByZXNzaW9uOwotCi1ieXRlW10gYml0SW52ZXJ0RGF0YShieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCS8vIERlc3RydWN0aXZlbHkgYml0IGludmVydCBkYXRhIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgotCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewotCQlkYXRhW2ldID0gKGJ5dGUpKDI1NSAtIGRhdGFbaSAtIHN0YXJ0SW5kZXhdKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLS8qKgotICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCi0gKiByZXByZXNlbnRzIGEgc3VwcG9ydGVkIGZpbGUgZm9ybWF0LgotICovCi1hYnN0cmFjdCBib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pOwotCi1hYnN0cmFjdCBJbWFnZURhdGFbXSBsb2FkRnJvbUJ5dGVTdHJlYW0oKTsKLQotcHVibGljIEltYWdlRGF0YVtdIGxvYWRGcm9tU3RyZWFtKExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWlucHV0U3RyZWFtID0gc3RyZWFtOwotCQlyZXR1cm4gbG9hZEZyb21CeXRlU3RyZWFtKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBJbWFnZURhdGFbXSBsb2FkKElucHV0U3RyZWFtIGlzLCBJbWFnZUxvYWRlciBsb2FkZXIpIHsKLQlMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgTEVEYXRhSW5wdXRTdHJlYW0oaXMpOwotCWJvb2xlYW4gaXNTdXBwb3J0ZWQgPSBmYWxzZTsJCi0JRmlsZUZvcm1hdCBmaWxlRm9ybWF0ID0gbmV3IFdpbklDT0ZpbGVGb3JtYXQoKTsKLQlpZiAoZmlsZUZvcm1hdC5pc0ZpbGVGb3JtYXQoc3RyZWFtKSkgaXNTdXBwb3J0ZWQgPSB0cnVlOwotCWVsc2UgewotCQlmaWxlRm9ybWF0ID0gbmV3IFdpbkJNUEZpbGVGb3JtYXQoKTsKLQkJaWYgKGZpbGVGb3JtYXQuaXNGaWxlRm9ybWF0KHN0cmVhbSkpIGlzU3VwcG9ydGVkID0gdHJ1ZTsKLQl9Ci0JaWYgKCFpc1N1cHBvcnRlZCkgU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQpOwotCWZpbGVGb3JtYXQubG9hZGVyID0gbG9hZGVyOwotCXJldHVybiBmaWxlRm9ybWF0LmxvYWRGcm9tU3RyZWFtKHN0cmVhbSk7Ci19Ci19Ci1zdGF0aWMgY2xhc3MgV2luQk1QRmlsZUZvcm1hdCBleHRlbmRzIEZpbGVGb3JtYXQgewotCXN0YXRpYyBmaW5hbCBpbnQgQk1QRmlsZUhlYWRlclNpemUgPSAxNDsKLQlzdGF0aWMgZmluYWwgaW50IEJNUEhlYWRlckZpeGVkU2l6ZSA9IDQwOwotCWludCBpbXBvcnRhbnRDb2xvcnM7Ci0KLXZvaWQgZGVjb21wcmVzc0RhdGEoYnl0ZVtdIHNyYywgYnl0ZVtdIGRlc3QsIGludCBzdHJpZGUsIGludCBjbXApIHsKLQlpZiAoY21wID09IDEpIHsgLy8gQk1QX1JMRThfQ09NUFJFU1NJT04KLQkJaWYgKGRlY29tcHJlc3NSTEU4RGF0YShzcmMsIHNyYy5sZW5ndGgsIHN0cmlkZSwgZGVzdCwgZGVzdC5sZW5ndGgpIDw9IDApCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQlyZXR1cm47Ci0JfQotCWlmIChjbXAgPT0gMikgeyAvLyBCTVBfUkxFNF9DT01QUkVTU0lPTgotCQlpZiAoZGVjb21wcmVzc1JMRTREYXRhKHNyYywgc3JjLmxlbmd0aCwgc3RyaWRlLCBkZXN0LCBkZXN0Lmxlbmd0aCkgPD0gMCkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLX0KLWludCBkZWNvbXByZXNzUkxFNERhdGEoYnl0ZVtdIHNyYywgaW50IG51bUJ5dGVzLCBpbnQgc3RyaWRlLCBieXRlW10gZGVzdCwgaW50IGRlc3RTaXplKSB7Ci0JaW50IHNwID0gMDsKLQlpbnQgc2UgPSBudW1CeXRlczsKLQlpbnQgZHAgPSAwOwotCWludCBkZSA9IGRlc3RTaXplOwotCWludCB4ID0gMCwgeSA9IDA7Ci0Jd2hpbGUgKHNwIDwgc2UpIHsKLQkJaW50IGxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQlzcCsrOwotCQlpZiAobGVuID09IDApIHsKLQkJCWxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQkJc3ArKzsKLQkJCXN3aXRjaCAobGVuKSB7Ci0JCQkJY2FzZSAwOiAvKiBlbmQgb2YgbGluZSAqLwotCQkJCQl5Kys7Ci0JCQkJCXggPSAwOwotCQkJCQlkcCA9IHkgKiBzdHJpZGU7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAvKiBlbmQgb2YgYml0bWFwICovCi0JCQkJCXJldHVybiAxOwotCQkJCWNhc2UgMjogLyogZGVsdGEgKi8KLQkJCQkJeCArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJeSArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJZHAgPSB5ICogc3RyaWRlICsgeCAvIDI7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogLyogYWJzb2x1dGUgbW9kZSBydW4gKi8KLQkJCQkJaWYgKChsZW4gJiAxKSAhPSAwKSAvKiBvZGQgcnVuIGxlbmd0aHMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJeCArPSBsZW47Ci0JCQkJCWxlbiA9IGxlbiAvIDI7Ci0JCQkJCWlmIChsZW4gPiAoc2UgLSBzcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQkJCWRlc3RbZHBdID0gc3JjW3NwXTsKLQkJCQkJCWRwKys7Ci0JCQkJCQlzcCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoc3AgJiAxKSAhPSAwKQotCQkJCQkJc3ArKzsgLyogd29yZCBhbGlnbiBzcD8gKi8KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKGxlbiAmIDEpICE9IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJeCArPSBsZW47Ci0JCQlsZW4gPSBsZW4gLyAyOwotCQkJYnl0ZSB0aGVCeXRlID0gc3JjW3NwXTsKLQkJCXNwKys7Ci0JCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCXJldHVybiAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlkZXN0W2RwXSA9IHRoZUJ5dGU7Ci0JCQkJZHArKzsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLWludCBkZWNvbXByZXNzUkxFOERhdGEoYnl0ZVtdIHNyYywgaW50IG51bUJ5dGVzLCBpbnQgc3RyaWRlLCBieXRlW10gZGVzdCwgaW50IGRlc3RTaXplKSB7Ci0JaW50IHNwID0gMDsKLQlpbnQgc2UgPSBudW1CeXRlczsKLQlpbnQgZHAgPSAwOwotCWludCBkZSA9IGRlc3RTaXplOwotCWludCB4ID0gMCwgeSA9IDA7Ci0Jd2hpbGUgKHNwIDwgc2UpIHsKLQkJaW50IGxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQlzcCsrOwotCQlpZiAobGVuID09IDApIHsKLQkJCWxlbiA9IHNyY1tzcF0gJiAweEZGOwotCQkJc3ArKzsKLQkJCXN3aXRjaCAobGVuKSB7Ci0JCQkJY2FzZSAwOiAvKiBlbmQgb2YgbGluZSAqLwotCQkJCQl5Kys7Ci0JCQkJCXggPSAwOwotCQkJCQlkcCA9IHkgKiBzdHJpZGU7Ci0JCQkJCWlmIChkcCA+PSBkZSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAvKiBlbmQgb2YgYml0bWFwICovCi0JCQkJCXJldHVybiAxOwotCQkJCWNhc2UgMjogLyogZGVsdGEgKi8KLQkJCQkJeCArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJeSArPSBzcmNbc3BdICYgMHhGRjsKLQkJCQkJc3ArKzsKLQkJCQkJZHAgPSB5ICogc3RyaWRlICsgeDsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlIHJ1biAqLwotCQkJCQlpZiAobGVuID4gKHNlIC0gc3ApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCQlkZXN0W2RwXSA9IHNyY1tzcF07Ci0JCQkJCQlkcCsrOwotCQkJCQkJc3ArKzsKLQkJCQkJfQotCQkJCQlpZiAoKHNwICYgMSkgIT0gMCkKLQkJCQkJCXNwKys7IC8qIHdvcmQgYWxpZ24gc3A/ICovCi0JCQkJCXggKz0gbGVuOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ5dGUgdGhlQnl0ZSA9IHNyY1tzcF07Ci0JCQlzcCsrOwotCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJZGVzdFtkcF0gPSB0aGVCeXRlOwotCQkJCWRwKys7Ci0JCQl9Ci0JCQl4ICs9IGxlbjsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLWJvb2xlYW4gaXNGaWxlRm9ybWF0KExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVsxOF07Ci0JCXN0cmVhbS5yZWFkKGhlYWRlcik7Ci0JCXN0cmVhbS51bnJlYWQoaGVhZGVyKTsKLQkJaW50IGluZm9IZWFkZXJTaXplID0gKGhlYWRlclsxNF0gJiAweEZGKSB8ICgoaGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpIHwgKChoZWFkZXJbMTZdICYgMHhGRikgPDwgMTYpIHwgKChoZWFkZXJbMTddICYgMHhGRikgPDwgMjQpOwotCQlyZXR1cm4gaGVhZGVyWzBdID09IDB4NDIgJiYgaGVhZGVyWzFdID09IDB4NEQgJiYgaW5mb0hlYWRlclNpemUgPj0gQk1QSGVhZGVyRml4ZWRTaXplOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1ieXRlW10gbG9hZERhdGEoYnl0ZVtdIGluZm9IZWFkZXIpIHsKLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBiaXRDb3VudCArIDcpIC8gODsKLQlzdHJpZGUgPSAoc3RyaWRlICsgMykgLyA0ICogNDsgLy8gUm91bmQgdXAgdG8gNCBieXRlIG11bHRpcGxlCi0JYnl0ZVtdIGRhdGEgPSBsb2FkRGF0YShpbmZvSGVhZGVyLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBoZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotYnl0ZVtdIGxvYWREYXRhKGJ5dGVbXSBpbmZvSGVhZGVyLCBpbnQgc3RyaWRlKSB7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBkYXRhU2l6ZSA9IGhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gKGluZm9IZWFkZXJbMTZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMThdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzE5XSAmIDB4RkYpIDw8IDI0KTsKLQlpZiAoY21wID09IDApIHsgLy8gQk1QX05PX0NPTVBSRVNTSU9OCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChkYXRhKSAhPSBkYXRhU2l6ZSkKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBjb21wcmVzc2VkU2l6ZSA9IChpbmZvSGVhZGVyWzIwXSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzIxXSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzIyXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsyM10gJiAweEZGKSA8PCAyNCk7Ci0JCWJ5dGVbXSBjb21wcmVzc2VkID0gbmV3IGJ5dGVbY29tcHJlc3NlZFNpemVdOwotCQl0cnkgewotCQkJaWYgKGlucHV0U3RyZWFtLnJlYWQoY29tcHJlc3NlZCkgIT0gY29tcHJlc3NlZFNpemUpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQkJZGVjb21wcmVzc0RhdGEoY29tcHJlc3NlZCwgZGF0YSwgc3RyaWRlLCBjbXApOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLWludFtdIGxvYWRGaWxlSGVhZGVyKCkgewotCWludFtdIGhlYWRlciA9IG5ldyBpbnRbNV07Ci0JdHJ5IHsKLQkJaGVhZGVyWzBdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclsxXSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaGVhZGVyWzJdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlclszXSA9IGlucHV0U3RyZWFtLnJlYWRTaG9ydCgpOwotCQloZWFkZXJbNF0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKGhlYWRlclswXSAhPSAweDRENDIpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIGhlYWRlcjsKLX0KLUltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbG9hZEZpbGVIZWFkZXIoKTsKLQlieXRlW10gaW5mb0hlYWRlciA9IG5ldyBieXRlW0JNUEhlYWRlckZpeGVkU2l6ZV07Ci0JdHJ5IHsKLQkJaW5wdXRTdHJlYW0ucmVhZChpbmZvSGVhZGVyKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoaW5mb0hlYWRlcik7Ci0JaWYgKGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkgPCBmaWxlSGVhZGVyWzRdKSB7Ci0JCS8vIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLnNraXAoZmlsZUhlYWRlcls0XSAtIGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCX0KLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGluZm9IZWFkZXIpOwotCXRoaXMuY29tcHJlc3Npb24gPSAoaW5mb0hlYWRlclsxNl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxN10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxOF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTldICYgMHhGRikgPDwgMjQpOwotCXRoaXMuaW1wb3J0YW50Q29sb3JzID0gKGluZm9IZWFkZXJbMzZdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMzddICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMzhdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzM5XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgeFBlbHNQZXJNZXRlciA9IChpbmZvSGVhZGVyWzI0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzI1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzI2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsyN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IHlQZWxzUGVyTWV0ZXIgPSAoaW5mb0hlYWRlclsyOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclszMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMzFdICYgMHhGRikgPDwgMjQpOwotCWludCB0eXBlID0gKHRoaXMuY29tcHJlc3Npb24gPT0gMSAvKkJNUF9STEU4X0NPTVBSRVNTSU9OKi8pIHx8ICh0aGlzLmNvbXByZXNzaW9uID09IDIgCi0KLS8qQk1QX1JMRTRfQ09NUFJFU1NJT04qLykgPyBTV1QuSU1BR0VfQk1QX1JMRSA6IFNXVC5JTUFHRV9CTVA7Ci0JcmV0dXJuIG5ldyBJbWFnZURhdGFbXSB7Ci0JCUltYWdlRGF0YS5pbnRlcm5hbF9uZXcoCi0JCQl3aWR0aCwKLQkJCWhlaWdodCwKLQkJCWJpdENvdW50LAotCQkJcGFsZXR0ZSwKLQkJCTQsCi0JCQlkYXRhLAotCQkJMCwKLQkJCW51bGwsCi0JCQludWxsLAotCQkJLTEsCi0JCQktMSwKLQkJCXR5cGUsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQkwKQotCX07Ci19Ci1QYWxldHRlRGF0YSBsb2FkUGFsZXR0ZShieXRlW10gaW5mb0hlYWRlcikgewotCWludCBkZXB0aCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCWludCBudW1Db2xvcnMgPSAoaW5mb0hlYWRlclszMl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclszM10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclszNF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMzVdICYgMHhGRikgPDwgMjQpOwotCQlpZiAobnVtQ29sb3JzID09IDApIHsKLQkJCW51bUNvbG9ycyA9IDEgPDwgZGVwdGg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobnVtQ29sb3JzID4gMjU2KQotCQkJCW51bUNvbG9ycyA9IDI1NjsKLQkJfQotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbnVtQ29sb3JzICogNF07Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChidWYpICE9IGJ1Zi5sZW5ndGgpCi0JCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JCX0KLQkJcmV0dXJuIHBhbGV0dGVGcm9tQnl0ZXMoYnVmLCBudW1Db2xvcnMpOwotCX0KLQlpZiAoZGVwdGggPT0gMTYpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHg3QzAwLCAweDNFMCwgMHgxRik7Ci0JaWYgKGRlcHRoID09IDI0KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYsIDB4RkYwMCwgMHhGRjAwMDApOwotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwLCAweEZGMDAwMCwgMHhGRjAwMDAwMCk7Ci19Ci1QYWxldHRlRGF0YSBwYWxldHRlRnJvbUJ5dGVzKGJ5dGVbXSBieXRlcywgaW50IG51bUNvbG9ycykgewotCWludCBieXRlc09mZnNldCA9IDA7Ci0JUkdCW10gY29sb3JzID0gbmV3IFJHQltudW1Db2xvcnNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JzOyBpKyspIHsKLQkJY29sb3JzW2ldID0gbmV3IFJHQihieXRlc1tieXRlc09mZnNldCArIDJdICYgMHhGRiwKLQkJCWJ5dGVzW2J5dGVzT2Zmc2V0ICsgMV0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXRdICYgMHhGRik7Ci0JCWJ5dGVzT2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBuZXcgUGFsZXR0ZURhdGEoY29sb3JzKTsKLX0KLS8qKgotICogQW5zd2VyIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBCTVAgcmVwcmVzZW50YXRpb24gb2YKLSAqIHRoZSBnaXZlbiBkZXZpY2UgaW5kZXBlbmRlbnQgcGFsZXR0ZS4KLSAqLwotc3RhdGljIGJ5dGVbXSBwYWxldHRlVG9CeXRlcyhQYWxldHRlRGF0YSBwYWwpIHsKLQlpbnQgbiA9IHBhbC5jb2xvcnMgPT0gbnVsbCA/IDAgOiAocGFsLmNvbG9ycy5sZW5ndGggPCAyNTYgPyBwYWwuY29sb3JzLmxlbmd0aCA6IDI1Nik7Ci0JYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbiAqIDRdOwotCWludCBvZmZzZXQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVJHQiBjb2wgPSBwYWwuY29sb3JzW2ldOwotCQlieXRlc1tvZmZzZXRdID0gKGJ5dGUpY29sLmJsdWU7Ci0JCWJ5dGVzW29mZnNldCArIDFdID0gKGJ5dGUpY29sLmdyZWVuOwotCQlieXRlc1tvZmZzZXQgKyAyXSA9IChieXRlKWNvbC5yZWQ7Ci0JCW9mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXZvaWQgZmxpcFNjYW5MaW5lcyhieXRlW10gZGF0YSwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkgewotCWludCBpMSA9IDA7Ci0JaW50IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspIHsKLQkJCWJ5dGUgYiA9IGRhdGFbaW5kZXggKyBpMV07Ci0JCQlkYXRhW2luZGV4ICsgaTFdID0gZGF0YVtpbmRleCArIGkyXTsKLQkJCWRhdGFbaW5kZXggKyBpMl0gPSBiOwotCQl9Ci0JCWkxICs9IHN0cmlkZTsKLQkJaTIgLT0gc3RyaWRlOwotCX0KLX0KLQotfQotCi1zdGF0aWMgY2xhc3MgV2luSUNPRmlsZUZvcm1hdCBleHRlbmRzIEZpbGVGb3JtYXQgewotCQotc3RhdGljIGZpbmFsIGJ5dGVbXSBjb252ZXJ0UGFkKGJ5dGVbXSBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBhZCwgaW50IG5ld1BhZCkgewotCWlmIChwYWQgPT0gbmV3UGFkKSByZXR1cm4gZGF0YTsKLQlpbnQgc3RyaWRlID0gKHdpZHRoICogZGVwdGggKyA3KSAvIDg7Ci0JaW50IGJwbCA9IChzdHJpZGUgKyAocGFkIC0gMSkpIC8gcGFkICogcGFkOwotCWludCBuZXdCcGwgPSAoc3RyaWRlICsgKG5ld1BhZCAtIDEpKSAvIG5ld1BhZCAqIG5ld1BhZDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2hlaWdodCAqIG5ld0JwbF07Ci0JaW50IHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgbmV3QnBsKTsKLQkJc3JjSW5kZXggKz0gYnBsOwotCQlkZXN0SW5kZXggKz0gbmV3QnBsOwotCX0KLQlyZXR1cm4gbmV3RGF0YTsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbgotICogaWNvbgotICovCi1pbnQgaWNvblNpemUoSW1hZ2VEYXRhIGkpIHsKLQlpbnQgc2hhcGVEYXRhU3RyaWRlID0gKGkud2lkdGggKiBpLmRlcHRoICsgMzEpIC8gMzIgKiA0OwotCWludCBtYXNrRGF0YVN0cmlkZSA9IChpLndpZHRoICsgMzEpIC8gMzIgKiA0OwotCWludCBkYXRhU2l6ZSA9IChzaGFwZURhdGFTdHJpZGUgKyBtYXNrRGF0YVN0cmlkZSkgKiBpLmhlaWdodDsKLQlpbnQgcGFsZXR0ZVNpemUgPSBpLnBhbGV0dGUuY29sb3JzICE9IG51bGwgPyBpLnBhbGV0dGUuY29sb3JzLmxlbmd0aCAqIDQgOiAwOwotCXJldHVybiBXaW5CTVBGaWxlRm9ybWF0LkJNUEhlYWRlckZpeGVkU2l6ZSArIHBhbGV0dGVTaXplICsgZGF0YVNpemU7Ci19Ci1ib29sZWFuIGlzRmlsZUZvcm1hdChMRURhdGFJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQl0cnkgewotCQlieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbNF07Ci0JCXN0cmVhbS5yZWFkKGhlYWRlcik7Ci0JCXN0cmVhbS51bnJlYWQoaGVhZGVyKTsKLQkJcmV0dXJuIGhlYWRlclswXSA9PSAwICYmIGhlYWRlclsxXSA9PSAwICYmIGhlYWRlclsyXSA9PSAxICYmIGhlYWRlclszXSA9PSAwOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1ib29sZWFuIGlzVmFsaWRJY29uKEltYWdlRGF0YSBpKSB7Ci0Jc3dpdGNoIChpLmRlcHRoKSB7Ci0JCWNhc2UgMToKLQkJY2FzZSA0OgotCQljYXNlIDg6Ci0JCQlpZiAoaS5wYWxldHRlLmlzRGlyZWN0KSByZXR1cm4gZmFsc2U7Ci0JCQlpbnQgc2l6ZSA9IGkucGFsZXR0ZS5jb2xvcnMubGVuZ3RoOwotCQkJcmV0dXJuIHNpemUgPT0gMiB8fCBzaXplID09IDE2IHx8IHNpemUgPT0gMzIgfHwgc2l6ZSA9PSAyNTY7Ci0JCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6Ci0JCQlyZXR1cm4gaS5wYWxldHRlLmlzRGlyZWN0OwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1pbnQgbG9hZEZpbGVIZWFkZXIoTEVEYXRhSW5wdXRTdHJlYW0gYnl0ZVN0cmVhbSkgewotCWludFtdIGZpbGVIZWFkZXIgPSBuZXcgaW50WzNdOwotCXRyeSB7Ci0JCWZpbGVIZWFkZXJbMF0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQlmaWxlSGVhZGVyWzFdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJZmlsZUhlYWRlclsyXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKChmaWxlSGVhZGVyWzBdICE9IDApIHx8IChmaWxlSGVhZGVyWzFdICE9IDEpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWludCBudW1JY29ucyA9IGZpbGVIZWFkZXJbMl07Ci0JaWYgKG51bUljb25zIDw9IDApCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIG51bUljb25zOwotfQotaW50IGxvYWRGaWxlSGVhZGVyKExFRGF0YUlucHV0U3RyZWFtIGJ5dGVTdHJlYW0sIGJvb2xlYW4gaGFzSGVhZGVyKSB7Ci0JaW50W10gZmlsZUhlYWRlciA9IG5ldyBpbnRbM107Ci0JdHJ5IHsKLQkJaWYgKGhhc0hlYWRlcikgewotCQkJZmlsZUhlYWRlclswXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQlmaWxlSGVhZGVyWzFdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVIZWFkZXJbMF0gPSAwOwotCQkJZmlsZUhlYWRlclsxXSA9IDE7Ci0JCX0KLQkJZmlsZUhlYWRlclsyXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKChmaWxlSGVhZGVyWzBdICE9IDApIHx8IChmaWxlSGVhZGVyWzFdICE9IDEpKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWludCBudW1JY29ucyA9IGZpbGVIZWFkZXJbMl07Ci0JaWYgKG51bUljb25zIDw9IDApCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JcmV0dXJuIG51bUljb25zOwotfQotSW1hZ2VEYXRhW10gbG9hZEZyb21CeXRlU3RyZWFtKCkgewotCWludCBudW1JY29ucyA9IGxvYWRGaWxlSGVhZGVyKGlucHV0U3RyZWFtKTsKLQlpbnRbXVtdIGhlYWRlcnMgPSBsb2FkSWNvbkhlYWRlcnMobnVtSWNvbnMpOwotCUltYWdlRGF0YVtdIGljb25zID0gbmV3IEltYWdlRGF0YVtoZWFkZXJzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykgewotCQlpY29uc1tpXSA9IGxvYWRJY29uKGhlYWRlcnNbaV0pOwotCX0KLQlyZXR1cm4gaWNvbnM7Ci19Ci0vKioKLSAqIExvYWQgb25lIGljb24gZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCi0gKi8KLUltYWdlRGF0YSBsb2FkSWNvbihpbnRbXSBpY29uSGVhZGVyKSB7Ci0JYnl0ZVtdIGluZm9IZWFkZXIgPSBsb2FkSW5mb0hlYWRlcihpY29uSGVhZGVyKTsKLQlXaW5CTVBGaWxlRm9ybWF0IGJtcEZvcm1hdCA9IG5ldyBXaW5CTVBGaWxlRm9ybWF0KCk7Ci0JYm1wRm9ybWF0LmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGJtcEZvcm1hdC5sb2FkUGFsZXR0ZShpbmZvSGVhZGVyKTsKLQlieXRlW10gc2hhcGVEYXRhID0gYm1wRm9ybWF0LmxvYWREYXRhKGluZm9IZWFkZXIpOwotCWludCB3aWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGRlcHRoID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaW5mb0hlYWRlclsxNF0gPSAxOwotCWluZm9IZWFkZXJbMTVdID0gMDsKLQlieXRlW10gbWFza0RhdGEgPSBibXBGb3JtYXQubG9hZERhdGEoaW5mb0hlYWRlcik7Ci0JbWFza0RhdGEgPSBjb252ZXJ0UGFkKG1hc2tEYXRhLCB3aWR0aCwgaGVpZ2h0LCAxLCA0LCAyKTsKLQliaXRJbnZlcnREYXRhKG1hc2tEYXRhLCAwLCBtYXNrRGF0YS5sZW5ndGgpOwotCXJldHVybiBJbWFnZURhdGEuaW50ZXJuYWxfbmV3KAotCQl3aWR0aCwKLQkJaGVpZ2h0LAotCQlkZXB0aCwKLQkJcGFsZXR0ZSwKLQkJNCwKLQkJc2hhcGVEYXRhLAotCQkyLAotCQltYXNrRGF0YSwKLQkJbnVsbCwKLQkJLTEsCi0JCS0xLAotCQlTV1QuSU1BR0VfSUNPLAotCQkwLAotCQkwLAotCQkwLAotCQkwKTsKLX0KLWludFtdW10gbG9hZEljb25IZWFkZXJzKGludCBudW1JY29ucykgewotCWludFtdW10gaGVhZGVycyA9IG5ldyBpbnRbbnVtSWNvbnNdWzddOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSWNvbnM7IGkrKykgewotCQkJaGVhZGVyc1tpXVswXSA9IGlucHV0U3RyZWFtLnJlYWQoKTsKLQkJCWhlYWRlcnNbaV1bMV0gPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQloZWFkZXJzW2ldWzJdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzNdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzRdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCQloZWFkZXJzW2ldWzVdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQkJaGVhZGVyc1tpXVs2XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotCXJldHVybiBoZWFkZXJzOwotfQotYnl0ZVtdIGxvYWRJbmZvSGVhZGVyKGludFtdIGljb25IZWFkZXIpIHsKLQlpbnQgd2lkdGggPSBpY29uSGVhZGVyWzBdOwotCWludCBoZWlnaHQgPSBpY29uSGVhZGVyWzFdOwotCWludCBudW1Db2xvcnMgPSBpY29uSGVhZGVyWzJdOyAvLyB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpcyBpbiB0aGUgbG93IGJ5dGUsIGJ1dCB0aGUgaGlnaCBieXRlIG11c3QgYmUgMAotCWlmIChudW1Db2xvcnMgPT0gMCkgbnVtQ29sb3JzID0gMjU2OyAvLyB0aGlzIGlzIHNwZWNpZmllZDogJzAwJyByZXByZXNlbnRzICcyNTYnICgweDEwMCkgY29sb3JzCi0JaWYgKChudW1Db2xvcnMgIT0gMikgJiYgKG51bUNvbG9ycyAhPSA4KSAmJiAobnVtQ29sb3JzICE9IDE2KSAmJgotCQkobnVtQ29sb3JzICE9IDMyKSAmJiAobnVtQ29sb3JzICE9IDI1NikpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaWYgKGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkgPCBpY29uSGVhZGVyWzZdKSB7Ci0JCS8vIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLnNraXAoaWNvbkhlYWRlcls2XSAtIGlucHV0U3RyZWFtLmdldFBvc2l0aW9uKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbmV3IGJ5dGVbV2luQk1QRmlsZUZvcm1hdC5CTVBIZWFkZXJGaXhlZFNpemVdOwotCXRyeSB7Ci0JCWlucHV0U3RyZWFtLnJlYWQoaW5mb0hlYWRlcik7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JaWYgKCgoaW5mb0hlYWRlclsxMl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxM10gJiAweEZGKSA8PCA4KSkgIT0gMSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbnQgaW5mb1dpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBpbmZvSGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGJpdENvdW50ID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaWYgKGhlaWdodCA9PSBpbmZvSGVpZ2h0ICYmIGJpdENvdW50ID09IDEpIGhlaWdodCAvPSAyOwotCWlmICghKCh3aWR0aCA9PSBpbmZvV2lkdGgpICYmIChoZWlnaHQgKiAyID09IGluZm9IZWlnaHQpICYmCi0JCShiaXRDb3VudCA9PSAxIHx8IGJpdENvdW50ID09IDQgfHwgYml0Q291bnQgPT0gOCB8fCBiaXRDb3VudCA9PSAyNCB8fCBiaXRDb3VudCA9PSAzMikpKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpbmZvSGVhZGVyWzhdID0gKGJ5dGUpKGhlaWdodCAmIDB4RkYpOwotCWluZm9IZWFkZXJbOV0gPSAoYnl0ZSkoKGhlaWdodCA+PiA4KSAmIDB4RkYpOwotCWluZm9IZWFkZXJbMTBdID0gKGJ5dGUpKChoZWlnaHQgPj4gMTYpICYgMHhGRik7Ci0JaW5mb0hlYWRlclsxMV0gPSAoYnl0ZSkoKGhlaWdodCA+PiAyNCkgJiAweEZGKTsKLQlyZXR1cm4gaW5mb0hlYWRlcjsKLX0KLX0KLXN0YXRpYyBjbGFzcyBTV1QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX0lDTyA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU8gPSAzOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lNQUdFID0gNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTlVMTF9BUkdVTUVOVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9BUkdVTUVOVCA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ0FOTk9UX0JFX1pFUk8gPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX1VOREVGSU5FRCA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIID0gMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX01BU0sgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfRk9STUFUID0gNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX0FMUEhBID0gMSA8PCAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9OT05FID0gMHgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9QSVhFTCA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRV9CTVAgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX0JNUF9STEUgPSAxOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgIitjb2RlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGludCBjb2RlLCBUaHJvd2FibGUgdCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl80LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzE2XzQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGEzZDU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzE2XzQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMTZfOC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl84LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhNTFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8xNl84LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzQuYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMzJfNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZmViMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfMzJfNC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF8zMl84LmJtcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0MDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzMyXzguYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfNC5ibXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF80OF80LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0YWJhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9JY29uIEV4ZS9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvdGVzdF80OF80LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0ljb24gRXhlL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC90ZXN0XzQ4XzguYm1wIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NjY3N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSWNvbiBFeGUvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL3Rlc3RfNDhfOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xhc3NEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xhc3NEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjAwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsYXNzRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIENsYXNzRGF0YSBleHRlbmRzIEl0ZW1EYXRhIHsKLQkKLQlDbGFzcyBjbGF6ejsKLQotcHVibGljIENsYXNzRGF0YShDbGFzcyBjbGF6eiwgU3RyaW5nIHN0cikgewotCXN1cGVyKHN0cik7Ci0JdGhpcy5jbGF6eiA9IGNsYXp6OwotfQotCQotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxGbGFncygpIHsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde0ZMQUdfTk9fR0VOLCBGTEFHX0NQUH07Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRDbGF6eigpIHsKLQlyZXR1cm4gY2xheno7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiZXhjbHVkZSIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFeGNsdWRlKFN0cmluZyBzdHIpIHsgCi0Jc2V0UGFyYW0oImV4Y2x1ZGUiLCBzdHIpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENsYXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGQwZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsZWFudXBDbGFzcyBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLVN0cmluZyBjbGFzc1NvdXJjZVBhdGg7Ci1TdHJpbmdbXSBzb3VyY2VQYXRoOwotU3RyaW5nIGNsYXNzU291cmNlOwotSGFzaHRhYmxlIGZpbGVzOwotaW50IHVzZWRDb3VudCwgdW51c2VkQ291bnQ7Ci0KLXZvaWQgbG9hZENsYXNzU291cmNlKCkgewotCWlmIChjbGFzc1NvdXJjZVBhdGggPT0gbnVsbCkgcmV0dXJuOwotCUZpbGUgZiA9IG5ldyBGaWxlKGNsYXNzU291cmNlUGF0aCk7Ci0JY2xhc3NTb3VyY2UgPSBsb2FkRmlsZShmKTsKLX0KLQotdm9pZCBsb2FkRmlsZXMgKCkgewotCS8vIEJBRCAtIGhvbGRzIG9uIHRvIGEgbG90IG9mIG1lbW9yeQotCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHJldHVybjsKLQlmaWxlcyA9IG5ldyBIYXNodGFibGUgKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNvdXJjZVBhdGhbaV0pOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aCgiLmphdmEiKSkgewotCQkJCQlmaWxlcy5wdXQoZmlsZSwgbG9hZEZpbGUoZmlsZSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbG9hZERpcmVjdG9yeShmaWxlKTsKLQkJCX0JCQotCQl9Ci0JfQotfQotCi1TdHJpbmcgbG9hZEZpbGUgKEZpbGUgZmlsZSkgewotCXRyeSB7Ci0JCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOwotCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCWludCByZWFkOwotCQl3aGlsZSAoKHJlYWQgPSBici5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQlzdHIuYXBwZW5kKGJ1ZmZlciwgMCwgcmVhZCk7Ci0JCX0KLQkJZnIuY2xvc2UoKTsKLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCXJldHVybiAiIjsKLX0KLQotdm9pZCBsb2FkRGlyZWN0b3J5KEZpbGUgZmlsZSkgewotCVN0cmluZ1tdIGVudHJpZXMgPSBmaWxlLmxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZSwgZW50cnkpOwotCQlpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGYuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKLQkJCQlmaWxlcy5wdXQoZiwgbG9hZEZpbGUoZikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9hZERpcmVjdG9yeShmKTsKLQkJfQkJCQkJCi0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCWxvYWRGaWxlcyAoKTsKLQlsb2FkQ2xhc3NTb3VyY2UoKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmdbXSBzb3VyY2VQYXRoKSB7Ci0JdGhpcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDsKLQlmaWxlcyA9IG51bGw7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsYXNzU291cmNlUGF0aChTdHJpbmcgY2xhc3NTb3VyY2VQYXRoKSB7Ci0JdGhpcy5jbGFzc1NvdXJjZVBhdGggPSBjbGFzc1NvdXJjZVBhdGg7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ2xlYW51cENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJkMzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENsZWFudXBDb25zdGFudHMgZXh0ZW5kcyBDbGVhbnVwQ2xhc3MgewotCi1TdHJpbmcgZ2V0RmllbGRWYWx1ZShGaWVsZCBmaWVsZCkgewotCVN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCWludCBpbmRleCA9IDA7Ci0Jd2hpbGUgKHRydWUpIHsKLQkJaW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKG5hbWUsIGluZGV4ICsgMSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7Ci0JCWludCBlcXVhbHNJbmRleCA9IGNsYXNzU291cmNlLmluZGV4T2YoIj0iLCBpbmRleCk7Ci0JCWlmIChjbGFzc1NvdXJjZS5zdWJzdHJpbmcoaW5kZXggKyBuYW1lLmxlbmd0aCgpLCBlcXVhbHNJbmRleCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWludCBzZW1pSW5kZXggPSBjbGFzc1NvdXJjZS5pbmRleE9mKCI7IiwgZXF1YWxzSW5kZXgpOwotIAkJCXJldHVybiBjbGFzc1NvdXJjZS5zdWJzdHJpbmcoZXF1YWxzSW5kZXggKyAxLCBzZW1pSW5kZXgpLnRyaW0oKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQl1bnVzZWRDb3VudCA9IHVzZWRDb3VudCA9IDA7Ci0Jc3VwZXIuZ2VuZXJhdGUoY2xhenopOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlnZW5lcmF0ZShmaWVsZHMpOwotCW91dHB1dCgidXNlZD0iICsgdXNlZENvdW50ICsgIiB1bnVzZWQ9IiArIHVudXNlZENvdW50ICsgIiB0b3RhbD0iICsgKHVudXNlZENvdW50ICsgdXNlZENvdW50KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkW10gZmllbGRzKSB7Ci0Jc29ydChmaWVsZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuRklOQUwpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZCBmaWVsZCkgewotCVN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCUVudW1lcmF0aW9uIGtleXMgPSBmaWxlcy5rZXlzKCk7Ci0Jd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpZmlsZXMuZ2V0KGtleSk7Ci0JCWlmIChzdHIuaW5kZXhPZihuYW1lKSAhPSAtMSkgewotCQkJaW50IG1vZGlmaWVycyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQkJU3RyaW5nIG1vZGlmaWVyc1N0ciA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyk7Ci0JCQlvdXRwdXQoIlx0Iik7Ci0JCQlvdXRwdXQobW9kaWZpZXJzU3RyKTsKLQkJCWlmIChtb2RpZmllcnNTdHIubGVuZ3RoKCkgPiAwKSBvdXRwdXQoIiAiKTsKLQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMyhmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCW91dHB1dCgiICIgKTsKLQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0KCIgPSAiKTsKLQkJCW91dHB1dChnZXRGaWVsZFZhbHVlKGZpZWxkKSk7Ci0JCQlvdXRwdXRsbigiOyIpOwotCQkJdXNlZENvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdW51c2VkQ291bnQrKzsKLQkvL291dHB1dCgiTk9UIFVTRUQ9IiArIGZpZWxkLnRvU3RyaW5nKCkgKyAiIFxuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ2xlYW51cENvbnN0YW50cyA8T1MgY2xhc3NOYW1lPiA8Y2xhc3Mgc291cmNlPiA8c3JjIHBhdGgxPiA8c3JjIHBhdGgyPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNsZWFudXBDb25zdGFudHMgZ2VuID0gbmV3IENsZWFudXBDb25zdGFudHMoKTsKLQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbMF07Ci0JCVN0cmluZyBjbGFzc1NvdXJjZSA9IGFyZ3NbMV07Ci0JCVN0cmluZ1tdIHNvdXJjZVBhdGggPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoIC0gMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJncywgMiwgc291cmNlUGF0aCwgMCwgc291cmNlUGF0aC5sZW5ndGgpOwotCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhenpOYW1lKTsKLQkJZ2VuLnNldFNvdXJjZVBhdGgoc291cmNlUGF0aCk7Ci0JCWdlbi5zZXRDbGFzc1NvdXJjZVBhdGgoY2xhc3NTb3VyY2UpOwotCQlnZW4uZ2VuZXJhdGUoY2xhenopOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9DbGVhbnVwTmF0aXZlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBOYXRpdmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNmRhZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NsZWFudXBOYXRpdmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwTmF0aXZlcyBleHRlbmRzIENsZWFudXBDbGFzcyB7Ci0JCi1wdWJsaWMgQ2xlYW51cE5hdGl2ZXMoKSB7Ci19Ci0KLVN0cmluZ1tdIGdldEFyZ05hbWVzKE1ldGhvZCBtZXRob2QpIHsKLQlpbnQgbl9hcmdzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOwotCWlmIChuX2FyZ3MgPT0gMCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCVN0cmluZyBwYXJhbXMgPSAiIjsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlICh0cnVlKSB7Ci0JCWluZGV4ID0gY2xhc3NTb3VyY2UuaW5kZXhPZihuYW1lLCBpbmRleCArIDEpOwotCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2xhc3NTb3VyY2UuY2hhckF0KGluZGV4IC0gMSkpKSBjb250aW51ZTsKLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm4gbnVsbDsKLQkJaW50IHBhcmFudGVzZXNTdGFydCA9IGNsYXNzU291cmNlLmluZGV4T2YoIigiLCBpbmRleCk7Ci0JCWlmIChjbGFzc1NvdXJjZS5zdWJzdHJpbmcoaW5kZXggKyBuYW1lLmxlbmd0aCgpLCBwYXJhbnRlc2VzU3RhcnQpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgcGFyYW50ZXNlc0VuZCA9IGNsYXNzU291cmNlLmluZGV4T2YoIikiLCBwYXJhbnRlc2VzU3RhcnQpOwotIAkJCXBhcmFtcyA9IGNsYXNzU291cmNlLnN1YnN0cmluZyhwYXJhbnRlc2VzU3RhcnQgKyAxLCBwYXJhbnRlc2VzRW5kKTsKLSAJCQlicmVhazsKLQkJfQotCX0KLQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbbl9hcmdzXTsKLQlTdHJpbmdUb2tlbml6ZXIgdGsgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhcmFtcywgIiwiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBzID0gdGsubmV4dFRva2VuKCkudHJpbSgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdGsxID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiICIpOwotCQlTdHJpbmcgczEgPSBudWxsOwotCQl3aGlsZSAodGsxLmhhc01vcmVUb2tlbnMoKSkgewotCQkJczEgPSB0azEubmV4dFRva2VuKCk7Ci0JCX0KLQkJbmFtZXNbaV0gPSBzMS50cmltKCk7Ci0JfQotCXJldHVybiBuYW1lczsJCi19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JdW51c2VkQ291bnQgPSB1c2VkQ291bnQgPSAwOwotCXN1cGVyLmdlbmVyYXRlKGNsYXp6KTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZ2VuZXJhdGUobWV0aG9kcyk7Ci0Jb3V0cHV0KCJ1c2VkPSIgKyB1c2VkQ291bnQgKyAiIHVudXNlZD0iICsgdW51c2VkQ291bnQgKyAiIHRvdGFsPSIgKyAodW51c2VkQ291bnQgKyB1c2VkQ291bnQpKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoTWV0aG9kW10gbWV0aG9kcykgewotCXNvcnQobWV0aG9kcyk7CQotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShtZXRob2QpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoTWV0aG9kIG1ldGhvZCkgewotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gZmlsZXMua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKWZpbGVzLmdldChrZXkpOwotCQlpZiAoc3RyLmluZGV4T2YobmFtZSkgIT0gLTEpIHsKLS8vCQkJaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLS8vCQkJQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLS8vCQkJU3RyaW5nIG1vZGlmaWVyc1N0ciA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyk7Ci0vLwkJCW91dHB1dChtb2RpZmllcnNTdHIpOwotLy8JCQlpZiAobW9kaWZpZXJzU3RyLmxlbmd0aCgpID4gMCkgb3V0cHV0KCIgIik7Ci0vLwkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0vLwkJCW91dHB1dCgiICIgKTsKLS8vCQkJb3V0cHV0KG1ldGhvZC5nZXROYW1lKCkpOwotLy8JCQlvdXRwdXQoIigiKTsKLS8vCQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtTmFtZXMgPSBnZXRBcmdOYW1lcyhtZXRob2QpOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0vLwkJCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0vLwkJCQlTdHJpbmcgc2lnID0gZ2V0VHlwZVNpZ25hdHVyZTMocGFyYW1UeXBlKTsKLS8vCQkJCWlmIChjbGF6ei5nZXRQYWNrYWdlKCkuZXF1YWxzKHBhcmFtVHlwZS5nZXRQYWNrYWdlKCkpKSBzaWcgPSBnZXRDbGFzc05hbWUocGFyYW1UeXBlKTsKLS8vCQkJCW91dHB1dChzaWcpOwotLy8JCQkJb3V0cHV0KCIgIik7Ci0vLwkJCQlvdXRwdXQocGFyYW1OYW1lc1tpXSk7Ci0vLwkJCX0KLS8vCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQl1c2VkQ291bnQrKzsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl1bnVzZWRDb3VudCsrOwotCW91dHB1dCgiTk9UIFVTRUQ9IiArIG1ldGhvZC50b1N0cmluZygpICsgIlxuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgQ2xlYW51cE5hdGl2ZXMgPE9TIGNsYXNzTmFtZT4gPE9TIGNsYXNzIHNvdXJjZT4gPHNyYyBwYXRoMD4gPHNyYyBwYXRoMT4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlDbGVhbnVwTmF0aXZlcyBnZW4gPSBuZXcgQ2xlYW51cE5hdGl2ZXMoKTsKLQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbMF07Ci0JCVN0cmluZyBjbGFzc1NvdXJjZSA9IGFyZ3NbMV07IAotCQlTdHJpbmdbXSBzb3VyY2VQYXRoID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDIsIHNvdXJjZVBhdGgsIDAsIHNvdXJjZVBhdGgubGVuZ3RoKTsKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXp6TmFtZSk7Ci0JCWdlbi5zZXRTb3VyY2VQYXRoKHNvdXJjZVBhdGgpOwotCQlnZW4uc2V0Q2xhc3NTb3VyY2VQYXRoKGNsYXNzU291cmNlKTsKLQkJZ2VuLmdlbmVyYXRlKGNsYXp6KTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ29uc3RhbnRzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvQ29uc3RhbnRzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjNkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0NvbnN0YW50c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBDb25zdGFudHNHZW5lcmF0b3IgZXh0ZW5kcyBKTklHZW5lcmF0b3IgewotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlnZW5lcmF0ZShmaWVsZHMpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZFtdIGZpZWxkcykgewotCXNvcnQoZmllbGRzKTsKLQlvdXRwdXRsbigiaW50IG1haW4oKSB7Iik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmICgoZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5GSU5BTCkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKGZpZWxkKTsKLQl9Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGQgZmllbGQpIHsKLQlDbGFzcyB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotCW91dHB1dCgiXHRwcmludGYoXCJwdWJsaWMgc3RhdGljIGZpbmFsICIpOwotCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMyhmaWVsZC5nZXRUeXBlKCkpKTsKLQlvdXRwdXQoIiAiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXQoIiA9ICIpOwotCWlmICh0eXBlID09IFN0cmluZy5jbGFzcyB8fCB0eXBlID09IGJ5dGVbXS5jbGFzcykgb3V0cHV0KCJcIiVzXCIiKTsKLQllbHNlIG91dHB1dCgiMHgleCIpOwotCW91dHB1dCgiO1xcblwiLCAiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXRsbigiKTsiKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBDb25zdGFudHNHZW5lcmF0b3IgPGNsYXNzTmFtZTE+IDxjbGFzc05hbWUyPiIpOwotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCUNvbnN0YW50c0dlbmVyYXRvciBnZW4gPSBuZXcgQ29uc3RhbnRzR2VuZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbaV07Ci0JCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhenpOYW1lKTsKLQkJCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0JCX0KLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRmllbGREYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvRmllbGREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzMzY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZpZWxkRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1wdWJsaWMgY2xhc3MgRmllbGREYXRhIGV4dGVuZHMgSXRlbURhdGEgewotCQotCUZpZWxkIGZpZWxkOwotCQotcHVibGljIEZpZWxkRGF0YShGaWVsZCBmaWVsZCwgU3RyaW5nIHN0cikgewotCXN1cGVyKHN0cik7Ci0JdGhpcy5maWVsZCA9IGZpZWxkOwotfQotCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbEZsYWdzKCkgewotCXJldHVybiBuZXcgU3RyaW5nW117RkxBR19OT19HRU4sIEZMQUdfTk9fV0lOQ0V9OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgewotCXJldHVybiAoU3RyaW5nKWdldFBhcmFtKCJhY2Nlc3NvciIpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhc3QoKSB7Ci0JU3RyaW5nIGNhc3QgPSAoKFN0cmluZylnZXRQYXJhbSgiY2FzdCIpKS50cmltKCk7Ci0JaWYgKGNhc3QubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghY2FzdC5zdGFydHNXaXRoKCIoIikpIGNhc3QgPSAiKCIgKyBjYXN0OwotCQlpZiAoIWNhc3QuZW5kc1dpdGgoIikiKSkgY2FzdCA9IGNhc3QgKyAiKSI7Ci0JfQotCXJldHVybiBjYXN0OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGUoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImV4Y2x1ZGUiKTsKLX0KLQotcHVibGljIEZpZWxkIGdldEZpZWxkKCkgewotCXJldHVybiBmaWVsZDsKLX0KLQotcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiYWNjZXNzb3IiLCBzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDYXN0KFN0cmluZyBzdHIpIHsKLQlzZXRQYXJhbSgiY2FzdCIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9GbGFncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZsYWdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZmQzMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0ZsYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBGbGFncyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PX0dFTiA9ICJub19nZW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9fSU4gPSAibm9faW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9fT1VUID0gIm5vX291dCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT19XSU5DRSA9ICJub193aW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DUklUSUNBTCA9ICJjcml0aWNhbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19JTklUID0gImluaXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU1RSVUNUID0gInN0cnVjdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19VTklDT0RFID0gInVuaWNvZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU0VOVElORUwgPSAic2VudGluZWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ1BQID0gImNwcCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ORVcgPSAibmV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0RFTEVURSA9ImRlbGV0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT05TVCA9ICJjb25zdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19EWU5BTUlDID0gImR5bmFtaWMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSk5JID0gImpuaSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19BRERSRVNTID0gImFkZHJlc3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR0NORVcgPSAiZ2NuZXciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR0NPQkpFQ1QgPSAiZ2NvYmplY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU0VUVEVSID0gInNldHRlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19HRVRURVIgPSAiZ2V0dGVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0FEREVSID0gImFkZGVyIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9JdGVtRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0l0ZW1EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjRjNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0l0ZW1EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJdGVtRGF0YSBpbXBsZW1lbnRzIEZsYWdzIHsKLQotCUhhc2hNYXAgcGFyYW1zOwotCi1wdWJsaWMgSXRlbURhdGEoU3RyaW5nIHN0cikgewotCXBhcnNlKHN0cik7Ci19Ci0KLXN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JU3RyaW5nVG9rZW5pemVyIHRrID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsIHNlcGFyYXRvcik7Ci0JQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQl3aGlsZSAodGsuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJcmVzdWx0LmFkZCh0ay5uZXh0RWxlbWVudCgpKTsKLQl9Ci0JcmV0dXJuIChTdHJpbmdbXSlyZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLX0KLQotcHVibGljIFN0cmluZ1tdIGdldEZsYWdzKCkgewotCU9iamVjdCBmbGFncyA9IGdldFBhcmFtKCJmbGFncyIpOwotCWlmIChmbGFncyA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQlpZiAoZmxhZ3MgaW5zdGFuY2VvZiBTdHJpbmdbXSkgcmV0dXJuIChTdHJpbmdbXSlmbGFnczsKLQlTdHJpbmdbXSByZXN1bHQgPSBzcGxpdCgoU3RyaW5nKWZsYWdzLCAiICIpOwotCXBhcmFtcy5wdXQoImZsYWdzIiwgcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGbGFnKFN0cmluZyBmbGFnKSB7Ci0JU3RyaW5nW10gZmxhZ3MgPSBnZXRGbGFncygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGZsYWdzW2ldLmVxdWFscyhmbGFnKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIE9iamVjdCBnZXRQYXJhbShTdHJpbmcga2V5KSB7Ci0JT2JqZWN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpOwotCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKLX0KLQotcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGUoKSB7Ci0JcmV0dXJuICFnZXRGbGFnKEZMQUdfTk9fR0VOKTsKLX0KLQotcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHN0cikgewotCXRoaXMucGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQlpZiAoc3RyLmxlbmd0aCgpID09IDApIHJldHVybjsKLQlTdHJpbmdbXSBwYXJhbXMgPSBzcGxpdChzdHIsICIsIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIHBhcmFtID0gcGFyYW1zW2ldOwotCQlpbnQgZXF1YWxzID0gcGFyYW0uaW5kZXhPZignPScpOwotCQlpZiAoZXF1YWxzID09ICAtMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHN0ciArICIgcGFyYW0gIiArIHBhcmFtKTsKLQkJfQotCQlTdHJpbmcga2V5ID0gcGFyYW0uc3Vic3RyaW5nKDAsIGVxdWFscykudHJpbSgpOwotCQlTdHJpbmcgdmFsdWUgPSBwYXJhbS5zdWJzdHJpbmcoZXF1YWxzICsgMSkudHJpbSgpOwotCQlzZXRQYXJhbShrZXksIHZhbHVlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZsYWdzKFN0cmluZ1tdIGZsYWdzKSB7IAotCXNldFBhcmFtKCJmbGFncyIsIGZsYWdzKTsKLX0KLQotcHVibGljIHZvaWQgc2V0RmxhZyhTdHJpbmcgZmxhZywgYm9vbGVhbiB2YWx1ZSkgewotCVN0cmluZ1tdIGZsYWdzID0gZ2V0RmxhZ3MoKTsKLQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZmxhZ3MpKTsKLQlpZiAodmFsdWUpIHsKLQkJc2V0LmFkZChmbGFnKTsKLQl9IGVsc2UgewotCQlzZXQucmVtb3ZlKGZsYWcpOwotCX0KLQlzZXRGbGFncygoU3RyaW5nW10pc2V0LnRvQXJyYXkobmV3IFN0cmluZ1tzZXQuc2l6ZSgpXSkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZShib29sZWFuIHZhbHVlKSB7Ci0Jc2V0RmxhZyhGTEFHX05PX0dFTiwgIXZhbHVlKTsKLX0KLQotcHVibGljIHZvaWQgc2V0UGFyYW0oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JcGFyYW1zLnB1dChrZXksIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCVNldCBzZXQgPSBwYXJhbXMua2V5U2V0KCk7Ci0JU3RyaW5nW10ga2V5cyA9IChTdHJpbmdbXSlzZXQudG9BcnJheShuZXcgU3RyaW5nW3NldC5zaXplKCldKTsKLQlBcnJheXMuc29ydChrZXlzKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHsKLQkJU3RyaW5nIGtleSA9IGtleXNbal07Ci0JCU9iamVjdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTsKLQkJU3RyaW5nIHZhbHVlU3RyID0gIiI7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdmFsdWVTdHIgPSAoU3RyaW5nKXZhbHVlOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IChTdHJpbmdbXSl2YWx1ZTsKLQkJCVN0cmluZ0J1ZmZlciB2YWx1ZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkgdmFsdWVCdWZmZXIuYXBwZW5kKCIgIik7Ci0JCQkJdmFsdWVCdWZmZXIuYXBwZW5kKHZhbHVlc1tpXSk7Ci0JCQl9Ci0JCQl2YWx1ZVN0ciA9IHZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZVN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKHZhbHVlU3RyLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSAhPSAwKSBidWZmZXIuYXBwZW5kKCIsIik7Ci0JCQlidWZmZXIuYXBwZW5kKGtleSk7Ci0JCQlidWZmZXIuYXBwZW5kKCI9Iik7Ci0JCQlidWZmZXIuYXBwZW5kKHZhbHVlU3RyKTsKLQkJfQotCX0KLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMTUxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvSk5JR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpOSUdlbmVyYXRvciBpbXBsZW1lbnRzIEZsYWdzIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlDbGFzc1tdIGNsYXNzZXM7Ci0JTWV0YURhdGEgbWV0YURhdGE7Ci0JYm9vbGVhbiBpc0NQUDsKLQlTdHJpbmcgZGVsaW1pdGVyOwotCVByaW50U3RyZWFtIG91dHB1dDsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0KLXB1YmxpYyBKTklHZW5lcmF0b3IoKSB7Ci0JZGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCW91dHB1dCA9IFN5c3RlbS5vdXQ7Ci0JbWV0YURhdGEgPSBuZXcgTWV0YURhdGEobmV3IFByb3BlcnRpZXMoKSk7Ci19Ci0KLVN0cmluZyBmaXhEZWxpbWl0ZXIoU3RyaW5nIHN0cikgewotCWlmIChkZWxpbWl0ZXIuZXF1YWxzKCJcbiIpKSByZXR1cm4gc3RyOwotCWludCBpbmRleCA9IDAsIGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQlpbnQgc3RhcnQgPSBpbmRleDsKLQkJaW5kZXggPSBzdHIuaW5kZXhPZignXG4nLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCWluZGV4Kys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDE7Ci0JcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4LCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoTWV0aG9kIG1ldGhvZCkgewotCXJldHVybiBnZXRGdW5jdGlvbk5hbWUobWV0aG9kLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcykgewotCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSByZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQlTdHJpbmcgZnVuY3Rpb24gPSB0b0MobWV0aG9kLmdldE5hbWUoKSk7Ci0JaWYgKCFpc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZnVuY3Rpb24pOwotCQlidWZmZXIuYXBwZW5kKCJfXyIpOwotCQlpZiAocGFyYW1UeXBlcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJCWJ1ZmZlci5hcHBlbmQodG9DKGdldFR5cGVTaWduYXR1cmUocGFyYW1UeXBlKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIGZ1bmN0aW9uOwotfQotCi1zdGF0aWMgaW50IGdldEJ5dGVDb3VudChDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiA0OwotCWlmIChjbGF6eiA9PSBMb25nLlRZUEUpIHJldHVybiA4OwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gMjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAyOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAxOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gNDsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiA4OwotCXJldHVybiA0OwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gIlYiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiSSI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJaIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gIkoiOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gIlMiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJDIjsKLQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkIiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gIkYiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEIjsKLQlpZiAoY2xhenogPT0gU3RyaW5nLmNsYXNzKSByZXR1cm4gIkxqYXZhL2xhbmcvU3RyaW5nOyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gIlsiICsgZ2V0VHlwZVNpZ25hdHVyZShjb21wb25lbnRUeXBlKTsKLQl9Ci0JcmV0dXJuICJMIiArIGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICI7IjsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlMShDbGFzcyBjbGF6eikgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAiVm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJJbnQiOwotCWlmIChjbGF6eiA9PSBCb29sZWFuLlRZUEUpIHJldHVybiAiQm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJMb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTaG9ydCI7Ci0JaWYgKGNsYXp6ID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gIkNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiQnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiRmxvYXQiOwotCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAiU3RyaW5nIjsKLQlyZXR1cm4gIk9iamVjdCI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZTIoQ2xhc3MgY2xhenopIHsKLQlpZiAoY2xhenogPT0gVm9pZC5UWVBFKSByZXR1cm4gInZvaWQiOwotCWlmIChjbGF6eiA9PSBJbnRlZ2VyLlRZUEUpIHJldHVybiAiamludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJqYm9vbGVhbiI7Ci0JaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJqbG9uZyI7Ci0JaWYgKGNsYXp6ID09IFNob3J0LlRZUEUpIHJldHVybiAianNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiamNoYXIiOwotCWlmIChjbGF6eiA9PSBCeXRlLlRZUEUpIHJldHVybiAiamJ5dGUiOwotCWlmIChjbGF6eiA9PSBGbG9hdC5UWVBFKSByZXR1cm4gImpmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImpkb3VibGUiOwotCWlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHJldHVybiAianN0cmluZyI7Ci0JaWYgKGNsYXp6ID09IENsYXNzLmNsYXNzKSByZXR1cm4gImpjbGFzcyI7Ci0JaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlyZXR1cm4gZ2V0VHlwZVNpZ25hdHVyZTIoY29tcG9uZW50VHlwZSkgKyAiQXJyYXkiOwotCX0KLQlyZXR1cm4gImpvYmplY3QiOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUzKENsYXNzIGNsYXp6KSB7Ci0JaWYgKGNsYXp6ID09IFZvaWQuVFlQRSkgcmV0dXJuICJ2b2lkIjsKLQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gImludCI7Ci0JaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImxvbmciOwotCWlmIChjbGF6eiA9PSBTaG9ydC5UWVBFKSByZXR1cm4gInNob3J0IjsKLQlpZiAoY2xhenogPT0gQ2hhcmFjdGVyLlRZUEUpIHJldHVybiAiY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJieXRlIjsKLQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJmbG9hdCI7Ci0JaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gImRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJTdHJpbmciOwotCWlmIChjbGF6ei5pc0FycmF5KCkpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGNsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVTaWduYXR1cmUzKGNvbXBvbmVudFR5cGUpICsgIltdIjsKLQl9Ci0JcmV0dXJuIGNsYXp6LmdldE5hbWUoKTsKLX0KLQotc3RhdGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlNChDbGFzcyBjbGF6eikgewotCXJldHVybiBnZXRUeXBlU2lnbmF0dXJlNChjbGF6eiwgZmFsc2UpOwotfQotCi1zdGF0aWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmU0KENsYXNzIGNsYXp6LCBib29sZWFuIHN0cnVjdCkgewotCWlmIChjbGF6eiA9PSBWb2lkLlRZUEUpIHJldHVybiAidm9pZCI7Ci0JaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJqaW50IjsKLQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gImpib29sZWFuIjsKLQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gImpsb25nIjsKLQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJqc2hvcnQiOwotCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJqY2hhciI7Ci0JaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJqYnl0ZSI7Ci0JaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiamZsb2F0IjsKLQlpZiAoY2xhenogPT0gRG91YmxlLlRZUEUpIHJldHVybiAiamRvdWJsZSI7Ci0JaWYgKGNsYXp6ID09IFN0cmluZy5jbGFzcykgcmV0dXJuICJqc3RyaW5nIjsKLQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCVN0cmluZyBzaWcgPSBnZXRUeXBlU2lnbmF0dXJlNChjb21wb25lbnRUeXBlKTsKLQkJcmV0dXJuIHN0cnVjdCA/IHNpZyA6IHNpZyArICIgKiI7Ci0JfQotCVN0cmluZyBzaWcgPSBnZXRDbGFzc05hbWUoY2xhenopOyAKLQlyZXR1cm4gc3RydWN0ID8gc2lnIDogc2lnICsgIiAqIjsKLX0KLQotc3RhdGljIEhhc2hNYXAgdW5pcXVlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotc3RhdGljIENsYXNzIHVuaXF1ZUNsYXNzQ2FjaGU7Ci1zdGF0aWMgTWV0aG9kW10gdW5pcXVlTWV0aG9kc0NhY2hlOwotc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTmF0aXZlVW5pcXVlKE1ldGhvZCBtZXRob2QpIHsKLQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCU9iamVjdCB1bmlxdWUgPSB1bmlxdWVDYWNoZS5nZXQobWV0aG9kKTsKLQlpZiAodW5pcXVlICE9IG51bGwpIHJldHVybiAoKEJvb2xlYW4pdW5pcXVlKS5ib29sZWFuVmFsdWUoKTsKLQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JTWV0aG9kW10gbWV0aG9kczsKLQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQlpZiAoY2xhenouZXF1YWxzKHVuaXF1ZUNsYXNzQ2FjaGUpKSB7Ci0JCW1ldGhvZHMgPSB1bmlxdWVNZXRob2RzQ2FjaGU7Ci0JfSBlbHNlIHsKLQkJbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl1bmlxdWVDbGFzc0NhY2hlID0gY2xheno7Ci0JCXVuaXF1ZU1ldGhvZHNDYWNoZSA9IG1ldGhvZHM7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbXRoID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtdGguZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpICE9IDAgJiYKLQkJCW1ldGhvZCAhPSBtdGggJiYgIW1ldGhvZC5lcXVhbHMobXRoKSAmJgotCQkJbmFtZS5lcXVhbHMobXRoLmdldE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCXVuaXF1ZUNhY2hlLnB1dChtZXRob2QsIG5ldyBCb29sZWFuKHJlc3VsdCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoTWV0aG9kW10gbWV0aG9kcykgewotCUFycmF5cy5zb3J0KG1ldGhvZHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlNZXRob2QgbXRoMSA9IChNZXRob2QpYTsKLQkJCU1ldGhvZCBtdGgyID0gKE1ldGhvZCliOwotCQkJaW50IHJlc3VsdCA9IG10aDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtdGgyLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IDAgPyByZXN1bHQgOiBnZXRGdW5jdGlvbk5hbWUobXRoMSkuY29tcGFyZVRvKGdldEZ1bmN0aW9uTmFtZShtdGgyKSk7Ci0JCX0KLQl9KTsKLX0KLQotc3RhdGljIHZvaWQgc29ydChGaWVsZFtdIGZpZWxkcykgewotCUFycmF5cy5zb3J0KGZpZWxkcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKEZpZWxkKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChGaWVsZCliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvcnQoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JQXJyYXlzLnNvcnQoY2xhc3NlcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoKENsYXNzKWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChDbGFzcyliKS5nZXROYW1lKCkpOwotCQl9Ci0JfSk7CQotfQotCi1zdGF0aWMgU3RyaW5nIHRvQyhTdHJpbmcgc3RyKSB7Ci0JaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKiAyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXyc6IGJ1ZmZlci5hcHBlbmQoIl8xIik7IGJyZWFrOwotCQkJY2FzZSAnOyc6IGJ1ZmZlci5hcHBlbmQoIl8yIik7IGJyZWFrOwotCQkJY2FzZSAnWyc6IGJ1ZmZlci5hcHBlbmQoIl8zIik7IGJyZWFrOwotCQkJY2FzZSAnLic6IGJ1ZmZlci5hcHBlbmQoIl8iKTsgYnJlYWs7Ci0JCQljYXNlICcvJzogYnVmZmVyLmFwcGVuZCgiXyIpOyBicmVhazsKLQkJCWRlZmF1bHQ6IGJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eik7Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlpZiAoY2xhc3NlcyA9PSBudWxsKSByZXR1cm47Ci0JZ2VuZXJhdGVDb3B5cmlnaHQoKTsKLQlnZW5lcmF0ZUluY2x1ZGVzKCk7Ci0Jc29ydChjbGFzc2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlDbGFzc0RhdGEgZGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCQlpZiAoZGF0YS5nZXRGbGFnKEZMQUdfQ1BQKSkgewotCQkJaXNDUFAgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJaWYgKGdldEdlbmVyYXRlKGNsYXp6KSkgZ2VuZXJhdGUoY2xhenopOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlvdXRwdXQuZmx1c2goKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRhRGF0YShTdHJpbmcga2V5KSB7Ci0JTWV0YURhdGEgbXQgPSBnZXRNZXRhRGF0YSgpOwotCVN0cmluZyBkYXRhID0gbXQuZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCW91dHB1dGxuKGZpeERlbGltaXRlcihkYXRhKSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXMoKSB7Ci0JcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JQ2xhc3NEYXRhIGRhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQlyZXR1cm4gIWRhdGEuZ2V0RmxhZyhGTEFHX05PX0dFTik7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGdldENQUCgpIHsKLQlyZXR1cm4gaXNDUFA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVsaW1pdGVyKCkgewotCXJldHVybiBkZWxpbWl0ZXI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBnZXRDUFAoKSA/ICIuY3BwIiA6ICIuYyI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JcmV0dXJuIGdldE91dHB1dE5hbWUoKSArIGdldFN1ZmZpeCgpICsgZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBQcmludFN0cmVhbSBnZXRPdXRwdXQoKSB7Ci0JcmV0dXJuIG91dHB1dDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCXJldHVybiBnZXRDbGFzc05hbWUoZ2V0TWFpbkNsYXNzKCkpLnRvTG93ZXJDYXNlKCk7Ci19Ci0KLXB1YmxpYyBDbGFzcyBnZXRNYWluQ2xhc3MoKSB7Ci0JcmV0dXJuIG1haW5DbGFzczsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybSgpIHsKLQlyZXR1cm4gU1dULmdldFBsYXRmb3JtKCk7Ci19Ci0KLXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCXJldHVybiBwcm9ncmVzczsKLX0KLQotcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7Ci0JcmV0dXJuICIiOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIHN0cikgewotCW91dHB1dC5wcmludChzdHIpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbigpIHsKLQlvdXRwdXQoZ2V0RGVsaW1pdGVyKCkpOwotfQotCi1wdWJsaWMgdm9pZCBvdXRwdXRsbihTdHJpbmcgc3RyKSB7Ci0Jb3V0cHV0KHN0cik7Ci0Jb3V0cHV0KGdldERlbGltaXRlcigpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2xhc3NlcyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0aGlzLmNsYXNzZXMgPSBjbGFzc2VzOwotfQotCi1wdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoQ2xhc3MgbWFpbkNsYXNzKSB7Ci0JdGhpcy5tYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1ldGFEYXRhIGRhdGEpIHsKLQltZXRhRGF0YSA9IGRhdGE7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dChQcmludFN0cmVhbSBvdXRwdXQpIHsKLQl0aGlzLm91dHB1dCA9IG91dHB1dDsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCXRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGViNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgY2xhc3MgSk5JR2VuZXJhdG9yQXBwIHsKLQotCUNsYXNzIG1haW5DbGFzczsKLQlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3M7Ci0JU3RyaW5nIG1haW5DbGFzc05hbWUsIG91dHB1dERpciwgY2xhc3NwYXRoOwotCU1ldGFEYXRhIG1ldGFEYXRhOwotCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwKCkgewotfQotCi1wdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLQlyZXR1cm4gY2xhc3NwYXRoOwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0TWFpbkNsYXNzKCkgewotCXJldHVybiBtYWluQ2xhc3M7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gbWFpbkNsYXNzTmFtZTsKLX0KLQotcHVibGljIE1ldGFEYXRhIGdldE1ldGFEYXRhKCkgewotCXJldHVybiBtZXRhRGF0YTsKLX0KLQotU3RyaW5nIGdldE1ldGFEYXRhRGlyKCkgewotCXJldHVybiAiLi9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvIjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXIoKSB7Ci0JcmV0dXJuIG91dHB1dERpcjsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVBbGwoKSB7Ci0JU3RyaW5nIG1haW5DbGFzc2VzID0gbmV3IE1ldGFEYXRhKGdldERlZmF1bHRNYWluQ2xhc3MoKSkuZ2V0TWV0YURhdGEoInN3dF9tYWluX2NsYXNzZXMiLCBudWxsKTsKLQlpZiAobWFpbkNsYXNzZXMgIT0gbnVsbCkgewotCQlTdHJpbmdbXSBsaXN0ID0gSXRlbURhdGEuc3BsaXQobWFpbkNsYXNzZXMsICIsIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGxpc3RbaV0udHJpbSgpOwotCQkJdHJ5IHsKLQkJCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nIFwiIiArIGNsYXNzTmFtZSArICJcIiIpOwotCQkJc2V0TWFpbkNsYXNzTmFtZShjbGFzc05hbWUpOwotCQkJZ2VuZXJhdGUoKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUQVRTX0MoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJU3RhdHNHZW5lcmF0b3IgZ2VuID0gbmV3IFN0YXRzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlU1RBVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdGF0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RhdHNHZW5lcmF0b3IodHJ1ZSk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfSChDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKHRydWUpOwotCQlnZW4uc2V0TWFpbkNsYXNzKG1haW5DbGFzcyk7Ci0JCWdlbi5zZXRDbGFzc2VzKGNsYXNzZXMpOwotCQlnZW4uc2V0TWV0YURhdGEobWV0YURhdGEpOwotCQlnZW4uc2V0UHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZ2VuLnNldE91dHB1dChuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgb3V0cHV0RGlyICsgZ2VuLmdldEZpbGVOYW1lKCkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci0KLX0KLQotdm9pZCBnZW5lcmF0ZVNUUlVDVFNfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQkJZ2VuLnNldE1haW5DbGFzcyhtYWluQ2xhc3MpOwotCQlnZW4uc2V0Q2xhc3NlcyhjbGFzc2VzKTsKLQkJZ2VuLnNldE1ldGFEYXRhKG1ldGFEYXRhKTsKLQkJZ2VuLnNldFByb2dyZXNzTW9uaXRvcihwcm9ncmVzcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWdlbi5zZXRPdXRwdXQobmV3IFByaW50U3RyZWFtKG91dCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQkJaWYgKG91dC5zaXplKCkgPiAwKSBvdXRwdXQob3V0LnRvQnl0ZUFycmF5KCksIG91dHB1dERpciArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotCi19Ci0KLXZvaWQgZ2VuZXJhdGVTV1RfQyhDbGFzc1tdIGNsYXNzZXMpIHsKLQl0cnkgewotCQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmIChvdXQuc2l6ZSgpID4gMCkgb3V0cHV0KG91dC50b0J5dGVBcnJheSgpLCBvdXRwdXREaXIgKyBnZW4uZ2V0RmlsZU5hbWUoKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEoQ2xhc3NbXSBjbGFzc2VzKSB7Ci0JdHJ5IHsKLQkJTWV0YURhdGFHZW5lcmF0b3IgZ2VuID0gbmV3IE1ldGFEYXRhR2VuZXJhdG9yKCk7Ci0JCWdlbi5zZXRNYWluQ2xhc3MobWFpbkNsYXNzKTsKLQkJZ2VuLnNldENsYXNzZXMoY2xhc3Nlcyk7Ci0JCWdlbi5zZXRNZXRhRGF0YShtZXRhRGF0YSk7Ci0JCWdlbi5zZXRQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3MpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlnZW4uc2V0T3V0cHV0KG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQkJZ2VuLmdlbmVyYXRlKCk7Ci0JCWlmICghbmV3IEZpbGUoZ2V0TWV0YURhdGFEaXIoKSkuZXhpc3RzKCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogTWV0YSBkYXRhIG91dHB1dCBkaXIgZG9lcyBub3QgZXhpc3QiKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob3V0LnNpemUoKSA+IDApIG91dHB1dChvdXQudG9CeXRlQXJyYXkoKSwgZ2V0TWV0YURhdGFEaXIoKSArIGdlbi5nZXRGaWxlTmFtZSgpKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0iKTsKLQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlnZW5lcmF0ZShudWxsKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJJbml0aWFsaXppbmcuLi4iKTsKLQlDbGFzc1tdIGNsYXNzZXMgPSBnZXRDbGFzc2VzKCk7Ci0JQ2xhc3NbXSBuYXRpdmVzID0gZ2V0TmF0aXZlc0NsYXNzZXMoKTsKLQlDbGFzc1tdIHN0cnVjdHMgPSBnZXRTdHJ1Y3R1cmVDbGFzc2VzKCk7Ci0JdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7Ci0JCWludCBuYXRpdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0aXZlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgY2xhenogPSBuYXRpdmVzW2ldOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQkJCW5hdGl2ZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaW50IHRvdGFsID0gbmF0aXZlQ291bnQgKiA0OwotCQl0b3RhbCArPSBjbGFzc2VzLmxlbmd0aDsKLQkJdG90YWwgKz0gbmF0aXZlcy5sZW5ndGggKiAzOwotCQl0b3RhbCArPSBzdHJ1Y3RzLmxlbmd0aCAqIDI7Ci0JCXByb2dyZXNzLnNldFRvdGFsKHRvdGFsKTsKLQkJcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBzdHJ1Y3RzLmggLi4uIik7Ci0JfQotCWdlbmVyYXRlU1RSVUNUU19IKHN0cnVjdHMpOwotCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zZXRNZXNzYWdlKCJHZW5lcmF0aW5nIHN0cnVjdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUUlVDVFNfQyhzdHJ1Y3RzKTsKLQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc2V0TWVzc2FnZSgiR2VuZXJhdGluZyBuYXRpdmVzIC4uLiIpOwotCWdlbmVyYXRlU1dUX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuaCAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0gobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgc3RhdHMuYyAuLi4iKTsKLQlnZW5lcmF0ZVNUQVRTX0MobmF0aXZlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkdlbmVyYXRpbmcgbWV0YSBkYXRhIC4uLiIpOwotCWdlbmVyYXRlTWV0YURhdGEoY2xhc3Nlcyk7Ci0JaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldE1lc3NhZ2UoIkRvbmUuIik7Ci0JdGhpcy5wcm9ncmVzcyA9IG51bGw7Ci19Ci0KLWJvb2xlYW4gY29tcGFyZShJbnB1dFN0cmVhbSBpczEsIElucHV0U3RyZWFtIGlzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl3aGlsZSAodHJ1ZSkgewotCQlpbnQgYzEgPSBpczEucmVhZCgpOwotCQlpbnQgYzIgPSBpczIucmVhZCgpOwotCQlpZiAoYzEgIT0gYzIpIHJldHVybiBmYWxzZTsKLQkJaWYgKGMxID09IC0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgb3V0cHV0KGJ5dGVbXSBieXRlcywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCUZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJaWYgKGNvbXBhcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaXMpKSkgcmV0dXJuOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCX0KLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQlvdXQud3JpdGUoYnl0ZXMpOwotCW91dC5jbG9zZSgpOwotfQotCi1TdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCWludCBkb3QgPSBtYWluQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGRvdCA9PSAtMSkgcmV0dXJuICIiOwotCXJldHVybiBtYWluQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBkb3QpOwotfQotCi1TdHJpbmdbXSBnZXRDbGFzc05hbWVzKFN0cmluZyBtYWluQ2xhc3NOYW1lKSB7Ci0JU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZShtYWluQ2xhc3NOYW1lKTsKLQlTdHJpbmcgY2xhc3NwYXRoID0gZ2V0Q2xhc3NwYXRoKCk7Ci0JaWYgKGNsYXNzcGF0aCA9PSBudWxsKSBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotCVN0cmluZyBwa2dQYXRoID0gcGtnTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQlTdHJpbmcgcGtnWmlwUGF0aCA9IHBrZ05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCWludCBzdGFydCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBjbGFzc3BhdGgubGVuZ3RoKCkpIHsKLQkJaW5kZXggPSBjbGFzc3BhdGguaW5kZXhPZihGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCBzdGFydCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgaW5kZXggPSBjbGFzc3BhdGgubGVuZ3RoKCk7Ci0JCVN0cmluZyBwYXRoID0gY2xhc3NwYXRoLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQlpZiAocGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShwYXRoKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwa2daaXBQYXRoKSAmJiBuYW1lLmluZGV4T2YoJy8nLCBwa2daaXBQYXRoLmxlbmd0aCgpICsgMSkgPT0gLTEgJiYgbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBuYW1lLnN1YnN0cmluZyhwa2daaXBQYXRoLmxlbmd0aCgpICsgMSwgbmFtZS5sZW5ndGgoKSAtIDYpOwotCQkJCQkJY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkJCQkJY2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgemlwRmlsZS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCQkJfQotCQl9IGVsc2UgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgcGtnUGF0aCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCVN0cmluZ1tdIGVudHJpZXMgPSBmaWxlLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZSwgZW50cnkpOwotCQkJCQlpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJaWYgKGYuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVudHJ5LnN1YnN0cmluZygwLCBlbnRyeS5sZW5ndGgoKSAtIDYpOwotCQkJCQkJCWNsYXNzZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlzdGFydCA9IGluZGV4ICsgMTsKLQl9Ci0JcmV0dXJuIChTdHJpbmdbXSljbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1tjbGFzc2VzLnNpemUoKV0pOwotfQotCi1wdWJsaWMgQ2xhc3NbXSBnZXRDbGFzc2VzKCkgewotCWlmIChtYWluQ2xhc3NOYW1lID09IG51bGwpIHJldHVybiBuZXcgQ2xhc3NbMF07Ci0JU3RyaW5nW10gY2xhc3NOYW1lcyA9IGdldENsYXNzTmFtZXMobWFpbkNsYXNzTmFtZSk7Ci0JQXJyYXlzLnNvcnQoY2xhc3NOYW1lcyk7Ci0JU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUobWFpbkNsYXNzTmFtZSk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW2NsYXNzTmFtZXMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaV07Ci0JCXRyeSB7Ci0JCQljbGFzc2VzW2ldID0gQ2xhc3MuZm9yTmFtZShwYWNrYWdlTmFtZSArICIuIiArIGNsYXNzTmFtZSwgZmFsc2UsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXJldHVybiBjbGFzc2VzOwotfQotCi1wdWJsaWMgQ2xhc3NbXSBnZXROYXRpdmVzQ2xhc3NlcygpIHsKLQlpZiAobWFpbkNsYXNzTmFtZSA9PSBudWxsKSByZXR1cm4gbmV3IENsYXNzWzBdOwotCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gZ2V0Q2xhc3NlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tqXTsKLQkJCWludCBtb2RzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKChtb2RzICYgTW9kaWZpZXIuTkFUSVZFKSAhPSAwKSB7Ci0JCQkJcmVzdWx0LmFkZChjbGF6eik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChDbGFzc1tdKXJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0KLXB1YmxpYyBDbGFzc1tdIGdldFN0cnVjdHVyZUNsYXNzZXMoKSB7Ci0JaWYgKG1haW5DbGFzc05hbWUgPT0gbnVsbCkgcmV0dXJuIG5ldyBDbGFzc1swXTsKLQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCUNsYXNzW10gY2xhc3NlcyA9IGdldENsYXNzZXMoKTsKLQlvdXRlcjoKLQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbal07Ci0JCQlpbnQgbW9kcyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmICgobW9kcyAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkgY29udGludWUgb3V0ZXI7Ci0JCX0KLQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJYm9vbGVhbiBoYXNQdWJsaWNGaWVsZHMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2pdOwotCQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmICgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgIT0gMCAmJiAobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgPT0gMCkgewotCQkJCWhhc1B1YmxpY0ZpZWxkcyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFoYXNQdWJsaWNGaWVsZHMpIGNvbnRpbnVlOwotCQlyZXN1bHQuYWRkKGNsYXp6KTsKLQl9Ci0JcmV0dXJuIChDbGFzc1tdKXJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoKSB7Ci0JdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1haW5DbGFzc05hbWUoU3RyaW5nIHN0cikgewotCW1haW5DbGFzc05hbWUgPSBzdHI7Ci0JbWV0YURhdGEgPSBuZXcgTWV0YURhdGEobWFpbkNsYXNzTmFtZSk7Ci0JU3RyaW5nIG1haW5DbGFzc2VzID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YSgic3d0X21haW5fY2xhc3NlcyIsIG51bGwpOwotCWlmIChtYWluQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIGxpc3QgPSBJdGVtRGF0YS5zcGxpdChtYWluQ2xhc3NlcywgIiwiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlpZiAobWFpbkNsYXNzTmFtZS5lcXVhbHMobGlzdFtpXS50cmltKCkpKSB7Ci0JCQkJc2V0T3V0cHV0RGlyKGxpc3RbaSArIDFdLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG1haW5DbGFzc05hbWUgIT0gbnVsbCkgewotCQl0cnkgewotCQkJbWFpbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShtYWluQ2xhc3NOYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE91dHB1dERpcihTdHJpbmcgc3RyKSB7Ci0JaWYgKHN0ciAhPSBudWxsKSB7Ci0JCWlmICghc3RyLmVuZHNXaXRoKCJcXCIpICYmICFzdHIuZW5kc1dpdGgoIi8iKSApIHsKLQkJCXN0ciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCX0KLQlvdXRwdXREaXIgPSBzdHI7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRNYWluQ2xhc3MoKSB7Ci0JcmV0dXJuICJvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuIiArIGdldERlZmF1bHRQbGF0Zm9ybSgpICsgIi5PUyI7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQbGF0Zm9ybSgpIHsKLQlyZXR1cm4gU1dULmdldFBsYXRmb3JtKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlKTklHZW5lcmF0b3JBcHAgZ2VuID0gbmV3IEpOSUdlbmVyYXRvckFwcCAoKTsKLQlpZiAoYXJncy5sZW5ndGggPT0gMSAmJiAoYXJnc1swXS5lcXVhbHMoIioiKSB8fCBhcmdzWzBdLmVxdWFscygiYWxsIikpKSB7Ci0JCWdlbi5nZW5lcmF0ZUFsbCgpOwotCQlyZXR1cm47Ci0JfQotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoYXJnc1swXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDEpIGdlbi5zZXRPdXRwdXREaXIoYXJnc1sxXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDIpIGdlbi5zZXRDbGFzc3BhdGgoYXJnc1syXSk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoZ2V0RGVmYXVsdE1haW5DbGFzcygpKTsKLQl9Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9KTklHZW5lcmF0b3JBcHBVSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDIxMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL0pOSUdlbmVyYXRvckFwcFVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIEpOSUdlbmVyYXRvckFwcFVJIHsKLQotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQkKLQlDb21wb3NpdGUgYWN0aW9uc1BhbmVsOwotCUNvbWJvIG1haW5DbGFzc0NiLCBvdXRwdXREaXJDYjsKLQlUYWJsZSBjbGFzc2VzTHQsIG1lbWJlcnNMdCwgcGFyYW1zTHQ7Ci0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JTGFiZWwgcHJvZ3Jlc3NMYWJlbDsKLQlGaWxlRGlhbG9nIGZpbGVEaWFsb2c7Ci0JCi0JVGFibGVFZGl0b3IgcGFyYW1UZXh0RWRpdG9yLCBtZW1iZXJUZXh0RWRpdG9yLCBjbGFzc1RleHRFZGl0b3I7Ci0JRmxhZ3NFZGl0b3IgcGFyYW1MaXN0RWRpdG9yLCBtZW1iZXJMaXN0RWRpdG9yLCBjbGFzc0xpc3RFZGl0b3I7Ci0JVGV4dCBwYXJhbUVkaXRvclR4LCBtZW1iZXJFZGl0b3JUeCwgY2xhc3NFZGl0b3JUeDsKLQlMaXN0IHBhcmFtRWRpdG9yTHQsIG1lbWJlckVkaXRvckx0LCBjbGFzc0VkaXRvckx0OwotCQotCXN0YXRpYyBjbGFzcyBGbGFnc0VkaXRvciB7Ci0JCVRhYmxlIHBhcmVudDsKLQkJaW50IGNvbHVtbiA9IC0xOwotCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCi0JCXB1YmxpYyBGbGFnc0VkaXRvcihUYWJsZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJCXJldHVybiBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBUYWJsZUl0ZW0gZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbHVtbikgewotCQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCX0KLQl9Ci0JCi0JSk5JR2VuZXJhdG9yQXBwIGFwcDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTkFNRV9DT0xVTU4gPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfRkxBR1NfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IENMQVNTX0VYQ0xVREVfQ09MVU1OID0gMjsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEZJRUxEX0ZMQUdTX0NPTFVNTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9DQVNUX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBGSUVMRF9BQ0NFU1NPUl9DT0xVTU4gPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgRklFTERfRVhDTFVERV9DT0xVTU4gPSA0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX05BTUVfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9GTEFHU19DT0xVTU4gPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBNRVRIT0RfRVhDTFVERV9DT0xVTU4gPSAzOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fSU5ERVhfQ09MVU1OID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX1RZUEVfQ09MVU1OID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFBBUkFNX0ZMQUdTX0NPTFVNTiA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQQVJBTV9DQVNUX0NPTFVNTiA9IDM7Ci0JCi1wdWJsaWMgSk5JR2VuZXJhdG9yQXBwVUkoKSB7Ci0JdGhpcyAobmV3IEpOSUdlbmVyYXRvckFwcCgpKTsKLX0KLQotcHVibGljIEpOSUdlbmVyYXRvckFwcFVJKEpOSUdlbmVyYXRvckFwcCBhcHApIHsKLQl0aGlzLmFwcCA9IGFwcDsKLX0KLQotdm9pZCBjbGVhbnVwKCkgewotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi12b2lkIGdlbmVyYXRlU3RydWN0c0hlYWRlciAoKSB7Ci0JU3RydWN0c0dlbmVyYXRvciBnZW4gPSBuZXcgU3RydWN0c0dlbmVyYXRvcih0cnVlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTdHJ1Y3RzICgpIHsKLQlTdHJ1Y3RzR2VuZXJhdG9yIGdlbiA9IG5ldyBTdHJ1Y3RzR2VuZXJhdG9yKGZhbHNlKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JZ2VuLmdlbmVyYXRlKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTaXplb2YgKCkgewotCVNpemVvZkdlbmVyYXRvciBnZW4gPSBuZXcgU2l6ZW9mR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCWdlbi5nZW5lcmF0ZSgpOwotfQotCi12b2lkIGdlbmVyYXRlTWV0YURhdGEgKCkgewotCU1ldGFEYXRhR2VuZXJhdG9yIGdlbiA9IG5ldyBNZXRhRGF0YUdlbmVyYXRvcigpOwotCWdlbi5zZXRNYWluQ2xhc3MoYXBwLmdldE1haW5DbGFzcygpKTsKLQlnZW4uc2V0TWV0YURhdGEoYXBwLmdldE1ldGFEYXRhKCkpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRTZWxlY3RlZE1ldGhvZHMoKTsKLQlpZiAobWV0aG9kcy5sZW5ndGggIT0gMCkgewotCQlnZW4uZ2VuZXJhdGUobWV0aG9kcyk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldENsYXNzZXMoZ2V0U2VsZWN0ZWRDbGFzc2VzKCkpOwotCQlnZW4uZ2VuZXJhdGUoKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVzICgpIHsKLQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JZ2VuLnNldE1haW5DbGFzcyhhcHAuZ2V0TWFpbkNsYXNzKCkpOwotCWdlbi5zZXRNZXRhRGF0YShhcHAuZ2V0TWV0YURhdGEoKSk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGdldFNlbGVjdGVkTWV0aG9kcygpOwotCWlmIChtZXRob2RzLmxlbmd0aCAhPSAwKSB7Ci0JCWdlbi5nZW5lcmF0ZShtZXRob2RzKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUFsbCgpIHsKLQlpZiAoIXVwZGF0ZU91dHB1dERpcigpKSByZXR1cm47Ci0JQ3Vyc29yIGN1cnNvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gYWN0aW9uc1BhbmVsLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgY2hpbGQuc2V0RW5hYmxlZChmYWxzZSk7CQkJCQotCX0KLQlmaW5hbCBib29sZWFuIHNob3dQcm9ncmVzcyA9IHRydWU7Ci0JaWYgKHNob3dQcm9ncmVzcykgewotCQlwcm9ncmVzc0xhYmVsLnNldFRleHQoIiIpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCXByb2dyZXNzTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JZmluYWwgYm9vbGVhbltdIGRvbmUgPSBuZXcgYm9vbGVhblsxXTsKLQluZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWFwcC5nZW5lcmF0ZSghc2hvd1Byb2dyZXNzID8gbnVsbCA6IG5ldyBQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCWludCB0b3RhbCwgc3RlcCwgbWF4aW11bSA9IDEwMDsKLQkJCQkJcHVibGljIHZvaWQgc2V0VG90YWwoZmluYWwgaW50IHRvdGFsKSB7Ci0JCQkJCQl0aGlzLnRvdGFsID0gdG90YWw7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXByb2dyZXNzQmFyLnNldE1heGltdW0obWF4aW11bSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgc3RlcCgpIHsKLQkJCQkJCWludCBvbGRWYWx1ZSA9IHN0ZXAgKiBtYXhpbXVtIC8gdG90YWw7Ci0JCQkJCQlzdGVwKys7Ci0JCQkJCQlmaW5hbCBpbnQgbmV3VmFsdWUgPSBzdGVwICogbWF4aW11bSAvIHRvdGFsOwotCQkJCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlKSByZXR1cm47Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihuZXdWYWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7CQkJCQkKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXByb2dyZXNzTGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCQkJCQkJcHJvZ3Jlc3NMYWJlbC51cGRhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlkb25lWzBdID0gdHJ1ZTsKLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIWRvbmVbMF0pIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIGNoaWxkLnNldEVuYWJsZWQodHJ1ZSk7CQkJCQotCX0KLQlpZiAoc2hvd1Byb2dyZXNzKSB7Ci0JCXByb2dyZXNzQmFyLnNldFZpc2libGUoZmFsc2UpOwotCQlwcm9ncmVzc0xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQlzaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUNvbnN0YW50cyAoKSB7Ci0JQ29uc3RhbnRzR2VuZXJhdG9yIGdlbiA9IG5ldyBDb25zdGFudHNHZW5lcmF0b3IoKTsKLQlnZW4uc2V0TWFpbkNsYXNzKGFwcC5nZXRNYWluQ2xhc3MoKSk7Ci0JZ2VuLnNldE1ldGFEYXRhKGFwcC5nZXRNZXRhRGF0YSgpKTsKLQlGaWVsZFtdIGZpZWxkcyA9IGdldFNlbGVjdGVkRmllbGRzKCk7Ci0JaWYgKGZpZWxkcy5sZW5ndGggIT0gMCkgewotCQlnZW4uZ2VuZXJhdGUoZmllbGRzKTsKLQl9IGVsc2UgewotCQlnZW4uc2V0Q2xhc3NlcyhnZXRTZWxlY3RlZENsYXNzZXMoKSk7Ci0JCWdlbi5nZW5lcmF0ZSgpOwotCX0KLX0KLQotQ2xhc3NbXSBnZXRTZWxlY3RlZENsYXNzZXMoKSB7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBjbGFzc2VzTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW2l0ZW1zLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQljbGFzc2VzW2ldID0gKChDbGFzc0RhdGEpaXRlbS5nZXREYXRhKCkpLmdldENsYXp6KCk7Ci0JfQotCXJldHVybiBjbGFzc2VzOwotfQotCi1NZXRob2RbXSBnZXRTZWxlY3RlZE1ldGhvZHMoKSB7Ci0JVGFibGVJdGVtW10gc2VsZWN0aW9uID0gbWVtYmVyc0x0LmdldFNlbGVjdGlvbigpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBuZXcgTWV0aG9kW3NlbGVjdGlvbi5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBzZWxlY3Rpb24gW2ldOwotCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJCU1ldGhvZCBtZXRob2QgPSAoKE1ldGhvZERhdGEpZGF0YSkuZ2V0TWV0aG9kKCk7Ci0JCQltZXRob2RzW2NvdW50KytdID0gbWV0aG9kOwotCQl9Ci0JfQotCWlmIChjb3VudCAhPSBtZXRob2RzLmxlbmd0aCkgewotCQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJbWV0aG9kcyA9IHJlc3VsdDsKLQl9Ci0JcmV0dXJuIG1ldGhvZHM7Ci19Ci0KLUZpZWxkW10gZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7Ci0JVGFibGVJdGVtW10gc2VsZWN0aW9uID0gbWVtYmVyc0x0LmdldFNlbGVjdGlvbigpOwotCUZpZWxkW10gZmllbGRzID0gbmV3IEZpZWxkW3NlbGVjdGlvbi5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBzZWxlY3Rpb24gW2ldOwotCQlPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJRmllbGQgZmllbGQgPSAoKEZpZWxkRGF0YSlkYXRhKS5nZXRGaWVsZCgpOwotCQkJZmllbGRzW2NvdW50KytdID0gZmllbGQ7Ci0JCX0KLQl9Ci0JaWYgKGNvdW50ICE9IGZpZWxkcy5sZW5ndGgpIHsKLQkJRmllbGRbXSByZXN1bHQgPSBuZXcgRmllbGRbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGZpZWxkcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCWZpZWxkcyA9IHJlc3VsdDsKLQl9Ci0JcmV0dXJuIGZpZWxkczsKLX0KLQotcHVibGljIHZvaWQgb3BlbiAoKSB7Ci0JZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSk5JIEdlbmVyYXRvciIpOwotCi0JR3JpZERhdGEgZGF0YTsKLQlHcmlkTGF5b3V0IHNoZWxsTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlzaGVsbExheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQoc2hlbGxMYXlvdXQpOwotCQotCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JcGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlHcmlkTGF5b3V0IHBhbmVsTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlwYW5lbExheW91dC5udW1Db2x1bW5zID0gMTsKLQlwYW5lbC5zZXRMYXlvdXQocGFuZWxMYXlvdXQpOwotCQotCUxpc3RlbmVyIHVwZGF0ZU1haW5DbGFzc0xpc3RlbmVyID0gIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJdXBkYXRlTWFpbkNsYXNzKCk7Ci0JCQlpZiAoIXVwZGF0ZU91dHB1dERpcigpKSByZXR1cm47Ci0JCQl1cGRhdGVDbGFzc2VzKCk7Ci0JCQl1cGRhdGVNZW1iZXJzKCk7Ci0JCQl1cGRhdGVQYXJhbWV0ZXJzKCk7Ci0JCX0KLQl9OwkKLQljcmVhdGVNYWluQ2xhc3NQYW5lbChwYW5lbCwgdXBkYXRlTWFpbkNsYXNzTGlzdGVuZXIpOwotCWNyZWF0ZUNsYXNzZXNQYW5lbChwYW5lbCk7Ci0JY3JlYXRlTWVtYmVyc1BhbmVsKHBhbmVsKTsKLQljcmVhdGVQYXJhbWV0ZXJzUGFuZWwocGFuZWwpOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbnMoc2hlbGwpOwotCi0JUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaGVsbC5nZXRTaXplKCkueCwgcHJlZmVycmVkU2l6ZS55KTsKLQkKLQl1cGRhdGVNYWluQ2xhc3MoKTsKLQl1cGRhdGVDbGFzc2VzKCk7Ci0JdXBkYXRlTWVtYmVycygpOwotCXVwZGF0ZVBhcmFtZXRlcnMoKTsKLX0KLQotdm9pZCBjcmVhdGVNYWluQ2xhc3NQYW5lbChDb21wb3NpdGUgcGFuZWwsIExpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyKSB7Ci0JTGFiZWwgbWFpbkNsYXNzTGIgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQltYWluQ2xhc3NMYi5zZXRUZXh0KCImTWFpbiBDbGFzczoiKTsKLQotCUdyaWREYXRhIGRhdGE7Ci0JbWFpbkNsYXNzQ2IgPSBuZXcgQ29tYm8ocGFuZWwsIFNXVC5EUk9QX0RPV04pOwotCVN0cmluZyBtYWluQ2xhc3MgPSBhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpOwotCW1haW5DbGFzc0NiLnNldFRleHQobWFpbkNsYXNzID09IG51bGwgPyAiIiA6IG1haW5DbGFzcyk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCW1haW5DbGFzc0NiLnNldExheW91dERhdGEoZGF0YSk7Ci0JbWFpbkNsYXNzQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdXBkYXRlTGlzdGVuZXIpOwotCW1haW5DbGFzc0NiLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0KLQlMYWJlbCBvdXRwdXREaXJMYiA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCW91dHB1dERpckxiLnNldFRleHQoIiZPdXRwdXQgRGlyOiIpOwotCQotCW91dHB1dERpckNiID0gbmV3IENvbWJvKHBhbmVsLCBTV1QuRFJPUF9ET1dOKTsKLQlTdHJpbmcgb3V0cHV0RGlyID0gYXBwLmdldE91dHB1dERpcigpOwotCW91dHB1dERpckNiLnNldFRleHQob3V0cHV0RGlyID09IG51bGwgPyAiIiA6IG91dHB1dERpcik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCW91dHB1dERpckNiLnNldExheW91dERhdGEoZGF0YSk7Ci0Jb3V0cHV0RGlyQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdXBkYXRlTGlzdGVuZXIpOwotCW91dHB1dERpckNiLmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCB1cGRhdGVMaXN0ZW5lcik7Ci0KLQlTdHJpbmcgbWFpbkNsYXNzZXMgPSBhcHAuZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YSgic3d0X21haW5fY2xhc3NlcyIsIG51bGwpOwotCWlmIChtYWluQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIGxpc3QgPSBJdGVtRGF0YS5zcGxpdChtYWluQ2xhc3NlcywgIiwiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gbGlzdFtpXS50cmltKCk7Ci0JCQl0cnkgewotCQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCQltYWluQ2xhc3NDYi5hZGQoY2xhc3NOYW1lKTsKLQkJCQlvdXRwdXREaXJDYi5hZGQobGlzdFtpICsgMV0udHJpbSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfQotfQotCi12b2lkIGNyZWF0ZUNsYXNzZXNQYW5lbChDb21wb3NpdGUgcGFuZWwpIHsKLQlMYWJlbCBjbGFzc2VzTGIgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQljbGFzc2VzTGIuc2V0VGV4dCgiJkNsYXNzZXM6Iik7Ci0KLQlHcmlkRGF0YSBkYXRhOwotCWNsYXNzZXNMdCA9IG5ldyBUYWJsZShwYW5lbCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaGVpZ2h0SGludCA9IGNsYXNzZXNMdC5nZXRJdGVtSGVpZ2h0KCkgKiA2OwotCWNsYXNzZXNMdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWNsYXNzZXNMdC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWNsYXNzZXNMdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLQkJCQl1cGRhdGVHZW5lcmF0ZSgoVGFibGVJdGVtKWUuaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXVwZGF0ZU1lbWJlcnMoKTsKLQkJCQl1cGRhdGVQYXJhbWV0ZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlUYWJsZUNvbHVtbiBjb2x1bW47Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGNsYXNzZXNMdCwgU1dULk5PTkUsIENMQVNTX05BTUVfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiQ2xhc3MiKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oY2xhc3Nlc0x0LCBTV1QuTk9ORSwgQ0xBU1NfRkxBR1NfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiRmxhZ3MiKTsKLQkvKgotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihjbGFzc2VzTHQsIFNXVC5OT05FLCBDTEFTU19FWENMVURFX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkV4Y2x1ZGUiKTsKLQkqLwotCQotCWNsYXNzVGV4dEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihjbGFzc2VzTHQpOwotCWNsYXNzVGV4dEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JY2xhc3NFZGl0b3JUeCA9IG5ldyBUZXh0KGNsYXNzZXNMdCwgU1dULlNJTkdMRSk7Ci0JY2xhc3NUZXh0RWRpdG9yLnNldEVkaXRvcihjbGFzc0VkaXRvclR4KTsKLQlMaXN0ZW5lciBjbGFzc1RleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCWNsYXNzVGV4dEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJY2xhc3NFZGl0b3JUeC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gY2xhc3NUZXh0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBjbGFzc1RleHRFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gKENsYXNzRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCWlmIChjb2x1bW4gPT0gQ0xBU1NfRVhDTFVERV9DT0xVTU4pIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGNsYXNzRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJCWNsYXNzRGF0YS5zZXRFeGNsdWRlKHRleHQpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGNsYXNzRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEoY2xhc3NEYXRhLmdldENsYXp6KCksIGNsYXNzRGF0YSk7Ci0JCQkJY2xhc3Nlc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0KLQkJfQotCX07Ci0JY2xhc3NFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgY2xhc3NUZXh0TGlzdGVuZXIpOwotCWNsYXNzRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjbGFzc1RleHRMaXN0ZW5lcik7Ci0JY2xhc3NFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIGNsYXNzVGV4dExpc3RlbmVyKTsKLQkKLQlmaW5hbCBTaGVsbCBmbG9hdGVyID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuTk9fVFJJTSk7Ci0JZmxvYXRlci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JY2xhc3NMaXN0RWRpdG9yID0gbmV3IEZsYWdzRWRpdG9yKGNsYXNzZXNMdCk7Ci0JY2xhc3NFZGl0b3JMdCA9IG5ldyBMaXN0KGZsb2F0ZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWNsYXNzRWRpdG9yTHQuc2V0SXRlbXMoQ2xhc3NEYXRhLmdldEFsbEZsYWdzKCkpOwotCWZsb2F0ZXIucGFjaygpOwotCWZsb2F0ZXIuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWNsYXNzTGlzdEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlmbG9hdGVyLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JTGlzdGVuZXIgY2xhc3Nlc0xpc3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNsYXNzTGlzdEVkaXRvci5nZXRJdGVtKCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgY29sdW1uID0gY2xhc3NMaXN0RWRpdG9yLmdldENvbHVtbigpOwotCQkJQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IChDbGFzc0RhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoY29sdW1uID09IENMQVNTX0ZMQUdTX0NPTFVNTikgewotCQkJCVN0cmluZ1tdIGZsYWdzID0gY2xhc3NFZGl0b3JMdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQljbGFzc0RhdGEuc2V0RmxhZ3MoZmxhZ3MpOwotCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGdldEZsYWdzU3RyaW5nKGNsYXNzRGF0YS5nZXRGbGFncygpKSk7Ci0JCQkJaXRlbS5zZXRDaGVja2VkKGNsYXNzRGF0YS5nZXRHZW5lcmF0ZSgpKTsKLQkJCQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKGNsYXNzRGF0YS5nZXRDbGF6eigpLCBjbGFzc0RhdGEpOwotCQkJCWNsYXNzZXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWNsYXNzRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGNsYXNzZXNMaXN0TGlzdGVuZXIpOwotCWNsYXNzRWRpdG9yTHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjbGFzc2VzTGlzdExpc3RlbmVyKTsKLQljbGFzc0VkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgY2xhc3Nlc0xpc3RMaXN0ZW5lcik7Ci0KLQljbGFzc2VzTHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBFdmVudCBlKSB7Ci0JCQllLmRpc3BsYXkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCWlmIChjbGFzc2VzTHQuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQlpZiAoZS5idXR0b24gIT0gMSkgcmV0dXJuOwotCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gY2xhc3Nlc0x0LmdldEl0ZW0ocHQpOwotCQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBjb2x1bW4gPSAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzTHQuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCQkJY29sdW1uID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0JCQkJCi0JCQkJCX0KLQkJCQkJaWYgKGNvbHVtbiA9PSAtMSkgcmV0dXJuOwotCQkJCQlDbGFzc0RhdGEgZGF0YSA9IChDbGFzc0RhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmIChjb2x1bW4gPT0gQ0xBU1NfRVhDTFVERV9DT0xVTU4pIHsKLQkJCQkJCWNsYXNzVGV4dEVkaXRvci5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCQkJCWNsYXNzVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJY2xhc3NFZGl0b3JUeC5zZXRUZXh0KGRhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCQkJCWNsYXNzRWRpdG9yVHguc2VsZWN0QWxsKCk7Ci0JCQkJCQljbGFzc0VkaXRvclR4LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQljbGFzc0VkaXRvclR4LnNldEZvY3VzKCk7Ci0JCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IENMQVNTX0ZMQUdTX0NPTFVNTikgewotCQkJCQkJY2xhc3NMaXN0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJY2xhc3NMaXN0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCQljbGFzc0VkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCQkJZmxvYXRlci5zZXRMb2NhdGlvbihjbGFzc2VzTHQudG9EaXNwbGF5KGUueCwgZS55KSk7Ci0JCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQljbGFzc0VkaXRvckx0LnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZU1lbWJlcnNQYW5lbChDb21wb3NpdGUgcGFuZWwpIHsKLQlHcmlkRGF0YSBkYXRhOwotCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYW5lbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQljb21wLnNldExheW91dERhdGEoZGF0YSk7CQotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JTGFiZWwgbWVtYmVyc0xiID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQltZW1iZXJzTGIuc2V0VGV4dCgiTWVtJmJlcnMgW3JlZ2V4XToiKTsKLQlmaW5hbCBUZXh0IHNlYXJjaFRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULlNFQVJDSCk7Ci0Jc2VhcmNoVGV4dC5zZXRUZXh0KCIuKiIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlzZWFyY2hUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0Jc2VhcmNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlib29sZWFuIG1hdGNoIChpbnQgaW5kZXgsIFN0cmluZyBwYXR0ZXJuKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG1lbWJlcnNMdC5nZXRJdGVtKGluZGV4KTsKLQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQl0cnkgewotCQkJCWlmICh0ZXh0Lm1hdGNoZXMocGF0dGVybikpIHsKLQkJCQkJbWVtYmVyc0x0LnNldFNlbGVjdGlvbihpbmRleCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgcGF0dGVybiA9IHNlYXJjaFRleHQuZ2V0VGV4dCgpOwotCQkJaW50IHNlbGVjdGlvbiA9IG1lbWJlcnNMdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaW50IGNvdW50ID0gbWVtYmVyc0x0LmdldEl0ZW1Db3VudCgpOwotCQkJc2VsZWN0aW9uKys7Ci0JCQlmb3IgKGludCBpID0gc2VsZWN0aW9uOyBpIDwgY291bnQ7IGkrKykgewotCQkJCWlmIChtYXRjaCAoaSwgcGF0dGVybikpIHJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uOyBpKyspIHsKLQkJCQlpZiAobWF0Y2ggKGksIHBhdHRlcm4pKSByZXR1cm47Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCW1lbWJlcnNMdCA9IG5ldyBUYWJsZShwYW5lbCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaGVpZ2h0SGludCA9IG1lbWJlcnNMdC5nZXRJdGVtSGVpZ2h0KCkgKiA2OwotCW1lbWJlcnNMdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCW1lbWJlcnNMdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLQkJCQl1cGRhdGVHZW5lcmF0ZSgoVGFibGVJdGVtKWUuaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXVwZGF0ZVBhcmFtZXRlcnMoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCW1lbWJlclRleHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IobWVtYmVyc0x0KTsKLQltZW1iZXJUZXh0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQltZW1iZXJFZGl0b3JUeCA9IG5ldyBUZXh0KG1lbWJlcnNMdCwgU1dULlNJTkdMRSk7Ci0JbWVtYmVyVGV4dEVkaXRvci5zZXRFZGl0b3IobWVtYmVyRWRpdG9yVHgpOwotCUxpc3RlbmVyIG1lbWJlclRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCW1lbWJlckVkaXRvclR4LnNldFZpc2libGUoZmFsc2UpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBtZW1iZXJUZXh0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBtZW1iZXJUZXh0RWRpdG9yLmdldENvbHVtbigpOwotCQkJSXRlbURhdGEgbWVtYmVyRGF0YSA9IChJdGVtRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCVN0cmluZyB0ZXh0ID0gbWVtYmVyRWRpdG9yVHguZ2V0VGV4dCgpOwotCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCWlmIChtZW1iZXJEYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCQkJRmllbGREYXRhIGZpZWxkRGF0YSA9IChGaWVsZERhdGEpbWVtYmVyRGF0YTsKLQkJCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJCQljYXNlIEZJRUxEX0NBU1RfQ09MVU1OOiB7Ci0JCQkJCQlmaWVsZERhdGEuc2V0Q2FzdCh0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGZpZWxkRGF0YS5nZXRDYXN0KCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBGSUVMRF9BQ0NFU1NPUl9DT0xVTU46IHsKLQkJCQkJCWZpZWxkRGF0YS5zZXRBY2Nlc3Nvcih0ZXh0LmVxdWFscyhmaWVsZERhdGEuZ2V0RmllbGQoKS5nZXROYW1lKCkpID8gIiIgOiB0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIGZpZWxkRGF0YS5nZXRBY2Nlc3NvcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgRklFTERfRVhDTFVERV9DT0xVTU46IHsKLQkJCQkJCWZpZWxkRGF0YS5zZXRFeGNsdWRlKHRleHQpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgZmllbGREYXRhLmdldEV4Y2x1ZGUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShmaWVsZERhdGEuZ2V0RmllbGQoKSwgZmllbGREYXRhKTsKLQkJCQltZW1iZXJzTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfSBlbHNlIGlmIChtZW1iZXJEYXRhIGluc3RhbmNlb2YgTWV0aG9kRGF0YSkgewotCQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IChNZXRob2REYXRhKW1lbWJlckRhdGE7Ci0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSBNRVRIT0RfQUNDRVNTT1JfQ09MVU1OOiB7Ci0JCQkJCQltZXRob2REYXRhLnNldEFjY2Vzc29yKHRleHQuZXF1YWxzKG1ldGhvZERhdGEuZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpKSA/ICIiIDogdGV4dCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBtZXRob2REYXRhLmdldEFjY2Vzc29yKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBNRVRIT0RfRVhDTFVERV9DT0xVTU46IHsKLQkJCQkJCW1ldGhvZERhdGEuc2V0RXhjbHVkZSh0ZXh0KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChjb2x1bW4sIG1ldGhvZERhdGEuZ2V0RXhjbHVkZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKG1ldGhvZERhdGEuZ2V0TWV0aG9kKCksIG1ldGhvZERhdGEpOwotCQkJCW1lbWJlcnNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCW1lbWJlckVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBtZW1iZXJUZXh0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgbWVtYmVyVGV4dExpc3RlbmVyKTsKLQltZW1iZXJFZGl0b3JUeC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG1lbWJlclRleHRMaXN0ZW5lcik7Ci0JCi0JZmluYWwgU2hlbGwgZmxvYXRlciA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5PX1RSSU0pOwotCWZsb2F0ZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW1lbWJlckxpc3RFZGl0b3IgPSBuZXcgRmxhZ3NFZGl0b3IobWVtYmVyc0x0KTsKLQltZW1iZXJFZGl0b3JMdCA9IG5ldyBMaXN0KGZsb2F0ZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWZsb2F0ZXIuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCW1lbWJlckxpc3RFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCUxpc3RlbmVyIG1lbWJlckxpc3RMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZsb2F0ZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG1lbWJlckxpc3RFZGl0b3IuZ2V0SXRlbSgpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaW50IGNvbHVtbiA9IG1lbWJlckxpc3RFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlJdGVtRGF0YSBkYXRhID0gKEl0ZW1EYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJU3RyaW5nW10gZmxhZ3MgPSBtZW1iZXJFZGl0b3JMdC5nZXRTZWxlY3Rpb24oKTsKLQkJCWRhdGEuc2V0RmxhZ3MoZmxhZ3MpOwotCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgZ2V0RmxhZ3NTdHJpbmcoZGF0YS5nZXRGbGFncygpKSk7Ci0JCQlpdGVtLnNldENoZWNrZWQoZGF0YS5nZXRHZW5lcmF0ZSgpKTsKLQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCUZpZWxkRGF0YSBmaWVsZERhdGEgPSAoRmllbGREYXRhKWRhdGE7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZmllbGREYXRhLmdldEZpZWxkKCksIGZpZWxkRGF0YSk7Ci0JCQkJbWVtYmVyc0x0LmdldENvbHVtbihjb2x1bW4pLnBhY2soKTsKLQkJCX0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSAoTWV0aG9kRGF0YSlkYXRhOwotCQkJCW1ldGFEYXRhLnNldE1ldGFEYXRhKG1ldGhvZERhdGEuZ2V0TWV0aG9kKCksIG1ldGhvZERhdGEpOwotCQkJCW1lbWJlcnNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCW1lbWJlckVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBtZW1iZXJMaXN0TGlzdGVuZXIpOwotCW1lbWJlckVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgbWVtYmVyTGlzdExpc3RlbmVyKTsKLQltZW1iZXJFZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG1lbWJlckxpc3RMaXN0ZW5lcik7Ci0JCi0JbWVtYmVyc0x0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoZmluYWwgRXZlbnQgZSkgewotCQkJZS5kaXNwbGF5LmFzeW5jRXhlYyAobmV3IFJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQlpZiAobWVtYmVyc0x0LmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJaWYgKGUuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG1lbWJlcnNMdC5nZXRJdGVtKHB0KTsKLQkJCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpbnQgY29sdW1uID0gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyc0x0LmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHB0KSkgewotCQkJCQkJCWNvbHVtbiA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9CQkJCQotCQkJCQl9Ci0JCQkJCWlmIChjb2x1bW4gPT0gLTEpIHJldHVybjsKLQkJCQkJSXRlbURhdGEgaXRlbURhdGEgPSAoSXRlbURhdGEpaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIEZpZWxkRGF0YSkgewotCQkJCQkJRmllbGREYXRhIGRhdGEgPSAoRmllbGREYXRhKWl0ZW1EYXRhOwotCQkJCQkJaWYgKGNvbHVtbiA9PSBGSUVMRF9DQVNUX0NPTFVNTiB8fCBjb2x1bW4gPT0gRklFTERfQUNDRVNTT1JfQ09MVU1OIHx8IGNvbHVtbiA9PSBGSUVMRF9FWENMVURFX0NPTFVNTikgewotCQkJCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQkJbWVtYmVyVGV4dEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gIiI7Ci0JCQkJCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJCQkJY2FzZSBGSUVMRF9DQVNUX0NPTFVNTjogdGV4dCA9IGRhdGEuZ2V0Q2FzdCgpOyBicmVhazsKLQkJCQkJCQkJY2FzZSBGSUVMRF9BQ0NFU1NPUl9DT0xVTU46IHsKLQkJCQkJCQkJCXRleHQgPSBkYXRhLmdldEFjY2Vzc29yKCk7IAotCQkJCQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgdGV4dCA9IGRhdGEuZ2V0RmllbGQoKS5nZXROYW1lKCk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXNlIEZJRUxEX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRUZXh0KHRleHQpOwotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IEZJRUxEX0ZMQUdTX0NPTFVNTikgewotCQkJCQkJCW1lbWJlckxpc3RFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQkJbWVtYmVyTGlzdEVkaXRvci5zZXRJdGVtKGl0ZW0pOwotCQkJCQkJCW1lbWJlckVkaXRvckx0LnNldEl0ZW1zKEZpZWxkRGF0YS5nZXRBbGxGbGFncygpKTsKLQkJCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRTZWxlY3Rpb24oZGF0YS5nZXRGbGFncygpKTsKLQkJCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKG1lbWJlcnNMdC50b0Rpc3BsYXkoZS54LCBlLnkpKTsKLQkJCQkJCQlmbG9hdGVyLnBhY2soKTsKLQkJCQkJCQlmbG9hdGVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yTHQuc2V0Rm9jdXMoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJCQkJCU1ldGhvZERhdGEgZGF0YSA9IChNZXRob2REYXRhKWl0ZW1EYXRhOwotCQkJCQkJaWYgKGNvbHVtbiA9PSBNRVRIT0RfRVhDTFVERV9DT0xVTU4gfHwgY29sdW1uID09IE1FVEhPRF9BQ0NFU1NPUl9DT0xVTU4pIHsKLQkJCQkJCQltZW1iZXJUZXh0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJCW1lbWJlclRleHRFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9ICIiOwotCQkJCQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJCQkJCWNhc2UgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTjogewotCQkJCQkJCQkJdGV4dCA9IGRhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJCQkJCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHRleHQgPSBkYXRhLmdldE1ldGhvZCgpLmdldE5hbWUoKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhc2UgTUVUSE9EX0VYQ0xVREVfQ09MVU1OOiB0ZXh0ID0gZGF0YS5nZXRFeGNsdWRlKCk7IGJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQltZW1iZXJFZGl0b3JUeC5zZXRUZXh0KHRleHQpOwotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNlbGVjdEFsbCgpOwotCQkJCQkJCW1lbWJlckVkaXRvclR4LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJbWVtYmVyRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCQkJCX0gZWxzZSBpZiAoY29sdW1uID09IE1FVEhPRF9GTEFHU19DT0xVTU4pIHsKLQkJCQkJCQltZW1iZXJMaXN0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJCW1lbWJlckxpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRJdGVtcyhNZXRob2REYXRhLmdldEFsbEZsYWdzKCkpOwotCQkJCQkJCW1lbWJlckVkaXRvckx0LnNldFNlbGVjdGlvbihkYXRhLmdldEZsYWdzKCkpOwotCQkJCQkJCWZsb2F0ZXIuc2V0TG9jYXRpb24obWVtYmVyc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCQkJCWZsb2F0ZXIucGFjaygpOwotCQkJCQkJCWZsb2F0ZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCQltZW1iZXJFZGl0b3JMdC5zZXRGb2N1cygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCBjcmVhdGVQYXJhbWV0ZXJzUGFuZWwoQ29tcG9zaXRlIHBhbmVsKSB7Ci0JTGFiZWwgcGFyYW1zTGIgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQlwYXJhbXNMYi5zZXRUZXh0KCImUGFyYW1ldGVyczoiKTsKLQkKLQlHcmlkRGF0YSBkYXRhOwotCXBhcmFtc0x0ID0gbmV3IFRhYmxlKHBhbmVsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JaW50IGl0ZW1IZWlnaHQgPSBwYXJhbXNMdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gaXRlbUhlaWdodCAqIDY7Ci0JcGFyYW1zTHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwYXJhbXNMdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsKLQkJCQl1cGRhdGVHZW5lcmF0ZSgoVGFibGVJdGVtKWUuaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCVRhYmxlQ29sdW1uIGNvbHVtbjsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocGFyYW1zTHQsIFNXVC5OT05FLCBQQVJBTV9JTkRFWF9DT0xVTU4pOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYXJhbXNMdCwgU1dULk5PTkUsIFBBUkFNX1RZUEVfQ09MVU1OKTsKLQljb2x1bW4uc2V0VGV4dCgiVHlwZSIpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYXJhbXNMdCwgU1dULk5PTkUsIFBBUkFNX0ZMQUdTX0NPTFVNTik7Ci0JY29sdW1uLnNldFRleHQoIkZsYWdzIik7Ci0JY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHBhcmFtc0x0LCBTV1QuTk9ORSwgUEFSQU1fQ0FTVF9DT0xVTU4pOwotCWNvbHVtbi5zZXRUZXh0KCJDYXN0Iik7Ci0JCi0JcGFyYW1UZXh0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKHBhcmFtc0x0KTsKLQlwYXJhbVRleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCXBhcmFtRWRpdG9yVHggPSBuZXcgVGV4dChwYXJhbXNMdCwgU1dULlNJTkdMRSk7Ci0JcGFyYW1UZXh0RWRpdG9yLnNldEVkaXRvcihwYXJhbUVkaXRvclR4KTsKLQlMaXN0ZW5lciBwYXJhbVRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuVHJhdmVyc2UpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCXBhcmFtVGV4dEVkaXRvci5zZXRJdGVtKG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJcGFyYW1FZGl0b3JUeC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gcGFyYW1UZXh0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBwYXJhbVRleHRFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IChQYXJhbWV0ZXJEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBQQVJBTV9DQVNUX0NPTFVNTikgewotCQkJCVN0cmluZyB0ZXh0ID0gcGFyYW1FZGl0b3JUeC5nZXRUZXh0KCk7Ci0JCQkJcGFyYW1EYXRhLnNldENhc3QodGV4dCk7Ci0JCQkJaXRlbS5zZXRUZXh0KGNvbHVtbiwgcGFyYW1EYXRhLmdldENhc3QoKSk7Ci0JCQkJTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQkJCQltZXRhRGF0YS5zZXRNZXRhRGF0YShwYXJhbURhdGEuZ2V0TWV0aG9kKCksIHBhcmFtRGF0YS5nZXRQYXJhbWV0ZXIoKSwgcGFyYW1EYXRhKTsKLQkJCQlwYXJhbXNMdC5nZXRDb2x1bW4oY29sdW1uKS5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXBhcmFtRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIHBhcmFtVGV4dExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvclR4LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgcGFyYW1UZXh0TGlzdGVuZXIpOwotCXBhcmFtRWRpdG9yVHguYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBwYXJhbVRleHRMaXN0ZW5lcik7Ci0JCi0JZmluYWwgU2hlbGwgZmxvYXRlciA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5PX1RSSU0pOwotCWZsb2F0ZXIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXBhcmFtTGlzdEVkaXRvciA9IG5ldyBGbGFnc0VkaXRvcihwYXJhbXNMdCk7Ci0JcGFyYW1FZGl0b3JMdCA9IG5ldyBMaXN0KGZsb2F0ZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCXBhcmFtRWRpdG9yTHQuc2V0SXRlbXMoUGFyYW1ldGVyRGF0YS5nZXRBbGxGbGFncygpKTsKLQlmbG9hdGVyLnBhY2soKTsKLQlmbG9hdGVyLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlwYXJhbUxpc3RFZGl0b3Iuc2V0SXRlbShudWxsKTsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCUxpc3RlbmVyIHBhcmFtTGlzdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZmxvYXRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gcGFyYW1MaXN0RWRpdG9yLmdldEl0ZW0oKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBjb2x1bW4gPSBwYXJhbUxpc3RFZGl0b3IuZ2V0Q29sdW1uKCk7Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IChQYXJhbWV0ZXJEYXRhKWl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGNvbHVtbiA9PSBQQVJBTV9GTEFHU19DT0xVTU4pIHsKLQkJCQlTdHJpbmdbXSBmbGFncyA9IHBhcmFtRWRpdG9yTHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJcGFyYW1EYXRhLnNldEZsYWdzKGZsYWdzKTsKLQkJCQlpdGVtLnNldFRleHQoY29sdW1uLCBnZXRGbGFnc1N0cmluZyhwYXJhbURhdGEuZ2V0RmxhZ3MoKSkpOwotCQkJCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JCQkJbWV0YURhdGEuc2V0TWV0YURhdGEocGFyYW1EYXRhLmdldE1ldGhvZCgpLCBwYXJhbURhdGEuZ2V0UGFyYW1ldGVyKCksIHBhcmFtRGF0YSk7Ci0JCQkJcGFyYW1zTHQuZ2V0Q29sdW1uKGNvbHVtbikucGFjaygpOwotCQkJfQotCQl9Ci0JfTsKLQlwYXJhbUVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBwYXJhbUxpc3RMaXN0ZW5lcik7Ci0JcGFyYW1FZGl0b3JMdC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHBhcmFtTGlzdExpc3RlbmVyKTsKLQlwYXJhbUVkaXRvckx0LmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgcGFyYW1MaXN0TGlzdGVuZXIpOwotCi0JcGFyYW1zTHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChmaW5hbCBFdmVudCBlKSB7Ci0JCQllLmRpc3BsYXkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCWlmIChwYXJhbXNMdC5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQkJCWlmIChlLmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGUueCwgZS55KTsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBwYXJhbXNMdC5nZXRJdGVtKHB0KTsKLQkJCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpbnQgY29sdW1uID0gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zTHQuZ2V0Q29sdW1uQ291bnQoKTsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMocHQpKSB7Ci0JCQkJCQkJY29sdW1uID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0JCQkJCi0JCQkJCX0KLQkJCQkJaWYgKGNvbHVtbiA9PSAtMSkgcmV0dXJuOwotCQkJCQlQYXJhbWV0ZXJEYXRhIGRhdGEgPSAoUGFyYW1ldGVyRGF0YSlpdGVtLmdldERhdGEoKTsKLQkJCQkJaWYgKGNvbHVtbiA9PSBQQVJBTV9DQVNUX0NPTFVNTikgewotCQkJCQkJcGFyYW1UZXh0RWRpdG9yLnNldENvbHVtbihjb2x1bW4pOwotCQkJCQkJcGFyYW1UZXh0RWRpdG9yLnNldEl0ZW0oaXRlbSk7Ci0JCQkJCQlwYXJhbUVkaXRvclR4LnNldFRleHQoZGF0YS5nZXRDYXN0KCkpOwotCQkJCQkJcGFyYW1FZGl0b3JUeC5zZWxlY3RBbGwoKTsKLQkJCQkJCXBhcmFtRWRpdG9yVHguc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXBhcmFtRWRpdG9yVHguc2V0Rm9jdXMoKTsKLQkJCQkJfSBlbHNlIGlmIChjb2x1bW4gPT0gUEFSQU1fRkxBR1NfQ09MVU1OKSB7Ci0JCQkJCQlwYXJhbUxpc3RFZGl0b3Iuc2V0Q29sdW1uKGNvbHVtbik7Ci0JCQkJCQlwYXJhbUxpc3RFZGl0b3Iuc2V0SXRlbShpdGVtKTsKLQkJCQkJCXBhcmFtRWRpdG9yTHQuc2V0U2VsZWN0aW9uKGRhdGEuZ2V0RmxhZ3MoKSk7Ci0JCQkJCQlmbG9hdGVyLnNldExvY2F0aW9uKHBhcmFtc0x0LnRvRGlzcGxheShlLngsIGUueSkpOwotCQkJCQkJZmxvYXRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJcGFyYW1FZGl0b3JMdC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9KTsKLX0KLQotQnV0dG9uIGNyZWF0ZUFjdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQlCdXR0b24gYWN0aW9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQlhY3Rpb24uc2V0VGV4dCh0ZXh0KTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JYWN0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JYWN0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlyZXR1cm4gYWN0aW9uOwotfQotCi12b2lkIGNyZWF0ZUFjdGlvbkJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewkJCi0JYWN0aW9uc1BhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JYWN0aW9uc1BhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCUdyaWRMYXlvdXQgYWN0aW9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JYWN0aW9uc0xheW91dC5udW1Db2x1bW5zID0gMTsKLQlhY3Rpb25zUGFuZWwuc2V0TGF5b3V0KGFjdGlvbnNMYXlvdXQpOwotCQotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSAmQWxsIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZUFsbCgpOwotCQl9Ci0JfSk7Ci0JCi0JTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGFjdGlvbnNQYW5lbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0Jc2VwYXJhdG9yID0gbmV3IExhYmVsKGFjdGlvbnNQYW5lbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlIFN0cnVjdHMgJkhlYWRlciIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVTdHJ1Y3RzSGVhZGVyKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgJlN0cnVjdHMiLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWdlbmVyYXRlU3RydWN0cygpOwotCQl9Ci0JfSk7Ci0JY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbnNQYW5lbCwgIkdlbmVyYXRlICZOYXRpdmVzIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZU5hdGl2ZXMoKTsKLQkJfQotCX0pOwotCWNyZWF0ZUFjdGlvbkJ1dHRvbihhY3Rpb25zUGFuZWwsICJHZW5lcmF0ZSBNZXRhICZEYXRhIiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlnZW5lcmF0ZU1ldGFEYXRhKCk7Ci0JCX0KLQl9KTsKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgQ29ucyZ0YW50cyIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVDb25zdGFudHMoKTsKLQkJfQotCX0pOwkKLQljcmVhdGVBY3Rpb25CdXR0b24oYWN0aW9uc1BhbmVsLCAiR2VuZXJhdGUgU2kmemVvZiIsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZ2VuZXJhdGVTaXplb2YoKTsKLQkJfQotCX0pOwotCi0JQ29tcG9zaXRlIGZpbGxlciA9IG5ldyBDb21wb3NpdGUoYWN0aW9uc1BhbmVsLCBTV1QuTk9ORSk7Ci0JZmlsbGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQotCXByb2dyZXNzTGFiZWwgPSBuZXcgTGFiZWwoYWN0aW9uc1BhbmVsLCBTV1QuTk9ORSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCXByb2dyZXNzTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwcm9ncmVzc0xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQotCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKGFjdGlvbnNQYW5lbCwgU1dULk5PTkUpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCXByb2dyZXNzQmFyLnNldFZpc2libGUoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCBydW4oKSB7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2xlYW51cCgpOwotfQotCi1TdHJpbmcgZ2V0UGFja2FnZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JaW50IGRvdCA9IGFwcC5nZXRNYWluQ2xhc3NOYW1lKCkubGFzdEluZGV4T2YoJy4nKTsKLQlpZiAoZG90ID09IC0xKSByZXR1cm4gIiI7Ci0JcmV0dXJuIGFwcC5nZXRNYWluQ2xhc3NOYW1lKCkuc3Vic3RyaW5nKDAsIGRvdCk7Ci19Ci0KLVN0cmluZyBnZXRDbGFzc1N0cmluZyhDbGFzcyBjbGF6eikgewotCVN0cmluZyBuYW1lID0gSk5JR2VuZXJhdG9yLmdldFR5cGVTaWduYXR1cmUzKGNsYXp6KTsKLQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JaWYgKGluZGV4ID09IC0xKSByZXR1cm4gbmFtZTsKLQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCgpKTsKLX0KLQotU3RyaW5nIGdldEZsYWdzU3RyaW5nKFN0cmluZ1tdIGZsYWdzKSB7Ci0JaWYgKGZsYWdzLmxlbmd0aCA9PSAwKSByZXR1cm4gIiI7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGZsYWdzLmxlbmd0aDsgaisrKSB7Ci0JCVN0cmluZyBmbGFnID0gZmxhZ3Nbal07Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgIT0gMCkgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLQkJYnVmZmVyLmFwcGVuZChmbGFnKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1TdHJpbmcgZ2V0TWV0aG9kU3RyaW5nKE1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmcgcGtnTmFtZSA9IGdldFBhY2thZ2VTdHJpbmcobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKSk7Ci0JYnVmZmVyLmFwcGVuZCgiKCIpOwotCUNsYXNzW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW0gPSBwYXJhbXNbaV07Ci0JCWlmIChpICE9IDApIGJ1ZmZlci5hcHBlbmQoIiwiKTsKLQkJU3RyaW5nIHN0cmluZyA9IEpOSUdlbmVyYXRvci5nZXRUeXBlU2lnbmF0dXJlMyhwYXJhbSk7Ci0JCWlmIChzdHJpbmcuc3RhcnRzV2l0aChwa2dOYW1lKSkgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhwa2dOYW1lLmxlbmd0aCgpICsgMSk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0JYnVmZmVyLmFwcGVuZCgiKSIpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLQotU3RyaW5nIGdldEZpZWxkU3RyaW5nKEZpZWxkIGZpZWxkKSB7Ci0JcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKLX0KLQotdm9pZCB1cGRhdGVDbGFzc2VzKCkgewotCWNsYXNzZXNMdC5yZW1vdmVBbGwoKTsKLQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCUNsYXNzW10gY2xhc3NlcyA9IGFwcC5nZXRDbGFzc2VzKCk7Ci0JaW50IG1haW5JbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsKLQkJaWYgKGNsYXp6LmVxdWFscyhhcHAuZ2V0TWFpbkNsYXNzKCkpKSBtYWluSW5kZXggPSBpOwotCQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gbWV0YURhdGEuZ2V0TWV0YURhdGEoY2xhenopOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY2xhc3Nlc0x0LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0RGF0YShjbGFzc0RhdGEpOwotCQlpdGVtLnNldFRleHQoQ0xBU1NfTkFNRV9DT0xVTU4sIGdldENsYXNzU3RyaW5nKGNsYXp6KSk7Ci0JCWl0ZW0uc2V0VGV4dChDTEFTU19GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGNsYXNzRGF0YS5nZXRGbGFncygpKSk7Ci0JCWl0ZW0uc2V0Q2hlY2tlZChjbGFzc0RhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IGNsYXNzZXNMdC5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCWNvbHVtbi5wYWNrKCk7Ci0JfQotCWNsYXNzZXNMdC5zZXRTZWxlY3Rpb24obWFpbkluZGV4KTsKLX0KLQotdm9pZCB1cGRhdGVNZW1iZXJzKCkgewotCW1lbWJlcnNMdC5yZW1vdmVBbGwoKTsKLQlNZXRhRGF0YSBtZXRhRGF0YSA9IGFwcC5nZXRNZXRhRGF0YSgpOwotCW1lbWJlcnNMdC5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBtZW1iZXJzTHQuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQljb2x1bW4uZGlzcG9zZSgpOwotCX0KLQlpbnRbXSBpbmRpY2VzID0gY2xhc3Nlc0x0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQlpZiAoaW5kaWNlcy5sZW5ndGggIT0gMSkgcmV0dXJuOwotCVRhYmxlSXRlbSBjbGFzc0l0ZW0gPSBjbGFzc2VzTHQuZ2V0SXRlbShpbmRpY2VzWzBdKTsKLQlDbGFzc0RhdGEgY2xhc3NEYXRhID0gKENsYXNzRGF0YSljbGFzc0l0ZW0uZ2V0RGF0YSgpOwotCUNsYXNzIGNsYXp6ID0gY2xhc3NEYXRhLmdldENsYXp6KCk7Ci0JYm9vbGVhbiBoYXNOYXRpdmVzID0gZmFsc2U7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaW50IG1vZHMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmIChoYXNOYXRpdmVzID0oKG1vZHMgJiBNb2RpZmllci5OQVRJVkUpICE9IDApKSBicmVhazsKLQl9Ci0JbWVtYmVyc0x0LnNldFJlZHJhdyhmYWxzZSk7Ci0JaWYgKGhhc05hdGl2ZXMpIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgTUVUSE9EX05BTUVfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIk1ldGhvZCIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgTUVUSE9EX0ZMQUdTX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJGbGFncyIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgTUVUSE9EX0FDQ0VTU09SX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJBY2Nlc3NvciIpOwotCQkvKgotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgTUVUSE9EX0VYQ0xVREVfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkV4Y2x1ZGUiKTsKLQkJKi8KLQkJSk5JR2VuZXJhdG9yLnNvcnQobWV0aG9kcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShtZXRob2QpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKG1lbWJlcnNMdCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXREYXRhKG1ldGhvZERhdGEpOwotCQkJaXRlbS5zZXRUZXh0KE1FVEhPRF9OQU1FX0NPTFVNTiwgZ2V0TWV0aG9kU3RyaW5nKG1ldGhvZCkpOwotCQkJaXRlbS5zZXRDaGVja2VkKG1ldGhvZERhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JCQlpdGVtLnNldFRleHQoTUVUSE9EX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcobWV0aG9kRGF0YS5nZXRGbGFncygpKSk7Ci0JCQlpdGVtLnNldFRleHQoTUVUSE9EX0FDQ0VTU09SX0NPTFVNTiwgbWV0aG9kRGF0YS5nZXRBY2Nlc3NvcigpKTsKLQkJCS8qCi0JCQlpdGVtLnNldFRleHQoTUVUSE9EX0VYQ0xVREVfQ09MVU1OLCBtZXRob2REYXRhLmdldEV4Y2x1ZGUoKSk7Ci0JCQkqLwotCQl9Ci0JfSBlbHNlIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfTkFNRV9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiRmllbGQiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1lbWJlcnNMdCwgU1dULk5PTkUsIEZJRUxEX0ZMQUdTX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJGbGFncyIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfQ0FTVF9DT0xVTU4pOwotCQljb2x1bW4uc2V0VGV4dCgiQ2FzdCIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obWVtYmVyc0x0LCBTV1QuTk9ORSwgRklFTERfQUNDRVNTT1JfQ09MVU1OKTsKLQkJY29sdW1uLnNldFRleHQoIkFjY2Vzc29yIik7Ci0JCS8qCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihtZW1iZXJzTHQsIFNXVC5OT05FLCBGSUVMRF9FWENMVURFX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJFeGNsdWRlIik7Ci0JCSovCi0JCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7IAotCQkJaWYgKCgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkgfHwKLQkJCQkoKG1vZHMgJiBNb2RpZmllci5GSU5BTCkgIT0gMCkgfHwKLQkJCQkoKG1vZHMgJiBNb2RpZmllci5TVEFUSUMpICE9IDApKSBjb250aW51ZTsKLQkJCUZpZWxkRGF0YSBmaWVsZERhdGEgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obWVtYmVyc0x0LCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldERhdGEoZmllbGREYXRhKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9OQU1FX0NPTFVNTiwgZ2V0RmllbGRTdHJpbmcoZmllbGQpKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZChmaWVsZERhdGEuZ2V0R2VuZXJhdGUoKSk7Ci0JCQlpdGVtLnNldFRleHQoRklFTERfQ0FTVF9DT0xVTU4sIGZpZWxkRGF0YS5nZXRDYXN0KCkpOwotCQkJaXRlbS5zZXRUZXh0KEZJRUxEX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoZmllbGREYXRhLmdldEZsYWdzKCkpKTsKLQkJCWl0ZW0uc2V0VGV4dChGSUVMRF9BQ0NFU1NPUl9DT0xVTU4sIGZpZWxkRGF0YS5nZXRBY2Nlc3NvcigpKTsKLQkJCS8qCi0JCQlpdGVtLnNldFRleHQoRklFTERfRVhDTFVERV9DT0xVTU4sIGZpZWxkRGF0YS5nZXRFeGNsdWRlKCkpOwotCQkJKi8KLQkJfQotCX0KLQljb2x1bW5zID0gbWVtYmVyc0x0LmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJY29sdW1uLnBhY2soKTsKLQl9Ci0JbWVtYmVyc0x0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JbWVtYmVyc0x0LnNldFJlZHJhdyh0cnVlKTsKLX0KLQotdm9pZCB1cGRhdGVQYXJhbWV0ZXJzKCkgewotCXBhcmFtc0x0LnJlbW92ZUFsbCgpOwotCU1ldGFEYXRhIG1ldGFEYXRhID0gYXBwLmdldE1ldGFEYXRhKCk7Ci0JaW50W10gaW5kaWNlcyA9IG1lbWJlcnNMdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JaWYgKGluZGljZXMubGVuZ3RoICE9IDEpIHsKLQkJcGFyYW1zTHQuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybjsKLQl9Ci0JVGFibGVJdGVtIG1lbWJlckl0ZW0gPSBtZW1iZXJzTHQuZ2V0SXRlbShpbmRpY2VzWzBdKTsKLQlPYmplY3QgZGF0YSA9IG1lbWJlckl0ZW0uZ2V0RGF0YSgpOwotCWlmICghKGRhdGEgaW5zdGFuY2VvZiBNZXRob2REYXRhKSkgcmV0dXJuOwotCXBhcmFtc0x0LnNldFJlZHJhdyhmYWxzZSk7Ci0JTWV0aG9kRGF0YSBtZXRob2REYXRhID0gKE1ldGhvZERhdGEpbWVtYmVySXRlbS5nZXREYXRhKCk7Ci0JTWV0aG9kIG1ldGhvZCA9IG1ldGhvZERhdGEuZ2V0TWV0aG9kKCk7Ci0JQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbSA9IHBhcmFtc1tpXTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBtZXRhRGF0YS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocGFyYW1zTHQsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXREYXRhKHBhcmFtRGF0YSk7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9JTkRFWF9DT0xVTU4sIFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJaXRlbS5zZXRUZXh0KFBBUkFNX1RZUEVfQ09MVU1OLCBnZXRDbGFzc1N0cmluZyhwYXJhbSkpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fQ0FTVF9DT0xVTU4sIHBhcmFtRGF0YS5nZXRDYXN0KCkpOwotCQlpdGVtLnNldFRleHQoUEFSQU1fRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhwYXJhbURhdGEuZ2V0RmxhZ3MoKSkpOwotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBwYXJhbXNMdC5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCWNvbHVtbi5wYWNrKCk7Ci0JfQotCXBhcmFtc0x0LnNldFJlZHJhdyh0cnVlKTsKLQlwYXJhbXNMdC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotfQotCi12b2lkIHVwZGF0ZUdlbmVyYXRlKFRhYmxlSXRlbSBpdGVtKSB7Ci0JTWV0YURhdGEgbWV0YURhdGEgPSBhcHAuZ2V0TWV0YURhdGEoKTsKLQlJdGVtRGF0YSBpdGVtRGF0YSA9IChJdGVtRGF0YSlpdGVtLmdldERhdGEoKTsKLQlpdGVtRGF0YS5zZXRHZW5lcmF0ZShpdGVtLmdldENoZWNrZWQoKSk7Ci0JaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgQ2xhc3NEYXRhKSB7Ci0JCUNsYXNzRGF0YSBkYXRhID0gKENsYXNzRGF0YSlpdGVtRGF0YTsKLQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRDbGF6eigpLCBkYXRhKTsKLQl9IGVsc2UgaWYgKGl0ZW1EYXRhIGluc3RhbmNlb2YgRmllbGREYXRhKSB7Ci0JCUZpZWxkRGF0YSBkYXRhID0gKEZpZWxkRGF0YSlpdGVtRGF0YTsKLQkJaXRlbS5zZXRUZXh0KEZJRUxEX0ZMQUdTX0NPTFVNTiwgZ2V0RmxhZ3NTdHJpbmcoZGF0YS5nZXRGbGFncygpKSk7Ci0JCW1ldGFEYXRhLnNldE1ldGFEYXRhKGRhdGEuZ2V0RmllbGQoKSwgZGF0YSk7Ci0JfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIE1ldGhvZERhdGEpIHsKLQkJTWV0aG9kRGF0YSBkYXRhID0gKE1ldGhvZERhdGEpaXRlbURhdGE7Ci0JCWl0ZW0uc2V0VGV4dChNRVRIT0RfRkxBR1NfQ09MVU1OLCBnZXRGbGFnc1N0cmluZyhkYXRhLmdldEZsYWdzKCkpKTsKLQkJbWV0YURhdGEuc2V0TWV0YURhdGEoZGF0YS5nZXRNZXRob2QoKSwgZGF0YSk7Ci0JfSBlbHNlIGlmIChpdGVtRGF0YSBpbnN0YW5jZW9mIFBhcmFtZXRlckRhdGEpIHsKLQkJUGFyYW1ldGVyRGF0YSBkYXRhID0gKFBhcmFtZXRlckRhdGEpaXRlbURhdGE7Ci0JCWl0ZW0uc2V0VGV4dChQQVJBTV9GTEFHU19DT0xVTU4sIGdldEZsYWdzU3RyaW5nKGRhdGEuZ2V0RmxhZ3MoKSkpOwotCQltZXRhRGF0YS5zZXRNZXRhRGF0YShkYXRhLmdldE1ldGhvZCgpLCBkYXRhLmdldFBhcmFtZXRlcigpLCBkYXRhKTsKLQl9Ci19Ci0KLWJvb2xlYW4gdXBkYXRlT3V0cHV0RGlyKCkgewotCVN0cmluZyBvdXRwdXREaXJTdHIgPSBvdXRwdXREaXJDYi5nZXRUZXh0KCk7Ci0JRmlsZSBmaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyU3RyKTsKLQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk9LIHwgU1dULklDT05fRVJST1IpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiT3V0cHV0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4iKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuSUNPTl9FUlJPUik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJPdXRwdXQgZGlyZWN0b3J5IGlzIG5vdCBhIGRpcmVjdG9yeS4iKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAob3V0cHV0RGlyU3RyLmxlbmd0aCgpID4gMCkgewotCQlpZiAoIW91dHB1dERpclN0ci5lcXVhbHMoYXBwLmdldE91dHB1dERpcigpKSkgewotCQkJYXBwLnNldE91dHB1dERpcihvdXRwdXREaXJTdHIpOwotCQl9Ci0JCWlmIChvdXRwdXREaXJDYi5pbmRleE9mKG91dHB1dERpclN0cikgPT0gLTEpIHsKLQkJCW91dHB1dERpckNiLmFkZChvdXRwdXREaXJTdHIpOwotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIHVwZGF0ZU1haW5DbGFzcygpIHsKLQlTdHJpbmcgbWFpbkNsYXNzU3RyID0gbWFpbkNsYXNzQ2IuZ2V0VGV4dCgpOwotCWlmIChtYWluQ2xhc3NTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCWlmICghbWFpbkNsYXNzU3RyLmVxdWFscyhhcHAuZ2V0TWFpbkNsYXNzTmFtZSgpKSkgewotCQkJYXBwLnNldE1haW5DbGFzc05hbWUobWFpbkNsYXNzU3RyKTsKLQkJfQotCQlpZiAobWFpbkNsYXNzQ2IuaW5kZXhPZihtYWluQ2xhc3NTdHIpID09IC0xKSB7Ci0JCQltYWluQ2xhc3NDYi5hZGQobWFpbkNsYXNzU3RyKTsKLQkJfQotCQlpZiAoYXBwLmdldE91dHB1dERpcigpICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IG91dHB1dERpckNiLmluZGV4T2YoYXBwLmdldE91dHB1dERpcigpKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgb3V0cHV0RGlyQ2Iuc2VsZWN0KGluZGV4KTsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCUpOSUdlbmVyYXRvckFwcCBnZW4gPSBuZXcgSk5JR2VuZXJhdG9yQXBwICgpOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoYXJnc1swXSk7Ci0JCWlmIChhcmdzLmxlbmd0aCA+IDEpIGdlbi5zZXRPdXRwdXREaXIoYXJnc1sxXSk7Ci0JfSBlbHNlIHsKLQkJZ2VuLnNldE1haW5DbGFzc05hbWUoSk5JR2VuZXJhdG9yQXBwLmdldERlZmF1bHRNYWluQ2xhc3MoKSk7Ci0JfQotCUpOSUdlbmVyYXRvckFwcFVJIHVpID0gbmV3IEpOSUdlbmVyYXRvckFwcFVJKGdlbik7Ci0JdWkub3BlbigpOwotCXVpLnJ1bigpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg5ZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1wdWJsaWMgY2xhc3MgTWV0YURhdGEgewotCQotCVByb3BlcnRpZXMgZGF0YTsKLQotcHVibGljIE1ldGFEYXRhKFN0cmluZyBtYWluQ2xhc3MpIHsKLQlkYXRhID0gbmV3IFByb3BlcnRpZXMoKTsKLQlpbnQgaW5kZXggPSAwOwotCUNsYXNzIGNsYXp6ID0gZ2V0Q2xhc3MoKTsKLQlpbnQgbGVuZ3RoID0gbWFpbkNsYXNzLmxlbmd0aCgpOwotCXdoaWxlIChpbmRleCA8IGxlbmd0aCkgewotCQlpbmRleCA9IG1haW5DbGFzcy5pbmRleE9mKCcuJywgaW5kZXgpOwotCQlpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gbGVuZ3RoOwotCQlJbnB1dFN0cmVhbSBpcyA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0obWFpbkNsYXNzLnN1YnN0cmluZygwLCBpbmRleCkgKyAiLnByb3BlcnRpZXMiKTsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGF0YS5sb2FkKGlzKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQkJCi0JCX0KLQkJaW5kZXgrKzsKLQl9Ci19Ci0KLXB1YmxpYyBNZXRhRGF0YShQcm9wZXJ0aWVzIGRhdGEpIHsKLQl0aGlzLmRhdGEgPSBkYXRhOwotfQotCi1wdWJsaWMgQ2xhc3NEYXRhIGdldE1ldGFEYXRhKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGtleSA9IEpOSUdlbmVyYXRvci50b0MoY2xhenouZ2V0TmFtZSgpKTsKLQlTdHJpbmcgdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksICIiKTsKLQlyZXR1cm4gbmV3IENsYXNzRGF0YShjbGF6eiwgdmFsdWUpOwotfQotCi1wdWJsaWMgRmllbGREYXRhIGdldE1ldGFEYXRhKEZpZWxkIGZpZWxkKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIGZpZWxkLmdldE5hbWUoKTsKLQlTdHJpbmcgdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksICIiKTsKLQlyZXR1cm4gbmV3IEZpZWxkRGF0YShmaWVsZCwgdmFsdWUpOwotfQotCi1ib29sZWFuIGNvbnZlcnRUbzMyQml0KENsYXNzW10gcGFyYW1UeXBlcykgewotCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlpZiAocGFyYW1UeXBlID09IExvbmcuVFlQRSkgewotCQkJcGFyYW1UeXBlc1tpXSA9IEludGVnZXIuVFlQRTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCWlmIChwYXJhbVR5cGUgPT0gbG9uZ1tdLmNsYXNzKSB7Ci0JCQlwYXJhbVR5cGVzW2ldID0gaW50W10uY2xhc3M7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gY2hhbmdlZDsJCi19Ci0KLXB1YmxpYyBNZXRob2REYXRhIGdldE1ldGFEYXRhKE1ldGhvZCBtZXRob2QpIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kKTsKLQlTdHJpbmcgdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIG1ldGhvZC5nZXROYW1lKCk7Ci0JCXZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQl9Ci0JLyoKLQkqIFN1cHBvcnQgZm9yIDY0IGJpdCBwb3J0LgotCSovCi0JaWYgKHZhbHVlID09IG51bGwpIHsKLQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWlmIChjb252ZXJ0VG8zMkJpdChwYXJhbVR5cGVzKSkgewotCQkJa2V5ID0gY2xhc3NOYW1lICsgIl8iICsgSk5JR2VuZXJhdG9yLmdldEZ1bmN0aW9uTmFtZShtZXRob2QsIHBhcmFtVHlwZXMpOwotCQkJdmFsdWUgPSBnZXRNZXRhRGF0YShrZXksIG51bGwpOwotCQl9Ci0JfQkKLQlpZiAodmFsdWUgPT0gbnVsbCkgdmFsdWUgPSAiIjsJCi0JcmV0dXJuIG5ldyBNZXRob2REYXRhKG1ldGhvZCwgdmFsdWUpOwotfQotCi1wdWJsaWMgUGFyYW1ldGVyRGF0YSBnZXRNZXRhRGF0YShNZXRob2QgbWV0aG9kLCBpbnQgcGFyYW1ldGVyKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCVN0cmluZyBrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkgKyAiXyIgKyBwYXJhbWV0ZXI7Ci0JU3RyaW5nIHZhbHVlID0gZ2V0TWV0YURhdGEoa2V5LCBudWxsKTsKLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIl8iICsgcGFyYW1ldGVyOwotCQl2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JfQkKLQkvKgotCSogU3VwcG9ydCBmb3IgNjQgYml0IHBvcnQuCi0JKi8KLQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJaWYgKGNvbnZlcnRUbzMyQml0KHBhcmFtVHlwZXMpKSB7Ci0JCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCwgcGFyYW1UeXBlcykgKyAiXyIgKyBwYXJhbWV0ZXI7Ci0JCQl2YWx1ZSA9IGdldE1ldGFEYXRhKGtleSwgbnVsbCk7Ci0JCX0KLQl9CQotCWlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwkKLQlyZXR1cm4gbmV3IFBhcmFtZXRlckRhdGEobWV0aG9kLCBwYXJhbWV0ZXIsIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JcmV0dXJuIGRhdGEuZ2V0UHJvcGVydHkoa2V5LCBkZWZhdWx0VmFsdWUpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShDbGFzcyBjbGF6eiwgQ2xhc3NEYXRhIHZhbHVlKSB7Ci0JU3RyaW5nIGtleSA9IEpOSUdlbmVyYXRvci50b0MoY2xhenouZ2V0TmFtZSgpKTsKLQlzZXRNZXRhRGF0YShrZXksIHZhbHVlLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShGaWVsZCBmaWVsZCwgRmllbGREYXRhIHZhbHVlKSB7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JU3RyaW5nIGtleSA9IGNsYXNzTmFtZSArICJfIiArIGZpZWxkLmdldE5hbWUoKTsKLQlzZXRNZXRhRGF0YShrZXksIHZhbHVlLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRNZXRhRGF0YShNZXRob2QgbWV0aG9kLCBNZXRob2REYXRhIHZhbHVlKSB7Ci0JU3RyaW5nIGtleTsKLQlTdHJpbmcgY2xhc3NOYW1lID0gSk5JR2VuZXJhdG9yLmdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0JaWYgKEpOSUdlbmVyYXRvci5pc05hdGl2ZVVuaXF1ZShtZXRob2QpKSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIG1ldGhvZC5nZXROYW1lICgpOwotCX0gZWxzZSB7Ci0JCWtleSA9IGNsYXNzTmFtZSArICJfIiArIEpOSUdlbmVyYXRvci5nZXRGdW5jdGlvbk5hbWUobWV0aG9kKTsKLQl9Ci0Jc2V0TWV0YURhdGEoa2V5LCB2YWx1ZS50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0TWV0YURhdGEoTWV0aG9kIG1ldGhvZCwgaW50IGFyZywgUGFyYW1ldGVyRGF0YSB2YWx1ZSkgewotCVN0cmluZyBrZXk7Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IEpOSUdlbmVyYXRvci5nZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCWlmIChKTklHZW5lcmF0b3IuaXNOYXRpdmVVbmlxdWUobWV0aG9kKSkgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBtZXRob2QuZ2V0TmFtZSAoKSArICJfIiArIGFyZzsKLQl9IGVsc2UgewotCQlrZXkgPSBjbGFzc05hbWUgKyAiXyIgKyBKTklHZW5lcmF0b3IuZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkgKyAiXyIgKyBhcmc7Ci0JfQotCXNldE1ldGFEYXRhKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCWRhdGEuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRhRGF0YUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDc3ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01ldGFEYXRhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUdlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotCWdlbmVyYXRlTWV0YURhdGEoInN3dF9wcm9wZXJ0aWVzX2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCW91dHB1dCh0b0MoY2xhenouZ2V0TmFtZSgpKSk7Ci0Jb3V0cHV0KCI9Iik7Ci0JQ2xhc3NEYXRhIGRhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQlpZiAoZGF0YSAhPSBudWxsKSBvdXRwdXQoZGF0YS50b1N0cmluZygpKTsKLQlvdXRwdXRsbigpOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlnZW5lcmF0ZShmaWVsZHMpOwotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlnZW5lcmF0ZShtZXRob2RzKTsKLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZFtdIGZpZWxkcykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpbnQgbW9kcyA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5QVUJMSUMpID09IDApIGNvbnRpbnVlOwotCQlpZiAoKG1vZHMgJiBNb2RpZmllci5GSU5BTCkgIT0gMCkgY29udGludWU7Ci0JCWlmICgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKGZpZWxkKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKEZpZWxkIGZpZWxkKSB7Ci0Jb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0Jb3V0cHV0KCJfIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0KCI9Iik7Ci0JRmllbGREYXRhIGRhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGZpZWxkKTsKLQlpZiAoZGF0YSAhPSBudWxsKSBvdXRwdXQoZGF0YS50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoTWV0aG9kW10gbWV0aG9kcykgewotCXNvcnQobWV0aG9kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKG1ldGhvZCk7Ci0JCW91dHB1dGxuKCk7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zdGVwKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2QgbWV0aG9kKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKGdldENsYXNzTmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCWJ1ZmZlci5hcHBlbmQoIl8iKTsKLQlpZiAoaXNOYXRpdmVVbmlxdWUobWV0aG9kKSkgewotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkpOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkpOwotCX0KLQlTdHJpbmcga2V5ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0Jb3V0cHV0KGtleSk7Ci0Jb3V0cHV0KCI9Iik7Ci0JTWV0aG9kRGF0YSBtZXRob2REYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QpOwotCWlmIChtZXRob2REYXRhICE9IG51bGwpIG91dHB1dChtZXRob2REYXRhLnRvU3RyaW5nKCkpOwotCW91dHB1dGxuKCk7Ci0JaW50IGxlbmd0aCA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCW91dHB1dChrZXkpOwotCQlvdXRwdXQoIl8iKTsKLQkJb3V0cHV0KGkgKyAiPSIpOwotCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJaWYgKHBhcmFtRGF0YSAhPSBudWxsKSBvdXRwdXQocGFyYW1EYXRhLnRvU3RyaW5nKCkpOwotCQlvdXRwdXRsbigpOwkJCi0JfQotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQlyZXR1cm4gIi5wcm9wZXJ0aWVzIjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCXJldHVybiBnZXRNYWluQ2xhc3MoKS5nZXROYW1lKCk7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGdldEdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRob2REYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTWV0aG9kRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY2M2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9NZXRob2REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGF0YSBleHRlbmRzIEl0ZW1EYXRhIHsKLQkKLQlNZXRob2QgbWV0aG9kOwotCi1wdWJsaWMgTWV0aG9kRGF0YShNZXRob2QgbWV0aG9kLCBTdHJpbmcgc3RyKSB7Ci0Jc3VwZXIoc3RyKTsKLQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLX0KLQotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxGbGFncygpIHsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde0ZMQUdfTk9fR0VOLCBGTEFHX0FERFJFU1MsIEZMQUdfQ09OU1QsIEZMQUdfRFlOQU1JQywgRkxBR19KTkksIEZMQUdfQ1BQLCBGTEFHX05FVywgRkxBR19ERUxFVEUsIEZMQUdfR0NORVcsIEZMQUdfR0NPQkpFQ1QsIEZMQUdfU0VUVEVSLCBGTEFHX0dFVFRFUiwgRkxBR19BRERFUn07Ci19Ci0KLXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgewotCXJldHVybiBtZXRob2Q7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7Ci0JcmV0dXJuIChTdHJpbmcpZ2V0UGFyYW0oImFjY2Vzc29yIik7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZSgpIHsKLQlyZXR1cm4gKFN0cmluZylnZXRQYXJhbSgiZXhjbHVkZSIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihTdHJpbmcgc3RyKSB7IAotCXNldFBhcmFtKCJhY2Nlc3NvciIsIHN0cik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoU3RyaW5nIHN0cikgeyAKLQlzZXRQYXJhbSgiZXhjbHVkZSIsIHN0cik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlc0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTZlMTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9OYXRpdmVzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmF0aXZlc0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLWJvb2xlYW4gZW50ZXJFeGl0TWFjcm87Ci0KLXB1YmxpYyBOYXRpdmVzR2VuZXJhdG9yKCkgewotCWVudGVyRXhpdE1hY3JvID0gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb3B5cmlnaHQoKSB7Ci0JZ2VuZXJhdGVNZXRhRGF0YSgic3d0X2NvcHlyaWdodCIpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVzKCkgewotCVN0cmluZyBvdXRwdXROYW1lID0gZ2V0T3V0cHV0TmFtZSgpOwotCW91dHB1dGxuKCIjaW5jbHVkZSBcInN3dC5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RydWN0cy5oXCIiKTsKLQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0Jb3V0cHV0KG91dHB1dE5hbWUpOwotCW91dHB1dGxuKCJfc3RhdHMuaFwiIik7Ci0Jb3V0cHV0bG4oKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSBjb3VudCsrOwotCX0KLQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQljb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKG1ldGhvZE5hbWUpKSByZXN1bHRbY291bnQrK10gPSBtZXRob2RzW2ldOwotCX0KLQlnZW5lcmF0ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzcyBjbGF6eikgewotCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQlpbnQgaSA9IDA7Ci0JZm9yICg7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgIT0gMCkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1ldGhvZHMubGVuZ3RoKSByZXR1cm47Ci0Jc29ydChtZXRob2RzKTsKLQlnZW5lcmF0ZU5hdGl2ZU1hY3JvKGNsYXp6KTsKLQlnZW5lcmF0ZUV4Y2x1ZGVzKG1ldGhvZHMpOwotCWdlbmVyYXRlKG1ldGhvZHMpOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2RbXSBtZXRob2RzKSB7Ci0Jc29ydChtZXRob2RzKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCWdlbmVyYXRlKG1ldGhvZCk7Ci0JCWlmIChwcm9ncmVzcyAhPSBudWxsKSBwcm9ncmVzcy5zdGVwKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShNZXRob2QgbWV0aG9kKSB7Ci0JTWV0aG9kRGF0YSBtZXRob2REYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QpOwotCWlmIChtZXRob2REYXRhLmdldEZsYWcoRkxBR19OT19HRU4pKSByZXR1cm47Ci0JQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JU3RyaW5nIGZ1bmN0aW9uID0gZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCk7Ci0JCi0JaWYgKCEocmV0dXJuVHlwZSA9PSBWb2lkLlRZUEUgfHwgcmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IGlzU3lzdGVtQ2xhc3MocmV0dXJuVHlwZSkgfHwgcmV0dXJuVHlwZSA9PSBTdHJpbmcuY2xhc3MpKSB7Ci0JCW91dHB1dCgiV2FybmluZzogYmFkIHJldHVybiB0eXBlLiA6Iik7Ci0JCW91dHB1dGxuKG1ldGhvZC50b1N0cmluZygpKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlnZW5lcmF0ZVNvdXJjZVN0YXJ0KGZ1bmN0aW9uKTsKLQlpZiAoaXNDUFApIHsKLQkJb3V0cHV0KCJleHRlcm4gXCJDXCIgIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgdHJ1ZSk7Ci0JCW91dHB1dGxuKCI7Iik7Ci0JfQotCWdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgZmFsc2UpOwotCWdlbmVyYXRlRnVuY3Rpb25Cb2R5KG1ldGhvZCwgbWV0aG9kRGF0YSwgZnVuY3Rpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUpOwotCWdlbmVyYXRlU291cmNlRW5kKGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFbnRlckV4aXRNYWNybyhib29sZWFuIGVudGVyRXhpdE1hY3JvKSB7Ci0JdGhpcy5lbnRlckV4aXRNYWNybyA9IGVudGVyRXhpdE1hY3JvOwotfQotCi12b2lkIGdlbmVyYXRlRXhjbHVkZXMoTWV0aG9kW10gbWV0aG9kcykgewotCUhhc2hTZXQgZXhjbHVkZXMgPSBuZXcgSGFzaFNldCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5OQVRJVkUpID09IDApIGNvbnRpbnVlOwotCQlNZXRob2REYXRhIG1ldGhvZERhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCWV4Y2x1ZGVzLmFkZChleGNsdWRlKTsKLQkJfQotCX0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQlvdXRwdXRsbihleGNsdWRlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJCU1ldGhvZERhdGEgbWV0aG9kRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kKTsKLQkJCVN0cmluZyBtZXRob2RFeGNsdWRlID0gbWV0aG9kRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCQlpZiAoZXhjbHVkZS5lcXVhbHMobWV0aG9kRXhjbHVkZSkpIHsKLQkJCQlvdXRwdXQoIiNkZWZpbmUgTk9fIik7Ci0JCQkJb3V0cHV0bG4oZ2V0RnVuY3Rpb25OYW1lKG1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJb3V0cHV0bG4oKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVOYXRpdmVNYWNybyhDbGFzcyBjbGF6eikgewotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGNsYXp6KSk7Ci0Jb3V0cHV0KCJfTkFUSVZFKGZ1bmMpIEphdmFfIik7Ci0Jb3V0cHV0KHRvQyhjbGF6ei5nZXROYW1lKCkpKTsKLQlvdXRwdXRsbigiXyMjZnVuYyIpOwotCW91dHB1dGxuKCk7Ci19Ci0KLWJvb2xlYW4gZ2VuZXJhdGVHZXRQYXJhbWV0ZXIoTWV0aG9kIG1ldGhvZCwgaW50IGksIENsYXNzIHBhcmFtVHlwZSwgUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEsIGJvb2xlYW4gY3JpdGljYWwsIGludCBpbmRlbnQpIHsKLQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSByZXR1cm4gZmFsc2U7Ci0JU3RyaW5nIGlTdHIgPSBTdHJpbmcudmFsdWVPZihpKTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSBvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KCJpZiAoYXJnIik7Ci0Jb3V0cHV0KGlTdHIpOwotCW91dHB1dCgiKSBpZiAoKGxwYXJnIik7Ci0Jb3V0cHV0KGlTdHIpOwotCW91dHB1dCgiID0gIik7Ci0JaWYgKHBhcmFtVHlwZS5pc0FycmF5KCkpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHBhcmFtVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChjcml0aWNhbCkgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIigiKTsKLQkJCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGNvbXBvbmVudFR5cGUpKTsKLQkJCQkJb3V0cHV0KCIqKSIpOwotCQkJCQlvdXRwdXQoImVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZyIpOwotCQkJCX0KLQkJCQlvdXRwdXQoaVN0cik7Ci0JCQkJb3V0cHV0KCIsIE5VTEwpIik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoImVudi0+R2V0Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCIoKmVudiktPkdldCIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheUVsZW1lbnRzKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCQlvdXRwdXQoIiwgTlVMTCkiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJfQotCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoRkxBR19VTklDT0RFKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ0NoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFyZyIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIigqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBhcmciKTsKLQkJCX0KLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiLCBOVUxMKSIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfTk9fSU4pKSB7Ci0JCQlvdXRwdXQoIiZfYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoImdldCIpOwotCQkJb3V0cHV0KGdldENsYXNzTmFtZShwYXJhbVR5cGUpKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiwgJl9hcmciKTsKLQkJCW91dHB1dChpU3RyKTsKLQkJCW91dHB1dCgiKSIpOwotCQl9Ci0JfQkKLQlvdXRwdXRsbigiKSA9PSBOVUxMKSBnb3RvIGZhaWw7Iik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTZXRQYXJhbWV0ZXIoaW50IGksIENsYXNzIHBhcmFtVHlwZSwgUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEsIGJvb2xlYW4gY3JpdGljYWwpIHsKLQlpZiAocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNTeXN0ZW1DbGFzcyhwYXJhbVR5cGUpKSByZXR1cm47Ci0JU3RyaW5nIGlTdHIgPSBTdHJpbmcudmFsdWVPZihpKTsKLQlpZiAocGFyYW1UeXBlLmlzQXJyYXkoKSkgewotCQlvdXRwdXQoIlx0aWYgKGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIpICIpOwotCQlDbGFzcyBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYgKGNyaXRpY2FsKSB7Ci0JCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJCW91dHB1dCgiZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcmciKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmciKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGlTdHIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2UiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIigqZW52KS0+UmVsZWFzZSIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTEoY29tcG9uZW50VHlwZSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIkFycmF5RWxlbWVudHMoYXJnIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheUVsZW1lbnRzKGVudiwgYXJnIik7Ci0JCQkJfQotCQkJCW91dHB1dChpU3RyKTsKLQkJCX0KLQkJCW91dHB1dCgiLCBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsICIpOwotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfTk9fT1VUKSkgewotCQkJCW91dHB1dCgiSk5JX0FCT1JUIik7Ci0JCQl9IGVsc2UgewkJCQkKLQkJCQlvdXRwdXQoIjAiKTsKLQkJCX0KLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBFcnJvcigibm90IGRvbmUiKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQlvdXRwdXQoIlx0aWYgKGFyZyIpOwotCQlvdXRwdXQoaVN0cik7Ci0JCW91dHB1dCgiICYmIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIpICIpOwotCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoRkxBR19VTklDT0RFKSkgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhcmciKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGFyZyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCW91dHB1dChpU3RyKTsKLQkJb3V0cHV0bG4oIik7Iik7Ci0JfSBlbHNlIHsKLQkJaWYgKCFwYXJhbURhdGEuZ2V0RmxhZyhGTEFHX05PX09VVCkpIHsKLQkJCW91dHB1dCgiXHRpZiAoYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXQoIiAmJiBscGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIpICIpOwotCQkJb3V0cHV0KCJzZXQiKTsKLQkJCW91dHB1dChnZXRDbGFzc05hbWUocGFyYW1UeXBlKSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGFyZyIpOwotCQkJb3V0cHV0KGlTdHIpOwotCQkJb3V0cHV0KCIsIGxwYXJnIik7Ci0JCQlvdXRwdXQoaVN0cik7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZUV4aXRNYWNybyhNZXRob2QgbWV0aG9kLCBTdHJpbmcgZnVuY3Rpb24pIHsKLQlpZiAoIWVudGVyRXhpdE1hY3JvKSByZXR1cm47Ci0Jb3V0cHV0KCJcdCIpOwotCW91dHB1dChnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQlvdXRwdXQoIl9OQVRJVkVfRVhJVChlbnYsIHRoYXQsICIpOwotCW91dHB1dChmdW5jdGlvbik7Ci0Jb3V0cHV0bG4oIl9GVU5DKTsiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUVudGVyTWFjcm8oTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uKSB7Ci0JaWYgKCFlbnRlckV4aXRNYWNybykgcmV0dXJuOwotCW91dHB1dCgiXHQiKTsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0Jb3V0cHV0KCJfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgIik7Ci0Jb3V0cHV0KGZ1bmN0aW9uKTsKLQlvdXRwdXRsbigiX0ZVTkMpOyIpOwotfQotCi1ib29sZWFuIGdlbmVyYXRlTG9jYWxWYXJzKE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1UeXBlcywgQ2xhc3MgcmV0dXJuVHlwZSkgewotCWJvb2xlYW4gbmVlZHNSZXR1cm4gPSBlbnRlckV4aXRNYWNybzsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJaWYgKHBhcmFtVHlwZS5pc1ByaW1pdGl2ZSgpIHx8IGlzU3lzdGVtQ2xhc3MocGFyYW1UeXBlKSkgY29udGludWU7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlvdXRwdXQoIlx0Iik7Ci0JCWlmIChwYXJhbVR5cGUuaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIoY29tcG9uZW50VHlwZSkpOwotCQkJCW91dHB1dCgiICpscGFyZyIgKyBpKTsKLQkJCQlvdXRwdXQoIj1OVUxMOyIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGFyYW1UeXBlID09IFN0cmluZy5jbGFzcykgewotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfVU5JQ09ERSkpIHsKLQkJCQlvdXRwdXQoImNvbnN0IGpjaGFyICpscGFyZyIgKyBpKTsJCQkJCi0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiY29uc3QgY2hhciAqbHBhcmciICsgaSk7Ci0JCQl9Ci0JCQlvdXRwdXQoIj0gTlVMTDsiKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dChnZXRDbGFzc05hbWUocGFyYW1UeXBlKSk7Ci0JCQlvdXRwdXQoIiBfYXJnIiArIGkpOwotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfSU5JVCkpIG91dHB1dCgiPXswfSIpOwotCQkJb3V0cHV0KCIsICpscGFyZyIgKyBpKTsKLQkJCW91dHB1dCgiPU5VTEw7Iik7Ci0JCX0KLQkJb3V0cHV0bG4oKTsKLQkJbmVlZHNSZXR1cm4gPSB0cnVlOwotCX0KLQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCQlvdXRwdXQoIlx0Iik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQkJb3V0cHV0bG4oIiByYyA9IDA7Iik7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5lZWRzUmV0dXJuOwotfQotCi1ib29sZWFuIGdlbmVyYXRlR2V0dGVycyhNZXRob2QgbWV0aG9kLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLQlib29sZWFuIGdlbkZhaWxUYWcgPSBmYWxzZTsKLQlpbnQgY3JpdGljYWxDb3VudCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlpZiAoIWlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQlnZW5GYWlsVGFnIHw9IGdlbmVyYXRlR2V0UGFyYW1ldGVyKG1ldGhvZCwgaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIGZhbHNlLCAxKTsKLQkJfSBlbHNlIHsKLQkJCWNyaXRpY2FsQ291bnQrKzsKLQkJfQotCX0KLQlpZiAoY3JpdGljYWxDb3VudCAhPSAwKSB7Ci0JCW91dHB1dGxuKCIjaWZkZWYgSk5JX1ZFUlNJT05fMV8yIik7Ci0JCW91dHB1dGxuKCJcdGlmIChJU19KTklfMV8yKSB7Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQkJZ2VuRmFpbFRhZyB8PSBnZW5lcmF0ZUdldFBhcmFtZXRlcihtZXRob2QsIGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCB0cnVlLCAyKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHR9IGVsc2UiKTsKLQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQlvdXRwdXRsbigiXHR7Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGlzQ3JpdGljYWwocGFyYW1UeXBlLCBwYXJhbURhdGEpKSB7Ci0JCQkJZ2VuRmFpbFRhZyB8PSBnZW5lcmF0ZUdldFBhcmFtZXRlcihtZXRob2QsIGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCBmYWxzZSwgMik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0fSIpOwotCX0KLQlyZXR1cm4gZ2VuRmFpbFRhZzsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldHRlcnMoTWV0aG9kIG1ldGhvZCwgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0JaW50IGNyaXRpY2FsQ291bnQgPSAwOwotCWZvciAoaW50IGkgPSBwYXJhbVR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCWNyaXRpY2FsQ291bnQrKzsKLQkJfQotCX0KLQlpZiAoY3JpdGljYWxDb3VudCAhPSAwKSB7Ci0JCW91dHB1dGxuKCIjaWZkZWYgSk5JX1ZFUlNJT05fMV8yIik7Ci0JCW91dHB1dGxuKCJcdGlmIChJU19KTklfMV8yKSB7Iik7Ci0JCWZvciAoaW50IGkgPSBwYXJhbVR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlpZiAoaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCQlvdXRwdXQoIlx0Iik7Ci0JCQkJZ2VuZXJhdGVTZXRQYXJhbWV0ZXIoaSwgcGFyYW1UeXBlLCBwYXJhbURhdGEsIHRydWUpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdH0gZWxzZSIpOwotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCW91dHB1dGxuKCJcdHsiKTsKLQkJZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCWlmIChpc0NyaXRpY2FsKHBhcmFtVHlwZSwgcGFyYW1EYXRhKSkgewotCQkJCW91dHB1dCgiXHQiKTsKLQkJCQlnZW5lcmF0ZVNldFBhcmFtZXRlcihpLCBwYXJhbVR5cGUsIHBhcmFtRGF0YSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdH0iKTsKLQl9Ci0JZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCWlmICghaXNDcml0aWNhbChwYXJhbVR5cGUsIHBhcmFtRGF0YSkpIHsKLQkJCWdlbmVyYXRlU2V0UGFyYW1ldGVyKGksIHBhcmFtVHlwZSwgcGFyYW1EYXRhLCBmYWxzZSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVEeW5hbWljRnVuY3Rpb25DYWxsKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBDbGFzcyByZXR1cm5UeXBlLCBib29sZWFuIG5lZWRzUmV0dXJuKSB7Ci0Jb3V0cHV0bG4oIi8qIik7Ci0JZ2VuZXJhdGVGdW5jdGlvbkNhbGwobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlLCBuZWVkc1JldHVybik7Ci0Jb3V0cHV0bG4oIiovIik7Ci0Jb3V0cHV0bG4oIlx0eyIpOwotCi0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCWlmIChnZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgewotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBITU9EVUxFIGhtID0gTlVMTDsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgRkFSUFJPQyBmcCA9IE5VTEw7Iik7Ci0JCWlmIChyZXR1cm5UeXBlICE9IFZvaWQuVFlQRSkgewotCQkJaWYgKG5lZWRzUmV0dXJuKSB7Ci0JCQkJb3V0cHV0bG4oIlx0XHRyYyA9IDA7Iik7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIlx0XHRpZiAoIWluaXRpYWxpemVkKSB7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKCFobSkgaG0gPSBMb2FkTGlicmFyeSgiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiX0xJQik7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKGhtKSBmcCA9IEdldFByb2NBZGRyZXNzKGhtLCBcIiIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJcIik7Iik7Ci0JCW91dHB1dGxuKCJcdFx0XHRpbml0aWFsaXplZCA9IDE7Iik7Ci0JCW91dHB1dGxuKCJcdFx0fSIpOwotCQlvdXRwdXRsbigiXHRcdGlmIChmcCkgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCJmcCIpOwotCQlnZW5lcmF0ZUZ1bmN0aW9uQ2FsbFJpZ2h0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHBhcmFtVHlwZXMsIDApOwotCQlvdXRwdXQoIjsiKTsKLQkJb3V0cHV0bG4oKTsKLQkJb3V0cHV0bG4oIlx0XHR9Iik7Ci0JfSBlbHNlIGlmIChnZXRQbGF0Zm9ybSgpLmVxdWFscygiY2FyYm9uIikpIHsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgQ0ZCdW5kbGVSZWYgYnVuZGxlID0gTlVMTDsiKTsKLQkJb3V0cHV0KCJcdFx0dHlwZWRlZiAiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKHJldHVyblR5cGUpKTsKLQkJb3V0cHV0KCIgKCpGUFRSKSgiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSBvdXRwdXQoIiwgIik7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKG1ldGhvZCwgaSk7Ci0JCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7Ci0JCQlpZiAoY2FzdC5sZW5ndGgoKSA+IDIpIHsKLQkJCQlvdXRwdXQoY2FzdC5zdWJzdHJpbmcoMSwgY2FzdC5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZSwgcGFyYW1EYXRhLmdldEZsYWcoRkxBR19TVFJVQ1QpKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0bG4oIik7Iik7Ci0JCW91dHB1dGxuKCJcdFx0c3RhdGljIEZQVFIgZnB0cjsiKTsKLQkJaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCQlpZiAobmVlZHNSZXR1cm4pIHsKLQkJCQlvdXRwdXRsbigiXHRcdHJjID0gMDsiKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiXHRcdGlmICghaW5pdGlhbGl6ZWQpIHsiKTsKLQkJb3V0cHV0KCJcdFx0XHRpZiAoIWJ1bmRsZSkgYnVuZGxlID0gQ0ZCdW5kbGVHZXRCdW5kbGVXaXRoSWRlbnRpZmllcihDRlNUUigiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiX0xJQikpOyIpOwotCQlvdXRwdXQoIlx0XHRcdGlmIChidW5kbGUpIGZwdHIgPSAoRlBUUilDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUoYnVuZGxlLCBDRlNUUihcIiIpOwotCQlvdXRwdXQobmFtZSk7Ci0JCW91dHB1dGxuKCJcIikpOyIpOwotCQlvdXRwdXRsbigiXHRcdFx0aW5pdGlhbGl6ZWQgPSAxOyIpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQkJb3V0cHV0bG4oIlx0XHRpZiAoZnB0cikgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCIoKmZwdHIpIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgMCk7Ci0JCW91dHB1dCgiOyIpOwotCQlvdXRwdXRsbigpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQl9IGVsc2UgewotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOyIpOwotCQlvdXRwdXRsbigiXHRcdHN0YXRpYyB2b2lkICpoYW5kbGUgPSBOVUxMOyIpOwotCQlvdXRwdXQoIlx0XHR0eXBlZGVmICIpOwotCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQlvdXRwdXQoIiAoKkZQVFIpKCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDApIG91dHB1dCgiLCAiKTsKLQkJCUNsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbaV07Ci0JCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCBpKTsKLQkJCVN0cmluZyBjYXN0ID0gcGFyYW1EYXRhLmdldENhc3QoKTsKLQkJCWlmIChjYXN0Lmxlbmd0aCgpID4gMikgewotCQkJCW91dHB1dChjYXN0LnN1YnN0cmluZygxLCBjYXN0Lmxlbmd0aCgpIC0gMSkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQocGFyYW1UeXBlLCBwYXJhbURhdGEuZ2V0RmxhZyhGTEFHX1NUUlVDVCkpKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiKTsiKTsKLQkJb3V0cHV0bG4oIlx0XHRzdGF0aWMgRlBUUiBmcHRyOyIpOwotCQlpZiAocmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUpIHsKLQkJCWlmIChuZWVkc1JldHVybikgewotCQkJCW91dHB1dGxuKCJcdFx0cmMgPSAwOyIpOwotCQkJfQotCQl9Ci0JCW91dHB1dGxuKCJcdFx0aWYgKCFpbml0aWFsaXplZCkgeyIpOwotCQlvdXRwdXQoIlx0XHRcdGlmICghaGFuZGxlKSBoYW5kbGUgPSBkbG9wZW4oIik7Ci0JCW91dHB1dChuYW1lKTsKLQkJb3V0cHV0bG4oIl9MSUIsIFJUTERfTEFaWSk7Iik7Ci0JCW91dHB1dCgiXHRcdFx0aWYgKGhhbmRsZSkgZnB0ciA9IChGUFRSKWRsc3ltKGhhbmRsZSwgXCIiKTsKLQkJb3V0cHV0KG5hbWUpOwotCQlvdXRwdXRsbigiXCIpOyIpOwotCQlvdXRwdXRsbigiXHRcdFx0aW5pdGlhbGl6ZWQgPSAxOyIpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQkJb3V0cHV0bG4oIlx0XHRpZiAoZnB0cikgeyIpOwotCQlvdXRwdXQoIlx0XHQiKTsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQkJb3V0cHV0KCIoKmZwdHIpIik7Ci0JCWdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgMCk7Ci0JCW91dHB1dCgiOyIpOwotCQlvdXRwdXRsbigpOwotCQlvdXRwdXRsbigiXHRcdH0iKTsKLQl9Ci0KLQlvdXRwdXRsbigiXHR9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShNZXRob2QgbWV0aG9kLCBNZXRob2REYXRhIG1ldGhvZERhdGEsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlvdXRwdXQoIlx0Iik7Ci0JaWYgKHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCWlmIChuZWVkc1JldHVybikgewotCQkJb3V0cHV0KCJyYyA9ICIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCJyZXR1cm4gIik7Ci0JCX0KLQkJb3V0cHV0KCIoIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiKSIpOwotCX0KLQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfQUREUkVTUykpIHsKLQkJb3V0cHV0KCImIik7Ci0JfQkKLQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfSk5JKSkgewotCQlvdXRwdXQoaXNDUFAgPyAiZW52LT4iIDogIigqZW52KS0+Iik7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25DYWxsUmlnaHRTaWRlKE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgQ2xhc3NbXSBwYXJhbVR5cGVzLCBpbnQgcGFyYW1TdGFydCkgewotCWlmICghbWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfQ09OU1QpKSB7Ci0JCW91dHB1dCgiKCIpOwotCQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfSk5JKSkgewotCQkJaWYgKCFpc0NQUCkgb3V0cHV0KCJlbnYsICIpOwotCQl9Ci0JCWZvciAoaW50IGkgPSBwYXJhbVN0YXJ0OyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLQkJCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIGkpOwotCQkJaWYgKGkgIT0gcGFyYW1TdGFydCkgb3V0cHV0KCIsICIpOwotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkgb3V0cHV0KCIqIik7Ci0JCQlvdXRwdXQocGFyYW1EYXRhLmdldENhc3QoKSk7Ci0JCQlpZiAocGFyYW1EYXRhLmdldEZsYWcoRkxBR19HQ09CSkVDVCkpIG91dHB1dCgiVE9fT0JKRUNUKCIpOwotCQkJaWYgKGkgPT0gcGFyYW1UeXBlcy5sZW5ndGggLSAxICYmIHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfU0VOVElORUwpKSB7Ci0JCQkJb3V0cHV0KCJOVUxMIik7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghcGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgJiYgIWlzU3lzdGVtQ2xhc3MocGFyYW1UeXBlKSkgb3V0cHV0KCJscCIpOwotCQkJCW91dHB1dCgiYXJnIiArIGkpOwotCQkJfQotCQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSBvdXRwdXQoIikiKTsKLQkJfQotCQlvdXRwdXQoIikiKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkNhbGwoTWV0aG9kIG1ldGhvZCwgTWV0aG9kRGF0YSBtZXRob2REYXRhLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gbmVlZHNSZXR1cm4pIHsKLQlTdHJpbmcgY29weSA9IChTdHJpbmcpbWV0aG9kRGF0YS5nZXRQYXJhbSgiY29weSIpOwotCWJvb2xlYW4gbWFrZUNvcHkgPSBjb3B5Lmxlbmd0aCgpICE9IDAgJiYgaXNDUFAgJiYgcmV0dXJuVHlwZSAhPSBWb2lkLlRZUEU7Ci0JaWYgKG1ha2VDb3B5KSB7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGNvcHkpOwotCQlvdXRwdXQoIiB0ZW1wID0gIik7Ci0JfSBlbHNlIHsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxMZWZ0U2lkZShtZXRob2QsIG1ldGhvZERhdGEsIHJldHVyblR5cGUsIG5lZWRzUmV0dXJuKTsKLQl9Ci0JaW50IHBhcmFtU3RhcnQgPSAwOwotCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjYWxsIikpIHsKLQkJb3V0cHV0KCIoIik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIDApOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTIocmV0dXJuVHlwZSkpOwotCQkJb3V0cHV0KCIgKCopKCkpIik7Ci0JCX0KLQkJb3V0cHV0KCJhcmcwKSIpOwotCQlwYXJhbVN0YXJ0ID0gMTsKLQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiVnRibENhbGwiKSkgewotCQlvdXRwdXQoIigoIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiIChTVERNRVRIT0RDQUxMVFlQRSAqKSgiKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAxKSBvdXRwdXQoIiwgIik7Ci0JCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZSkpOwotCQl9Ci0JCW91dHB1dCgiKSkoKigiKTsKLQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmU0KHBhcmFtVHlwZXNbMV0pKTsKLQkJb3V0cHV0KCIgKiopYXJnMSlbYXJnMF0pIik7Ci0JCXBhcmFtU3RhcnQgPSAxOwotCX0gZWxzZSBpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfQ1BQKSB8fCBtZXRob2REYXRhLmdldEZsYWcoRkxBR19TRVRURVIpIHx8IG1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX0dFVFRFUikgfHwgbWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfQURERVIpKSB7Ci0JCWlmIChtZXRob2REYXRhLmdldEZsYWcoRkxBR19HQ09CSkVDVCkpIHsKLQkJCW91dHB1dCgiVE9fSEFORExFKCIpOwotCQl9Ci0JCW91dHB1dCgiKCIpOwotCQlQYXJhbWV0ZXJEYXRhIHBhcmFtRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEobWV0aG9kLCAwKTsKLQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfU1RSVUNUKSkgb3V0cHV0KCIqIik7Ci0JCVN0cmluZyBjYXN0ID0gcGFyYW1EYXRhLmdldENhc3QoKTsgCi0JCWlmIChjYXN0Lmxlbmd0aCgpICE9IDAgJiYgIWNhc3QuZXF1YWxzKCIoKSIpKSB7Ci0JCQlvdXRwdXQoY2FzdCk7Ci0JCX0KLQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSB7Ci0JCQlvdXRwdXQoIlRPX09CSkVDVCgiKTsKLQkJfQotCQlvdXRwdXQoImFyZzAiKTsKLQkJaWYgKHBhcmFtRGF0YS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSB7Ci0JCQlvdXRwdXQoIikiKTsKLQkJfQotCQlvdXRwdXQoIiktPiIpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBtZXRob2REYXRhLmdldEFjY2Vzc29yKCk7Ci0JCWlmIChhY2Nlc3Nvci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQl9IGVsc2UgewotCQkJaW50IGluZGV4ID0gLTE7Ci0JCQlpZiAoKGluZGV4ID0gbmFtZS5pbmRleE9mKCdfJykpICE9IC0xKSB7Ci0JCQkJb3V0cHV0KG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcGFyYW1TdGFydCA9IDE7Ci0JfSBlbHNlIGlmIChtZXRob2REYXRhLmdldEZsYWcoRkxBR19HQ05FVykpIHsKLQkJb3V0cHV0KCJUT19IQU5ETEUoZ2NuZXcgIik7Ci0JCVN0cmluZyBhY2Nlc3NvciA9IG1ldGhvZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaW5kZXggPSAtMTsKLQkJCWlmICgoaW5kZXggPSBuYW1lLmluZGV4T2YoJ18nKSkgIT0gLTEpIHsKLQkJCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dChuYW1lKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfTkVXKSkgewotCQlvdXRwdXQoIm5ldyAiKTsKLQkJU3RyaW5nIGFjY2Vzc29yID0gbWV0aG9kRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaWYgKChpbmRleCA9IG5hbWUuaW5kZXhPZignXycpKSAhPSAtMSkgewotCQkJCW91dHB1dChuYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQobmFtZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKG1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX0RFTEVURSkpIHsKLQkJb3V0cHV0KCJkZWxldGUgIik7Ci0JCVBhcmFtZXRlckRhdGEgcGFyYW1EYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShtZXRob2QsIDApOwotCQlTdHJpbmcgY2FzdCA9IHBhcmFtRGF0YS5nZXRDYXN0KCk7IAotCQlpZiAoY2FzdC5sZW5ndGgoKSAhPSAwICYmICFjYXN0LmVxdWFscygiKCkiKSkgewotCQkJb3V0cHV0KGNhc3QpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIoIik7Ci0JCQlvdXRwdXQobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCJfIikpKTsKLQkJCW91dHB1dCgiICopIik7Ci0JCX0KLQkJb3V0cHV0bG4oImFyZzA7Iik7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfR0NPQkpFQ1QpKSB7Ci0JCQlvdXRwdXQoIlRPX0hBTkRMRSgiKTsJCQkJCi0JCX0KLQkJU3RyaW5nIGFjY2Vzc29yID0gbWV0aG9kRGF0YS5nZXRBY2Nlc3NvcigpOwotCQlpZiAoYWNjZXNzb3IubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJfSBlbHNlIHsKLQkJCW91dHB1dChuYW1lKTsKLQkJfQotCX0KLQlpZiAoKG1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX1NFVFRFUikgJiYgcGFyYW1UeXBlcy5sZW5ndGggPT0gMykgfHwgKG1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX0dFVFRFUikgJiYgcGFyYW1UeXBlcy5sZW5ndGggPT0gMikpIHsKLQkJb3V0cHV0KCJbYXJnMV0iKTsKLQkJcGFyYW1TdGFydCsrOwotCX0KLQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfU0VUVEVSKSkgb3V0cHV0KCIgPSAiKTsKLQlpZiAobWV0aG9kRGF0YS5nZXRGbGFnKEZMQUdfQURERVIpKSBvdXRwdXQoIiArPSAiKTsKLQlpZiAoIW1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX0dFVFRFUikpIHsKLQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGxSaWdodFNpZGUobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCBwYXJhbVN0YXJ0KTsKLQl9Ci0JaWYgKG1ldGhvZERhdGEuZ2V0RmxhZyhGTEFHX0dDTkVXKSB8fCBtZXRob2REYXRhLmdldEZsYWcoRkxBR19HQ09CSkVDVCkpIHsKLQkJb3V0cHV0KCIpIik7Ci0JfQotCW91dHB1dCgiOyIpOwotCW91dHB1dGxuKCk7Ci0JaWYgKG1ha2VDb3B5KSB7Ci0JCW91dHB1dGxuKCJcdHsiKTsKLQkJb3V0cHV0KCJcdFx0Iik7Ci0JCW91dHB1dChjb3B5KTsKLQkJb3V0cHV0KCIqIGNvcHkgPSBuZXcgIik7Ci0JCW91dHB1dChjb3B5KTsKLQkJb3V0cHV0bG4oIigpOyIpOwotCQlvdXRwdXRsbigiXHRcdCpjb3B5ID0gdGVtcDsiKTsKLQkJb3V0cHV0KCJcdFx0cmMgPSAiKTsKLQkJb3V0cHV0KCIoIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0JCW91dHB1dCgiKSIpOwotCQlvdXRwdXRsbigiY29weTsiKTsKLQkJb3V0cHV0bG4oIlx0fSIpOwotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVJldHVybihNZXRob2QgbWV0aG9kLCBDbGFzcyByZXR1cm5UeXBlLCBib29sZWFuIG5lZWRzUmV0dXJuKSB7Ci0JaWYgKG5lZWRzUmV0dXJuICYmIHJldHVyblR5cGUgIT0gVm9pZC5UWVBFKSB7Ci0JCW91dHB1dGxuKCJcdHJldHVybiByYzsiKTsKLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVNZW1tb3ZlKE1ldGhvZCBtZXRob2QsIFN0cmluZyBmdW5jdGlvbiwgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0JZ2VuZXJhdGVFbnRlck1hY3JvKG1ldGhvZCwgZnVuY3Rpb24pOwotCW91dHB1dCgiXHQiKTsKLQlib29sZWFuIGdldCA9IHBhcmFtVHlwZXNbMF0uaXNQcmltaXRpdmUoKTsKLQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHBhcmFtVHlwZXNbZ2V0ID8gMSA6IDBdKTsKLQlvdXRwdXQoZ2V0ID8gImlmIChhcmcxKSBnZXQiIDogImlmIChhcmcwKSBzZXQiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoZ2V0ID8gIkZpZWxkcyhlbnYsIGFyZzEsICgiIDogIkZpZWxkcyhlbnYsIGFyZzAsICgiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXQoZ2V0ID8gIiAqKWFyZzApIiA6ICIgKilhcmcxKSIpOwotCW91dHB1dGxuKCI7Iik7Ci0JZ2VuZXJhdGVFeGl0TWFjcm8obWV0aG9kLCBmdW5jdGlvbik7CQotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25Cb2R5KE1ldGhvZCBtZXRob2QsIE1ldGhvZERhdGEgbWV0aG9kRGF0YSwgU3RyaW5nIGZ1bmN0aW9uLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUpIHsKLQlvdXRwdXRsbigieyIpOwotCQotCS8qIEN1c3RvbSBHVEsgbWVtbW92ZXMuICovCi0JU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCWJvb2xlYW4gaXNNZW1vdmUgPSAobmFtZS5lcXVhbHMoIm1lbW1vdmUiKSB8fCBuYW1lLmVxdWFscygiTW92ZU1lbW9yeSIpKSAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHJldHVyblR5cGUgPT0gVm9pZC5UWVBFOwotCWlmIChpc01lbW92ZSkgewotCQlnZW5lcmF0ZU1lbW1vdmUobWV0aG9kLCBmdW5jdGlvbiwgcGFyYW1UeXBlcyk7Ci0JfSBlbHNlIHsKLQkJYm9vbGVhbiBuZWVkc1JldHVybiA9IGdlbmVyYXRlTG9jYWxWYXJzKG1ldGhvZCwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSk7Ci0JCWdlbmVyYXRlRW50ZXJNYWNybyhtZXRob2QsIGZ1bmN0aW9uKTsKLQkJYm9vbGVhbiBnZW5GYWlsVGFnID0gZ2VuZXJhdGVHZXR0ZXJzKG1ldGhvZCwgcGFyYW1UeXBlcyk7Ci0JCWlmIChtZXRob2REYXRhLmdldEZsYWcoRkxBR19EWU5BTUlDKSkgewotCQkJZ2VuZXJhdGVEeW5hbWljRnVuY3Rpb25DYWxsKG1ldGhvZCwgbWV0aG9kRGF0YSwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCQl9IGVsc2UgewotCQkJZ2VuZXJhdGVGdW5jdGlvbkNhbGwobWV0aG9kLCBtZXRob2REYXRhLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlLCBuZWVkc1JldHVybik7Ci0JCX0KLQkJaWYgKGdlbkZhaWxUYWcpIG91dHB1dGxuKCJmYWlsOiIpOwotCQlnZW5lcmF0ZVNldHRlcnMobWV0aG9kLCBwYXJhbVR5cGVzKTsKLQkJZ2VuZXJhdGVFeGl0TWFjcm8obWV0aG9kLCBmdW5jdGlvbik7Ci0JCWdlbmVyYXRlUmV0dXJuKG1ldGhvZCwgcmV0dXJuVHlwZSwgbmVlZHNSZXR1cm4pOwotCX0KLQkKLQlvdXRwdXRsbigifSIpOwotfQotCi12b2lkIGdlbmVyYXRlRnVuY3Rpb25Qcm90b3R5cGUoTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGZ1bmN0aW9uLCBDbGFzc1tdIHBhcmFtVHlwZXMsIENsYXNzIHJldHVyblR5cGUsIGJvb2xlYW4gc2luZ2xlTGluZSkgewotCW91dHB1dCgiSk5JRVhQT1JUICIpOwotCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihyZXR1cm5UeXBlKSk7Ci0Jb3V0cHV0KCIgSk5JQ0FMTCAiKTsKLQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0Jb3V0cHV0KCJfTkFUSVZFKCIpOwotCW91dHB1dChmdW5jdGlvbik7Ci0JaWYgKHNpbmdsZUxpbmUpIHsKLQkJb3V0cHV0KCIpIik7Ci0JCW91dHB1dCgiKEpOSUVudiAqZW52LCAiKTsKLQl9IGVsc2UgewotCQlvdXRwdXRsbigiKSIpOwotCQlvdXRwdXQoIlx0KEpOSUVudiAqZW52LCAiKTsKLQl9Ci0JaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIHsKLQkJb3V0cHV0KCJqY2xhc3MiKTsKLQl9IGVsc2UgewotCQlvdXRwdXQoImpvYmplY3QiKTsKLQl9Ci0Jb3V0cHV0KCIgdGhhdCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotCQlvdXRwdXQoIiwgIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihwYXJhbVR5cGUpKTsKLQkJb3V0cHV0KCIgYXJnIiArIGkpOwotCX0KLQlvdXRwdXQoIikiKTsKLQlpZiAoIXNpbmdsZUxpbmUpIG91dHB1dGxuKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VTdGFydChTdHJpbmcgZnVuY3Rpb24pIHsKLQlvdXRwdXQoIiNpZm5kZWYgTk9fIik7Ci0Jb3V0cHV0bG4oZnVuY3Rpb24pOwotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRW5kKFN0cmluZyBmdW5jdGlvbikgewotCW91dHB1dGxuKCIjZW5kaWYiKTsKLX0KLQotYm9vbGVhbiBpc0NyaXRpY2FsKENsYXNzIHBhcmFtVHlwZSwgUGFyYW1ldGVyRGF0YSBwYXJhbURhdGEpIHsKLQlyZXR1cm4gcGFyYW1UeXBlLmlzQXJyYXkoKSAmJiBwYXJhbVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkgJiYgcGFyYW1EYXRhLmdldEZsYWcoRkxBR19DUklUSUNBTCk7Ci19Ci0KLWJvb2xlYW4gaXNTeXN0ZW1DbGFzcyhDbGFzcyB0eXBlKSB7Ci0JcmV0dXJuIHR5cGUgPT0gT2JqZWN0LmNsYXNzIHx8IHR5cGUgPT0gQ2xhc3MuY2xhc3M7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLS8vCWFyZ3MgPSBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUyJ9OwotCWlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBOYXRpdmVzR2VuZXJhdG9yIDxjbGFzc05hbWUxPiA8Y2xhc3NOYW1lMj4iKTsKLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQlOYXRpdmVzR2VuZXJhdG9yIGdlbiA9IG5ldyBOYXRpdmVzR2VuZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNsYXp6TmFtZSA9IGFyZ3NbaV07Ci0JCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhenpOYW1lKTsKLQkJCWdlbi5nZW5lcmF0ZShjbGF6eik7Ci0vLwkJCWdlbi5nZW5lcmF0ZShjbGF6eiwgIkNvbW1hbmRCYXJfRGVzdHJveSIpOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIik7Ci0JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1BhcmFtZXRlckRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9QYXJhbWV0ZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OWJjNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1BhcmFtZXRlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJEYXRhIGV4dGVuZHMgSXRlbURhdGEgewotCQotCU1ldGhvZCBtZXRob2Q7Ci0JaW50IHBhcmFtZXRlcjsKLQotcHVibGljIFBhcmFtZXRlckRhdGEoTWV0aG9kIG1ldGhvZCwgaW50IHBhcmFtZXRlciwgU3RyaW5nIHN0cikgewotCXN1cGVyKHN0cik7Ci0JdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JdGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsRmxhZ3MoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXtGTEFHX05PX0lOLCBGTEFHX05PX09VVCwgRkxBR19DUklUSUNBTCwgRkxBR19JTklULCBGTEFHX1NUUlVDVCwgRkxBR19VTklDT0RFLCBGTEFHX1NFTlRJTkVMLCBGTEFHX0dDT0JKRUNUfTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXN0KCkgewotCVN0cmluZyBjYXN0ID0gKChTdHJpbmcpZ2V0UGFyYW0oImNhc3QiKSkudHJpbSgpOwotCWlmIChjYXN0Lmxlbmd0aCgpID4gMCkgewotCQlpZiAoIWNhc3Quc3RhcnRzV2l0aCgiKCIpKSBjYXN0ID0gIigiICsgY2FzdDsKLQkJaWYgKCFjYXN0LmVuZHNXaXRoKCIpIikpIGNhc3QgPSBjYXN0ICsgIikiOwotCX0KLQlyZXR1cm4gY2FzdDsKLX0KLQotcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7Ci0JcmV0dXJuIG1ldGhvZDsKLX0KLQotcHVibGljIGludCBnZXRQYXJhbWV0ZXIoKSB7Ci0JcmV0dXJuIHBhcmFtZXRlcjsKLX0KLQotcHVibGljIHZvaWQgc2V0Q2FzdChTdHJpbmcgc3RyKSB7Ci0Jc2V0UGFyYW0oImNhc3QiLCBzdHIpOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGNmNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1Byb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBQcm9ncmVzc01vbml0b3IgewotCi1wdWJsaWMgdm9pZCBzZXRUb3RhbChpbnQgdG90YWwpOwotcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci1wdWJsaWMgdm9pZCBzdGVwKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TaXplb2ZHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TaXplb2ZHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyNjA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2l6ZW9mR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotcHVibGljIGNsYXNzIFNpemVvZkdlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoIlx0cHJpbnRmKFwiIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCI9JWRcXG5cIiwgc2l6ZW9mKCIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCIpKTsiKTsKLS8vCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLS8vCWdlbmVyYXRlKGZpZWxkcyk7CQotfQotCQotcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB7Ci0Jb3V0cHV0bG4oImludCBtYWluKCkgeyIpOwotCXN1cGVyLmdlbmVyYXRlKCk7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoRmllbGRbXSBmaWVsZHMpIHsKLQlzb3J0KGZpZWxkcyk7CQotCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQlpZiAoKGZpZWxkLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuRklOQUwpID09IDApIGNvbnRpbnVlOwotCQlnZW5lcmF0ZShmaWVsZCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZShGaWVsZCBmaWVsZCkgewotCW91dHB1dCgiXHRwcmludGYoXCIiKTsKLQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQlvdXRwdXQoIj0lZFxcblwiLCBzaXplb2YoIik7Ci0Jb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0Jb3V0cHV0bG4oIikpOyIpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JaWYgKGFyZ3MubGVuZ3RoIDwgMSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIFNpemVvZkdlbmVyYXRvciA8Y2xhc3NOYW1lMT4gPGNsYXNzTmFtZTI+Iik7Ci0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJU2l6ZW9mR2VuZXJhdG9yIGdlbiA9IG5ldyBTaXplb2ZHZW5lcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY2xhenpOYW1lID0gYXJnc1tpXTsKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGF6ek5hbWUpOwotCQkJZ2VuLmdlbmVyYXRlKGNsYXp6KTsKLQkJfQotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSIpOwotCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdGF0c0dlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1N0YXRzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWI4ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL1N0YXRzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0c0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLQlib29sZWFuIGhlYWRlcjsKLQkKLXB1YmxpYyBTdGF0c0dlbmVyYXRvcihib29sZWFuIGhlYWRlcikgewotCXRoaXMuaGVhZGVyID0gaGVhZGVyOwotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZUNvcHlyaWdodCgpIHsKLQlnZW5lcmF0ZU1ldGFEYXRhKCJzd3RfY29weXJpZ2h0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlSW5jbHVkZXMoKSB7Ci0JaWYgKCFoZWFkZXIpIHsKLQkJb3V0cHV0bG4oIiNpbmNsdWRlIFwic3d0LmhcIiIpOwotCQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0JCW91dHB1dChnZXRPdXRwdXROYW1lKCkpOwotCQlvdXRwdXRsbigiX3N0YXRzLmhcIiIpOwotCQlvdXRwdXRsbigpOwotCX0KLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGUoQ2xhc3MgY2xhenopIHsKLQlpZiAoaGVhZGVyKSB7Ci0JCWdlbmVyYXRlSGVhZGVyRmlsZShjbGF6eik7Ci0JfSBlbHNlIHsKLQkJZ2VuZXJhdGVTb3VyY2VGaWxlKGNsYXp6KTsKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCXJldHVybiBoZWFkZXIgPyAiLmgiIDogc3VwZXIuZ2V0RXh0ZW5zaW9uKCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotCXJldHVybiAiX3N0YXRzIjsKLX0KLQotdm9pZCBnZW5lcmF0ZUhlYWRlckZpbGUoQ2xhc3MgY2xhenopewotCWdlbmVyYXRlTkFUSVZFTWFjcm9zKGNsYXp6KTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0Jc29ydChtZXRob2RzKTsKLQlnZW5lcmF0ZUZ1bmN0aW9uRW51bShtZXRob2RzKTsJCi19Ci0KLXZvaWQgZ2VuZXJhdGVOQVRJVkVNYWNyb3MoQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXRsbigiI2lmZGVmIE5BVElWRV9TVEFUUyIpOwotCW91dHB1dCgiZXh0ZXJuIGludCAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Iik7Ci0Jb3V0cHV0KCJleHRlcm4gaW50ICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsiKTsKLQlvdXRwdXQoImV4dGVybiBjaGFyKiAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uTmFtZXNbXTsiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCJfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtmdW5jXSsrOyIpOwotCW91dHB1dCgiI2RlZmluZSAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgIik7Ci0Jb3V0cHV0bG4oIiNlbHNlIik7Ci0Jb3V0cHV0KCIjaWZuZGVmICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VOVEVSIik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgIik7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotCW91dHB1dCgiI2lmbmRlZiAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX05BVElWRV9FWElUIik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAiKTsKLQlvdXRwdXRsbigiI2VuZGlmIik7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotCW91dHB1dGxuKCk7CQotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRmlsZShDbGFzcyBjbGF6eikgewotCW91dHB1dGxuKCIjaWZkZWYgTkFUSVZFX1NUQVRTIik7Ci0Jb3V0cHV0bG4oKTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JaW50IG1ldGhvZENvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJbWV0aG9kQ291bnQrKzsKLQl9Ci0JU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCJfbmF0aXZlRnVuY3Rpb25Db3VudCA9ICIpOwotCW91dHB1dChTdHJpbmcudmFsdWVPZihtZXRob2RDb3VudCkpOwotCW91dHB1dGxuKCI7Iik7Ci0Jb3V0cHV0KCJpbnQgIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0KCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbIik7Ci0Jb3V0cHV0KFN0cmluZy52YWx1ZU9mKG1ldGhvZENvdW50KSk7Ci0Jb3V0cHV0bG4oIl07Iik7Ci0Jb3V0cHV0KCJjaGFyICogIik7Ci0Jb3V0cHV0KGNsYXNzTmFtZSk7Ci0Jb3V0cHV0bG4oIl9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Iik7Ci0Jc29ydChtZXRob2RzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuTkFUSVZFKSA9PSAwKSBjb250aW51ZTsKLQkJb3V0cHV0KCJcdFwiIik7Ci0JCW91dHB1dChnZXRGdW5jdGlvbk5hbWUobWV0aG9kKSk7Ci0JCW91dHB1dGxuKCJcIiwiKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnN0ZXAoKTsKLQl9Ci0Jb3V0cHV0bG4oIn07Iik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZVN0YXRzTmF0aXZlcyhjbGFzc05hbWUpOwotCW91dHB1dGxuKCk7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotfQotCi12b2lkIGdlbmVyYXRlU3RhdHNOYXRpdmVzKFN0cmluZyBjbGFzc05hbWUpIHsKLQlvdXRwdXRsbigiI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jIik7Ci0Jb3V0cHV0bG4oKTsKLQotCW91dHB1dCgiSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoIik7Ci0Jb3V0cHV0KHRvQyhjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ291bnQiKSk7Ci0Jb3V0cHV0bG4oIikiKTsKLQlvdXRwdXRsbigiXHQoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdHJldHVybiAiKTsKLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLQlvdXRwdXRsbigpOwotCi0Jb3V0cHV0KCJKTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRSgiKTsKLQlvdXRwdXQodG9DKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25OYW1lIikpOwotCW91dHB1dGxuKCIpIik7Ci0Jb3V0cHV0bG4oIlx0KEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRyZXR1cm4gIik7Ci0JaWYgKGlzQ1BQKSB7Ci0JCW91dHB1dCgiZW52LT5OZXdTdHJpbmdVVEYoIik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0KCIoKmVudiktPk5ld1N0cmluZ1VURihlbnYsICIpOwotCX0KLQlvdXRwdXQoY2xhc3NOYW1lKTsKLQlvdXRwdXRsbigiX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsiKTsKLQlvdXRwdXRsbigifSIpOwotCW91dHB1dGxuKCk7Ci0KLQlvdXRwdXQoIkpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKCIpOwotCW91dHB1dCh0b0MoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbkNhbGxDb3VudCIpKTsKLQlvdXRwdXRsbigiKSIpOwotCW91dHB1dGxuKCJcdChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0cmV0dXJuICIpOwotCW91dHB1dChjbGFzc05hbWUpOwotCW91dHB1dGxuKCJfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOyIpOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbkVudW0oTWV0aG9kW10gbWV0aG9kcykgewotCWlmIChtZXRob2RzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0Jb3V0cHV0bG4oInR5cGVkZWYgZW51bSB7Iik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQlpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLk5BVElWRSkgPT0gMCkgY29udGludWU7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGdldEZ1bmN0aW9uTmFtZShtZXRob2QpKTsKLQkJb3V0cHV0bG4oIl9GVU5DLCIpOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgcHJvZ3Jlc3Muc3RlcCgpOwotCX0KLQlDbGFzcyBjbGF6eiA9IG1ldGhvZHNbMF0uZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQlvdXRwdXQoIn0gIik7Ci0Jb3V0cHV0KGdldENsYXNzTmFtZShjbGF6eikpOwotCW91dHB1dGxuKCJfRlVOQ1M7Iik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU3RydWN0c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QyZjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TdHJ1Y3RzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50b29scy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0c0dlbmVyYXRvciBleHRlbmRzIEpOSUdlbmVyYXRvciB7Ci0KLWJvb2xlYW4gaGVhZGVyOwotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBHTE9CQUxfUkVGID0gZmFsc2U7Ci0KLXB1YmxpYyBTdHJ1Y3RzR2VuZXJhdG9yKGJvb2xlYW4gaGVhZGVyKSB7Ci0JdGhpcy5oZWFkZXIgPSBoZWFkZXI7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29weXJpZ2h0KCkgewotCWdlbmVyYXRlTWV0YURhdGEoInN3dF9jb3B5cmlnaHQiKTsKLX0KLQotcHVibGljIHZvaWQgZ2VuZXJhdGVJbmNsdWRlcygpIHsKLQlpZiAoaGVhZGVyKSB7Ci0JCW91dHB1dCgiI2luY2x1ZGUgXCIiKTsKLQkJb3V0cHV0KGdldE91dHB1dE5hbWUoKSk7Ci0JCW91dHB1dGxuKCIuaFwiIik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0bG4oIiNpbmNsdWRlIFwic3d0LmhcIiIpOwotCQlvdXRwdXQoIiNpbmNsdWRlIFwiIik7Ci0JCW91dHB1dChnZXRPdXRwdXROYW1lKCkpOwotCQlvdXRwdXRsbigiX3N0cnVjdHMuaFwiIik7Ci0JfQotCW91dHB1dGxuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzIGNsYXp6KSB7Ci0JaW50IGogPSAwOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlmb3IgKDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tqXTsKLQkJaW50IG1vZHMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKChtb2RzICYgTW9kaWZpZXIuUFVCTElDKSAhPSAwICYmIChtb2RzICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaiA9PSBmaWVsZHMubGVuZ3RoKSByZXR1cm47Ci0JaWYgKGhlYWRlcikgewotCQlnZW5lcmF0ZUhlYWRlckZpbGUoY2xhenopOwotCX0gZWxzZSB7Ci0JCWdlbmVyYXRlU291cmNlRmlsZShjbGF6eik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsKLQlpZiAoIWhlYWRlciAmJiBnZXRDbGFzc2VzKCkubGVuZ3RoID09IDApIHJldHVybjsKLQlzdXBlci5nZW5lcmF0ZSgpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQlyZXR1cm4gaGVhZGVyID8gIi5oIiA6IHN1cGVyLmdldEV4dGVuc2lvbigpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLQlyZXR1cm4gIl9zdHJ1Y3RzIjsKLX0KLQotdm9pZCBnZW5lcmF0ZUV4Y2x1ZGVzKENsYXNzW10gY2xhc3NlcykgewotCUhhc2hTZXQgZXhjbHVkZXMgPSBuZXcgSGFzaFNldCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlDbGFzcyBjbGF6eiA9IGNsYXNzZXNbaV07Ci0JCUNsYXNzRGF0YSBjbGFzc0RhdGEgPSBnZXRNZXRhRGF0YSgpLmdldE1ldGFEYXRhKGNsYXp6KTsKLQkJU3RyaW5nIGV4Y2x1ZGUgPSBjbGFzc0RhdGEuZ2V0RXhjbHVkZSgpOwotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlleGNsdWRlcy5hZGQoZXhjbHVkZSk7Ci0JCX0KLQl9Ci0JZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCVN0cmluZyBleGNsdWRlID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQkJQ2xhc3NEYXRhIGNsYXNzRGF0YSA9IGdldE1ldGFEYXRhKCkuZ2V0TWV0YURhdGEoY2xhenopOwotCQkJU3RyaW5nIGNsYXNzRXhjbHVkZSA9IGNsYXNzRGF0YS5nZXRFeGNsdWRlKCk7Ci0JCQlpZiAoZXhjbHVkZS5lcXVhbHMoY2xhc3NFeGNsdWRlKSkgewotCQkJCW91dHB1dCgiI2RlZmluZSBOT18iKTsKLQkJCQlvdXRwdXRsbihnZXRDbGFzc05hbWUoY2xhenopKTsKLQkJCX0KLQkJfQotCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCW91dHB1dGxuKCk7Ci0JfQotfQotCi12b2lkIGdlbmVyYXRlSGVhZGVyRmlsZShDbGFzcyBjbGF6eikgewotCWdlbmVyYXRlU291cmNlU3RhcnQoY2xhenopOwotCWdlbmVyYXRlUHJvdG90eXBlcyhjbGF6eik7Ci0JZ2VuZXJhdGVCbGFua01hY3JvcyhjbGF6eik7Ci0JZ2VuZXJhdGVTb3VyY2VFbmQoY2xhenopOwkKLQlvdXRwdXRsbigpOwotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRmlsZShDbGFzcyBjbGF6eikgewotCWdlbmVyYXRlU291cmNlU3RhcnQoY2xhenopOwotCWdlbmVyYXRlRklEc1N0cnVjdHVyZShjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZUdsb2JhbFZhcihjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZUZ1bmN0aW9ucyhjbGF6eik7Ci0JZ2VuZXJhdGVTb3VyY2VFbmQoY2xhenopOwotCW91dHB1dGxuKCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVTb3VyY2VTdGFydChDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgiI2lmbmRlZiBOT18iKTsKLQlvdXRwdXRsbihjbGF6ek5hbWUpOwotfQotCi12b2lkIGdlbmVyYXRlU291cmNlRW5kKENsYXNzIGNsYXp6KSB7Ci0Jb3V0cHV0bG4oIiNlbmRpZiIpOwotfQotCi12b2lkIGdlbmVyYXRlR2xvYmFsVmFyKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCJfRklEX0NBQ0hFICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGYzsiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUJsYW5rTWFjcm9zKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0bG4oIiNlbHNlIik7Ci0Jb3V0cHV0KCIjZGVmaW5lIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhhLGIpIik7Ci0Jb3V0cHV0KCIjZGVmaW5lIGdldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoYSxiLGMpIE5VTEwiKTsKLQlvdXRwdXQoIiNkZWZpbmUgc2V0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhhLGIsYykiKTsKLQlvdXRwdXQoIiNkZWZpbmUgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIl9zaXplb2YoKSAwIik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVQcm90b3R5cGVzKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJ2b2lkIGNhY2hlIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCk7Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0KCIgKmdldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiICpscFN0cnVjdCk7Iik7Ci0Jb3V0cHV0KCJ2b2lkIHNldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiICpscFN0cnVjdCk7Iik7Ci0Jb3V0cHV0KCIjZGVmaW5lICIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiX3NpemVvZigpIHNpemVvZigiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiKSIpOwotfQotCi12b2lkIGdlbmVyYXRlRklEc1N0cnVjdHVyZShDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dCgidHlwZWRlZiBzdHJ1Y3QgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIl9GSURfQ0FDSEUgeyIpOwotCW91dHB1dGxuKCJcdGludCBjYWNoZWQ7Iik7Ci0Jb3V0cHV0bG4oIlx0amNsYXNzIGNsYXp6OyIpOwotCW91dHB1dCgiXHRqZmllbGRJRCAiKTsKLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlpZiAoIWZpcnN0KSBvdXRwdXQoIiwgIik7Ci0JCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQlmaXJzdCA9IGZhbHNlOwotCX0KLQlvdXRwdXRsbigiOyIpOwotCW91dHB1dCgifSAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiX0ZJRF9DQUNIRTsiKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUNhY2hlRnVuY3Rpb24oQ2xhc3MgY2xhenopIHsKLQlTdHJpbmcgY2xhenpOYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQlvdXRwdXQoInZvaWQgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KSIpOwotCW91dHB1dGxuKCJ7Iik7Ci0Jb3V0cHV0KCJcdGlmICgiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmMuY2FjaGVkKSByZXR1cm47Iik7Ci0JQ2xhc3Mgc3VwZXJjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQlpZiAoc3VwZXJjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKLQkJU3RyaW5nIHN1cGVyTmFtZSA9IGdldENsYXNzTmFtZShzdXBlcmNsYXp6KTsKLQkJb3V0cHV0KCJcdGNhY2hlIik7Ci0JCW91dHB1dChzdXBlck5hbWUpOwotCQlvdXRwdXRsbigiRmllbGRzKGVudiwgbHBPYmplY3QpOyIpOwotCX0KLQlvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0JaWYgKGlzQ1BQKSB7Ci0JCWlmIChHTE9CQUxfUkVGKSB7Ci0JCQlvdXRwdXQoIkZjLmNsYXp6ID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZihlbnYtPkdldE9iamVjdENsYXNzKGxwT2JqZWN0KSk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoIkZjLmNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhscE9iamVjdCk7Iik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoR0xPQkFMX1JFRikgewotCQkJb3V0cHV0KCJGYy5jbGF6eiA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KSk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQoIkZjLmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsiKTsKLQkJfQotCX0KLQlvdXRwdXRsbigpOwotCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJaWYgKGlnbm9yZUZpZWxkKGZpZWxkKSkgY29udGludWU7Ci0JCW91dHB1dCgiXHQiKTsKLQkJb3V0cHV0KGNsYXp6TmFtZSk7Ci0JCW91dHB1dCgiRmMuIik7Ci0JCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQlpZiAoaXNDUFApIHsKLQkJCW91dHB1dCgiID0gZW52LT5HZXRGaWVsZElEKCIpOwotCQl9IGVsc2UgewotCQkJb3V0cHV0KCIgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCAiKTsKLQkJfQotCQlvdXRwdXQoY2xhenpOYW1lKTsKLQkJb3V0cHV0KCJGYy5jbGF6eiwgXCIiKTsKLQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCW91dHB1dCgiXCIsIFwiIik7Ci0JCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlKGZpZWxkLmdldFR5cGUoKSkpOwotCQlvdXRwdXRsbigiXCIpOyIpOwotCX0KLQlvdXRwdXQoIlx0Iik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIkZjLmNhY2hlZCA9IDE7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZUdldEZpZWxkcyhDbGFzcyBjbGF6eikgewotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IGdldENsYXNzTmFtZShzdXBlcmNsYXp6KTsKLQlpZiAoc3VwZXJjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdGdldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZUdldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlGaWVsZERhdGEgZmllbGREYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gZmllbGREYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGREYXRhLmdldEZsYWcoRkxBR19OT19XSU5DRSk7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2lmbmRlZiBfV0lOMzJfV0NFIik7Ci0JCX0KLQkJQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKHR5cGUpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCW91dHB1dCgiXHRscFN0cnVjdC0+Iik7Ci0JCQlvdXRwdXQoYWNjZXNzb3IpOwotCQkJb3V0cHV0KCIgPSAiKTsKLQkJCW91dHB1dChmaWVsZERhdGEuZ2V0Q2FzdCgpKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiZW52LT5HZXQiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCIoKmVudiktPkdldCIpOwotCQkJfQotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJaWYgKGlzQ1BQKSB7Ci0JCQkJb3V0cHV0KCJGaWVsZChscE9iamVjdCwgIik7Ci0JCQl9IGVsc2UgewotCQkJCW91dHB1dCgiRmllbGQoZW52LCBscE9iamVjdCwgIik7Ci0JCQl9Ci0JCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCW91dHB1dCgiRmMuIik7Ci0JCQlvdXRwdXQoZmllbGQuZ2V0TmFtZSgpKTsKLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCQlvdXRwdXQoIlx0Iik7CQkJCQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCQlvdXRwdXQoIiBscE9iamVjdDEgPSAoIik7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIillbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIikoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCQlvdXRwdXQoIkZjLiIpOwotCQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIlx0ZW52LT5HZXQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIlx0KCplbnYpLT5HZXQiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGNvbXBvbmVudFR5cGUpKTsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihscE9iamVjdDEsIDAsIHNpemVvZihscFN0cnVjdC0+Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihlbnYsIGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXQoIikiKTsKLQkJCQlpbnQgYnl0ZUNvdW50ID0gZ2V0Qnl0ZUNvdW50KGNvbXBvbmVudFR5cGUpOwotCQkJCWlmIChieXRlQ291bnQgPiAxKSB7Ci0JCQkJCW91dHB1dCgiIC8gIik7Ci0JCQkJCW91dHB1dChTdHJpbmcudmFsdWVPZihieXRlQ291bnQpKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KCIsICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQodHlwZSkpOwkJCQkKLQkJCQlvdXRwdXQoIilscFN0cnVjdC0+Iik7Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXRsbigiKTsiKTsKLQkJCQlvdXRwdXQoIlx0fSIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXRsbigiXHR7Iik7Ci0JCQlpZiAoaXNDUFApIHsKLQkJCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSBlbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0KCJcdGpvYmplY3QgbHBPYmplY3QxID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGxwT2JqZWN0LCAiKTsKLQkJCX0KLQkJCW91dHB1dChnZXRDbGFzc05hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOwotCQkJb3V0cHV0KCJGYy4iKTsKLQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJb3V0cHV0bG4oIik7Iik7Ci0JCQlvdXRwdXQoIlx0aWYgKGxwT2JqZWN0MSAhPSBOVUxMKSBnZXQiKTsKLQkJCW91dHB1dCh0eXBlTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0MSwgJmxwU3RydWN0LT4iKTsKLQkJCW91dHB1dChhY2Nlc3Nvcik7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHR9Iik7Ci0JCX0KLQkJb3V0cHV0bG4oKTsKLQkJaWYgKG5vV2luQ0UpIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCQlpZiAoZXhjbHVkZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlvdXRwdXRsbigiI2VuZGlmIik7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVHZXRGdW5jdGlvbihDbGFzcyBjbGF6eikgewotCVN0cmluZyBjbGF6ek5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiICpnZXQiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgIik7Ci0Jb3V0cHV0KGNsYXp6TmFtZSk7Ci0Jb3V0cHV0bG4oIiAqbHBTdHJ1Y3QpIik7Ci0Jb3V0cHV0bG4oInsiKTsKLQlvdXRwdXQoIlx0aWYgKCEiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXQoIkZjLmNhY2hlZCkgY2FjaGUiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiRmllbGRzKGVudiwgbHBPYmplY3QpOyIpOwotCWdlbmVyYXRlR2V0RmllbGRzKGNsYXp6KTsKLQlvdXRwdXRsbigiXHRyZXR1cm4gbHBTdHJ1Y3Q7Iik7Ci0Jb3V0cHV0bG4oIn0iKTsKLX0KLQotdm9pZCBnZW5lcmF0ZVNldEZpZWxkcyhDbGFzcyBjbGF6eikgewotCUNsYXNzIHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JU3RyaW5nIHN1cGVyTmFtZSA9IGdldENsYXNzTmFtZShzdXBlcmNsYXp6KTsKLQlpZiAoc3VwZXJjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKLQkJLyogV2luZG93cyBleGNlcHRpb24gLSBjYW5ub3QgY2FsbCBnZXQvc2V0IGZ1bmN0aW9uIG9mIHN1cGVyIGNsYXNzIGluIHRoaXMgY2FzZSAqLwotCQlpZiAoIShjbGF6ek5hbWUuZXF1YWxzKHN1cGVyTmFtZSArICJBIikgfHwgY2xhenpOYW1lLmVxdWFscyhzdXBlck5hbWUgKyAiVyIpKSkgewotCQkJb3V0cHV0KCJcdHNldCIpOwotCQkJb3V0cHV0KHN1cGVyTmFtZSk7Ci0JCQlvdXRwdXQoIkZpZWxkcyhlbnYsIGxwT2JqZWN0LCAoIik7Ci0JCQlvdXRwdXQoc3VwZXJOYW1lKTsKLQkJCW91dHB1dGxuKCIgKilscFN0cnVjdCk7Iik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZVNldEZpZWxkcyhzdXBlcmNsYXp6KTsKLQkJfQotCX0KLQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCWlmIChpZ25vcmVGaWVsZChmaWVsZCkpIGNvbnRpbnVlOwotCQlGaWVsZERhdGEgZmllbGREYXRhID0gZ2V0TWV0YURhdGEoKS5nZXRNZXRhRGF0YShmaWVsZCk7Ci0JCVN0cmluZyBleGNsdWRlID0gZmllbGREYXRhLmdldEV4Y2x1ZGUoKTsKLQkJaWYgKGV4Y2x1ZGUubGVuZ3RoKCkgIT0gMCkgewotCQkJb3V0cHV0bG4oZXhjbHVkZSk7Ci0JCX0KLQkJYm9vbGVhbiBub1dpbkNFID0gZmllbGREYXRhLmdldEZsYWcoRkxBR19OT19XSU5DRSk7Ci0JCWlmIChub1dpbkNFKSB7Ci0JCQlvdXRwdXRsbigiI2lmbmRlZiBfV0lOMzJfV0NFIik7Ci0JCX0KLQkJQ2xhc3MgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKHR5cGUpOwotCQlTdHJpbmcgYWNjZXNzb3IgPSBmaWVsZERhdGEuZ2V0QWNjZXNzb3IoKTsKLQkJaWYgKGFjY2Vzc29yID09IG51bGwgfHwgYWNjZXNzb3IubGVuZ3RoKCkgPT0gMCkgYWNjZXNzb3IgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiXHRlbnYtPlNldCIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIlx0KCplbnYpLT5TZXQiKTsKLQkJCX0KLQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMShmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCWlmIChpc0NQUCkgewotCQkJCW91dHB1dCgiRmllbGQobHBPYmplY3QsICIpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQoIkZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJfQotCQkJb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXQoIiwgKCIpOwotCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJb3V0cHV0KCIpbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dCgiKTsiKTsKLQkJfSBlbHNlIGlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCW91dHB1dGxuKCJcdHsiKTsKLQkJCQlvdXRwdXQoIlx0Iik7CQkJCQotCQkJCW91dHB1dChnZXRUeXBlU2lnbmF0dXJlMihmaWVsZC5nZXRUeXBlKCkpKTsKLQkJCQlvdXRwdXQoIiBscE9iamVjdDEgPSAoIik7Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUyKGZpZWxkLmdldFR5cGUoKSkpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIillbnYtPkdldE9iamVjdEZpZWxkKGxwT2JqZWN0LCAiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIikoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJCX0KLQkJCQlvdXRwdXQoZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpKTsKLQkJCQlvdXRwdXQoIkZjLiIpOwotCQkJCW91dHB1dChmaWVsZC5nZXROYW1lKCkpOwotCQkJCW91dHB1dGxuKCIpOyIpOwotCQkJCWlmIChpc0NQUCkgewotCQkJCQlvdXRwdXQoIlx0ZW52LT5TZXQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvdXRwdXQoIlx0KCplbnYpLT5TZXQiKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGdldFR5cGVTaWduYXR1cmUxKGNvbXBvbmVudFR5cGUpKTsKLQkJCQlpZiAoaXNDUFApIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihscE9iamVjdDEsIDAsIHNpemVvZihscFN0cnVjdC0+Iik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3V0cHV0KCJBcnJheVJlZ2lvbihlbnYsIGxwT2JqZWN0MSwgMCwgc2l6ZW9mKGxwU3RydWN0LT4iKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXQoIikiKTsKLQkJCQlpbnQgYnl0ZUNvdW50ID0gZ2V0Qnl0ZUNvdW50KGNvbXBvbmVudFR5cGUpOwotCQkJCWlmIChieXRlQ291bnQgPiAxKSB7Ci0JCQkJCW91dHB1dCgiIC8gIik7Ci0JCQkJCW91dHB1dChTdHJpbmcudmFsdWVPZihieXRlQ291bnQpKTsKLQkJCQl9Ci0JCQkJb3V0cHV0KCIsICgiKTsKLQkJCQlvdXRwdXQoZ2V0VHlwZVNpZ25hdHVyZTQodHlwZSkpOwkJCQkKLQkJCQlvdXRwdXQoIilscFN0cnVjdC0+Iik7Ci0JCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCQlvdXRwdXRsbigiKTsiKTsKLQkJCQlvdXRwdXQoIlx0fSIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXJyb3IoIm5vdCBkb25lIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXRsbigiXHR7Iik7Ci0JCQlvdXRwdXQoIlx0am9iamVjdCBscE9iamVjdDEgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgbHBPYmplY3QsICIpOwotCQkJb3V0cHV0KGdldENsYXNzTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSk7Ci0JCQlvdXRwdXQoIkZjLiIpOwotCQkJb3V0cHV0KGZpZWxkLmdldE5hbWUoKSk7Ci0JCQlvdXRwdXRsbigiKTsiKTsKLQkJCW91dHB1dCgiXHRpZiAobHBPYmplY3QxICE9IE5VTEwpIHNldCIpOwotCQkJb3V0cHV0KHR5cGVOYW1lKTsKLQkJCW91dHB1dCgiRmllbGRzKGVudiwgbHBPYmplY3QxLCAmbHBTdHJ1Y3QtPiIpOwotCQkJb3V0cHV0KGFjY2Vzc29yKTsKLQkJCW91dHB1dGxuKCIpOyIpOwotCQkJb3V0cHV0KCJcdH0iKTsKLQkJfQotCQlvdXRwdXRsbigpOwotCQlpZiAobm9XaW5DRSkgewotCQkJb3V0cHV0bG4oIiNlbmRpZiIpOwotCQl9Ci0JCWlmIChleGNsdWRlLmxlbmd0aCgpICE9IDApIHsKLQkJCW91dHB1dGxuKCIjZW5kaWYiKTsKLQkJfQotCX0KLX0KLQotdm9pZCBnZW5lcmF0ZVNldEZ1bmN0aW9uKENsYXNzIGNsYXp6KSB7Ci0JU3RyaW5nIGNsYXp6TmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0Jb3V0cHV0KCJ2b2lkIHNldCIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCAiKTsKLQlvdXRwdXQoY2xhenpOYW1lKTsKLQlvdXRwdXRsbigiICpscFN0cnVjdCkiKTsKLQlvdXRwdXRsbigieyIpOwotCW91dHB1dCgiXHRpZiAoISIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dCgiRmMuY2FjaGVkKSBjYWNoZSIpOwotCW91dHB1dChjbGF6ek5hbWUpOwotCW91dHB1dGxuKCJGaWVsZHMoZW52LCBscE9iamVjdCk7Iik7Ci0JZ2VuZXJhdGVTZXRGaWVsZHMoY2xhenopOwotCW91dHB1dGxuKCJ9Iik7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVGdW5jdGlvbnMoQ2xhc3MgY2xhenopIHsKLQlnZW5lcmF0ZUNhY2hlRnVuY3Rpb24oY2xhenopOwotCW91dHB1dGxuKCk7Ci0JZ2VuZXJhdGVHZXRGdW5jdGlvbihjbGF6eik7Ci0Jb3V0cHV0bG4oKTsKLQlnZW5lcmF0ZVNldEZ1bmN0aW9uKGNsYXp6KTsKLX0KLQotYm9vbGVhbiBpZ25vcmVGaWVsZChGaWVsZCBmaWVsZCkgewotCWludCBtb2RzID0gZmllbGQuZ2V0TW9kaWZpZXJzKCk7Ci0JcmV0dXJuCi0JCSgobW9kcyAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkgfHwKLQkJKChtb2RzICYgTW9kaWZpZXIuRklOQUwpICE9IDApIHx8Ci0JCSgobW9kcyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YmZmNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX0JpZGlVdGlsPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfQz0KLUNfUFRSX3NpemVvZj0KLQotQ19mcmVlPQotQ19mcmVlXzA9Y2FzdD0odm9pZCAqKQotCi1DX2dldGVudj0KLUNfZ2V0ZW52XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1DX21hbGxvYz0KLUNfbWFsbG9jXzA9Ci0KLUNfbWVtbW92ZV9fSUlJPQotQ19tZW1tb3ZlX19JSUlfMD1jYXN0PSh2b2lkICopCi1DX21lbW1vdmVfX0lJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLUNfbWVtbW92ZV9fSUlJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbW1vdmVfX0lfM0JJPQotQ19tZW1tb3ZlX19JXzNCSV8wPWNhc3Q9KHZvaWQgKikKLUNfbWVtbW92ZV9fSV8zQklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotQ19tZW1tb3ZlX19JXzNCSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19JXzNDST0KLUNfbWVtbW92ZV9fSV8zQ0lfMD1jYXN0PSh2b2lkICopCi1DX21lbW1vdmVfX0lfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLUNfbWVtbW92ZV9fSV8zQ0lfMj1jYXN0PShzaXplX3QpCi0KLUNfbWVtbW92ZV9fSV8zREk9Ci1DX21lbW1vdmVfX0lfM0RJXzA9Y2FzdD0odm9pZCAqKQotQ19tZW1tb3ZlX19JXzNESV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1DX21lbW1vdmVfX0lfM0RJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbW1vdmVfX0lfM0ZJPQotQ19tZW1tb3ZlX19JXzNGSV8wPWNhc3Q9KHZvaWQgKikKLUNfbWVtbW92ZV9fSV8zRklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotQ19tZW1tb3ZlX19JXzNGSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19JXzNJST0KLUNfbWVtbW92ZV9fSV8zSUlfMD1jYXN0PSh2b2lkICopCi1DX21lbW1vdmVfX0lfM0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLUNfbWVtbW92ZV9fSV8zSUlfMj1jYXN0PShzaXplX3QpCi0KLUNfbWVtbW92ZV9fSV8zSkk9Ci1DX21lbW1vdmVfX0lfM0pJXzA9Y2FzdD0odm9pZCAqKQotQ19tZW1tb3ZlX19JXzNKSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1DX21lbW1vdmVfX0lfM0pJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbW1vdmVfX0lfM1NJPQotQ19tZW1tb3ZlX19JXzNTSV8wPWNhc3Q9KHZvaWQgKikKLUNfbWVtbW92ZV9fSV8zU0lfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotQ19tZW1tb3ZlX19JXzNTSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0JJST0KLUNfbWVtbW92ZV9fXzNCSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1DX21lbW1vdmVfX18zQklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0JJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0JfM0NJPQotQ19tZW1tb3ZlX19fM0JfM0NJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotQ19tZW1tb3ZlX19fM0JfM0NJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLUNfbWVtbW92ZV9fXzNCXzNDSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0NJST0KLUNfbWVtbW92ZV9fXzNDSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1DX21lbW1vdmVfX18zQ0lJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0NJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0RJST0KLUNfbWVtbW92ZV9fXzNESUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1DX21lbW1vdmVfX18zRElJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0RJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0ZJST0KLUNfbWVtbW92ZV9fXzNGSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1DX21lbW1vdmVfX18zRklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0ZJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0lJST0KLUNfbWVtbW92ZV9fXzNJSUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1DX21lbW1vdmVfX18zSUlJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0lJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ19tZW1tb3ZlX19fM0lfM0JJPQotQ19tZW1tb3ZlX19fM0lfM0JJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotQ19tZW1tb3ZlX19fM0lfM0JJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ19tZW1tb3ZlX19fM0lfM0JJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbW1vdmVfX18zSklJPQotQ19tZW1tb3ZlX19fM0pJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLUNfbWVtbW92ZV9fXzNKSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1DX21lbW1vdmVfX18zSklJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbW1vdmVfX18zU0lJPQotQ19tZW1tb3ZlX19fM1NJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLUNfbWVtbW92ZV9fXzNTSUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1DX21lbW1vdmVfX18zU0lJXzI9Y2FzdD0oc2l6ZV90KQotCi1DX21lbXNldD0KLUNfbWVtc2V0XzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbAotQ19tZW1zZXRfMT0KLUNfbWVtc2V0XzI9Y2FzdD0oc2l6ZV90KQotCi1DX3N0cmxlbj0KLUNfc3RybGVuXzA9Y2FzdD0oY2hhciAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9DYWxsYmFjaz1mbGFncz1ub19nZW4KLUNhbGxiYWNrX2JpbmQ9Ci1DYWxsYmFja19iaW5kXzA9Ci1DYWxsYmFja19iaW5kXzE9Ci1DYWxsYmFja19iaW5kXzI9Ci1DYWxsYmFja19iaW5kXzM9Ci1DYWxsYmFja19iaW5kXzQ9Ci1DYWxsYmFja19iaW5kXzU9Ci1DYWxsYmFja19iaW5kXzY9Ci1DYWxsYmFja19iaW5kXzc9Ci0KLUNhbGxiYWNrX2dldEVuYWJsZWQ9Ci0KLUNhbGxiYWNrX2dldEVudHJ5Q291bnQ9Ci0KLUNhbGxiYWNrX2dldFBsYXRmb3JtPQotCi1DYWxsYmFja19yZXNldD0KLQotQ2FsbGJhY2tfc2V0RW5hYmxlZD0KLUNhbGxiYWNrX3NldEVuYWJsZWRfMD0KLQotQ2FsbGJhY2tfdW5iaW5kPQotQ2FsbGJhY2tfdW5iaW5kXzA9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX0Nsb25lYWJsZUNvbXBhdGliaWxpdHk9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9Db21wYXRpYmlsaXR5PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfTE9ORz1mbGFncz1ub19nZW4KLUxPTkdfdmFsdWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9MaWJyYXJ5PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfTG9jaz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1BsYXRmb3JtPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50T2JqZWN0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU2VyaWFsaXphYmxlQ29tcGF0aWJpbGl0eT1mbGFncz1ub19nZW4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsuQVRLLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTMxMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5Lmd0ay5BVEsucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQVRLPQotQVRLX0F0a09iamVjdEZhY3RvcnlDbGFzc19zaXplb2Y9Ci0KLUFUS19BdGtPYmplY3RGYWN0b3J5X3NpemVvZj0KLQotQVRLX19BVEtfQUNUSU9OX0dFVF9JRkFDRT0KLUFUS19fQVRLX0FDVElPTl9HRVRfSUZBQ0VfMD0KLQotQVRLX19BVEtfQ09NUE9ORU5UX0dFVF9JRkFDRT0KLUFUS19fQVRLX0NPTVBPTkVOVF9HRVRfSUZBQ0VfMD0KLQotQVRLX19BVEtfT0JKRUNUX0ZBQ1RPUllfQ0xBU1M9Ci1BVEtfX0FUS19PQkpFQ1RfRkFDVE9SWV9DTEFTU18wPQotCi1BVEtfX0FUS19TRUxFQ1RJT05fR0VUX0lGQUNFPQotQVRLX19BVEtfU0VMRUNUSU9OX0dFVF9JRkFDRV8wPQotCi1BVEtfX0FUS19URVhUX0dFVF9JRkFDRT0KLUFUS19fQVRLX1RFWFRfR0VUX0lGQUNFXzA9Ci0KLUFUS19fR1RLX0FDQ0VTU0lCTEU9Ci1BVEtfX0dUS19BQ0NFU1NJQkxFXzA9Ci0KLUFUS19fYXRrX2ZvY3VzX3RyYWNrZXJfbm90aWZ5PQotQVRLX19hdGtfZm9jdXNfdHJhY2tlcl9ub3RpZnlfMD1jYXN0PShBdGtPYmplY3QgKikKLQotQVRLX19hdGtfZ2V0X2RlZmF1bHRfcmVnaXN0cnk9Ci0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2NyZWF0ZV9hY2Nlc3NpYmxlPQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfY3JlYXRlX2FjY2Vzc2libGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi1BVEtfX2F0a19vYmplY3RfZmFjdG9yeV9jcmVhdGVfYWNjZXNzaWJsZV8xPWNhc3Q9KEdPYmplY3QgKikKLQotQVRLX19hdGtfb2JqZWN0X2ZhY3RvcnlfZ2V0X2FjY2Vzc2libGVfdHlwZT0KLUFUS19fYXRrX29iamVjdF9mYWN0b3J5X2dldF9hY2Nlc3NpYmxlX3R5cGVfMD1jYXN0PShBdGtPYmplY3RGYWN0b3J5ICopCi0KLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplPQotQVRLX19hdGtfb2JqZWN0X2luaXRpYWxpemVfMD1jYXN0PShBdGtPYmplY3QgKikKLUFUS19fYXRrX29iamVjdF9pbml0aWFsaXplXzE9Y2FzdD0oZ3BvaW50ZXIpCi0KLUFUS19fYXRrX29iamVjdF9yZWZfcmVsYXRpb25fc2V0PQotQVRLX19hdGtfb2JqZWN0X3JlZl9yZWxhdGlvbl9zZXRfMD1jYXN0PShBdGtPYmplY3QgKikKLQotQVRLX19hdGtfcmVnaXN0cnlfZ2V0X2ZhY3Rvcnk9Ci1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9nZXRfZmFjdG9yeV8xPWNhc3Q9KEdUeXBlKQotCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlPQotQVRLX19hdGtfcmVnaXN0cnlfc2V0X2ZhY3RvcnlfdHlwZV8wPWNhc3Q9KEF0a1JlZ2lzdHJ5ICopCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzE9Y2FzdD0oR1R5cGUpCi1BVEtfX2F0a19yZWdpc3RyeV9zZXRfZmFjdG9yeV90eXBlXzI9Y2FzdD0oR1R5cGUpCi0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfbl9yZWxhdGlvbnM9Ci1BVEtfX2F0a19yZWxhdGlvbl9zZXRfZ2V0X25fcmVsYXRpb25zXzA9Y2FzdD0oQXRrUmVsYXRpb25TZXQgKikKLQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbj0KLUFUS19fYXRrX3JlbGF0aW9uX3NldF9nZXRfcmVsYXRpb25fMD1jYXN0PShBdGtSZWxhdGlvblNldCAqKQotQVRLX19hdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbl8xPQotCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlPQotQVRLX19hdGtfcmVsYXRpb25fc2V0X3JlbW92ZV8wPWNhc3Q9KEF0a1JlbGF0aW9uU2V0ICopCi1BVEtfX2F0a19yZWxhdGlvbl9zZXRfcmVtb3ZlXzE9Y2FzdD0oQXRrUmVsYXRpb24gKikKLQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZT0KLUFUS19fYXRrX3N0YXRlX3NldF9hZGRfc3RhdGVfMD1jYXN0PShBdGtTdGF0ZVNldCAqKQotQVRLX19hdGtfc3RhdGVfc2V0X2FkZF9zdGF0ZV8xPWNhc3Q9KEF0a1N0YXRlVHlwZSkKLQotQVRLX19hdGtfc3RhdGVfc2V0X25ldz0KLQotQVRLX18xY2FsbF9fSUk9Ci1BVEtfXzFjYWxsX19JSV8wPQotQVRLX18xY2FsbF9fSUlfMT0KLQotQVRLX18xY2FsbF9fSUlJPQotQVRLX18xY2FsbF9fSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlfMT0KLUFUS19fMWNhbGxfX0lJSV8yPQotCi1BVEtfXzFjYWxsX19JSUlJPQotQVRLX18xY2FsbF9fSUlJSV8wPQotQVRLX18xY2FsbF9fSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSV8yPQotQVRLX18xY2FsbF9fSUlJSV8zPQotCi1BVEtfXzFjYWxsX19JSUlJST0KLUFUS19fMWNhbGxfX0lJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlfMj0KLUFUS19fMWNhbGxfX0lJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSV80PQotCi1BVEtfXzFjYWxsX19JSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMD0KLUFUS19fMWNhbGxfX0lJSUlJSV8xPQotQVRLX18xY2FsbF9fSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlfMz0KLUFUS19fMWNhbGxfX0lJSUlJSV80PQotQVRLX18xY2FsbF9fSUlJSUlJXzU9Ci0KLUFUS19fMWNhbGxfX0lJSUlJSUk9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzA9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzE9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzI9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzM9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzQ9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzU9Ci1BVEtfXzFjYWxsX19JSUlJSUlJXzY9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtBY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtDb21wb25lbnRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtIeXBlcnRleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtPYmplY3RGYWN0b3J5Q2xhc3NfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJfMD0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtTZWxlY3Rpb25JZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMj0KLUFUS19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19BdGtUZXh0SWZhY2VfMl8wPQotQVRLX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrQ29tcG9uZW50SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrSHlwZXJ0ZXh0SWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3NfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdENsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzc18ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0RmFjdG9yeUNsYXNzXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2VfMklfMD0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1NlbGVjdGlvbklmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8yST0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a1RleHRJZmFjZV8ySV8wPQotQVRLX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlXzJJXzE9Ci0KLUFUS19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0d0a0FjY2Vzc2libGVfMkk9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzA9Ci1BVEtfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlXzJJXzE9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0FjdGlvbklmYWNlPQotQXRrQWN0aW9uSWZhY2VfZG9fYWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X25fYWN0aW9ucz1jYXN0PShnaW50ICgqKSgpKQotQXRrQWN0aW9uSWZhY2VfZ2V0X2Rlc2NyaXB0aW9uPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9uYW1lPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX2dldF9rZXliaW5kaW5nPWNhc3Q9KEdfQ09OU1RfUkVUVVJOIGdjaGFyICooKikoKSkKLUF0a0FjdGlvbklmYWNlX3NldF9kZXNjcmlwdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0NvbXBvbmVudElmYWNlPQotQXRrQ29tcG9uZW50SWZhY2VfYWRkX2ZvY3VzX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9jb250YWlucz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlZl9hY2Nlc3NpYmxlX2F0X3BvaW50PWNhc3Q9KEF0a09iamVjdCAqKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfZXh0ZW50cz1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X3Bvc2l0aW9uPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9nZXRfc2l6ZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ3JhYl9mb2N1cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3JlbW92ZV9mb2N1c19oYW5kbGVyPWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtDb21wb25lbnRJZmFjZV9zZXRfZXh0ZW50cz1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9wb3NpdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a0NvbXBvbmVudElmYWNlX3NldF9zaXplPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrQ29tcG9uZW50SWZhY2VfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a0h5cGVydGV4dElmYWNlPQotQXRrSHlwZXJ0ZXh0SWZhY2VfZ2V0X2xpbms9Y2FzdD0oQXRrSHlwZXJsaW5rICooKikoKSkKLUF0a0h5cGVydGV4dElmYWNlX2dldF9uX2xpbmtzPWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtIeXBlcnRleHRJZmFjZV9nZXRfbGlua19pbmRleD1jYXN0PShnaW50ICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrT2JqZWN0Q2xhc3M9Ci1BdGtPYmplY3RDbGFzc19nZXRfbmFtZT1jYXN0PShHX0NPTlNUX1JFVFVSTiBnY2hhciAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfZGVzY3JpcHRpb249Y2FzdD0oR19DT05TVF9SRVRVUk4gZ2NoYXIgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X3BhcmVudD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X25fY2hpbGRyZW49Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9jaGlsZD1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2luZGV4X2luX3BhcmVudD1jYXN0PShnaW50ICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfcmVmX3JlbGF0aW9uX3NldD1jYXN0PShBdGtSZWxhdGlvblNldCAqKCopKCkpCi1BdGtPYmplY3RDbGFzc19nZXRfcm9sZT1jYXN0PShBdGtSb2xlICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X2xheWVyPWNhc3Q9KEF0a0xheWVyICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfZ2V0X21kaV96b3JkZXI9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a09iamVjdENsYXNzX3JlZl9zdGF0ZV9zZXQ9Y2FzdD0oQXRrU3RhdGVTZXQgKigqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X25hbWU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3NldF9kZXNjcmlwdGlvbj1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3BhcmVudD1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3Nfc2V0X3JvbGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2Nvbm5lY3RfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0oZ3VpbnQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19yZW1vdmVfcHJvcGVydHlfY2hhbmdlX2hhbmRsZXI9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2luaXRpYWxpemU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2NoaWxkcmVuX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX2ZvY3VzX2V2ZW50PWNhc3Q9KHZvaWQgKCopKCkpCi1BdGtPYmplY3RDbGFzc19wcm9wZXJ0eV9jaGFuZ2U9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdENsYXNzX3N0YXRlX2NoYW5nZT1jYXN0PSh2b2lkICgqKSgpKQotQXRrT2JqZWN0Q2xhc3NfdmlzaWJsZV9kYXRhX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2FjY2Vzc2liaWxpdHlfZ3RrX0F0a09iamVjdEZhY3RvcnlDbGFzcz0KLUF0a09iamVjdEZhY3RvcnlDbGFzc19jcmVhdGVfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrT2JqZWN0RmFjdG9yeUNsYXNzX2ludmFsaWRhdGU9Y2FzdD0odm9pZCAoKikoKSkKLUF0a09iamVjdEZhY3RvcnlDbGFzc19nZXRfYWNjZXNzaWJsZV90eXBlPWNhc3Q9KEdUeXBlICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrU2VsZWN0aW9uSWZhY2U9Ci1BdGtTZWxlY3Rpb25JZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfY2xlYXJfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfcmVmX3NlbGVjdGlvbj1jYXN0PShBdGtPYmplY3QgKigqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfZ2V0X3NlbGVjdGlvbl9jb3VudD1jYXN0PShnaW50ICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2VfaXNfY2hpbGRfc2VsZWN0ZWQ9Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9yZW1vdmVfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrU2VsZWN0aW9uSWZhY2Vfc2VsZWN0X2FsbF9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtTZWxlY3Rpb25JZmFjZV9zZWxlY3Rpb25fY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfYWNjZXNzaWJpbGl0eV9ndGtfQXRrVGV4dElmYWNlPQotQXRrVGV4dElmYWNlX2dldF90ZXh0PWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfdGV4dF9hZnRlcl9vZmZzZXQ9Y2FzdD0oZ2NoYXIgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF90ZXh0X2F0X29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NoYXJhY3Rlcl9hdF9vZmZzZXQ9Y2FzdD0oZ3VuaWNoYXIgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X3RleHRfYmVmb3JlX29mZnNldD1jYXN0PShnY2hhciAqKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X2NhcmV0X29mZnNldD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9ydW5fYXR0cmlidXRlcz1jYXN0PShBdGtBdHRyaWJ1dGVTZXQgKigqKSgpKQotQXRrVGV4dElmYWNlX2dldF9kZWZhdWx0X2F0dHJpYnV0ZXM9Y2FzdD0oQXRrQXR0cmlidXRlU2V0ICooKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2V4dGVudHM9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfY2hhcmFjdGVyX2NvdW50PWNhc3Q9KGdpbnQgKCopKCkpCi1BdGtUZXh0SWZhY2VfZ2V0X29mZnNldF9hdF9wb2ludD1jYXN0PShnaW50ICgqKSgpKQotQXRrVGV4dElmYWNlX2dldF9uX3NlbGVjdGlvbnM9Y2FzdD0oZ2ludCAoKikoKSkKLUF0a1RleHRJZmFjZV9nZXRfc2VsZWN0aW9uPWNhc3Q9KGdjaGFyICooKikoKSkKLUF0a1RleHRJZmFjZV9hZGRfc2VsZWN0aW9uPWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3JlbW92ZV9zZWxlY3Rpb249Y2FzdD0oZ2Jvb2xlYW4gKCopKCkpCi1BdGtUZXh0SWZhY2Vfc2V0X3NlbGVjdGlvbj1jYXN0PShnYm9vbGVhbiAoKikoKSkKLUF0a1RleHRJZmFjZV9zZXRfY2FyZXRfb2Zmc2V0PWNhc3Q9KGdib29sZWFuICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2hhbmdlZD1jYXN0PSh2b2lkICgqKSgpKQotQXRrVGV4dElmYWNlX3RleHRfY2FyZXRfbW92ZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUF0a1RleHRJZmFjZV90ZXh0X3NlbGVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQgKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9hY2Nlc3NpYmlsaXR5X2d0a19HdGtBY2Nlc3NpYmxlPQotR3RrQWNjZXNzaWJsZV93aWRnZXQ9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzZmIxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmFjY2Vzc2liaWxpdHkuZ3RrLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zd3RfY29weXJpZ2h0PS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gXAotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIFwKLSAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtc1xuIFwKLSAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIFZlcnNpb24gMi4xIHRoYXRcbiBcCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiAobGdwbC12MjEudHh0KS4gIFRoZSBMR1BMIGlzIGFsc29cbiBcCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbC4gIElmIHRoZSB2ZXJzaW9uXG4gXAotICogb2YgdGhlIExHUEwgYXQgaHR0cDovL3d3dy5nbnUub3JnIGlzIGRpZmZlcmVudCB0byB0aGUgdmVyc2lvbiBvZlxuIFwKLSAqIHRoZSBMR1BMIGFjY29tcGFueWluZyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgdGhlcmUgaXMgYW55IGNvbmZsaWN0XG4gXAotICogYmV0d2VlbiB0aGUgdHdvIGxpY2Vuc2UgdmVyc2lvbnMsIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCBhY2NvbXBhbnlpbmdcbiBcCi0gKiB0aGlzIGRpc3RyaWJ1dGlvbiBzaGFsbCBnb3Zlcm4uXG4gXAotICogXG4gXAotICogQ29udHJpYnV0b3JzOlxuIFwKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiBcCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8uQ2Fpcm8ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2Fpcm8uQ2Fpcm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkOWUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLkNhaXJvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX0NhaXJvPQotQ2Fpcm9fY2Fpcm9fYXBwZW5kX3BhdGg9Ci1DYWlyb19jYWlyb19hcHBlbmRfcGF0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2FwcGVuZF9wYXRoXzE9Y2FzdD0oY2Fpcm9fcGF0aF90ICopCi0KLUNhaXJvX2NhaXJvX2FyYz0KLUNhaXJvX2NhaXJvX2FyY18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2FyY18xPQotQ2Fpcm9fY2Fpcm9fYXJjXzI9Ci1DYWlyb19jYWlyb19hcmNfMz0KLUNhaXJvX2NhaXJvX2FyY180PQotQ2Fpcm9fY2Fpcm9fYXJjXzU9Ci0KLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZT0KLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZV8xPQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzI9Ci1DYWlyb19jYWlyb19hcmNfbmVnYXRpdmVfMz0KLUNhaXJvX2NhaXJvX2FyY19uZWdhdGl2ZV80PQotQ2Fpcm9fY2Fpcm9fYXJjX25lZ2F0aXZlXzU9Ci0KLUNhaXJvX2NhaXJvX2NsaXA9Ci1DYWlyb19jYWlyb19jbGlwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jbGlwX3ByZXNlcnZlPQotQ2Fpcm9fY2Fpcm9fY2xpcF9wcmVzZXJ2ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fY2xvc2VfcGF0aD0KLUNhaXJvX2NhaXJvX2Nsb3NlX3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2NvcHlfcGFnZT0KLUNhaXJvX2NhaXJvX2NvcHlfcGFnZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fY29weV9wYXRoPQotQ2Fpcm9fY2Fpcm9fY29weV9wYXRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jb3B5X3BhdGhfZmxhdD0KLUNhaXJvX2NhaXJvX2NvcHlfcGF0aF9mbGF0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19jcmVhdGU9Ci1DYWlyb19jYWlyb19jcmVhdGVfMD1jYXN0PWNhaXJvX3N1cmZhY2VfdCAqCi0KLUNhaXJvX2NhaXJvX2N1cnZlX3RvPQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19jdXJ2ZV90b18xPQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fMj0KLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzM9Ci1DYWlyb19jYWlyb19jdXJ2ZV90b180PQotQ2Fpcm9fY2Fpcm9fY3VydmVfdG9fNT0KLUNhaXJvX2NhaXJvX2N1cnZlX3RvXzY9Ci0KLUNhaXJvX2NhaXJvX2Rlc3Ryb3k9Ci1DYWlyb19jYWlyb19kZXN0cm95XzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcj0KLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfMT0KLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyXzI9Ci0KLUNhaXJvX2NhaXJvX2RldmljZV90b191c2VyX2Rpc3RhbmNlPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2VfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZV8xPQotQ2Fpcm9fY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2VfMj0KLQotQ2Fpcm9fY2Fpcm9fZmlsbD0KLUNhaXJvX2NhaXJvX2ZpbGxfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50cz0KLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50c18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50c18xPQotQ2Fpcm9fY2Fpcm9fZmlsbF9leHRlbnRzXzI9Ci1DYWlyb19jYWlyb19maWxsX2V4dGVudHNfMz0KLUNhaXJvX2NhaXJvX2ZpbGxfZXh0ZW50c180PQotCi1DYWlyb19jYWlyb19maWxsX3ByZXNlcnZlPQotQ2Fpcm9fY2Fpcm9fZmlsbF9wcmVzZXJ2ZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZm9udF9leHRlbnRzPQotQ2Fpcm9fY2Fpcm9fZm9udF9leHRlbnRzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZm9udF9leHRlbnRzXzE9Ci0KLUNhaXJvX2NhaXJvX2ZvbnRfZXh0ZW50c190X3NpemVvZj0KLQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX2NyZWF0ZT0KLQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX2Rlc3Ryb3k9Ci1DYWlyb19jYWlyb19mb250X29wdGlvbnNfZGVzdHJveV8wPWNhc3Q9Y2Fpcm9fZm9udF9vcHRpb25zX3QgKgotCi1DYWlyb19jYWlyb19mb250X29wdGlvbnNfZ2V0X2FudGlhbGlhcz0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19nZXRfYW50aWFsaWFzXzA9Y2FzdD1jYWlyb19mb250X29wdGlvbnNfdCAqCi0KLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19zZXRfYW50aWFsaWFzPQotQ2Fpcm9fY2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXNfMD1jYXN0PWNhaXJvX2ZvbnRfb3B0aW9uc190ICoKLUNhaXJvX2NhaXJvX2ZvbnRfb3B0aW9uc19zZXRfYW50aWFsaWFzXzE9Ci0KLUNhaXJvX2NhaXJvX2dldF9hbnRpYWxpYXM9Ci1DYWlyb19jYWlyb19nZXRfYW50aWFsaWFzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfY3VycmVudF9wb2ludD0KLUNhaXJvX2NhaXJvX2dldF9jdXJyZW50X3BvaW50XzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnRfMT0KLUNhaXJvX2NhaXJvX2dldF9jdXJyZW50X3BvaW50XzI9Ci0KLUNhaXJvX2NhaXJvX2dldF9maWxsX3J1bGU9Ci1DYWlyb19jYWlyb19nZXRfZmlsbF9ydWxlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfZm9udF9mYWNlPQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfZmFjZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfbWF0cml4PQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfbWF0cml4XzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZ2V0X2ZvbnRfbWF0cml4XzE9Y2FzdD1jYWlyb19tYXRyaXhfdCAqCi0KLUNhaXJvX2NhaXJvX2dldF9mb250X29wdGlvbnM9Ci1DYWlyb19jYWlyb19nZXRfZm9udF9vcHRpb25zXzA9Y2FzdD1jYWlyb190ICoKLUNhaXJvX2NhaXJvX2dldF9mb250X29wdGlvbnNfMT1jYXN0PWNhaXJvX2ZvbnRfb3B0aW9uc190ICoKLQotQ2Fpcm9fY2Fpcm9fZ2V0X2xpbmVfY2FwPQotQ2Fpcm9fY2Fpcm9fZ2V0X2xpbmVfY2FwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfbGluZV9qb2luPQotQ2Fpcm9fY2Fpcm9fZ2V0X2xpbmVfam9pbl8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X2xpbmVfd2lkdGg9Ci1DYWlyb19jYWlyb19nZXRfbGluZV93aWR0aF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX2dldF9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nZXRfbWF0cml4XzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X21pdGVyX2xpbWl0PQotQ2Fpcm9fY2Fpcm9fZ2V0X21pdGVyX2xpbWl0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfb3BlcmF0b3I9Ci1DYWlyb19jYWlyb19nZXRfb3BlcmF0b3JfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dldF9zb3VyY2U9Ci1DYWlyb19jYWlyb19nZXRfc291cmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19nZXRfdGFyZ2V0PQotQ2Fpcm9fY2Fpcm9fZ2V0X3RhcmdldF8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fZ2V0X3RvbGVyYW5jZT0KLUNhaXJvX2NhaXJvX2dldF90b2xlcmFuY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2dseXBoX2V4dGVudHM9Ci1DYWlyb19jYWlyb19nbHlwaF9leHRlbnRzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfZXh0ZW50c18xPWNhc3Q9KGNhaXJvX2dseXBoX3QgKikKLUNhaXJvX2NhaXJvX2dseXBoX2V4dGVudHNfMj0KLUNhaXJvX2NhaXJvX2dseXBoX2V4dGVudHNfMz1jYXN0PWNhaXJvX3RleHRfZXh0ZW50c190ICoKLQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfcGF0aD0KLUNhaXJvX2NhaXJvX2dseXBoX3BhdGhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19nbHlwaF9wYXRoXzE9Y2FzdD0oY2Fpcm9fZ2x5cGhfdCAqKQotQ2Fpcm9fY2Fpcm9fZ2x5cGhfcGF0aF8yPQotCi1DYWlyb19jYWlyb19pZGVudGl0eV9tYXRyaXg9Ci1DYWlyb19jYWlyb19pZGVudGl0eV9tYXRyaXhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfMD0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlXzE9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV8yPQotCi1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhXzA9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfMT0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhXzI9Ci1DYWlyb19jYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YV8zPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGFfND0KLQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0PQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0XzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoPQotQ2Fpcm9fY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGhfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLQotQ2Fpcm9fY2Fpcm9faW5fZmlsbD0KLUNhaXJvX2NhaXJvX2luX2ZpbGxfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19pbl9maWxsXzE9Ci1DYWlyb19jYWlyb19pbl9maWxsXzI9Ci0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZT0KLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX2luX3N0cm9rZV8xPQotQ2Fpcm9fY2Fpcm9faW5fc3Ryb2tlXzI9Ci0KLUNhaXJvX2NhaXJvX2xpbmVfdG89Ci1DYWlyb19jYWlyb19saW5lX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fbGluZV90b18xPQotQ2Fpcm9fY2Fpcm9fbGluZV90b18yPQotCi1DYWlyb19jYWlyb19tYXNrPQotQ2Fpcm9fY2Fpcm9fbWFza18wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19tYXNrXzE9Y2FzdD1jYWlyb19wYXR0ZXJuX3QgKgotCi1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2U9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzE9Y2FzdD1jYWlyb19zdXJmYWNlX3QgKgotQ2Fpcm9fY2Fpcm9fbWFza19zdXJmYWNlXzI9Ci1DYWlyb19jYWlyb19tYXNrX3N1cmZhY2VfMz0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXQ9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfMj0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzM9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF80PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfNT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0XzY9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X2lkZW50aXR5PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfaWRlbnRpdHlfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2luaXRfc2NhbGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfaW5pdF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF9pbml0X3RyYW5zbGF0ZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfaW52ZXJ0PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X2ludmVydF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseT0KLUNhaXJvX2NhaXJvX21hdHJpeF9tdWx0aXBseV8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfbXVsdGlwbHlfMT1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X211bHRpcGx5XzI9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZT0KLUNhaXJvX2NhaXJvX21hdHJpeF9yb3RhdGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3JvdGF0ZV8xPQotCi1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3NjYWxlXzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfc2NhbGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2Zvcm1fZGlzdGFuY2VfMD1jYXN0PShjYWlyb19tYXRyaXhfdCAqKQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8xPQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9kaXN0YW5jZV8yPQotCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50PQotQ2Fpcm9fY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludF8wPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzE9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNmb3JtX3BvaW50XzI9Ci0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGU9Ci1DYWlyb19jYWlyb19tYXRyaXhfdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMT0KLUNhaXJvX2NhaXJvX21hdHJpeF90cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fbW92ZV90bz0KLUNhaXJvX2NhaXJvX21vdmVfdG9fMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19tb3ZlX3RvXzE9Ci1DYWlyb19jYWlyb19tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX25ld19wYXRoPQotQ2Fpcm9fY2Fpcm9fbmV3X3BhdGhfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50PQotQ2Fpcm9fY2Fpcm9fcGFpbnRfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3BhaW50X3dpdGhfYWxwaGE9Ci1DYWlyb19jYWlyb19wYWludF93aXRoX2FscGhhXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYV8xPQotCi1DYWlyb19jYWlyb19wYXRoX2RhdGFfdF9zaXplb2Y9Ci0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdGhfZGVzdHJveV8wPWNhc3Q9Y2Fpcm9fcGF0aF90ICoKLQotQ2Fpcm9fY2Fpcm9fcGF0aF90X3NpemVvZj0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2I9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYl8zPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JfND0KLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfMT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV8yPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhXzM9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmFfND0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYV81PQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8wPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyXzE9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXJfMj0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcl8zPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWw9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF8xPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2NyZWF0ZV9yYWRpYWxfMz0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbF80PQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsXzU9Ci0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveT0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZGVzdHJveV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX2dldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyPQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyXzA9Y2FzdD0oY2Fpcm9fcGF0dGVybl90ICopCi0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeD0KLUNhaXJvX2NhaXJvX3BhdHRlcm5fZ2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4XzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fcGF0dGVybl9yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3JlZmVyZW5jZV8wPWNhc3Q9KGNhaXJvX3BhdHRlcm5fdCAqKQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmQ9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9leHRlbmRfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZF8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXI9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9maWx0ZXJfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlcl8xPQotCi1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXg9Ci1DYWlyb19jYWlyb19wYXR0ZXJuX3NldF9tYXRyaXhfMD1jYXN0PShjYWlyb19wYXR0ZXJuX3QgKikKLUNhaXJvX2NhaXJvX3BhdHRlcm5fc2V0X21hdHJpeF8xPWNhc3Q9KGNhaXJvX21hdHJpeF90ICopCi0KLUNhaXJvX2NhaXJvX3BkZl9zdXJmYWNlX3NldF9zaXplPWZsYWdzPWR5bmFtaWMKLUNhaXJvX2NhaXJvX3BkZl9zdXJmYWNlX3NldF9zaXplXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19wZGZfc3VyZmFjZV9zZXRfc2l6ZV8xPQotQ2Fpcm9fY2Fpcm9fcGRmX3N1cmZhY2Vfc2V0X3NpemVfMj0KLQotQ2Fpcm9fY2Fpcm9fcHNfc3VyZmFjZV9zZXRfc2l6ZT1mbGFncz1keW5hbWljCi1DYWlyb19jYWlyb19wc19zdXJmYWNlX3NldF9zaXplXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19wc19zdXJmYWNlX3NldF9zaXplXzE9Ci1DYWlyb19jYWlyb19wc19zdXJmYWNlX3NldF9zaXplXzI9Ci0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZT0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV8xPQotQ2Fpcm9fY2Fpcm9fcmVjdGFuZ2xlXzI9Ci1DYWlyb19jYWlyb19yZWN0YW5nbGVfMz0KLUNhaXJvX2NhaXJvX3JlY3RhbmdsZV80PQotCi1DYWlyb19jYWlyb19yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19yZWZlcmVuY2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b18xPQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzI9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fMz0KLUNhaXJvX2NhaXJvX3JlbF9jdXJ2ZV90b180PQotQ2Fpcm9fY2Fpcm9fcmVsX2N1cnZlX3RvXzU9Ci1DYWlyb19jYWlyb19yZWxfY3VydmVfdG9fNj0KLQotQ2Fpcm9fY2Fpcm9fcmVsX2xpbmVfdG89Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3JlbF9saW5lX3RvXzE9Ci1DYWlyb19jYWlyb19yZWxfbGluZV90b18yPQotCi1DYWlyb19jYWlyb19yZWxfbW92ZV90bz0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcmVsX21vdmVfdG9fMT0KLUNhaXJvX2NhaXJvX3JlbF9tb3ZlX3RvXzI9Ci0KLUNhaXJvX2NhaXJvX3Jlc2V0X2NsaXA9Ci1DYWlyb19jYWlyb19yZXNldF9jbGlwXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19yZXN0b3JlPQotQ2Fpcm9fY2Fpcm9fcmVzdG9yZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fcm90YXRlPQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fcm90YXRlXzE9Ci0KLUNhaXJvX2NhaXJvX3NhdmU9Ci1DYWlyb19jYWlyb19zYXZlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19zY2FsZT0KLUNhaXJvX2NhaXJvX3NjYWxlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2NhbGVfMT0KLUNhaXJvX2NhaXJvX3NjYWxlXzI9Ci0KLUNhaXJvX2NhaXJvX3NlbGVjdF9mb250X2ZhY2U9Ci1DYWlyb19jYWlyb19zZWxlY3RfZm9udF9mYWNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2VsZWN0X2ZvbnRfZmFjZV8xPWNhc3Q9Y29uc3QgY2hhciAqCi1DYWlyb19jYWlyb19zZWxlY3RfZm9udF9mYWNlXzI9Ci1DYWlyb19jYWlyb19zZWxlY3RfZm9udF9mYWNlXzM9Ci0KLUNhaXJvX2NhaXJvX3NldF9hbnRpYWxpYXM9Ci1DYWlyb19jYWlyb19zZXRfYW50aWFsaWFzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2FudGlhbGlhc18xPQotCi1DYWlyb19jYWlyb19zZXRfZGFzaD0KLUNhaXJvX2NhaXJvX3NldF9kYXNoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2Rhc2hfMT0KLUNhaXJvX2NhaXJvX3NldF9kYXNoXzI9Ci1DYWlyb19jYWlyb19zZXRfZGFzaF8zPQotCi1DYWlyb19jYWlyb19zZXRfZmlsbF9ydWxlPQotQ2Fpcm9fY2Fpcm9fc2V0X2ZpbGxfcnVsZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9maWxsX3J1bGVfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfZmFjZT0KLUNhaXJvX2NhaXJvX3NldF9mb250X2ZhY2VfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfZm9udF9mYWNlXzE9Y2FzdD1jYWlyb19mb250X2ZhY2VfdCAqCi0KLUNhaXJvX2NhaXJvX3NldF9mb250X21hdHJpeD0KLUNhaXJvX2NhaXJvX3NldF9mb250X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9mb250X21hdHJpeF8xPWNhc3Q9Y2Fpcm9fbWF0cml4X3QgKgotCi1DYWlyb19jYWlyb19zZXRfZm9udF9vcHRpb25zPQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfb3B0aW9uc18wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfZm9udF9vcHRpb25zXzE9Y2FzdD1jYWlyb19mb250X29wdGlvbnNfdCAqCi0KLUNhaXJvX2NhaXJvX3NldF9mb250X3NpemU9Ci1DYWlyb19jYWlyb19zZXRfZm9udF9zaXplXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X2ZvbnRfc2l6ZV8xPQotCi1DYWlyb19jYWlyb19zZXRfbGluZV9jYXA9Ci1DYWlyb19jYWlyb19zZXRfbGluZV9jYXBfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfbGluZV9jYXBfMT0KLQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfam9pbj0KLUNhaXJvX2NhaXJvX3NldF9saW5lX2pvaW5fMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfbGluZV9qb2luXzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9saW5lX3dpZHRoPQotQ2Fpcm9fY2Fpcm9fc2V0X2xpbmVfd2lkdGhfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfbGluZV93aWR0aF8xPQotCi1DYWlyb19jYWlyb19zZXRfbWF0cml4PQotQ2Fpcm9fY2Fpcm9fc2V0X21hdHJpeF8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9tYXRyaXhfMT1jYXN0PWNhaXJvX21hdHJpeF90ICoKLQotQ2Fpcm9fY2Fpcm9fc2V0X21pdGVyX2xpbWl0PQotQ2Fpcm9fY2Fpcm9fc2V0X21pdGVyX2xpbWl0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2V0X21pdGVyX2xpbWl0XzE9Ci0KLUNhaXJvX2NhaXJvX3NldF9vcGVyYXRvcj0KLUNhaXJvX2NhaXJvX3NldF9vcGVyYXRvcl8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3NldF9vcGVyYXRvcl8xPQotCi1DYWlyb19jYWlyb19zZXRfc291cmNlPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV8wPWNhc3Q9Y2Fpcm9fdCAqCi1DYWlyb19jYWlyb19zZXRfc291cmNlXzE9Y2FzdD1jYWlyb19wYXR0ZXJuX3QgKgotCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYj0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiXzA9Y2FzdD1jYWlyb190ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiXzE9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYl8yPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JfMz0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhXzA9Y2FzdD1jYWlyb190ICoKLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV8xPQotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhXzI9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3JnYmFfMz0KLUNhaXJvX2NhaXJvX3NldF9zb3VyY2VfcmdiYV80PQotCi1DYWlyb19jYWlyb19zZXRfc291cmNlX3N1cmZhY2U9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3N1cmZhY2VfMD1jYXN0PWNhaXJvX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzE9Y2FzdD1jYWlyb19zdXJmYWNlX3QgKgotQ2Fpcm9fY2Fpcm9fc2V0X3NvdXJjZV9zdXJmYWNlXzI9Ci1DYWlyb19jYWlyb19zZXRfc291cmNlX3N1cmZhY2VfMz0KLQotQ2Fpcm9fY2Fpcm9fc2V0X3RvbGVyYW5jZT0KLUNhaXJvX2NhaXJvX3NldF90b2xlcmFuY2VfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zZXRfdG9sZXJhbmNlXzE9Ci0KLUNhaXJvX2NhaXJvX3Nob3dfZ2x5cGhzPQotQ2Fpcm9fY2Fpcm9fc2hvd19nbHlwaHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zaG93X2dseXBoc18xPWNhc3Q9KGNhaXJvX2dseXBoX3QgKikKLUNhaXJvX2NhaXJvX3Nob3dfZ2x5cGhzXzI9Ci0KLUNhaXJvX2NhaXJvX3Nob3dfcGFnZT0KLUNhaXJvX2NhaXJvX3Nob3dfcGFnZV8wPWNhc3Q9KGNhaXJvX3QgKikKLQotQ2Fpcm9fY2Fpcm9fc2hvd190ZXh0PQotQ2Fpcm9fY2Fpcm9fc2hvd190ZXh0XzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fc2hvd190ZXh0XzE9Y2FzdD1jb25zdCBjaGFyICoKLQotQ2Fpcm9fY2Fpcm9fc3RhdHVzPQotQ2Fpcm9fY2Fpcm9fc3RhdHVzXzA9Y2FzdD0oY2Fpcm9fdCAqKQotCi1DYWlyb19jYWlyb19zdGF0dXNfdG9fc3RyaW5nPQotQ2Fpcm9fY2Fpcm9fc3RhdHVzX3RvX3N0cmluZ18wPQotCi1DYWlyb19jYWlyb19zdHJva2U9Ci1DYWlyb19jYWlyb19zdHJva2VfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzPQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c18xPQotQ2Fpcm9fY2Fpcm9fc3Ryb2tlX2V4dGVudHNfMj0KLUNhaXJvX2NhaXJvX3N0cm9rZV9leHRlbnRzXzM9Ci1DYWlyb19jYWlyb19zdHJva2VfZXh0ZW50c180PQotCi1DYWlyb19jYWlyb19zdHJva2VfcHJlc2VydmU9Ci1DYWlyb19jYWlyb19zdHJva2VfcHJlc2VydmVfMD1jYXN0PShjYWlyb190ICopCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXI9Ci1DYWlyb19jYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyXzE9Ci1DYWlyb19jYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyXzI9Ci1DYWlyb19jYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyXzM9Ci0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZGVzdHJveT0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZGVzdHJveV8wPWNhc3Q9KGNhaXJvX3N1cmZhY2VfdCAqKQotCi1DYWlyb19jYWlyb19zdXJmYWNlX2ZpbmlzaD0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZmluaXNoXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi0KLUNhaXJvX2NhaXJvX3N1cmZhY2VfZ2V0X3R5cGU9ZmxhZ3M9ZHluYW1pYwotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9nZXRfdHlwZV8wPWNhc3Q9KGNhaXJvX3N1cmZhY2VfdCAqKQotCi1DYWlyb19jYWlyb19zdXJmYWNlX2dldF91c2VyX2RhdGE9Ci1DYWlyb19jYWlyb19zdXJmYWNlX2dldF91c2VyX2RhdGFfMD1jYXN0PShjYWlyb19zdXJmYWNlX3QgKikKLUNhaXJvX2NhaXJvX3N1cmZhY2VfZ2V0X3VzZXJfZGF0YV8xPWNhc3Q9Y2Fpcm9fdXNlcl9kYXRhX2tleV90ICoKLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2U9Ci1DYWlyb19jYWlyb19zdXJmYWNlX3JlZmVyZW5jZV8wPWNhc3Q9KGNhaXJvX3N1cmZhY2VfdCAqKQotCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF9kZXZpY2Vfb2Zmc2V0PQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldF8wPWNhc3Q9KGNhaXJvX3N1cmZhY2VfdCAqKQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldF8xPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldF8yPQotCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF9mYWxsYmFja19yZXNvbHV0aW9uPWZsYWdzPWR5bmFtaWMKLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb25fMD0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb25fMT0KLUNhaXJvX2NhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb25fMj0KLQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhPQotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzA9Y2FzdD0oY2Fpcm9fc3VyZmFjZV90ICopCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMT1jYXN0PWNhaXJvX3VzZXJfZGF0YV9rZXlfdCAqCi1DYWlyb19jYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGFfMj1jYXN0PXZvaWQgKgotQ2Fpcm9fY2Fpcm9fc3VyZmFjZV9zZXRfdXNlcl9kYXRhXzM9Y2FzdD1jYWlyb19kZXN0cm95X2Z1bmNfdAotCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHM9Ci1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMD1jYXN0PShjYWlyb190ICopCi1DYWlyb19jYWlyb190ZXh0X2V4dGVudHNfMT1jYXN0PWNvbnN0IGNoYXIgKgotQ2Fpcm9fY2Fpcm9fdGV4dF9leHRlbnRzXzI9Y2FzdD1jYWlyb190ZXh0X2V4dGVudHNfdCAqCi0KLUNhaXJvX2NhaXJvX3RleHRfZXh0ZW50c190X3NpemVvZj0KLQotQ2Fpcm9fY2Fpcm9fdGV4dF9wYXRoPQotQ2Fpcm9fY2Fpcm9fdGV4dF9wYXRoXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdGV4dF9wYXRoXzE9Y2FzdD1jb25zdCBjaGFyICoKLQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtPQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNmb3JtXzE9Y2FzdD0oY2Fpcm9fbWF0cml4X3QgKikKLQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlPQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdHJhbnNsYXRlXzE9Ci1DYWlyb19jYWlyb190cmFuc2xhdGVfMj0KLQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2U9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8wPWNhc3Q9KGNhaXJvX3QgKikKLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlXzE9Ci1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV8yPQotCi1DYWlyb19jYWlyb191c2VyX3RvX2RldmljZV9kaXN0YW5jZT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzA9Y2FzdD0oY2Fpcm9fdCAqKQotQ2Fpcm9fY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2VfMT0KLUNhaXJvX2NhaXJvX3VzZXJfdG9fZGV2aWNlX2Rpc3RhbmNlXzI9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGU9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlXzA9Y2FzdD0oRGlzcGxheSAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8xPWNhc3Q9KERyYXdhYmxlKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8yPWNhc3Q9KFZpc3VhbCAqKQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV80PQotCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXA9Ci1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1DYWlyb19jYWlyb194bGliX3N1cmZhY2VfY3JlYXRlX2Zvcl9iaXRtYXBfMT1jYXN0PVBpeG1hcAotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzI9Y2FzdD0oU2NyZWVuICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9jcmVhdGVfZm9yX2JpdG1hcF8zPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX2NyZWF0ZV9mb3JfYml0bWFwXzQ9Ci0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZT0KLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8wPWNhc3Q9Y2Fpcm9fc3VyZmFjZV90ICoKLUNhaXJvX2NhaXJvX3hsaWJfc3VyZmFjZV9zZXRfc2l6ZV8xPQotQ2Fpcm9fY2Fpcm9feGxpYl9zdXJmYWNlX3NldF9zaXplXzI9Ci0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXRfMklJPQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMD1jYXN0PXZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMT1jYXN0PWNvbnN0IHZvaWQgKgotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xZGF0YV8xdF8ySUlfMj1jYXN0PXNpemVfdAotCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJST0KLUNhaXJvX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXRfMklJXzA9Y2FzdD0odm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xcGF0aF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1DYWlyb19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFwYXRoXzF0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotQ2Fpcm9fbWVtbW92ZV9fXzNESUk9Ci1DYWlyb19tZW1tb3ZlX19fM0RJSV8wPWNhc3Q9KHZvaWQgKikKLUNhaXJvX21lbW1vdmVfX18zRElJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotQ2Fpcm9fbWVtbW92ZV9fXzNESUlfMj1jYXN0PShzaXplX3QpCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhaXJvX2NhaXJvXzFmb250XzFleHRlbnRzXzF0PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfYXNjZW50PQotY2Fpcm9fZm9udF9leHRlbnRzX3RfZGVzY2VudD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X2hlaWdodD0KLWNhaXJvX2ZvbnRfZXh0ZW50c190X21heF94X2FkdmFuY2U9Ci1jYWlyb19mb250X2V4dGVudHNfdF9tYXhfeV9hZHZhbmNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMWRhdGFfMXQ9Ci1jYWlyb19wYXRoX2RhdGFfdF90eXBlPWFjY2Vzc29yPWhlYWRlci50eXBlCi1jYWlyb19wYXRoX2RhdGFfdF9sZW5ndGg9YWNjZXNzb3I9aGVhZGVyLmxlbmd0aAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2Fpcm9fY2Fpcm9fMXBhdGhfMXQ9Ci1jYWlyb19wYXRoX3Rfc3RhdHVzPQotY2Fpcm9fcGF0aF90X2RhdGE9Y2FzdD1jYWlyb19wYXRoX2RhdGFfdCAqCi1jYWlyb19wYXRoX3RfbnVtX2RhdGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYWlyb19jYWlyb18xdGV4dF8xZXh0ZW50c18xdD0KLWNhaXJvX3RleHRfZXh0ZW50c190X3hfYmVhcmluZz0KLWNhaXJvX3RleHRfZXh0ZW50c190X3lfYmVhcmluZz0KLWNhaXJvX3RleHRfZXh0ZW50c190X3dpZHRoPQotY2Fpcm9fdGV4dF9leHRlbnRzX3RfaGVpZ2h0PQotY2Fpcm9fdGV4dF9leHRlbnRzX3RfeF9hZHZhbmNlPQotY2Fpcm9fdGV4dF9leHRlbnRzX3RfeV9hZHZhbmNlPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjcxYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYWlyby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqXG4gXAotICogVmVyc2lvbjogTVBMIDEuMVxuIFwKLSAqXG4gXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uXG4gXAotICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gXAotICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuIFwKLSAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML1xuIFwKLSAqXG4gXAotICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcyxcbiBcCi0gKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2VcbiBcCi0gKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZVxuIFwKLSAqIExpY2Vuc2UuXG4gXAotICpcbiBcCi0gKiBDb250cmlidXRvcihzKTpcbiBcCi0gKlxuIFwKLSAqIElCTVxuIFwKLSAqIC0gIEJpbmRpbmcgdG8gcGVybWl0IGludGVyZmFjaW5nIGJldHdlZW4gQ2Fpcm8gYW5kIFNXVFxuIFwKLSAqIC0gIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNyBJQk0gQ29ycC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gXAotICpcbiBcCi0gKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqL1xuCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uT1MucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLk9TLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Nzc3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uT1MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4MDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BRURlc2M9Ci1BRURlc2NfZGVzY3JpcHRvclR5cGU9Y2FzdD0oRGVzY1R5cGUpCi1BRURlc2NfZGF0YUhhbmRsZT1jYXN0PShBRURhdGFTdG9yYWdlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU0ZvbnRNZXRyaWNzPQotQVRTRm9udE1ldHJpY3NfdmVyc2lvbj0KLUFUU0ZvbnRNZXRyaWNzX2FzY2VudD0KLUFUU0ZvbnRNZXRyaWNzX2Rlc2NlbnQ9Ci1BVFNGb250TWV0cmljc19sZWFkaW5nPQotQVRTRm9udE1ldHJpY3NfYXZnQWR2YW5jZVdpZHRoPQotQVRTRm9udE1ldHJpY3NfbWF4QWR2YW5jZVdpZHRoPQotQVRTRm9udE1ldHJpY3NfbWluTGVmdFNpZGVCZWFyaW5nPQotQVRTRm9udE1ldHJpY3NfbWluUmlnaHRTaWRlQmVhcmluZz0KLUFUU0ZvbnRNZXRyaWNzX3N0ZW1XaWR0aD0KLUFUU0ZvbnRNZXRyaWNzX3N0ZW1IZWlnaHQ9Ci1BVFNGb250TWV0cmljc19jYXBIZWlnaHQ9Ci1BVFNGb250TWV0cmljc194SGVpZ2h0PQotQVRTRm9udE1ldHJpY3NfaXRhbGljQW5nbGU9Ci1BVFNGb250TWV0cmljc191bmRlcmxpbmVQb3NpdGlvbj0KLUFUU0ZvbnRNZXRyaWNzX3VuZGVybGluZVRoaWNrbmVzcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmQ9Ci1BVFNMYXlvdXRSZWNvcmRfZ2x5cGhJRD0KLUFUU0xheW91dFJlY29yZF9mbGFncz0KLUFUU0xheW91dFJlY29yZF9vcmlnaW5hbE9mZnNldD0KLUFUU0xheW91dFJlY29yZF9yZWFsUG9zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZD0KLUFUU1RyYXBlem9pZF91cHBlckxlZnRfeD1hY2Nlc3Nvcj11cHBlckxlZnQueAotQVRTVHJhcGV6b2lkX3VwcGVyTGVmdF95PWFjY2Vzc29yPXVwcGVyTGVmdC55Ci1BVFNUcmFwZXpvaWRfdXBwZXJSaWdodF94PWFjY2Vzc29yPXVwcGVyUmlnaHQueAotQVRTVHJhcGV6b2lkX3VwcGVyUmlnaHRfeT1hY2Nlc3Nvcj11cHBlclJpZ2h0LnkKLUFUU1RyYXBlem9pZF9sb3dlclJpZ2h0X3g9YWNjZXNzb3I9bG93ZXJSaWdodC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJSaWdodF95PWFjY2Vzc29yPWxvd2VyUmlnaHQueQotQVRTVHJhcGV6b2lkX2xvd2VyTGVmdF94PWFjY2Vzc29yPWxvd2VyTGVmdC54Ci1BVFNUcmFwZXpvaWRfbG93ZXJMZWZ0X3k9YWNjZXNzb3I9bG93ZXJMZWZ0LnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVQ2FyZXQ9Ci1BVFNVQ2FyZXRfZlg9Ci1BVFNVQ2FyZXRfZlk9Ci1BVFNVQ2FyZXRfZkRlbHRhWD0KLUFUU1VDYXJldF9mRGVsdGFZPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWI9Ci1BVFNVVGFiX3RhYlBvc2l0aW9uPQotQVRTVVRhYl90YWJUeXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VVbmhpZ2hsaWdodERhdGE9Ci1BVFNVVW5oaWdobGlnaHREYXRhX2RhdGFUeXBlPQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9yZWQ9YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5yZWQKLUFUU1VVbmhpZ2hsaWdodERhdGFfZ3JlZW49YWNjZXNzb3I9dW5oaWdobGlnaHREYXRhLmJhY2tncm91bmRDb2xvci5ncmVlbgotQVRTVVVuaGlnaGxpZ2h0RGF0YV9ibHVlPWFjY2Vzc29yPXVuaGlnaGxpZ2h0RGF0YS5iYWNrZ3JvdW5kQ29sb3IuYmx1ZQotQVRTVVVuaGlnaGxpZ2h0RGF0YV9hbHBoYT1hY2Nlc3Nvcj11bmhpZ2hsaWdodERhdGEuYmFja2dyb3VuZENvbG9yLmFscGhhCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWM9Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY192ZXJzaW9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfbW92YWJsZT0KLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2hlbHBCdXR0b249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0VGV4dD1jYXN0PShDRlN0cmluZ1JlZikKLUFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX2NhbmNlbFRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19vdGhlclRleHQ9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19kZWZhdWx0QnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfY2FuY2VsQnV0dG9uPQotQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfcG9zaXRpb249Ci1BbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19mbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9CaXRNYXA9Ci1CaXRNYXBfYmFzZUFkZHI9Y2FzdD0odm9pZCAqKQotQml0TWFwX3Jvd0J5dGVzPQotQml0TWFwX3RvcD1hY2Nlc3Nvcj1ib3VuZHMudG9wCi1CaXRNYXBfbGVmdD1hY2Nlc3Nvcj1ib3VuZHMubGVmdAotQml0TWFwX2JvdHRvbT1hY2Nlc3Nvcj1ib3VuZHMuYm90dG9tCi1CaXRNYXBfcmlnaHQ9YWNjZXNzb3I9Ym91bmRzLnJpZ2h0Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0ZSYW5nZT0KLUNGUmFuZ2VfbG9jYXRpb249Y2FzdD0oQ0ZJbmRleCkKLUNGUmFuZ2VfbGVuZ3RoPWNhc3Q9KENGSW5kZXgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dGdW5jdGlvbkNhbGxiYWNrcz0KLUNHRnVuY3Rpb25DYWxsYmFja3NfdmVyc2lvbj0KLUNHRnVuY3Rpb25DYWxsYmFja3NfZXZhbHVhdGU9Y2FzdD1DR0Z1bmN0aW9uRXZhbHVhdGVDYWxsYmFjawotQ0dGdW5jdGlvbkNhbGxiYWNrc19yZWxlYXNlSW5mbz1jYXN0PUNHRnVuY3Rpb25SZWxlYXNlSW5mb0NhbGxiYWNrCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudD0KLUNHUGF0aEVsZW1lbnRfdHlwZT1jYXN0PUNHUGF0aEVsZW1lbnRUeXBlCi1DR1BhdGhFbGVtZW50X3BvaW50cz1jYXN0PUNHUG9pbnQgKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0dGVybkNhbGxiYWNrcz0KLUNHUGF0dGVybkNhbGxiYWNrc192ZXJzaW9uPQotQ0dQYXR0ZXJuQ2FsbGJhY2tzX2RyYXdQYXR0ZXJuPWNhc3Q9Q0dQYXR0ZXJuRHJhd1BhdHRlcm5DYWxsYmFjawotQ0dQYXR0ZXJuQ2FsbGJhY2tzX3JlbGVhc2VJbmZvPWNhc3Q9Q0dQYXR0ZXJuUmVsZWFzZUluZm9DYWxsYmFjawotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnQ9Ci1DR1BvaW50X3g9Y2FzdD0oZmxvYXQpCi1DR1BvaW50X3k9Y2FzdD0oZmxvYXQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0PQotQ0dSZWN0X3g9YWNjZXNzb3I9b3JpZ2luLngsY2FzdD0oZmxvYXQpCi1DR1JlY3RfeT1hY2Nlc3Nvcj1vcmlnaW4ueSxjYXN0PShmbG9hdCkKLUNHUmVjdF93aWR0aD1hY2Nlc3Nvcj1zaXplLndpZHRoLGNhc3Q9KGZsb2F0KQotQ0dSZWN0X2hlaWdodD1hY2Nlc3Nvcj1zaXplLmhlaWdodCxjYXN0PShmbG9hdCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db2xvclBpY2tlckluZm89Ci1Db2xvclBpY2tlckluZm9fcHJvZmlsZT1hY2Nlc3Nvcj10aGVDb2xvci5wcm9maWxlLGNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19yZWQ9YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLnJlZCxjYXN0PShVSW50MTYpCi1Db2xvclBpY2tlckluZm9fZ3JlZW49YWNjZXNzb3I9dGhlQ29sb3IuY29sb3IucmdiLmdyZWVuLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19ibHVlPWFjY2Vzc29yPXRoZUNvbG9yLmNvbG9yLnJnYi5ibHVlLGNhc3Q9KFVJbnQxNikKLUNvbG9yUGlja2VySW5mb19kc3RQcm9maWxlPWNhc3Q9KENNUHJvZmlsZUhhbmRsZSkKLUNvbG9yUGlja2VySW5mb19mbGFncz1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcGxhY2VXaGVyZT1jYXN0PShEaWFsb2dQbGFjZW1lbnRTcGVjKQotQ29sb3JQaWNrZXJJbmZvX2g9YWNjZXNzb3I9ZGlhbG9nT3JpZ2luLmgsY2FzdD0oc2hvcnQpCi1Db2xvclBpY2tlckluZm9fdj1hY2Nlc3Nvcj1kaWFsb2dPcmlnaW4udixjYXN0PShzaG9ydCkKLUNvbG9yUGlja2VySW5mb19waWNrZXJUeXBlPWNhc3Q9KE9TVHlwZSkKLUNvbG9yUGlja2VySW5mb19ldmVudFByb2M9Y2FzdD0oVXNlckV2ZW50VVBQKQotQ29sb3JQaWNrZXJJbmZvX2NvbG9yUHJvYz1jYXN0PShDb2xvckNoYW5nZWRVUFApCi1Db2xvclBpY2tlckluZm9fY29sb3JQcm9jRGF0YT1jYXN0PShVSW50MzIpCi1Db2xvclBpY2tlckluZm9fcHJvbXB0PWNhc3Q9KFN0cjI1NSkKLUNvbG9yUGlja2VySW5mb19lZGl0TWVudUlEPWFjY2Vzc29yPW1JbmZvLmVkaXRNZW51SUQsY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2N1dEl0ZW09YWNjZXNzb3I9bUluZm8uY3V0SXRlbSxjYXN0PShTSW50MTYpCi1Db2xvclBpY2tlckluZm9fY29weUl0ZW09YWNjZXNzb3I9bUluZm8uY29weUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3Bhc3RlSXRlbT1hY2Nlc3Nvcj1tSW5mby5wYXN0ZUl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX2NsZWFySXRlbT1hY2Nlc3Nvcj1tSW5mby5jbGVhckl0ZW0sY2FzdD0oU0ludDE2KQotQ29sb3JQaWNrZXJJbmZvX3VuZG9JdGVtPWFjY2Vzc29yPW1JbmZvLnVuZG9JdGVtLGNhc3Q9KFNJbnQxNikKLUNvbG9yUGlja2VySW5mb19uZXdDb2xvckNob3Nlbj1jYXN0PShCb29sZWFuKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mbz0KLUNvbnRyb2xCdXR0b25Db250ZW50SW5mb19jb250ZW50VHlwZT1jYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1Db250cm9sQnV0dG9uQ29udGVudEluZm9faWNvblJlZj1hY2Nlc3Nvcj11Lmljb25SZWYsY2FzdD0odm9pZCAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlYz0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxTdGFydD0KLUNvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY19zZWxFbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlYz0KLUNvbnRyb2xGb250U3R5bGVSZWNfZmxhZ3M9Ci1Db250cm9sRm9udFN0eWxlUmVjX2ZvbnQ9Ci1Db250cm9sRm9udFN0eWxlUmVjX3NpemU9Ci1Db250cm9sRm9udFN0eWxlUmVjX3N0eWxlPQotQ29udHJvbEZvbnRTdHlsZVJlY19tb2RlPQotQ29udHJvbEZvbnRTdHlsZVJlY19qdXN0PQotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWZvcmVDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWZvcmVDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1mb3JlQ29sb3IuYmx1ZQotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJhY2tDb2xvci5yZWQKLUNvbnRyb2xGb250U3R5bGVSZWNfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJhY2tDb2xvci5ncmVlbgotQ29udHJvbEZvbnRTdHlsZVJlY19iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1iYWNrQ29sb3IuYmx1ZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xLaW5kPQotQ29udHJvbEtpbmRfc2lnbmF0dXJlPQotQ29udHJvbEtpbmRfa2luZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiRW50cnk9Ci1Db250cm9sVGFiRW50cnlfaWNvbj1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLUNvbnRyb2xUYWJFbnRyeV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotQ29udHJvbFRhYkVudHJ5X2VuYWJsZWQ9Y2FzdD0oQm9vbGVhbikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxPQotQ29udHJvbFRhYkluZm9SZWNWMV92ZXJzaW9uPWNhc3Q9KFNJbnQxNikKLUNvbnRyb2xUYWJJbmZvUmVjVjFfaWNvblN1aXRlSUQ9Y2FzdD0oU0ludDE2KQotQ29udHJvbFRhYkluZm9SZWNWMV9uYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcj0KLUN1cnNvcl9kYXRhPQotQ3Vyc29yX21hc2s9Ci1DdXJzb3JfaG90U3BvdF92PWFjY2Vzc29yPWhvdFNwb3QudgotQ3Vyc29yX2hvdFNwb3RfaD1hY2Nlc3Nvcj1ob3RTcG90LmgKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ2FsbGJhY2tzX3ZlcnNpb249Y2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfaXRlbURhdGFDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLml0ZW1EYXRhQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1Db21wYXJlQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtQ29tcGFyZUNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbUNvbXBhcmVVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtTm90aWZpY2F0aW9uVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfYWRkRHJhZ0l0ZW1DYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFkZERyYWdJdGVtQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJBZGREcmFnSXRlbVVQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2FjY2VwdERyYWdDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmFjY2VwdERyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckFjY2VwdERyYWdVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9yZWNlaXZlRHJhZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEucmVjZWl2ZURyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclJlY2VpdmVEcmFnVVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfcG9zdFByb2Nlc3NEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5wb3N0UHJvY2Vzc0RyYWdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclBvc3RQcm9jZXNzRHJhZ1VQUCkKLURhdGFCcm93c2VyQ2FsbGJhY2tzX3YxX2l0ZW1IZWxwQ29udGVudENhbGxiYWNrPWFjY2Vzc29yPXUudjEuaXRlbUhlbHBDb250ZW50Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtSGVscENvbnRlbnRVUFApCi1EYXRhQnJvd3NlckNhbGxiYWNrc192MV9nZXRDb250ZXh0dWFsTWVudUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZ2V0Q29udGV4dHVhbE1lbnVDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckdldENvbnRleHR1YWxNZW51VVBQKQotRGF0YUJyb3dzZXJDYWxsYmFja3NfdjFfc2VsZWN0Q29udGV4dHVhbE1lbnVDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLnNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJTZWxlY3RDb250ZXh0dWFsTWVudVVQUCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrcz0KLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3ZlcnNpb249Ci1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9kcmF3SXRlbUNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhd0l0ZW1DYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckRyYXdJdGVtVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZWRpdFRleHRDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmVkaXRUZXh0Q2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJFZGl0SXRlbVVQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX2hpdFRlc3RDYWxsYmFjaz1hY2Nlc3Nvcj11LnYxLmhpdFRlc3RDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlckhpdFRlc3RVUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV90cmFja2luZ0NhbGxiYWNrPWFjY2Vzc29yPXUudjEudHJhY2tpbmdDYWxsYmFjayxjYXN0PShEYXRhQnJvd3NlclRyYWNraW5nVVBQKQotRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfdjFfZHJhZ1JlZ2lvbkNhbGxiYWNrPWFjY2Vzc29yPXUudjEuZHJhZ1JlZ2lvbkNhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbURyYWdSZ25VUFApCi1EYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc192MV9hY2NlcHREcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5hY2NlcHREcmFnQ2FsbGJhY2ssY2FzdD0oRGF0YUJyb3dzZXJJdGVtQWNjZXB0RHJhZ1VQUCkKLURhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3YxX3JlY2VpdmVEcmFnQ2FsbGJhY2s9YWNjZXNzb3I9dS52MS5yZWNlaXZlRHJhZ0NhbGxiYWNrLGNhc3Q9KERhdGFCcm93c2VySXRlbVJlY2VpdmVEcmFnVVBQKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0RhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjPQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5SUQ9YWNjZXNzb3I9cHJvcGVydHlEZXNjLnByb3BlcnR5SUQsY2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfcHJvcGVydHlEZXNjX3Byb3BlcnR5VHlwZT1hY2Nlc3Nvcj1wcm9wZXJ0eURlc2MucHJvcGVydHlUeXBlLGNhc3Q9KE9TVHlwZSkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX3Byb3BlcnR5RGVzY19wcm9wZXJ0eUZsYWdzPWFjY2Vzc29yPXByb3BlcnR5RGVzYy5wcm9wZXJ0eUZsYWdzLGNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlGbGFncykKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdmVyc2lvbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnZlcnNpb24sY2FzdD0oVUludDMyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19taW5pbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5taW5pbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19tYXhpbXVtV2lkdGg9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5tYXhpbXVtV2lkdGgsY2FzdD0oVUludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY190aXRsZU9mZnNldD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLnRpdGxlT2Zmc2V0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfdGl0bGVTdHJpbmc9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy50aXRsZVN0cmluZyxjYXN0PShDRlN0cmluZ1JlZikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfaW5pdGlhbE9yZGVyPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuaW5pdGlhbE9yZGVyLGNhc3Q9KERhdGFCcm93c2VyU29ydE9yZGVyKQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZmxhZ3M9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZmxhZ3MsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfZm9udD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb250LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX3NpemU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuc2l6ZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9zdHlsZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5zdHlsZSxjYXN0PShTSW50MTYpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9tb2RlPWFjY2Vzc29yPWhlYWRlckJ0bkRlc2MuYnRuRm9udFN0eWxlLm1vZGUsY2FzdD0oU0ludDE2KQotRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfaGVhZGVyQnRuRGVzY19idG5Gb250U3R5bGVfanVzdD1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5qdXN0LGNhc3Q9KFNJbnQxNikKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZm9yZUNvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2ZvcmVDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9yZWQ9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuYmFja0NvbG9yLnJlZCxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuRm9udFN0eWxlX2JhY2tDb2xvcl9ncmVlbj1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4sY2FzdD0odW5zaWduZWQgc2hvcnQpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1oZWFkZXJCdG5EZXNjLmJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuYmx1ZSxjYXN0PSh1bnNpZ25lZCBzaG9ydCkKLURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX2hlYWRlckJ0bkRlc2NfYnRuQ29udGVudEluZm9fY29udGVudFR5cGU9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby5jb250ZW50VHlwZSxjYXN0PShDb250cm9sQ29udGVudFR5cGUpCi1EYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19oZWFkZXJCdG5EZXNjX2J0bkNvbnRlbnRJbmZvX2ljb25SZWY9YWNjZXNzb3I9aGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby51Lmljb25SZWYsY2FzdD0oSWNvblJlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYz0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3ZlcnNpb249Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19taW5pbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19tYXhpbXVtV2lkdGg9Ci1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY190aXRsZU9mZnNldD0KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX3RpdGxlU3RyaW5nPWNhc3Q9KENGU3RyaW5nUmVmKQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfaW5pdGlhbE9yZGVyPQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZsYWdzPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mbGFncwotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2ZvbnQ9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmZvbnQKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9zaXplPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5zaXplCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfc3R5bGU9YWNjZXNzb3I9YnRuRm9udFN0eWxlLnN0eWxlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfbW9kZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUubW9kZQotRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfYnRuRm9udFN0eWxlX2p1c3Q9YWNjZXNzb3I9YnRuRm9udFN0eWxlLmp1c3QKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfZm9yZUNvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5mb3JlQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9mb3JlQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuZm9yZUNvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfcmVkPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IucmVkCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Gb250U3R5bGVfYmFja0NvbG9yX2dyZWVuPWFjY2Vzc29yPWJ0bkZvbnRTdHlsZS5iYWNrQ29sb3IuZ3JlZW4KLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkZvbnRTdHlsZV9iYWNrQ29sb3JfYmx1ZT1hY2Nlc3Nvcj1idG5Gb250U3R5bGUuYmFja0NvbG9yLmJsdWUKLURhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX2J0bkNvbnRlbnRJbmZvX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLmNvbnRlbnRUeXBlCi1EYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19idG5Db250ZW50SW5mb19pY29uUmVmPWFjY2Vzc29yPWJ0bkNvbnRlbnRJbmZvLnUuaWNvblJlZixjYXN0PShJY29uUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0V2ZW50UmVjb3JkPQotRXZlbnRSZWNvcmRfd2hhdD1jYXN0PShFdmVudEtpbmQpCi1FdmVudFJlY29yZF9tZXNzYWdlPQotRXZlbnRSZWNvcmRfd2hlbj0KLUV2ZW50UmVjb3JkX3doZXJlX3Y9YWNjZXNzb3I9d2hlcmUudgotRXZlbnRSZWNvcmRfd2hlcmVfaD1hY2Nlc3Nvcj13aGVyZS5oCi1FdmVudFJlY29yZF9tb2RpZmllcnM9Y2FzdD0oRXZlbnRNb2RpZmllcnMpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fR0RldmljZT0KLUdEZXZpY2VfZ2RSZWZOdW09Ci1HRGV2aWNlX2dkSUQ9Ci1HRGV2aWNlX2dkVHlwZT0KLUdEZXZpY2VfZ2RJVGFibGU9Y2FzdD0oSVRhYkhhbmRsZSkKLUdEZXZpY2VfZ2RSZXNQcmVmPQotR0RldmljZV9nZFNlYXJjaFByb2M9Y2FzdD0oU1Byb2NIbmRsKQotR0RldmljZV9nZENvbXBQcm9jPWNhc3Q9KENQcm9jSG5kbCkKLUdEZXZpY2VfZ2RGbGFncz0KLUdEZXZpY2VfZ2RQTWFwPWNhc3Q9KFBpeE1hcEhhbmRsZSkKLUdEZXZpY2VfZ2RSZWZDb249Ci1HRGV2aWNlX2dkTmV4dEdEPWNhc3Q9KEdESGFuZGxlKQotR0RldmljZV9sZWZ0PWFjY2Vzc29yPWdkUmVjdC5sZWZ0Ci1HRGV2aWNlX3RvcD1hY2Nlc3Nvcj1nZFJlY3QudG9wCi1HRGV2aWNlX3JpZ2h0PWFjY2Vzc29yPWdkUmVjdC5yaWdodAotR0RldmljZV9ib3R0b209YWNjZXNzb3I9Z2RSZWN0LmJvdHRvbQotR0RldmljZV9nZE1vZGU9Ci1HRGV2aWNlX2dkQ0NCeXRlcz0KLUdEZXZpY2VfZ2RDQ0RlcHRoPQotR0RldmljZV9nZENDWERhdGE9Y2FzdD0oSGFuZGxlKQotR0RldmljZV9nZENDWE1hc2s9Y2FzdD0oSGFuZGxlKQotR0RldmljZV9nZEV4dD1jYXN0PShIYW5kbGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElBeGlzUG9zaXRpb249Ci1ISUF4aXNQb3NpdGlvbl90b1ZpZXc9Y2FzdD0oSElWaWV3UmVmKQotSElBeGlzUG9zaXRpb25fa2luZD0KLUhJQXhpc1Bvc2l0aW9uX29mZnNldD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUF4aXNTY2FsZT0KLUhJQXhpc1NjYWxlX3RvVmlldz1jYXN0PShISVZpZXdSZWYpCi1ISUF4aXNTY2FsZV9raW5kPQotSElBeGlzU2NhbGVfcmF0aW89Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElCaW5kaW5nPQotSElCaW5kaW5nX3RvcD0KLUhJQmluZGluZ19sZWZ0PQotSElCaW5kaW5nX2JvdHRvbT0KLUhJQmluZGluZ19yaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmQ9Ci1ISUNvbW1hbmRfYXR0cmlidXRlcz0KLUhJQ29tbWFuZF9jb21tYW5kSUQ9Ci1ISUNvbW1hbmRfbWVudV9tZW51UmVmPWFjY2Vzc29yPW1lbnUubWVudVJlZixjYXN0PShNZW51UmVmKQotSElDb21tYW5kX21lbnVfbWVudUl0ZW1JbmRleD1hY2Nlc3Nvcj1tZW51Lm1lbnVJdGVtSW5kZXgsY2FzdD0oTWVudUl0ZW1JbmRleCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUxheW91dEluZm89Ci1ISUxheW91dEluZm9fdmVyc2lvbj0KLUhJTGF5b3V0SW5mb19iaW5kaW5nPQotSElMYXlvdXRJbmZvX3NjYWxlPQotSElMYXlvdXRJbmZvX3Bvc2l0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJUG9zaXRpb25pbmc9Ci1ISVBvc2l0aW9uaW5nX3g9Ci1ISVBvc2l0aW9uaW5nX3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElTY2FsaW5nPQotSElTY2FsaW5nX3g9Ci1ISVNjYWxpbmdfeT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVNjcm9sbEJhclRyYWNrSW5mbz0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX3ZlcnNpb249Ci1ISVNjcm9sbEJhclRyYWNrSW5mb19lbmFibGVTdGF0ZT0KLUhJU2Nyb2xsQmFyVHJhY2tJbmZvX3ByZXNzU3RhdGU9Ci1ISVNjcm9sbEJhclRyYWNrSW5mb192aWV3c2l6ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVNpZGVCaW5kaW5nPQotSElTaWRlQmluZGluZ190b1ZpZXc9Y2FzdD0oSElWaWV3UmVmKQotSElTaWRlQmluZGluZ19raW5kPQotSElTaWRlQmluZGluZ19vZmZzZXQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUFuaW1hdGlvbkZyYW1lSW5mbz0KLUhJVGhlbWVBbmltYXRpb25GcmFtZUluZm9faW5kZXg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUFuaW1hdGlvblRpbWVJbmZvPQotSElUaGVtZUFuaW1hdGlvblRpbWVJbmZvX3N0YXJ0PQotSElUaGVtZUFuaW1hdGlvblRpbWVJbmZvX2N1cnJlbnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUJhY2tncm91bmREcmF3SW5mbz0KLUhJVGhlbWVCYWNrZ3JvdW5kRHJhd0luZm9fdmVyc2lvbj0KLUhJVGhlbWVCYWNrZ3JvdW5kRHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lQmFja2dyb3VuZERyYXdJbmZvX2tpbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUJ1dHRvbkRyYXdJbmZvPQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fa2luZD0KLUhJVGhlbWVCdXR0b25EcmF3SW5mb192YWx1ZT0KLUhJVGhlbWVCdXR0b25EcmF3SW5mb19hZG9ybm1lbnQ9Ci1ISVRoZW1lQnV0dG9uRHJhd0luZm9fdGltZT1hY2Nlc3Nvcj1hbmltYXRpb24udGltZQotSElUaGVtZUJ1dHRvbkRyYXdJbmZvX2ZyYW1lPWFjY2Vzc29yPWFuaW1hdGlvbi5mcmFtZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVGcmFtZURyYXdJbmZvPQotSElUaGVtZUZyYW1lRHJhd0luZm9fdmVyc2lvbj0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX3N0YXRlPQotSElUaGVtZUZyYW1lRHJhd0luZm9fa2luZD0KLUhJVGhlbWVGcmFtZURyYXdJbmZvX2lzRm9jdXNlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lR3JvdXBCb3hEcmF3SW5mbz0KLUhJVGhlbWVHcm91cEJveERyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lR3JvdXBCb3hEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVHcm91cEJveERyYXdJbmZvX2tpbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZUdyb3dCb3hEcmF3SW5mbz0KLUhJVGhlbWVHcm93Qm94RHJhd0luZm9fdmVyc2lvbj0KLUhJVGhlbWVHcm93Qm94RHJhd0luZm9fa2luZD0KLUhJVGhlbWVHcm93Qm94RHJhd0luZm9fc3RhdGU9Ci1ISVRoZW1lR3Jvd0JveERyYXdJbmZvX2RpcmVjdGlvbj0KLUhJVGhlbWVHcm93Qm94RHJhd0luZm9fc2l6ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lUG9wdXBBcnJvd0RyYXdJbmZvPQotSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mb192ZXJzaW9uPQotSElUaGVtZVBvcHVwQXJyb3dEcmF3SW5mb19zdGF0ZT0KLUhJVGhlbWVQb3B1cEFycm93RHJhd0luZm9fb3JpZW50YXRpb249Ci1ISVRoZW1lUG9wdXBBcnJvd0RyYXdJbmZvX3NpemU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVNlcGFyYXRvckRyYXdJbmZvPQotSElUaGVtZVNlcGFyYXRvckRyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lU2VwYXJhdG9yRHJhd0luZm9fc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVRhYkRyYXdJbmZvPQotSElUaGVtZVRhYkRyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lVGFiRHJhd0luZm9fc3R5bGU9Ci1ISVRoZW1lVGFiRHJhd0luZm9fZGlyZWN0aW9uPQotSElUaGVtZVRhYkRyYXdJbmZvX3NpemU9Ci1ISVRoZW1lVGFiRHJhd0luZm9fYWRvcm5tZW50PQotSElUaGVtZVRhYkRyYXdJbmZvX2tpbmQ9ZXhjbHVkZT0jaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQKLUhJVGhlbWVUYWJEcmF3SW5mb19wb3NpdGlvbj1leGNsdWRlPSNpZiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJVGhlbWVUYWJQYW5lRHJhd0luZm89Ci1ISVRoZW1lVGFiUGFuZURyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lVGFiUGFuZURyYXdJbmZvX3N0YXRlPQotSElUaGVtZVRhYlBhbmVEcmF3SW5mb19kaXJlY3Rpb249Ci1ISVRoZW1lVGFiUGFuZURyYXdJbmZvX3NpemU9Ci1ISVRoZW1lVGFiUGFuZURyYXdJbmZvX2tpbmQ9ZXhjbHVkZT0jaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQKLUhJVGhlbWVUYWJQYW5lRHJhd0luZm9fYWRvcm5tZW50PWV4Y2x1ZGU9I2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF80Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElUaGVtZVRleHRJbmZvPQotSElUaGVtZVRleHRJbmZvX3ZlcnNpb249Ci1ISVRoZW1lVGV4dEluZm9fc3RhdGU9Ci1ISVRoZW1lVGV4dEluZm9fZm9udElEPQotSElUaGVtZVRleHRJbmZvX2hvcml6b250YWxGbHVzaG5lc3M9Ci1ISVRoZW1lVGV4dEluZm9fdmVydGljYWxGbHVzaG5lc3M9Ci1ISVRoZW1lVGV4dEluZm9fb3B0aW9ucz0KLUhJVGhlbWVUZXh0SW5mb190cnVuY2F0aW9uUG9zaXRpb249Ci1ISVRoZW1lVGV4dEluZm9fdHJ1bmNhdGlvbk1heExpbmVzPQotSElUaGVtZVRleHRJbmZvX3RydW5jYXRpb25IYXBwZW5lZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISVRoZW1lVHJhY2tEcmF3SW5mbz0KLUhJVGhlbWVUcmFja0RyYXdJbmZvX3ZlcnNpb249Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19raW5kPWNhc3Q9VGhlbWVUcmFja0tpbmQKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2JvdW5kc194PWFjY2Vzc29yPWJvdW5kcy5vcmlnaW4ueAotSElUaGVtZVRyYWNrRHJhd0luZm9fYm91bmRzX3k9YWNjZXNzb3I9Ym91bmRzLm9yaWdpbi55Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19ib3VuZHNfd2lkdGg9YWNjZXNzb3I9Ym91bmRzLnNpemUud2lkdGgKLUhJVGhlbWVUcmFja0RyYXdJbmZvX2JvdW5kc19oZWlnaHQ9YWNjZXNzb3I9Ym91bmRzLnNpemUuaGVpZ2h0Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19taW49Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb19tYXg9Ci1ISVRoZW1lVHJhY2tEcmF3SW5mb192YWx1ZT0KLUhJVGhlbWVUcmFja0RyYXdJbmZvX3Jlc2VydmVkPQotSElUaGVtZVRyYWNrRHJhd0luZm9fYXR0cmlidXRlcz1jYXN0PVRoZW1lVHJhY2tBdHRyaWJ1dGVzCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19lbmFibGVTdGF0ZT1jYXN0PVRoZW1lVHJhY2tFbmFibGVTdGF0ZQotSElUaGVtZVRyYWNrRHJhd0luZm9fZmlsbGVyMT0KLUhJVGhlbWVUcmFja0RyYXdJbmZvX3Njcm9sbGJhcj1hY2Nlc3Nvcj10cmFja0luZm8uc2Nyb2xsYmFyCi1ISVRoZW1lVHJhY2tEcmF3SW5mb19zbGlkZXI9YWNjZXNzb3I9dHJhY2tJbmZvLnNsaWRlcgotSElUaGVtZVRyYWNrRHJhd0luZm9fcHJvZ3Jlc3M9YWNjZXNzb3I9dHJhY2tJbmZvLnByb2dyZXNzCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlYz0KLUhNSGVscENvbnRlbnRSZWNfdmVyc2lvbj0KLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF90b3A9YWNjZXNzb3I9YWJzSG90UmVjdC50b3AKLUhNSGVscENvbnRlbnRSZWNfYWJzSG90UmVjdF9sZWZ0PWFjY2Vzc29yPWFic0hvdFJlY3QubGVmdAotSE1IZWxwQ29udGVudFJlY19hYnNIb3RSZWN0X2JvdHRvbT1hY2Nlc3Nvcj1hYnNIb3RSZWN0LmJvdHRvbQotSE1IZWxwQ29udGVudFJlY19hYnNIb3RSZWN0X3JpZ2h0PWFjY2Vzc29yPWFic0hvdFJlY3QucmlnaHQKLUhNSGVscENvbnRlbnRSZWNfdGFnU2lkZT0KLUhNSGVscENvbnRlbnRSZWNfY29udGVudDBfY29udGVudFR5cGU9YWNjZXNzb3I9Y29udGVudFswXS5jb250ZW50VHlwZQotSE1IZWxwQ29udGVudFJlY19jb250ZW50MF90YWdDRlN0cmluZz1hY2Nlc3Nvcj1jb250ZW50WzBdLnUudGFnQ0ZTdHJpbmcsY2FzdD0oQ0ZTdHJpbmdSZWYpCi1ITUhlbHBDb250ZW50UmVjX2NvbnRlbnQxX2NvbnRlbnRUeXBlPWFjY2Vzc29yPWNvbnRlbnRbMV0uY29udGVudFR5cGUKLUhNSGVscENvbnRlbnRSZWNfY29udGVudDFfdGFnQ0ZTdHJpbmc9YWNjZXNzb3I9Y29udGVudFsxXS51LnRhZ0NGU3RyaW5nLGNhc3Q9KENGU3RyaW5nUmVmKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xTQXBwbGljYXRpb25QYXJhbWV0ZXJzPQotTFNBcHBsaWNhdGlvblBhcmFtZXRlcnNfdmVyc2lvbj0KLUxTQXBwbGljYXRpb25QYXJhbWV0ZXJzX2ZsYWdzPQotTFNBcHBsaWNhdGlvblBhcmFtZXRlcnNfYXBwbGljYXRpb249Y2FzdD1jb25zdCBGU1JlZiAqCi1MU0FwcGxpY2F0aW9uUGFyYW1ldGVyc19hc3luY0xhdW5jaFJlZkNvbj1jYXN0PXZvaWQgKgotTFNBcHBsaWNhdGlvblBhcmFtZXRlcnNfZW52aXJvbm1lbnQ9Y2FzdD1DRkRpY3Rpb25hcnlSZWYKLUxTQXBwbGljYXRpb25QYXJhbWV0ZXJzX2FyZ3Y9Y2FzdD1DRkFycmF5UmVmCi1MU0FwcGxpY2F0aW9uUGFyYW1ldGVyc19pbml0aWFsRXZlbnQ9Y2FzdD1BcHBsZUV2ZW50ICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Mb25nRGF0ZVJlYz0KLUxvbmdEYXRlUmVjX2VyYT1hY2Nlc3Nvcj1sZC5lcmEKLUxvbmdEYXRlUmVjX3llYXI9YWNjZXNzb3I9bGQueWVhcgotTG9uZ0RhdGVSZWNfbW9udGg9YWNjZXNzb3I9bGQubW9udGgKLUxvbmdEYXRlUmVjX2RheT1hY2Nlc3Nvcj1sZC5kYXkKLUxvbmdEYXRlUmVjX2hvdXI9YWNjZXNzb3I9bGQuaG91cgotTG9uZ0RhdGVSZWNfbWludXRlPWFjY2Vzc29yPWxkLm1pbnV0ZQotTG9uZ0RhdGVSZWNfc2Vjb25kPWFjY2Vzc29yPWxkLnNlY29uZAotTG9uZ0RhdGVSZWNfZGF5T2ZXZWVrPWFjY2Vzc29yPWxkLmRheU9mV2VlawotTG9uZ0RhdGVSZWNfZGF5T2ZZZWFyPWFjY2Vzc29yPWxkLmRheU9mWWVhcgotTG9uZ0RhdGVSZWNfd2Vla09mWWVhcj1hY2Nlc3Nvcj1sZC53ZWVrT2ZZZWFyCi1Mb25nRGF0ZVJlY19wbT1hY2Nlc3Nvcj1sZC5wbQotTG9uZ0RhdGVSZWNfcmVzMT1hY2Nlc3Nvcj1sZC5yZXMxCi1Mb25nRGF0ZVJlY19yZXMyPWFjY2Vzc29yPWxkLnJlczIKLUxvbmdEYXRlUmVjX3JlczM9YWNjZXNzb3I9bGQucmVzMwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX01lbnVUcmFja2luZ0RhdGE9Ci1NZW51VHJhY2tpbmdEYXRhX21lbnU9Y2FzdD0oTWVudVJlZikKLU1lbnVUcmFja2luZ0RhdGFfaXRlbVNlbGVjdGVkPQotTWVudVRyYWNraW5nRGF0YV9pdGVtVW5kZXJNb3VzZT0KLU1lbnVUcmFja2luZ0RhdGFfdG9wPWFjY2Vzc29yPWl0ZW1SZWN0LnRvcAotTWVudVRyYWNraW5nRGF0YV9sZWZ0PWFjY2Vzc29yPWl0ZW1SZWN0LmxlZnQKLU1lbnVUcmFja2luZ0RhdGFfYm90dG9tPWFjY2Vzc29yPWl0ZW1SZWN0LmJvdHRvbQotTWVudVRyYWNraW5nRGF0YV9yaWdodD1hY2Nlc3Nvcj1pdGVtUmVjdC5yaWdodAotTWVudVRyYWNraW5nRGF0YV92aXJ0dWFsTWVudVRvcD0KLU1lbnVUcmFja2luZ0RhdGFfdmlydHVhbE1lbnVCb3R0b209Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zPQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX3ZlcnNpb249Ci1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfb3B0aW9uRmxhZ3M9Y2FzdD0oTmF2RGlhbG9nT3B0aW9uRmxhZ3MpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfbG9jYXRpb25faD1hY2Nlc3Nvcj1sb2NhdGlvbi5oCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfbG9jYXRpb25fdj1hY2Nlc3Nvcj1sb2NhdGlvbi52Ci1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfY2xpZW50TmFtZT1jYXN0PShDRlN0cmluZ1JlZikKLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc193aW5kb3dUaXRsZT1jYXN0PShDRlN0cmluZ1JlZikKLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19hY3Rpb25CdXR0b25MYWJlbD1jYXN0PShDRlN0cmluZ1JlZikKLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19jYW5jZWxCdXR0b25MYWJlbD1jYXN0PShDRlN0cmluZ1JlZikKLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19zYXZlRmlsZU5hbWU9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfbWVzc2FnZT1jYXN0PShDRlN0cmluZ1JlZikKLU5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9uc19wcmVmZXJlbmNlS2V5PQotTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zX3BvcHVwRXh0ZW5zaW9uPWNhc3Q9KENGQXJyYXlSZWYpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfbW9kYWxpdHk9Y2FzdD0oV2luZG93TW9kYWxpdHkpCi1OYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnNfcGFyZW50V2luZG93PWNhc3Q9KFdpbmRvd1JlZikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9OYXZSZXBseVJlY29yZD0KLU5hdlJlcGx5UmVjb3JkX3ZlcnNpb249Y2FzdD0oVUludDE2KQotTmF2UmVwbHlSZWNvcmRfdmFsaWRSZWNvcmQ9Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX3JlcGxhY2luZz1jYXN0PShCb29sZWFuKQotTmF2UmVwbHlSZWNvcmRfaXNTdGF0aW9uZXJ5PWNhc3Q9KEJvb2xlYW4pCi1OYXZSZXBseVJlY29yZF90cmFuc2xhdGlvbk5lZWRlZD1jYXN0PShCb29sZWFuKQotTmF2UmVwbHlSZWNvcmRfc2VsZWN0aW9uX2Rlc2NyaXB0b3JUeXBlPWFjY2Vzc29yPXNlbGVjdGlvbi5kZXNjcmlwdG9yVHlwZSxjYXN0PShEZXNjVHlwZSkKLU5hdlJlcGx5UmVjb3JkX3NlbGVjdGlvbl9kYXRhSGFuZGxlPWFjY2Vzc29yPXNlbGVjdGlvbi5kYXRhSGFuZGxlLGNhc3Q9KEFFRGF0YVN0b3JhZ2UpCi1OYXZSZXBseVJlY29yZF9rZXlTY3JpcHQ9Y2FzdD0oU2NyaXB0Q29kZSkKLU5hdlJlcGx5UmVjb3JkX2ZpbGVUcmFuc2xhdGlvbj1jYXN0PShGaWxlVHJhbnNsYXRpb25TcGVjQXJyYXlIYW5kbGUpCi1OYXZSZXBseVJlY29yZF9yZXNlcnZlZDE9Y2FzdD0oVUludDMyKQotTmF2UmVwbHlSZWNvcmRfc2F2ZUZpbGVOYW1lPWNhc3Q9KENGU3RyaW5nUmVmKQotTmF2UmVwbHlSZWNvcmRfc2F2ZUZpbGVFeHRlbnNpb25IaWRkZW49Y2FzdD0oQm9vbGVhbikKLU5hdlJlcGx5UmVjb3JkX3Jlc2VydmVkMj1jYXN0PShVSW50OCkKLU5hdlJlcGx5UmVjb3JkX3Jlc2VydmVkPWNhc3Q9KGNoYXJbXSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9PUz0KLU9TX0FFQ291bnRJdGVtcz0KLU9TX0FFQ291bnRJdGVtc18wPWNhc3Q9KGNvbnN0IEFFRGVzY0xpc3QgKikKLU9TX0FFQ291bnRJdGVtc18xPWNhc3Q9KGxvbmcgKikKLQotT1NfQUVHZXROdGhQdHI9Ci1PU19BRUdldE50aFB0cl8wPWNhc3Q9KGNvbnN0IEFFRGVzY0xpc3QgKikKLU9TX0FFR2V0TnRoUHRyXzE9Ci1PU19BRUdldE50aFB0cl8yPWNhc3Q9KERlc2NUeXBlKQotT1NfQUVHZXROdGhQdHJfMz1jYXN0PShBRUtleXdvcmQgKikKLU9TX0FFR2V0TnRoUHRyXzQ9Y2FzdD0oRGVzY1R5cGUgKikKLU9TX0FFR2V0TnRoUHRyXzU9Y2FzdD0odm9pZCAqKQotT1NfQUVHZXROdGhQdHJfNj1jYXN0PShTaXplKQotT1NfQUVHZXROdGhQdHJfNz1jYXN0PShTaXplICopCi0KLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcj0KLU9TX0FFSW5zdGFsbEV2ZW50SGFuZGxlcl8wPWNhc3Q9QUVFdmVudENsYXNzCi1PU19BRUluc3RhbGxFdmVudEhhbmRsZXJfMT1jYXN0PUFFRXZlbnRJRAotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzI9Y2FzdD0oQUVFdmVudEhhbmRsZXJVUFApCi1PU19BRUluc3RhbGxFdmVudEhhbmRsZXJfMz1jYXN0PShsb25nKQotT1NfQUVJbnN0YWxsRXZlbnRIYW5kbGVyXzQ9Ci0KLU9TX0FFUHJvY2Vzc0FwcGxlRXZlbnQ9Ci1PU19BRVByb2Nlc3NBcHBsZUV2ZW50XzA9Y2FzdD0oY29uc3QgRXZlbnRSZWNvcmQgKikKLQotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uPQotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uXzA9Y2FzdD1jb25zdCBGU1NwZWMgKgotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uXzE9Y2FzdD1BVFNGb250Q29udGV4dAotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uXzI9Y2FzdD1BVFNGb250Rm9ybWF0Ci1PU19BVFNGb250QWN0aXZhdGVGcm9tRmlsZVNwZWNpZmljYXRpb25fMz1jYXN0PXZvaWQgKgotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uXzQ9Y2FzdD1BVFNPcHRpb25GbGFncwotT1NfQVRTRm9udEFjdGl2YXRlRnJvbUZpbGVTcGVjaWZpY2F0aW9uXzU9Y2FzdD1BVFNGb250Q29udGFpbmVyUmVmICoKLQotT1NfQVRTRm9udERlYWN0aXZhdGU9Ci1PU19BVFNGb250RGVhY3RpdmF0ZV8wPWNhc3Q9QVRTRm9udENvbnRhaW5lclJlZgotT1NfQVRTRm9udERlYWN0aXZhdGVfMT1jYXN0PXZvaWQgKgotT1NfQVRTRm9udERlYWN0aXZhdGVfMj1jYXN0PUFUU09wdGlvbkZsYWdzCi0KLU9TX0FUU0ZvbnRGaW5kRnJvbU5hbWU9Ci1PU19BVFNGb250RmluZEZyb21OYW1lXzA9Y2FzdD1DRlN0cmluZ1JlZgotT1NfQVRTRm9udEZpbmRGcm9tTmFtZV8xPWNhc3Q9KEFUU09wdGlvbkZsYWdzKQotCi1PU19BVFNGb250R2V0SG9yaXpvbnRhbE1ldHJpY3M9Ci1PU19BVFNGb250R2V0SG9yaXpvbnRhbE1ldHJpY3NfMD1jYXN0PShBVFNGb250UmVmKQotT1NfQVRTRm9udEdldEhvcml6b250YWxNZXRyaWNzXzE9Ci1PU19BVFNGb250R2V0SG9yaXpvbnRhbE1ldHJpY3NfMj0KLQotT1NfQVRTRm9udEdldE5hbWU9Ci1PU19BVFNGb250R2V0TmFtZV8wPWNhc3Q9KEFUU0ZvbnRSZWYpCi1PU19BVFNGb250R2V0TmFtZV8xPWNhc3Q9KEFUU09wdGlvbkZsYWdzKQotT1NfQVRTRm9udEdldE5hbWVfMj1jYXN0PUNGU3RyaW5nUmVmKgotCi1PU19BVFNGb250R2V0UG9zdFNjcmlwdE5hbWU9Ci1PU19BVFNGb250R2V0UG9zdFNjcmlwdE5hbWVfMD1jYXN0PShBVFNGb250UmVmKQotT1NfQVRTRm9udEdldFBvc3RTY3JpcHROYW1lXzE9Y2FzdD0oQVRTT3B0aW9uRmxhZ3MpCi1PU19BVFNGb250R2V0UG9zdFNjcmlwdE5hbWVfMj1jYXN0PShDRlN0cmluZ1JlZiAqKQotCi1PU19BVFNGb250R2V0VmVydGljYWxNZXRyaWNzPQotT1NfQVRTRm9udEdldFZlcnRpY2FsTWV0cmljc18wPWNhc3Q9KEFUU0ZvbnRSZWYpCi1PU19BVFNGb250R2V0VmVydGljYWxNZXRyaWNzXzE9Y2FzdD0oQVRTT3B0aW9uRmxhZ3MpCi1PU19BVFNGb250R2V0VmVydGljYWxNZXRyaWNzXzI9Ci0KLU9TX0FUU0ZvbnRJdGVyYXRvckNyZWF0ZT0KLU9TX0FUU0ZvbnRJdGVyYXRvckNyZWF0ZV8wPWNhc3Q9QVRTRm9udENvbnRleHQKLU9TX0FUU0ZvbnRJdGVyYXRvckNyZWF0ZV8xPWNhc3Q9Y29uc3QgQVRTRm9udEZpbHRlciAqCi1PU19BVFNGb250SXRlcmF0b3JDcmVhdGVfMj1jYXN0PXZvaWQgKgotT1NfQVRTRm9udEl0ZXJhdG9yQ3JlYXRlXzM9Y2FzdD1BVFNPcHRpb25GbGFncwotT1NfQVRTRm9udEl0ZXJhdG9yQ3JlYXRlXzQ9Y2FzdD1BVFNGb250SXRlcmF0b3IgKgotCi1PU19BVFNGb250SXRlcmF0b3JOZXh0PQotT1NfQVRTRm9udEl0ZXJhdG9yTmV4dF8wPWNhc3Q9KEFUU0ZvbnRJdGVyYXRvcikKLU9TX0FUU0ZvbnRJdGVyYXRvck5leHRfMT1jYXN0PUFUU0ZvbnRSZWYgKgotCi1PU19BVFNGb250SXRlcmF0b3JSZWxlYXNlPQotT1NfQVRTRm9udEl0ZXJhdG9yUmVsZWFzZV8wPWNhc3Q9QVRTRm9udEl0ZXJhdG9yICoKLQotT1NfQVRTVUJhdGNoQnJlYWtMaW5lcz0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXNfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VCYXRjaEJyZWFrTGluZXNfMT0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXNfMj0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXNfMz0KLU9TX0FUU1VCYXRjaEJyZWFrTGluZXNfND1jYXN0PShJdGVtQ291bnQgKikKLQotT1NfQVRTVUNyZWF0ZVN0eWxlPQotT1NfQVRTVUNyZWF0ZVN0eWxlXzA9Y2FzdD0oQVRTVVN0eWxlICopCi0KLU9TX0FUU1VDcmVhdGVUZXh0TGF5b3V0PQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRfMD1jYXN0PShBVFNVVGV4dExheW91dCAqKQotCi1PU19BVFNVQ3JlYXRlVGV4dExheW91dFdpdGhUZXh0UHRyPQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl8wPWNhc3Q9KENvbnN0VW5pQ2hhckFycmF5UHRyKQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl8xPQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl8yPQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl8zPQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl80PQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl81PWNhc3Q9KGNvbnN0IFVuaUNoYXJDb3VudCAqKQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl82PWNhc3Q9KEFUU1VTdHlsZSAqKQotT1NfQVRTVUNyZWF0ZVRleHRMYXlvdXRXaXRoVGV4dFB0cl83PWNhc3Q9KEFUU1VUZXh0TGF5b3V0ICopCi0KLU9TX0FUU1VEaXJlY3RHZXRMYXlvdXREYXRhQXJyYXlQdHJGcm9tVGV4dExheW91dD0KLU9TX0FUU1VEaXJlY3RHZXRMYXlvdXREYXRhQXJyYXlQdHJGcm9tVGV4dExheW91dF8wPWNhc3Q9QVRTVVRleHRMYXlvdXQKLU9TX0FUU1VEaXJlY3RHZXRMYXlvdXREYXRhQXJyYXlQdHJGcm9tVGV4dExheW91dF8xPWNhc3Q9VW5pQ2hhckFycmF5T2Zmc2V0Ci1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfMj1jYXN0PUFUU1VEaXJlY3REYXRhU2VsZWN0b3IKLU9TX0FUU1VEaXJlY3RHZXRMYXlvdXREYXRhQXJyYXlQdHJGcm9tVGV4dExheW91dF8zPWNhc3Q9dm9pZCAqCi1PU19BVFNVRGlyZWN0R2V0TGF5b3V0RGF0YUFycmF5UHRyRnJvbVRleHRMYXlvdXRfND1jYXN0PUl0ZW1Db3VudCAqCi0KLU9TX0FUU1VEaXJlY3RSZWxlYXNlTGF5b3V0RGF0YUFycmF5UHRyPQotT1NfQVRTVURpcmVjdFJlbGVhc2VMYXlvdXREYXRhQXJyYXlQdHJfMD1jYXN0PUFUU1VMaW5lUmVmCi1PU19BVFNVRGlyZWN0UmVsZWFzZUxheW91dERhdGFBcnJheVB0cl8xPWNhc3Q9QVRTVURpcmVjdERhdGFTZWxlY3RvcgotT1NfQVRTVURpcmVjdFJlbGVhc2VMYXlvdXREYXRhQXJyYXlQdHJfMj1jYXN0PXZvaWQgKgotCi1PU19BVFNVRGlzcG9zZVN0eWxlPQotT1NfQVRTVURpc3Bvc2VTdHlsZV8wPWNhc3Q9KEFUU1VTdHlsZSkKLQotT1NfQVRTVURpc3Bvc2VUZXh0TGF5b3V0PQotT1NfQVRTVURpc3Bvc2VUZXh0TGF5b3V0XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi0KLU9TX0FUU1VEcmF3VGV4dD0KLU9TX0FUU1VEcmF3VGV4dF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVURyYXdUZXh0XzE9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0KQotT1NfQVRTVURyYXdUZXh0XzI9Y2FzdD0oVW5pQ2hhckNvdW50KQotT1NfQVRTVURyYXdUZXh0XzM9Y2FzdD0oQVRTVVRleHRNZWFzdXJlbWVudCkKLU9TX0FUU1VEcmF3VGV4dF80PWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lPQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfMD1jYXN0PWNvbnN0IHZvaWQgKgotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfMT0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzI9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV8zPQotT1NfQVRTVUZpbmRGb250RnJvbU5hbWVfND0KLU9TX0FUU1VGaW5kRm9udEZyb21OYW1lXzU9Ci1PU19BVFNVRmluZEZvbnRGcm9tTmFtZV82PWNhc3Q9QVRTVUZvbnRJRCAqCi0KLU9TX0FUU1VGaW5kRm9udE5hbWU9Ci1PU19BVFNVRmluZEZvbnROYW1lXzA9Y2FzdD1BVFNVRm9udElECi1PU19BVFNVRmluZEZvbnROYW1lXzE9Ci1PU19BVFNVRmluZEZvbnROYW1lXzI9Ci1PU19BVFNVRmluZEZvbnROYW1lXzM9Ci1PU19BVFNVRmluZEZvbnROYW1lXzQ9Ci1PU19BVFNVRmluZEZvbnROYW1lXzU9Ci1PU19BVFNVRmluZEZvbnROYW1lXzY9Y2FzdD1QdHIKLU9TX0FUU1VGaW5kRm9udE5hbWVfNz1jYXN0PUJ5dGVDb3VudCAqCi1PU19BVFNVRmluZEZvbnROYW1lXzg9Y2FzdD1JdGVtQ291bnQgKgotCi1PU19BVFNVR2V0Rm9udElEcz0KLU9TX0FUU1VHZXRGb250SURzXzA9Y2FzdD1BVFNVRm9udElEICoKLU9TX0FUU1VHZXRGb250SURzXzE9Ci1PU19BVFNVR2V0Rm9udElEc18yPWNhc3Q9SXRlbUNvdW50ICoKLQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zST0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUlfM0lfMT1jYXN0PShBVFNVVGV4dE1lYXN1cmVtZW50KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV8yPWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lJXzNJXzM9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0KQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV80PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV81PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV82PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV83PWNhc3Q9KEFUU1RyYXBlem9pZCAqKQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJSV8zSV84PWNhc3Q9KEl0ZW1Db3VudCAqKQotCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zST0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8yXzNJXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV8xPWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV8yPWNhc3Q9KEFUU1VUZXh0TWVhc3VyZW1lbnQpCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV8zPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8yXzNJXzQ9Ci1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV81PQotT1NfQVRTVUdldEdseXBoQm91bmRzX19JSUlJSVNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJfM0lfNj0KLU9TX0FUU1VHZXRHbHlwaEJvdW5kc19fSUlJSUlTSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8yXzNJXzc9Y2FzdD0oQVRTVHJhcGV6b2lkICopCi1PU19BVFNVR2V0R2x5cGhCb3VuZHNfX0lJSUlJU0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMl8zSV84PWNhc3Q9KEl0ZW1Db3VudCAqKQotCi1PU19BVFNVR2V0TGF5b3V0Q29udHJvbD0KLU9TX0FUU1VHZXRMYXlvdXRDb250cm9sXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVR2V0TGF5b3V0Q29udHJvbF8xPWNhc3Q9QVRTVUF0dHJpYnV0ZVRhZwotT1NfQVRTVUdldExheW91dENvbnRyb2xfMj0KLU9TX0FUU1VHZXRMYXlvdXRDb250cm9sXzM9Y2FzdD1BVFNVQXR0cmlidXRlVmFsdWVQdHIKLU9TX0FUU1VHZXRMYXlvdXRDb250cm9sXzQ9Y2FzdD1CeXRlQ291bnQgKgotCi1PU19BVFNVR2V0TGluZUNvbnRyb2w9Ci1PU19BVFNVR2V0TGluZUNvbnRyb2xfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRMaW5lQ29udHJvbF8xPWNhc3Q9VW5pQ2hhckFycmF5T2Zmc2V0Ci1PU19BVFNVR2V0TGluZUNvbnRyb2xfMj1jYXN0PUFUU1VBdHRyaWJ1dGVUYWcKLU9TX0FUU1VHZXRMaW5lQ29udHJvbF8zPWNhc3Q9Qnl0ZUNvdW50Ci1PU19BVFNVR2V0TGluZUNvbnRyb2xfND1jYXN0PUFUU1VBdHRyaWJ1dGVWYWx1ZVB0cgotT1NfQVRTVUdldExpbmVDb250cm9sXzU9Y2FzdD1CeXRlQ291bnQgKgotCi1PU19BVFNVR2V0U29mdExpbmVCcmVha3M9Ci1PU19BVFNVR2V0U29mdExpbmVCcmVha3NfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc18xPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc18yPWNhc3Q9KFVuaUNoYXJDb3VudCkKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc18zPWNhc3Q9KEl0ZW1Db3VudCkKLU9TX0FUU1VHZXRTb2Z0TGluZUJyZWFrc180PWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCAqKQotT1NfQVRTVUdldFNvZnRMaW5lQnJlYWtzXzU9Y2FzdD0oSXRlbUNvdW50ICopCi0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0PQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzE9Ci1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF8yPQotT1NfQVRTVUdldFRleHRIaWdobGlnaHRfMz0KLU9TX0FUU1VHZXRUZXh0SGlnaGxpZ2h0XzQ9Ci1PU19BVFNVR2V0VGV4dEhpZ2hsaWdodF81PWNhc3Q9UmduSGFuZGxlCi0KLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kcz0KLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzE9Ci1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfMj0KLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc18zPWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudCAqCi1PU19BVFNVR2V0VW5qdXN0aWZpZWRCb3VuZHNfND1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQgKgotT1NfQVRTVUdldFVuanVzdGlmaWVkQm91bmRzXzU9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50ICoKLU9TX0FUU1VHZXRVbmp1c3RpZmllZEJvdW5kc182PWNhc3Q9QVRTVVRleHRNZWFzdXJlbWVudCAqCi0KLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzPQotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfMD1jYXN0PUFUU1VTdHlsZQotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfMT1jYXN0PUdseXBoSUQKLU9TX0FUU1VHbHlwaEdldFF1YWRyYXRpY1BhdGhzXzI9Y2FzdD1BVFNRdWFkcmF0aWNOZXdQYXRoVVBQCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc18zPWNhc3Q9QVRTUXVhZHJhdGljTGluZVVQUAotT1NfQVRTVUdseXBoR2V0UXVhZHJhdGljUGF0aHNfND1jYXN0PUFUU1F1YWRyYXRpY0N1cnZlVVBQCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc181PWNhc3Q9QVRTUXVhZHJhdGljQ2xvc2VQYXRoVVBQCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc182PWNhc3Q9dm9pZCAqCi1PU19BVFNVR2x5cGhHZXRRdWFkcmF0aWNQYXRoc183PWNhc3Q9T1NTdGF0dXMgKgotCi1PU19BVFNVSGlnaGxpZ2h0VGV4dD0KLU9TX0FUU1VIaWdobGlnaHRUZXh0XzA9Y2FzdD1BVFNVVGV4dExheW91dAotT1NfQVRTVUhpZ2hsaWdodFRleHRfMT1jYXN0PUFUU1VUZXh0TWVhc3VyZW1lbnQKLU9TX0FUU1VIaWdobGlnaHRUZXh0XzI9Y2FzdD1BVFNVVGV4dE1lYXN1cmVtZW50Ci1PU19BVFNVSGlnaGxpZ2h0VGV4dF8zPQotT1NfQVRTVUhpZ2hsaWdodFRleHRfND0KLQotT1NfQVRTVU5leHRDdXJzb3JQb3NpdGlvbj0KLU9TX0FUU1VOZXh0Q3Vyc29yUG9zaXRpb25fMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VOZXh0Q3Vyc29yUG9zaXRpb25fMT1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQpCi1PU19BVFNVTmV4dEN1cnNvclBvc2l0aW9uXzI9Y2FzdD0oQVRTVUN1cnNvck1vdmVtZW50VHlwZSkKLU9TX0FUU1VOZXh0Q3Vyc29yUG9zaXRpb25fMz1jYXN0PShVbmlDaGFyQXJyYXlPZmZzZXQgKikKLQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb249Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fMT0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzI9Ci1PU19BVFNVT2Zmc2V0VG9Qb3NpdGlvbl8zPQotT1NfQVRTVU9mZnNldFRvUG9zaXRpb25fND0KLU9TX0FUU1VPZmZzZXRUb1Bvc2l0aW9uXzU9Y2FzdD1Cb29sZWFuICoKLQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXQ9Ci1PU19BVFNVUG9zaXRpb25Ub09mZnNldF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVBvc2l0aW9uVG9PZmZzZXRfMT0KLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0XzI9Ci1PU19BVFNVUG9zaXRpb25Ub09mZnNldF8zPWNhc3Q9VW5pQ2hhckFycmF5T2Zmc2V0ICoKLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0XzQ9Y2FzdD1Cb29sZWFuICoKLU9TX0FUU1VQb3NpdGlvblRvT2Zmc2V0XzU9Y2FzdD1VbmlDaGFyQXJyYXlPZmZzZXQgKgotCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbj0KLU9TX0FUU1VQcmV2aW91c0N1cnNvclBvc2l0aW9uXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVUHJldmlvdXNDdXJzb3JQb3NpdGlvbl8xPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VQcmV2aW91c0N1cnNvclBvc2l0aW9uXzI9Y2FzdD0oQVRTVUN1cnNvck1vdmVtZW50VHlwZSkKLU9TX0FUU1VQcmV2aW91c0N1cnNvclBvc2l0aW9uXzM9Y2FzdD0oVW5pQ2hhckFycmF5T2Zmc2V0ICopCi0KLU9TX0FUU1VTZXRBdHRyaWJ1dGVzPQotT1NfQVRTVVNldEF0dHJpYnV0ZXNfMD1jYXN0PShBVFNVU3R5bGUpCi1PU19BVFNVU2V0QXR0cmlidXRlc18xPWNhc3Q9KEl0ZW1Db3VudCkKLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzI9Y2FzdD0oQVRTVUF0dHJpYnV0ZVRhZyAqKQotT1NfQVRTVVNldEF0dHJpYnV0ZXNfMz1jYXN0PShCeXRlQ291bnQgKikKLU9TX0FUU1VTZXRBdHRyaWJ1dGVzXzQ9Y2FzdD0oQVRTVUF0dHJpYnV0ZVZhbHVlUHRyICopCi0KLU9TX0FUU1VTZXRGb250RmVhdHVyZXM9Ci1PU19BVFNVU2V0Rm9udEZlYXR1cmVzXzA9Y2FzdD0oQVRTVVN0eWxlKQotT1NfQVRTVVNldEZvbnRGZWF0dXJlc18xPWNhc3Q9KEl0ZW1Db3VudCkKLU9TX0FUU1VTZXRGb250RmVhdHVyZXNfMj1jYXN0PShjb25zdCBBVFNVRm9udEZlYXR1cmVUeXBlICopCi1PU19BVFNVU2V0Rm9udEZlYXR1cmVzXzM9Y2FzdD0oY29uc3QgQVRTVUZvbnRGZWF0dXJlU2VsZWN0b3IgKikKLQotT1NfQVRTVVNldEhpZ2hsaWdodGluZ01ldGhvZD0KLU9TX0FUU1VTZXRIaWdobGlnaHRpbmdNZXRob2RfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VTZXRIaWdobGlnaHRpbmdNZXRob2RfMT0KLU9TX0FUU1VTZXRIaWdobGlnaHRpbmdNZXRob2RfMj0KLQotT1NfQVRTVVNldExheW91dENvbnRyb2xzPQotT1NfQVRTVVNldExheW91dENvbnRyb2xzXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0TGF5b3V0Q29udHJvbHNfMT1jYXN0PShJdGVtQ291bnQpCi1PU19BVFNVU2V0TGF5b3V0Q29udHJvbHNfMj1jYXN0PShBVFNVQXR0cmlidXRlVGFnICopCi1PU19BVFNVU2V0TGF5b3V0Q29udHJvbHNfMz1jYXN0PShCeXRlQ291bnQgKikKLU9TX0FUU1VTZXRMYXlvdXRDb250cm9sc180PWNhc3Q9KEFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciAqKQotCi1PU19BVFNVU2V0TGluZUNvbnRyb2xzPQotT1NfQVRTVVNldExpbmVDb250cm9sc18wPWNhc3Q9QVRTVVRleHRMYXlvdXQKLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfMT1jYXN0PVVuaUNoYXJBcnJheU9mZnNldAotT1NfQVRTVVNldExpbmVDb250cm9sc18yPWNhc3Q9SXRlbUNvdW50Ci1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzM9Y2FzdD1jb25zdCBBVFNVQXR0cmlidXRlVGFnICoKLU9TX0FUU1VTZXRMaW5lQ29udHJvbHNfND1jYXN0PWNvbnN0IEJ5dGVDb3VudCAqCi1PU19BVFNVU2V0TGluZUNvbnRyb2xzXzU9Y2FzdD1jb25zdCBBVFNVQXR0cmlidXRlVmFsdWVQdHIgKgotCi1PU19BVFNVU2V0UnVuU3R5bGU9Ci1PU19BVFNVU2V0UnVuU3R5bGVfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VTZXRSdW5TdHlsZV8xPWNhc3Q9KEFUU1VTdHlsZSkKLU9TX0FUU1VTZXRSdW5TdHlsZV8yPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VTZXRSdW5TdHlsZV8zPWNhc3Q9KFVuaUNoYXJDb3VudCkKLQotT1NfQVRTVVNldFNvZnRMaW5lQnJlYWs9Ci1PU19BVFNVU2V0U29mdExpbmVCcmVha18wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVNldFNvZnRMaW5lQnJlYWtfMT0KLQotT1NfQVRTVVNldFRhYkFycmF5PQotT1NfQVRTVVNldFRhYkFycmF5XzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0VGFiQXJyYXlfMT1jYXN0PWNvbnN0IEFUU1VUYWIgKgotT1NfQVRTVVNldFRhYkFycmF5XzI9Ci0KLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uPQotT1NfQVRTVVNldFRleHRQb2ludGVyTG9jYXRpb25fMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzE9Y2FzdD0oQ29uc3RVbmlDaGFyQXJyYXlQdHIpCi1PU19BVFNVU2V0VGV4dFBvaW50ZXJMb2NhdGlvbl8yPWNhc3Q9KFVuaUNoYXJBcnJheU9mZnNldCkKLU9TX0FUU1VTZXRUZXh0UG9pbnRlckxvY2F0aW9uXzM9Y2FzdD0oVW5pQ2hhckNvdW50KQotT1NfQVRTVVNldFRleHRQb2ludGVyTG9jYXRpb25fND1jYXN0PShVbmlDaGFyQ291bnQpCi0KLU9TX0FUU1VTZXRUcmFuc2llbnRGb250TWF0Y2hpbmc9Ci1PU19BVFNVU2V0VHJhbnNpZW50Rm9udE1hdGNoaW5nXzA9Y2FzdD0oQVRTVVRleHRMYXlvdXQpCi1PU19BVFNVU2V0VHJhbnNpZW50Rm9udE1hdGNoaW5nXzE9Ci0KLU9TX0FUU1VUZXh0RGVsZXRlZD0KLU9TX0FUU1VUZXh0RGVsZXRlZF8wPWNhc3Q9KEFUU1VUZXh0TGF5b3V0KQotT1NfQVRTVVRleHREZWxldGVkXzE9Ci1PU19BVFNVVGV4dERlbGV0ZWRfMj0KLQotT1NfQVRTVVRleHRJbnNlcnRlZD0KLU9TX0FUU1VUZXh0SW5zZXJ0ZWRfMD1jYXN0PShBVFNVVGV4dExheW91dCkKLU9TX0FUU1VUZXh0SW5zZXJ0ZWRfMT0KLU9TX0FUU1VUZXh0SW5zZXJ0ZWRfMj0KLQotT1NfQVhOb3RpZmljYXRpb25ISU9iamVjdE5vdGlmeT0KLU9TX0FYTm90aWZpY2F0aW9uSElPYmplY3ROb3RpZnlfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0FYTm90aWZpY2F0aW9uSElPYmplY3ROb3RpZnlfMT1jYXN0PShISU9iamVjdFJlZikKLU9TX0FYTm90aWZpY2F0aW9uSElPYmplY3ROb3RpZnlfMj1jYXN0PShVSW50NjQpCi0KLU9TX0FYVUlFbGVtZW50Q3JlYXRlV2l0aEhJT2JqZWN0QW5kSWRlbnRpZmllcj0KLU9TX0FYVUlFbGVtZW50Q3JlYXRlV2l0aEhJT2JqZWN0QW5kSWRlbnRpZmllcl8wPWNhc3Q9KEhJT2JqZWN0UmVmKQotT1NfQVhVSUVsZW1lbnRDcmVhdGVXaXRoSElPYmplY3RBbmRJZGVudGlmaWVyXzE9Y2FzdD0oVUludDY0KQotCi1PU19BWFVJRWxlbWVudEdldElkZW50aWZpZXI9Ci1PU19BWFVJRWxlbWVudEdldElkZW50aWZpZXJfMD1jYXN0PShBWFVJRWxlbWVudFJlZikKLU9TX0FYVUlFbGVtZW50R2V0SWRlbnRpZmllcl8xPWNhc3Q9KFVJbnQ2NCAqKQotCi1PU19BWFZhbHVlQ3JlYXRlPQotT1NfQVhWYWx1ZUNyZWF0ZV8wPWNhc3Q9QVhWYWx1ZVR5cGUKLU9TX0FYVmFsdWVDcmVhdGVfMT1jYXN0PShDRlJhbmdlICopCi0KLU9TX0FjcXVpcmVGaXJzdE1hdGNoaW5nRXZlbnRJblF1ZXVlPQotT1NfQWNxdWlyZUZpcnN0TWF0Y2hpbmdFdmVudEluUXVldWVfMD1jYXN0PUV2ZW50UXVldWVSZWYKLU9TX0FjcXVpcmVGaXJzdE1hdGNoaW5nRXZlbnRJblF1ZXVlXzE9Ci1PU19BY3F1aXJlRmlyc3RNYXRjaGluZ0V2ZW50SW5RdWV1ZV8yPWNhc3Q9Y29uc3QgRXZlbnRUeXBlU3BlYyAqCi1PU19BY3F1aXJlRmlyc3RNYXRjaGluZ0V2ZW50SW5RdWV1ZV8zPQotCi1PU19BY3RpdmVOb25GbG9hdGluZ1dpbmRvdz0KLQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtcz0KLU9TX0FkZERhdGFCcm93c2VySXRlbXNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18xPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEKQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc18yPWNhc3Q9KFVJbnQzMikKLU9TX0FkZERhdGFCcm93c2VySXRlbXNfMz1jYXN0PShjb25zdCBEYXRhQnJvd3Nlckl0ZW1JRCAqKQotT1NfQWRkRGF0YUJyb3dzZXJJdGVtc180PWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLQotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbj0KLU9TX0FkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5fMD1jYXN0PShDb250cm9sUmVmKQotT1NfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbl8xPWNhc3Q9KERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjICopCi1PU19BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uXzI9Y2FzdD0oRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5JbmRleCkKLQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3I9Ci1PU19BZGREcmFnSXRlbUZsYXZvcl8wPWNhc3Q9KERyYWdSZWYpCi1PU19BZGREcmFnSXRlbUZsYXZvcl8xPWNhc3Q9KERyYWdJdGVtUmVmKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMj1jYXN0PShGbGF2b3JUeXBlKQotT1NfQWRkRHJhZ0l0ZW1GbGF2b3JfMz1jYXN0PShjb25zdCB2b2lkICopCi1PU19BZGREcmFnSXRlbUZsYXZvcl80PWNhc3Q9KFNpemUpCi1PU19BZGREcmFnSXRlbUZsYXZvcl81PWNhc3Q9KEZsYXZvckZsYWdzKQotCi1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMj1jYXN0PShNZW51SXRlbUF0dHJpYnV0ZXMpCi1PU19BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMz1jYXN0PShNZW51Q29tbWFuZCkKLU9TX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ180PWNhc3Q9KE1lbnVJdGVtSW5kZXggKikKLQotT1NfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucz0KLU9TX0F1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnNfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19CcmluZ1RvRnJvbnQ9Ci1PU19CcmluZ1RvRnJvbnRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0NGQXJyYXlBcHBlbmRWYWx1ZT0KLU9TX0NGQXJyYXlBcHBlbmRWYWx1ZV8wPWNhc3Q9KENGTXV0YWJsZUFycmF5UmVmKQotT1NfQ0ZBcnJheUFwcGVuZFZhbHVlXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19DRkFycmF5Q3JlYXRlTXV0YWJsZT0KLU9TX0NGQXJyYXlDcmVhdGVNdXRhYmxlXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRkFycmF5Q3JlYXRlTXV0YWJsZV8xPWNhc3Q9KENGSW5kZXgpCi1PU19DRkFycmF5Q3JlYXRlTXV0YWJsZV8yPWNhc3Q9KGNvbnN0IENGQXJyYXlDYWxsQmFja3MgKikKLQotT1NfQ0ZBcnJheUdldENvdW50PQotT1NfQ0ZBcnJheUdldENvdW50XzA9Y2FzdD0oQ0ZBcnJheVJlZikKLQotT1NfQ0ZBcnJheUdldFZhbHVlQXRJbmRleD0KLU9TX0NGQXJyYXlHZXRWYWx1ZUF0SW5kZXhfMD1jYXN0PShDRkFycmF5UmVmKQotT1NfQ0ZBcnJheUdldFZhbHVlQXRJbmRleF8xPQotCi1PU19DRkRhdGFHZXRCeXRlUHRyPQotT1NfQ0ZEYXRhR2V0Qnl0ZVB0cl8wPWNhc3Q9Q0ZEYXRhUmVmCi0KLU9TX0NGRGF0YUdldEJ5dGVzPQotT1NfQ0ZEYXRhR2V0Qnl0ZXNfMD1jYXN0PShDRkRhdGFSZWYpCi1PU19DRkRhdGFHZXRCeXRlc18xPWZsYWdzPXN0cnVjdAotT1NfQ0ZEYXRhR2V0Qnl0ZXNfMj1jYXN0PShVSW50OCAqKQotCi1PU19DRkRhdGFHZXRMZW5ndGg9Ci1PU19DRkRhdGFHZXRMZW5ndGhfMD1jYXN0PShDRkRhdGFSZWYpCi0KLU9TX0NGRGljdGlvbmFyeUdldFZhbHVlSWZQcmVzZW50PQotT1NfQ0ZEaWN0aW9uYXJ5R2V0VmFsdWVJZlByZXNlbnRfMD1jYXN0PUNGRGljdGlvbmFyeVJlZgotT1NfQ0ZEaWN0aW9uYXJ5R2V0VmFsdWVJZlByZXNlbnRfMT1jYXN0PWNvbnN0IHZvaWQgKgotT1NfQ0ZEaWN0aW9uYXJ5R2V0VmFsdWVJZlByZXNlbnRfMj1jYXN0PWNvbnN0IHZvaWQgKioKLQotT1NfQ0ZFcXVhbD0KLU9TX0NGRXF1YWxfMD1jYXN0PUNGU3RyaW5nUmVmCi1PU19DRkVxdWFsXzE9Y2FzdD1DRlN0cmluZ1JlZgotCi1PU19DRkxvY2FsZUNvcHlDdXJyZW50PQotCi1PU19DRk51bWJlckZvcm1hdHRlckNvcHlQcm9wZXJ0eT0KLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ29weVByb3BlcnR5XzA9Y2FzdD1DRk51bWJlckZvcm1hdHRlclJlZgotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDb3B5UHJvcGVydHlfMT1jYXN0PUNGU3RyaW5nUmVmCi0KLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ3JlYXRlPQotT1NfQ0ZOdW1iZXJGb3JtYXR0ZXJDcmVhdGVfMD1jYXN0PUNGQWxsb2NhdG9yUmVmCi1PU19DRk51bWJlckZvcm1hdHRlckNyZWF0ZV8xPWNhc3Q9Q0ZMb2NhbGVSZWYKLU9TX0NGTnVtYmVyRm9ybWF0dGVyQ3JlYXRlXzI9Y2FzdD1DRk51bWJlckZvcm1hdHRlclN0eWxlCi0KLU9TX0NGUmVsZWFzZT0KLU9TX0NGUmVsZWFzZV8wPWNhc3Q9KENGVHlwZVJlZikKLQotT1NfQ0ZSZXRhaW49Ci1PU19DRlJldGFpbl8wPWNhc3Q9KENGVHlwZVJlZikKLQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXM9Ci1PU19DRlN0cmluZ0NyZWF0ZVdpdGhCeXRlc18wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfMT1jYXN0PShjb25zdCBVSW50OCAqKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfMj1jYXN0PShDRkluZGV4KQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfMz1jYXN0PShDRlN0cmluZ0VuY29kaW5nKQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXNfND0KLQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJPQotT1NfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc19fSUlJXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JSUlfMT1jYXN0PShjb25zdCBVbmlDaGFyICopCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JSUlfMj1jYXN0PShDRkluZGV4KQotCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDST0KLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lfM0NJXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzX19JXzNDSV8xPWNhc3Q9KGNvbnN0IFVuaUNoYXIgKikKLU9TX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNfX0lfM0NJXzI9Y2FzdD0oQ0ZJbmRleCkKLQotT1NfQ0ZTdHJpbmdHZXRCeXRlcz0KLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfMT1jYXN0PShDRlJhbmdlICopLGZsYWdzPXN0cnVjdAotT1NfQ0ZTdHJpbmdHZXRCeXRlc18yPWNhc3Q9KENGU3RyaW5nRW5jb2RpbmcpCi1PU19DRlN0cmluZ0dldEJ5dGVzXzM9Y2FzdD0oVUludDgpCi1PU19DRlN0cmluZ0dldEJ5dGVzXzQ9Y2FzdD0oQm9vbGVhbikKLU9TX0NGU3RyaW5nR2V0Qnl0ZXNfNT1jYXN0PShVSW50OCAqKQotT1NfQ0ZTdHJpbmdHZXRCeXRlc182PWNhc3Q9KENGSW5kZXgpCi1PU19DRlN0cmluZ0dldEJ5dGVzXzc9Y2FzdD0oQ0ZJbmRleCAqKQotCi1PU19DRlN0cmluZ0dldENoYXJhY3RlcnM9Ci1PU19DRlN0cmluZ0dldENoYXJhY3RlcnNfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NGU3RyaW5nR2V0Q2hhcmFjdGVyc18xPWNhc3Q9KENGUmFuZ2UgKiksZmxhZ3M9c3RydWN0Ci1PU19DRlN0cmluZ0dldENoYXJhY3RlcnNfMj1jYXN0PShVbmlDaGFyICopCi0KLU9TX0NGU3RyaW5nR2V0TGVuZ3RoPQotT1NfQ0ZTdHJpbmdHZXRMZW5ndGhfMD1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZz0KLQotT1NfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGg9Ci1PU19DRlVSTENvcHlGaWxlU3lzdGVtUGF0aF8wPWNhc3Q9KENGVVJMUmVmKQotT1NfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGhfMT1jYXN0PShDRlVSTFBhdGhTdHlsZSkKLQotT1NfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQ9Ci1PU19DRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudF8wPWNhc3Q9KENGVVJMUmVmKQotCi1PU19DRlVSTENvcHlQYXRoRXh0ZW5zaW9uPQotT1NfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbl8wPWNhc3Q9Q0ZVUkxSZWYKLQotT1NfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudD0KLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnRfMT1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnRfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnRfMz1jYXN0PShCb29sZWFuKQotCi1PU19DRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50PQotT1NfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudF8wPWNhc3Q9KENGQWxsb2NhdG9yUmVmKQotT1NfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudF8xPWNhc3Q9KENGVVJMUmVmKQotCi1PU19DRlVSTENyZWF0ZURhdGE9Ci1PU19DRlVSTENyZWF0ZURhdGFfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlRGF0YV8xPWNhc3Q9KENGVVJMUmVmKQotT1NfQ0ZVUkxDcmVhdGVEYXRhXzI9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGVVJMQ3JlYXRlRGF0YV8zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0NGVVJMQ3JlYXRlRnJvbUZTUmVmPQotT1NfQ0ZVUkxDcmVhdGVGcm9tRlNSZWZfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlRnJvbUZTUmVmXzE9Y2FzdD0oY29uc3Qgc3RydWN0IEZTUmVmICopCi0KLU9TX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbj0KLU9TX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbl8wPWNhc3Q9Q0ZBbGxvY2F0b3JSZWYKLU9TX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbl8xPWNhc3Q9Y29uc3QgVUludDggKgotT1NfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uXzI9Ci1PU19DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25fMz0KLQotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzPQotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzXzA9Y2FzdD1DRkFsbG9jYXRvclJlZgotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzXzE9Y2FzdD1DRlN0cmluZ1JlZgotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzXzI9Y2FzdD1DRlN0cmluZ1JlZgotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzXzM9Y2FzdD1DRlN0cmluZ1JlZgotT1NfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzXzQ9Ci0KLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzPQotT1NfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXNfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzE9Y2FzdD0oY29uc3QgVUludDggKikKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzI9Y2FzdD0oQ0ZJbmRleCkKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzM9Y2FzdD0oQ0ZTdHJpbmdFbmNvZGluZykKLU9TX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzXzQ9Y2FzdD0oQ0ZVUkxSZWYpCi0KLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoPQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aF8yPWNhc3Q9KENGVVJMUGF0aFN0eWxlKQotT1NfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhfMz0KLQotT1NfQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nPQotT1NfQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nXzA9Y2FzdD0oQ0ZBbGxvY2F0b3JSZWYpCi1PU19DRlVSTENyZWF0ZVdpdGhTdHJpbmdfMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NGVVJMQ3JlYXRlV2l0aFN0cmluZ18yPWNhc3Q9Q0ZVUkxSZWYKLQotT1NfQ0ZVUkxHZXRGU1JlZj0KLU9TX0NGVVJMR2V0RlNSZWZfMD1jYXN0PShDRlVSTFJlZikKLU9TX0NGVVJMR2V0RlNSZWZfMT1jYXN0PShzdHJ1Y3QgRlNSZWYgKikKLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQ9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybUNvbmNhdF8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXRfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtQ29uY2F0XzI9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0PWZsYWdzPW5vX2dlbgotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnRfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0XzE9Ci0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzE9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV8zPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlXzQ9Ci1PU19DR0FmZmluZVRyYW5zZm9ybU1ha2VfNT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtTWFrZV82PQotCi1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtUm90YXRlXzA9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVJvdGF0ZV8xPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1Sb3RhdGVfMj0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1TY2FsZT1mbGFncz1ub19nZW4KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMD0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMj0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtU2NhbGVfMz0KLQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGU9ZmxhZ3M9bm9fZ2VuCi1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8wPQotT1NfQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGVfMT0KLU9TX0NHQWZmaW5lVHJhbnNmb3JtVHJhbnNsYXRlXzI9Ci1PU19DR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZV8zPQotCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGU9Ci1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMD1jYXN0PSh2b2lkICopCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMj1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfMz1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNT1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVfNj1jYXN0PShDR0ltYWdlQWxwaGFJbmZvKQotCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZT1mbGFncz1keW5hbWljCi1PU19DR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZV8wPQotCi1PU19DR0NvbG9yQ3JlYXRlPQotT1NfQ0dDb2xvckNyZWF0ZV8wPWNhc3Q9KENHQ29sb3JTcGFjZVJlZikKLU9TX0NHQ29sb3JDcmVhdGVfMT0KLQotT1NfQ0dDb2xvclJlbGVhc2U9Ci1PU19DR0NvbG9yUmVsZWFzZV8wPWNhc3Q9Q0dDb2xvclJlZgotCi1PU19DR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0I9Ci0KLU9TX0NHQ29sb3JTcGFjZUNyZWF0ZVBhdHRlcm49Ci1PU19DR0NvbG9yU3BhY2VDcmVhdGVQYXR0ZXJuXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLQotT1NfQ0dDb2xvclNwYWNlUmVsZWFzZT0KLU9TX0NHQ29sb3JTcGFjZVJlbGVhc2VfMD1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi0KLU9TX0NHQ29udGV4dEFkZEFyYz0KLU9TX0NHQ29udGV4dEFkZEFyY18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY18xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dEFkZEFyY180PWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0QWRkQXJjXzU9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRBZGRBcmNfNj1jYXN0PShCb29sZWFuKQotCi1PU19DR0NvbnRleHRBZGRBcmNUb1BvaW50PQotT1NfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMT0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMj0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfMz0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfND0KLU9TX0NHQ29udGV4dEFkZEFyY1RvUG9pbnRfNT0KLQotT1NfQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQ9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEFkZExpbmVUb1BvaW50XzE9Ci1PU19DR0NvbnRleHRBZGRMaW5lVG9Qb2ludF8yPQotCi1PU19DR0NvbnRleHRBZGRMaW5lcz0KLU9TX0NHQ29udGV4dEFkZExpbmVzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0QWRkTGluZXNfMT1jYXN0PShjb25zdCBDR1BvaW50ICopCi1PU19DR0NvbnRleHRBZGRMaW5lc18yPWNhc3Q9KHNpemVfdCkKLQotT1NfQ0dDb250ZXh0QWRkUGF0aD0KLU9TX0NHQ29udGV4dEFkZFBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRBZGRQYXRoXzE9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dDb250ZXh0QWRkUmVjdD0KLU9TX0NHQ29udGV4dEFkZFJlY3RfMD1jYXN0PUNHQ29udGV4dFJlZgotT1NfQ0dDb250ZXh0QWRkUmVjdF8xPWZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHRCZWdpblBhdGg9Ci1PU19DR0NvbnRleHRCZWdpblBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dENsZWFyUmVjdD0KLU9TX0NHQ29udGV4dENsZWFyUmVjdF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dENsZWFyUmVjdF8xPWNhc3Q9KENHUmVjdCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfQ0dDb250ZXh0Q2xpcD0KLU9TX0NHQ29udGV4dENsaXBfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dENsb3NlUGF0aD0KLU9TX0NHQ29udGV4dENsb3NlUGF0aF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0Q29uY2F0Q1RNPQotT1NfQ0dDb250ZXh0Q29uY2F0Q1RNXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0Q29uY2F0Q1RNXzE9Y2FzdD0oQ0dBZmZpbmVUcmFuc2Zvcm0gKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dERyYXdJbWFnZT0KLU9TX0NHQ29udGV4dERyYXdJbWFnZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dERyYXdJbWFnZV8xPWNhc3Q9KENHUmVjdCAqKSxmbGFncz1zdHJ1Y3QKLU9TX0NHQ29udGV4dERyYXdJbWFnZV8yPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHQ29udGV4dERyYXdTaGFkaW5nPQotT1NfQ0dDb250ZXh0RHJhd1NoYWRpbmdfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHREcmF3U2hhZGluZ18xPWNhc3Q9Q0dTaGFkaW5nUmVmCi0KLU9TX0NHQ29udGV4dEVPQ2xpcD0KLU9TX0NHQ29udGV4dEVPQ2xpcF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0RU9GaWxsUGF0aD0KLU9TX0NHQ29udGV4dEVPRmlsbFBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEZpbGxQYXRoPQotT1NfQ0dDb250ZXh0RmlsbFBhdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dEZpbGxSZWN0PQotT1NfQ0dDb250ZXh0RmlsbFJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRGaWxsUmVjdF8xPWNhc3Q9KENHUmVjdCAqKSxmbGFncz1zdHJ1Y3QKLQotT1NfQ0dDb250ZXh0Rmx1c2g9Ci1PU19DR0NvbnRleHRGbHVzaF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0R2V0Q1RNPWZsYWdzPW5vX2dlbgotT1NfQ0dDb250ZXh0R2V0Q1RNXzA9Ci1PU19DR0NvbnRleHRHZXRDVE1fMT0KLQotT1NfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHk9Ci1PU19DR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94PWZsYWdzPW5vX2dlbgotT1NfQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94XzE9Ci0KLU9TX0NHQ29udGV4dEdldFRleHRQb3NpdGlvbj1mbGFncz1ub19nZW4KLU9TX0NHQ29udGV4dEdldFRleHRQb3NpdGlvbl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dEdldFRleHRQb3NpdGlvbl8xPWNhc3Q9KENHUG9pbnQpCi0KLU9TX0NHQ29udGV4dE1vdmVUb1BvaW50PQotT1NfQ0dDb250ZXh0TW92ZVRvUG9pbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRNb3ZlVG9Qb2ludF8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0TW92ZVRvUG9pbnRfMj1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0UmVsZWFzZT0KLU9TX0NHQ29udGV4dFJlbGVhc2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi0KLU9TX0NHQ29udGV4dFJlc3RvcmVHU3RhdGU9Ci1PU19DR0NvbnRleHRSZXN0b3JlR1N0YXRlXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRTYXZlR1N0YXRlPQotT1NfQ0dDb250ZXh0U2F2ZUdTdGF0ZV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U2NhbGVDVE09Ci1PU19DR0NvbnRleHRTY2FsZUNUTV8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNjYWxlQ1RNXzE9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTY2FsZUNUTV8yPWNhc3Q9KGZsb2F0KQotCi1PU19DR0NvbnRleHRTZWxlY3RGb250PQotT1NfQ0dDb250ZXh0U2VsZWN0Rm9udF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNlbGVjdEZvbnRfMT1jYXN0PShjb25zdCBjaGFyICopCi1PU19DR0NvbnRleHRTZWxlY3RGb250XzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZWxlY3RGb250XzM9Y2FzdD0oQ0dUZXh0RW5jb2RpbmcpCi0KLU9TX0NHQ29udGV4dFNldEFscGhhPQotT1NfQ0dDb250ZXh0U2V0QWxwaGFfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRBbHBoYV8xPQotCi1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3I9Ci1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3JfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3JfMT1jYXN0PShjb25zdCBmbG9hdCAqKQotCi1PU19DR0NvbnRleHRTZXRGaWxsQ29sb3JTcGFjZT0KLU9TX0NHQ29udGV4dFNldEZpbGxDb2xvclNwYWNlXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0RmlsbENvbG9yU3BhY2VfMT1jYXN0PShDR0NvbG9yU3BhY2VSZWYpCi0KLU9TX0NHQ29udGV4dFNldEZpbGxQYXR0ZXJuPQotT1NfQ0dDb250ZXh0U2V0RmlsbFBhdHRlcm5fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRGaWxsUGF0dGVybl8xPWNhc3Q9Q0dQYXR0ZXJuUmVmCi1PU19DR0NvbnRleHRTZXRGaWxsUGF0dGVybl8yPQotCi1PU19DR0NvbnRleHRTZXRGb250PQotT1NfQ0dDb250ZXh0U2V0Rm9udF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldEZvbnRfMT1jYXN0PShDR0ZvbnRSZWYpCi0KLU9TX0NHQ29udGV4dFNldEZvbnRTaXplPQotT1NfQ0dDb250ZXh0U2V0Rm9udFNpemVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRGb250U2l6ZV8xPWNhc3Q9KGZsb2F0KQotCi1PU19DR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eT0KLU9TX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHlfMT0KLQotT1NfQ0dDb250ZXh0U2V0TGluZUNhcD0KLU9TX0NHQ29udGV4dFNldExpbmVDYXBfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRMaW5lQ2FwXzE9Ci0KLU9TX0NHQ29udGV4dFNldExpbmVEYXNoPQotT1NfQ0dDb250ZXh0U2V0TGluZURhc2hfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRMaW5lRGFzaF8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0TGluZURhc2hfMj1jYXN0PShjb25zdCBmbG9hdCAqKQotT1NfQ0dDb250ZXh0U2V0TGluZURhc2hfMz1jYXN0PShzaXplX3QpCi0KLU9TX0NHQ29udGV4dFNldExpbmVKb2luPQotT1NfQ0dDb250ZXh0U2V0TGluZUpvaW5fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRMaW5lSm9pbl8xPQotCi1PU19DR0NvbnRleHRTZXRMaW5lV2lkdGg9Ci1PU19DR0NvbnRleHRTZXRMaW5lV2lkdGhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRMaW5lV2lkdGhfMT1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdD0KLU9TX0NHQ29udGV4dFNldE1pdGVyTGltaXRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRNaXRlckxpbWl0XzE9Ci0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3JfMz1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcl80PWNhc3Q9KGZsb2F0KQotCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcj0KLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yXzI9Y2FzdD0oZmxvYXQpCi1PU19DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcl8zPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3JfND1jYXN0PShmbG9hdCkKLQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50PQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0UmVuZGVyaW5nSW50ZW50XzE9Ci0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcz0KLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc18xPQotCi1PU19DR0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cz0KLU9TX0NHQ29udGV4dFNldFNob3VsZFNtb290aEZvbnRzXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ0dDb250ZXh0U2V0U2hvdWxkU21vb3RoRm9udHNfMT0KLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3I9Ci1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvcl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yXzE9Y2FzdD0oY29uc3QgZmxvYXQgKikKLQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlQ29sb3JTcGFjZT0KLU9TX0NHQ29udGV4dFNldFN0cm9rZUNvbG9yU3BhY2VfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRTdHJva2VDb2xvclNwYWNlXzE9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotCi1PU19DR0NvbnRleHRTZXRTdHJva2VQYXR0ZXJuPQotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFN0cm9rZVBhdHRlcm5fMT1jYXN0PUNHUGF0dGVyblJlZgotT1NfQ0dDb250ZXh0U2V0U3Ryb2tlUGF0dGVybl8yPQotCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGU9Ci1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGVfMT1jYXN0PShDR1RleHREcmF3aW5nTW9kZSkKLQotT1NfQ0dDb250ZXh0U2V0VGV4dE1hdHJpeD0KLU9TX0NHQ29udGV4dFNldFRleHRNYXRyaXhfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTZXRUZXh0TWF0cml4XzE9Y2FzdD0oQ0dBZmZpbmVUcmFuc2Zvcm0gKiksZmxhZ3M9c3RydWN0Ci0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbj0KLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8wPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbl8xPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uXzI9Y2FzdD0oZmxvYXQpCi0KLU9TX0NHQ29udGV4dFNob3dUZXh0PQotT1NfQ0dDb250ZXh0U2hvd1RleHRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dF8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX0NHQ29udGV4dFNob3dUZXh0XzI9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQ9Ci1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTaG93VGV4dEF0UG9pbnRfMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludF8yPWNhc3Q9KGZsb2F0KQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50XzQ9Y2FzdD0oc2l6ZV90KQotCi1PU19DR0NvbnRleHRTdHJva2VQYXRoPQotT1NfQ0dDb250ZXh0U3Ryb2tlUGF0aF8wPWNhc3Q9KENHQ29udGV4dFJlZikKLQotT1NfQ0dDb250ZXh0U3Ryb2tlUmVjdD0KLU9TX0NHQ29udGV4dFN0cm9rZVJlY3RfMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRTdHJva2VSZWN0XzE9Y2FzdD0oQ0dSZWN0ICopLGZsYWdzPXN0cnVjdAotCi1PU19DR0NvbnRleHRTeW5jaHJvbml6ZT0KLU9TX0NHQ29udGV4dFN5bmNocm9uaXplXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE09Ci1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMD1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19DR0NvbnRleHRUcmFuc2xhdGVDVE1fMT1jYXN0PShmbG9hdCkKLU9TX0NHQ29udGV4dFRyYW5zbGF0ZUNUTV8yPWNhc3Q9KGZsb2F0KQotCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8wPWNhc3Q9KHZvaWQgKikKLU9TX0NHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGFfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19DR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YV8zPWNhc3Q9KHZvaWQgKikKLQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMPQotT1NfQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoVVJMXzA9Y2FzdD1DRlVSTFJlZgotCi1PU19DR0RhdGFQcm92aWRlclJlbGVhc2U9Ci1PU19DR0RhdGFQcm92aWRlclJlbGVhc2VfMD1jYXN0PShDR0RhdGFQcm92aWRlclJlZikKLQotT1NfQ0dEaXNwbGF5QmFzZUFkZHJlc3M9Ci1PU19DR0Rpc3BsYXlCYXNlQWRkcmVzc18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWw9Ci1PU19DR0Rpc3BsYXlCaXRzUGVyUGl4ZWxfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qml0c1BlclNhbXBsZT0KLU9TX0NHRGlzcGxheUJpdHNQZXJTYW1wbGVfMD1jYXN0PShDR0RpcmVjdERpc3BsYXlJRCkKLQotT1NfQ0dEaXNwbGF5Qnl0ZXNQZXJSb3c9Ci1PU19DR0Rpc3BsYXlCeXRlc1BlclJvd18wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNIaWdoPQotT1NfQ0dEaXNwbGF5UGl4ZWxzSGlnaF8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0Rpc3BsYXlQaXhlbHNXaWRlPQotT1NfQ0dEaXNwbGF5UGl4ZWxzV2lkZV8wPWNhc3Q9KENHRGlyZWN0RGlzcGxheUlEKQotCi1PU19DR0ZvbnRDcmVhdGVXaXRoUGxhdGZvcm1Gb250PQotT1NfQ0dGb250Q3JlYXRlV2l0aFBsYXRmb3JtRm9udF8wPQotCi1PU19DR0ZvbnRSZWxlYXNlPQotT1NfQ0dGb250UmVsZWFzZV8wPWNhc3Q9KENHRm9udFJlZikKLQotT1NfQ0dGdW5jdGlvbkNyZWF0ZT0KLU9TX0NHRnVuY3Rpb25DcmVhdGVfMD1jYXN0PXZvaWQgKgotT1NfQ0dGdW5jdGlvbkNyZWF0ZV8xPWNhc3Q9c2l6ZV90Ci1PU19DR0Z1bmN0aW9uQ3JlYXRlXzI9Y2FzdD1jb25zdCBmbG9hdCAqCi1PU19DR0Z1bmN0aW9uQ3JlYXRlXzM9Y2FzdD1zaXplX3QKLU9TX0NHRnVuY3Rpb25DcmVhdGVfND1jYXN0PWNvbnN0IGZsb2F0ICoKLU9TX0NHRnVuY3Rpb25DcmVhdGVfNT1jYXN0PWNvbnN0IENHRnVuY3Rpb25DYWxsYmFja3MgKgotCi1PU19DR0Z1bmN0aW9uUmVsZWFzZT0KLU9TX0NHRnVuY3Rpb25SZWxlYXNlXzA9Y2FzdD1DR0Z1bmN0aW9uUmVmCi0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdD0KLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzE9Y2FzdD1DR0Rpc3BsYXlDb3VudAotT1NfQ0dHZXREaXNwbGF5c1dpdGhSZWN0XzI9Y2FzdD0oQ0dEaXJlY3REaXNwbGF5SUQgKikKLU9TX0NHR2V0RGlzcGxheXNXaXRoUmVjdF8zPWNhc3Q9Q0dEaXNwbGF5Q291bnQgKgotCi1PU19DR0ltYWdlQ3JlYXRlPQotT1NfQ0dJbWFnZUNyZWF0ZV8wPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfMT1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzI9Y2FzdD0oc2l6ZV90KQotT1NfQ0dJbWFnZUNyZWF0ZV8zPWNhc3Q9KHNpemVfdCkKLU9TX0NHSW1hZ2VDcmVhdGVfND1jYXN0PShzaXplX3QpCi1PU19DR0ltYWdlQ3JlYXRlXzU9Y2FzdD0oQ0dDb2xvclNwYWNlUmVmKQotT1NfQ0dJbWFnZUNyZWF0ZV82PWNhc3Q9KENHSW1hZ2VBbHBoYUluZm8pCi1PU19DR0ltYWdlQ3JlYXRlXzc9Y2FzdD0oQ0dEYXRhUHJvdmlkZXJSZWYpCi1PU19DR0ltYWdlQ3JlYXRlXzg9Y2FzdD0oY29uc3QgZmxvYXQgKikKLU9TX0NHSW1hZ2VDcmVhdGVfOT1jYXN0PShCb29sZWFuKQotT1NfQ0dJbWFnZUNyZWF0ZV8xMD1jYXN0PShDR0NvbG9yUmVuZGVyaW5nSW50ZW50KQotCi1PU19DR0ltYWdlQ3JlYXRlV2l0aEltYWdlSW5SZWN0PWZsYWdzPWR5bmFtaWMKLU9TX0NHSW1hZ2VDcmVhdGVXaXRoSW1hZ2VJblJlY3RfMD0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoSW1hZ2VJblJlY3RfMT1mbGFncz1zdHJ1Y3QKLQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhKUEVHRGF0YVByb3ZpZGVyPQotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhKUEVHRGF0YVByb3ZpZGVyXzA9Y2FzdD1DR0RhdGFQcm92aWRlclJlZgotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhKUEVHRGF0YVByb3ZpZGVyXzE9Ci1PU19DR0ltYWdlQ3JlYXRlV2l0aEpQRUdEYXRhUHJvdmlkZXJfMj0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoSlBFR0RhdGFQcm92aWRlcl8zPQotCi1PU19DR0ltYWdlQ3JlYXRlV2l0aFBOR0RhdGFQcm92aWRlcj0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyXzA9Y2FzdD1DR0RhdGFQcm92aWRlclJlZgotT1NfQ0dJbWFnZUNyZWF0ZVdpdGhQTkdEYXRhUHJvdmlkZXJfMT0KLU9TX0NHSW1hZ2VDcmVhdGVXaXRoUE5HRGF0YVByb3ZpZGVyXzI9Ci1PU19DR0ltYWdlQ3JlYXRlV2l0aFBOR0RhdGFQcm92aWRlcl8zPQotCi1PU19DR0ltYWdlR2V0QWxwaGFJbmZvPQotT1NfQ0dJbWFnZUdldEFscGhhSW5mb18wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRCaXRzUGVyQ29tcG9uZW50PQotT1NfQ0dJbWFnZUdldEJpdHNQZXJDb21wb25lbnRfMD1jYXN0PShDR0ltYWdlUmVmKQotCi1PU19DR0ltYWdlR2V0Qml0c1BlclBpeGVsPQotT1NfQ0dJbWFnZUdldEJpdHNQZXJQaXhlbF8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRCeXRlc1BlclJvdz0KLU9TX0NHSW1hZ2VHZXRCeXRlc1BlclJvd18wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRDb2xvclNwYWNlPQotT1NfQ0dJbWFnZUdldENvbG9yU3BhY2VfMD1jYXN0PShDR0ltYWdlUmVmKQotCi1PU19DR0ltYWdlR2V0SGVpZ2h0PQotT1NfQ0dJbWFnZUdldEhlaWdodF8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VHZXRXaWR0aD0KLU9TX0NHSW1hZ2VHZXRXaWR0aF8wPWNhc3Q9KENHSW1hZ2VSZWYpCi0KLU9TX0NHSW1hZ2VSZWxlYXNlPQotT1NfQ0dJbWFnZVJlbGVhc2VfMD1jYXN0PShDR0ltYWdlUmVmKQotCi1PU19DR1BhdGhBZGRBcmM9Ci1PU19DR1BhdGhBZGRBcmNfMD1jYXN0PUNHTXV0YWJsZVBhdGhSZWYKLU9TX0NHUGF0aEFkZEFyY18xPWNhc3Q9KGNvbnN0IENHQWZmaW5lVHJhbnNmb3JtICopCi1PU19DR1BhdGhBZGRBcmNfMj0KLU9TX0NHUGF0aEFkZEFyY18zPQotT1NfQ0dQYXRoQWRkQXJjXzQ9Ci1PU19DR1BhdGhBZGRBcmNfNT0KLU9TX0NHUGF0aEFkZEFyY182PQotT1NfQ0dQYXRoQWRkQXJjXzc9Ci0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludD0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF8wPWNhc3Q9KENHTXV0YWJsZVBhdGhSZWYpCi1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfMT1jYXN0PShjb25zdCBDR0FmZmluZVRyYW5zZm9ybSAqKQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzI9Ci1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfMz0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF80PQotT1NfQ0dQYXRoQWRkQ3VydmVUb1BvaW50XzU9Ci1PU19DR1BhdGhBZGRDdXJ2ZVRvUG9pbnRfNj0KLU9TX0NHUGF0aEFkZEN1cnZlVG9Qb2ludF83PQotCi1PU19DR1BhdGhBZGRMaW5lVG9Qb2ludD0KLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50XzA9Y2FzdD1DR011dGFibGVQYXRoUmVmCi1PU19DR1BhdGhBZGRMaW5lVG9Qb2ludF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoQWRkTGluZVRvUG9pbnRfMj0KLU9TX0NHUGF0aEFkZExpbmVUb1BvaW50XzM9Ci0KLU9TX0NHUGF0aEFkZFBhdGg9Ci1PU19DR1BhdGhBZGRQYXRoXzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLU9TX0NHUGF0aEFkZFBhdGhfMT1jYXN0PWNvbnN0IENHQWZmaW5lVHJhbnNmb3JtICoKLU9TX0NHUGF0aEFkZFBhdGhfMj1jYXN0PUNHUGF0aFJlZgotCi1PU19DR1BhdGhBZGRRdWFkQ3VydmVUb1BvaW50PQotT1NfQ0dQYXRoQWRkUXVhZEN1cnZlVG9Qb2ludF8wPWNhc3Q9KENHTXV0YWJsZVBhdGhSZWYpCi1PU19DR1BhdGhBZGRRdWFkQ3VydmVUb1BvaW50XzE9Y2FzdD0oY29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKikKLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfMj0KLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfMz0KLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfND0KLU9TX0NHUGF0aEFkZFF1YWRDdXJ2ZVRvUG9pbnRfNT0KLQotT1NfQ0dQYXRoQWRkUmVjdD0KLU9TX0NHUGF0aEFkZFJlY3RfMD1jYXN0PShDR011dGFibGVQYXRoUmVmKQotT1NfQ0dQYXRoQWRkUmVjdF8xPWNhc3Q9Y29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0gKgotT1NfQ0dQYXRoQWRkUmVjdF8yPWZsYWdzPXN0cnVjdAotCi1PU19DR1BhdGhBcHBseT0KLU9TX0NHUGF0aEFwcGx5XzA9Y2FzdD1DR1BhdGhSZWYKLU9TX0NHUGF0aEFwcGx5XzE9Y2FzdD12b2lkICoKLU9TX0NHUGF0aEFwcGx5XzI9Y2FzdD1DR1BhdGhBcHBsaWVyRnVuY3Rpb24KLQotT1NfQ0dQYXRoQ2xvc2VTdWJwYXRoPQotT1NfQ0dQYXRoQ2xvc2VTdWJwYXRoXzA9Y2FzdD0oQ0dNdXRhYmxlUGF0aFJlZikKLQotT1NfQ0dQYXRoQ3JlYXRlTXV0YWJsZT0KLQotT1NfQ0dQYXRoR2V0Qm91bmRpbmdCb3g9ZmxhZ3M9bm9fZ2VuCi1PU19DR1BhdGhHZXRCb3VuZGluZ0JveF8wPWNhc3Q9Q0dQYXRoUmVmCi1PU19DR1BhdGhHZXRCb3VuZGluZ0JveF8xPQotCi1PU19DR1BhdGhHZXRDdXJyZW50UG9pbnQ9ZmxhZ3M9bm9fZ2VuCi1PU19DR1BhdGhHZXRDdXJyZW50UG9pbnRfMD1jYXN0PUNHUGF0aFJlZgotT1NfQ0dQYXRoR2V0Q3VycmVudFBvaW50XzE9Ci0KLU9TX0NHUGF0aElzRW1wdHk9Ci1PU19DR1BhdGhJc0VtcHR5XzA9Y2FzdD1DR1BhdGhSZWYKLQotT1NfQ0dQYXRoTW92ZVRvUG9pbnQ9Ci1PU19DR1BhdGhNb3ZlVG9Qb2ludF8wPWNhc3Q9Q0dNdXRhYmxlUGF0aFJlZgotT1NfQ0dQYXRoTW92ZVRvUG9pbnRfMT1jYXN0PWNvbnN0IENHQWZmaW5lVHJhbnNmb3JtICoKLU9TX0NHUGF0aE1vdmVUb1BvaW50XzI9Ci1PU19DR1BhdGhNb3ZlVG9Qb2ludF8zPQotCi1PU19DR1BhdGhSZWxlYXNlPQotT1NfQ0dQYXRoUmVsZWFzZV8wPWNhc3Q9Q0dQYXRoUmVmCi0KLU9TX0NHUGF0dGVybkNyZWF0ZT0KLU9TX0NHUGF0dGVybkNyZWF0ZV8wPWNhc3Q9dm9pZCAqCi1PU19DR1BhdHRlcm5DcmVhdGVfMT1mbGFncz1zdHJ1Y3QKLU9TX0NHUGF0dGVybkNyZWF0ZV8yPWNhc3Q9Q0dBZmZpbmVUcmFuc2Zvcm0gKixmbGFncz1zdHJ1Y3QKLU9TX0NHUGF0dGVybkNyZWF0ZV8zPQotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzQ9Ci1PU19DR1BhdHRlcm5DcmVhdGVfNT1jYXN0PUNHUGF0dGVyblRpbGluZwotT1NfQ0dQYXR0ZXJuQ3JlYXRlXzY9Ci1PU19DR1BhdHRlcm5DcmVhdGVfNz1jYXN0PShjb25zdCBDR1BhdHRlcm5DYWxsYmFja3MgKikKLQotT1NfQ0dQYXR0ZXJuUmVsZWFzZT0KLU9TX0NHUGF0dGVyblJlbGVhc2VfMD1jYXN0PUNHUGF0dGVyblJlZgotCi1PU19DR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm09ZmxhZ3M9bm9fZ2VuCi1PU19DR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm1fMD0KLU9TX0NHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybV8xPQotT1NfQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtXzI9Ci0KLU9TX0NHUG9zdEtleWJvYXJkRXZlbnQ9Ci1PU19DR1Bvc3RLZXlib2FyZEV2ZW50XzA9Y2FzdD0oQ0dDaGFyQ29kZSkKLU9TX0NHUG9zdEtleWJvYXJkRXZlbnRfMT1jYXN0PUNHS2V5Q29kZQotT1NfQ0dQb3N0S2V5Ym9hcmRFdmVudF8yPWNhc3Q9Ym9vbGVhbl90Ci0KLU9TX0NHUG9zdE1vdXNlRXZlbnQ9Ci1PU19DR1Bvc3RNb3VzZUV2ZW50XzA9ZmxhZ3M9c3RydWN0Ci1PU19DR1Bvc3RNb3VzZUV2ZW50XzE9Y2FzdD1ib29sZWFuX3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfMj0KLU9TX0NHUG9zdE1vdXNlRXZlbnRfMz1jYXN0PWJvb2xlYW5fdAotT1NfQ0dQb3N0TW91c2VFdmVudF80PWNhc3Q9Ym9vbGVhbl90Ci1PU19DR1Bvc3RNb3VzZUV2ZW50XzU9Y2FzdD1ib29sZWFuX3QKLU9TX0NHUG9zdE1vdXNlRXZlbnRfNj1jYXN0PShib29sZWFuX3QpCi1PU19DR1Bvc3RNb3VzZUV2ZW50Xzc9Y2FzdD0oYm9vbGVhbl90KQotCi1PU19DR1Bvc3RTY3JvbGxXaGVlbEV2ZW50PQotT1NfQ0dQb3N0U2Nyb2xsV2hlZWxFdmVudF8wPQotT1NfQ0dQb3N0U2Nyb2xsV2hlZWxFdmVudF8xPQotCi1PU19DR1JlY3RDb250YWluc1BvaW50PQotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8wPWZsYWdzPXN0cnVjdAotT1NfQ0dSZWN0Q29udGFpbnNQb2ludF8xPWZsYWdzPXN0cnVjdAotCi1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbD0KLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzA9Y2FzdD1DR0NvbG9yU3BhY2VSZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF8yPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlQXhpYWxfMz1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZUF4aWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVBeGlhbF81PQotCi1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWw9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMD1jYXN0PUNHQ29sb3JTcGFjZVJlZgotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzE9ZmxhZ3M9c3RydWN0Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfMj0KLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF8zPWZsYWdzPXN0cnVjdAotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzQ9Ci1PU19DR1NoYWRpbmdDcmVhdGVSYWRpYWxfNT1jYXN0PUNHRnVuY3Rpb25SZWYKLU9TX0NHU2hhZGluZ0NyZWF0ZVJhZGlhbF82PQotT1NfQ0dTaGFkaW5nQ3JlYXRlUmFkaWFsXzc9Ci0KLU9TX0NHU2hhZGluZ1JlbGVhc2U9Ci1PU19DR1NoYWRpbmdSZWxlYXNlXzA9Y2FzdD1DR1NoYWRpbmdSZWYKLQotT1NfQ0dXYXJwTW91c2VDdXJzb3JQb3NpdGlvbj0KLU9TX0NHV2FycE1vdXNlQ3Vyc29yUG9zaXRpb25fMD1mbGFncz1zdHJ1Y3QKLQotT1NfQ1BTRW5hYmxlRm9yZWdyb3VuZE9wZXJhdGlvbj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMD0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMT0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMj0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fMz0KLU9TX0NQU0VuYWJsZUZvcmVncm91bmRPcGVyYXRpb25fND0KLQotT1NfQ1BTU2V0UHJvY2Vzc05hbWU9Ci1PU19DUFNTZXRQcm9jZXNzTmFtZV8wPQotT1NfQ1BTU2V0UHJvY2Vzc05hbWVfMT0KLQotT1NfQ2FsY01lbnVTaXplPQotT1NfQ2FsY01lbnVTaXplXzA9Y2FzdD1NZW51UmVmCi0KLU9TX0NhbGw9Ci1PU19DYWxsXzA9Ci1PU19DYWxsXzE9Ci1PU19DYWxsXzI9Ci0KLU9TX0NhbGxOZXh0RXZlbnRIYW5kbGVyPQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMD1jYXN0PShFdmVudEhhbmRsZXJDYWxsUmVmKQotT1NfQ2FsbE5leHRFdmVudEhhbmRsZXJfMT1jYXN0PShFdmVudFJlZikKLQotT1NfQ2FuY2VsTWVudVRyYWNraW5nPQotT1NfQ2FuY2VsTWVudVRyYWNraW5nXzA9Y2FzdD1NZW51UmVmCi1PU19DYW5jZWxNZW51VHJhY2tpbmdfMT0KLU9TX0NhbmNlbE1lbnVUcmFja2luZ18yPQotCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzPQotT1NfQ2hhbmdlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9V2luZG93UmVmCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzE9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi1PU19DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzI9Y2FzdD1XaW5kb3dBdHRyaWJ1dGVzCi0KLU9TX0NsZWFyQ3VycmVudFNjcmFwPQotCi1PU19DbGVhcktleWJvYXJkRm9jdXM9Ci1PU19DbGVhcktleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0NsZWFyTWVudUJhcj0KLQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uPQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzA9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ2xpcENHQ29udGV4dFRvUmVnaW9uXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyPQotT1NfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX0Nsb3NlUmduPQotT1NfQ2xvc2VSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0NvbGxhcHNlV2luZG93PQotT1NfQ29sbGFwc2VXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19Db2xsYXBzZVdpbmRvd18xPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0NvbnRleHR1YWxNZW51U2VsZWN0PQotT1NfQ29udGV4dHVhbE1lbnVTZWxlY3RfMD1jYXN0PU1lbnVSZWYKLU9TX0NvbnRleHR1YWxNZW51U2VsZWN0XzE9ZmxhZ3M9c3RydWN0Ci1PU19Db250ZXh0dWFsTWVudVNlbGVjdF8yPQotT1NfQ29udGV4dHVhbE1lbnVTZWxlY3RfMz0KLU9TX0NvbnRleHR1YWxNZW51U2VsZWN0XzQ9Y2FzdD1Db25zdFN0cjI1NVBhcmFtCi1PU19Db250ZXh0dWFsTWVudVNlbGVjdF81PQotT1NfQ29udGV4dHVhbE1lbnVTZWxlY3RfNj1jYXN0PVVJbnQzMiAqCi1PU19Db250ZXh0dWFsTWVudVNlbGVjdF83PWNhc3Q9U0ludDE2ICoKLU9TX0NvbnRleHR1YWxNZW51U2VsZWN0Xzg9Y2FzdD1NZW51SXRlbUluZGV4ICoKLQotT1NfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZD0KLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMD1jYXN0PShFdmVudFJlZikKLU9TX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmRfMT1jYXN0PShFdmVudFJlY29yZCAqKQotCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGU9Ci1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMD1jYXN0PVRleHRUb1VuaWNvZGVJbmZvCi1PU19Db252ZXJ0RnJvbVBTdHJpbmdUb1VuaWNvZGVfMT1jYXN0PUNvbnN0U3RyMjU1UGFyYW0KLU9TX0NvbnZlcnRGcm9tUFN0cmluZ1RvVW5pY29kZV8yPQotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzM9Y2FzdD1CeXRlQ291bnQgKgotT1NfQ29udmVydEZyb21QU3RyaW5nVG9Vbmljb2RlXzQ9Ci0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZz0KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18wPWNhc3Q9VW5pY29kZVRvVGV4dEluZm8KLU9TX0NvbnZlcnRGcm9tVW5pY29kZVRvUFN0cmluZ18xPQotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzI9Y2FzdD1Db25zdFVuaUNoYXJBcnJheVB0cgotT1NfQ29udmVydEZyb21Vbmljb2RlVG9QU3RyaW5nXzM9Y2FzdD0odW5zaWduZWQgY2hhciAqKQotCi1PU19Db3B5Qml0cz0KLU9TX0NvcHlCaXRzXzA9Y2FzdD0oY29uc3QgQml0TWFwICopCi1PU19Db3B5Qml0c18xPWNhc3Q9KGNvbnN0IEJpdE1hcCAqKQotT1NfQ29weUJpdHNfMj1jYXN0PShjb25zdCBSZWN0ICopCi1PU19Db3B5Qml0c18zPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NvcHlCaXRzXzQ9Y2FzdD0oc2hvcnQpCi1PU19Db3B5Qml0c181PWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmc9Ci1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZ18xPWNhc3Q9KENGU3RyaW5nUmVmICopCi0KLU9TX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nPQotT1NfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmdfMT1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmdfMj1jYXN0PShDRlN0cmluZ1JlZiAqKQotCi1PU19Db3B5UmduPQotT1NfQ29weVJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX0NvcHlSZ25fMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzPQotT1NfQ291bnREcmFnSXRlbUZsYXZvcnNfMD1jYXN0PShEcmFnUmVmKQotT1NfQ291bnREcmFnSXRlbUZsYXZvcnNfMT1jYXN0PShEcmFnSXRlbVJlZikKLU9TX0NvdW50RHJhZ0l0ZW1GbGF2b3JzXzI9Y2FzdD0oVUludDE2ICopCi0KLU9TX0NvdW50RHJhZ0l0ZW1zPQotT1NfQ291bnREcmFnSXRlbXNfMD1jYXN0PShEcmFnUmVmKQotT1NfQ291bnREcmFnSXRlbXNfMT1jYXN0PShVSW50MTYgKikKLQotT1NfQ291bnRNZW51SXRlbXM9Ci1PU19Db3VudE1lbnVJdGVtc18wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX0NvdW50U3ViQ29udHJvbHM9Ci1PU19Db3VudFN1YkNvbnRyb2xzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0NvdW50U3ViQ29udHJvbHNfMT1jYXN0PShVSW50MTYgKikKLQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sPQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sXzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfMz1jYXN0PShDb250cm9sQmV2ZWxUaGlja25lc3MpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfND1jYXN0PShDb250cm9sQmV2ZWxCdXR0b25CZWhhdmlvcikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF81PWNhc3Q9KENvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0cikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF82PWNhc3Q9KFNJbnQxNikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF83PWNhc3Q9KENvbnRyb2xCZXZlbEJ1dHRvbk1lbnVCZWhhdmlvcikKLU9TX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbF84PWNhc3Q9KENvbnRyb2xCZXZlbEJ1dHRvbk1lbnVQbGFjZW1lbnQpCi1PU19DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2xfOT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQ9Ci1PU19DcmVhdGVDR0NvbnRleHRGb3JQb3J0XzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19DcmVhdGVDR0NvbnRleHRGb3JQb3J0XzE9Y2FzdD0oQ0dDb250ZXh0UmVmICopCi0KLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbD0KLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlQ2hlY2tCb3hDb250cm9sXzM9Y2FzdD0oU0ludDMyKQotT1NfQ3JlYXRlQ2hlY2tCb3hDb250cm9sXzQ9Y2FzdD0oQm9vbGVhbikKLU9TX0NyZWF0ZUNoZWNrQm94Q29udHJvbF81PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlQ2xvY2tDb250cm9sPQotT1NfQ3JlYXRlQ2xvY2tDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlQ2xvY2tDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlQ2xvY2tDb250cm9sXzI9Y2FzdD1Db250cm9sQ2xvY2tUeXBlCi1PU19DcmVhdGVDbG9ja0NvbnRyb2xfMz1jYXN0PUNvbnRyb2xDbG9ja0ZsYWdzCi1PU19DcmVhdGVDbG9ja0NvbnRyb2xfND1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbD0KLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbF8yPWNhc3Q9KERhdGFCcm93c2VyVmlld1N0eWxlKQotT1NfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sPQotT1NfQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMT0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfMz0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfND0KLU9TX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUV2ZW50PQotT1NfQ3JlYXRlRXZlbnRfMD1jYXN0PShDRkFsbG9jYXRvclJlZikKLU9TX0NyZWF0ZUV2ZW50XzE9Y2FzdD0oVUludDMyKQotT1NfQ3JlYXRlRXZlbnRfMj1jYXN0PShVSW50MzIpCi1PU19DcmVhdGVFdmVudF8zPWNhc3Q9KEV2ZW50VGltZSkKLU9TX0NyZWF0ZUV2ZW50XzQ9Y2FzdD0oRXZlbnRBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlRXZlbnRfNT1jYXN0PShFdmVudFJlZiAqKQotCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2w9Ci1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZUdyb3VwQm94Q29udHJvbF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVHcm91cEJveENvbnRyb2xfND1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZUljb25Db250cm9sPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVJY29uQ29udHJvbF8xPQotT1NfQ3JlYXRlSWNvbkNvbnRyb2xfMj0KLU9TX0NyZWF0ZUljb25Db250cm9sXzM9Ci1PU19DcmVhdGVJY29uQ29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbD0KLU9TX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2xfMD1jYXN0PVdpbmRvd1JlZgotT1NfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbF8xPWNhc3Q9Y29uc3QgUmVjdCAqCi1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzI9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzM9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzQ9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzU9Ci1PU19DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVOZXdNZW51PQotT1NfQ3JlYXRlTmV3TWVudV8wPWNhc3Q9KE1lbnVJRCkKLU9TX0NyZWF0ZU5ld01lbnVfMT1jYXN0PShNZW51QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld01lbnVfMj1jYXN0PShNZW51UmVmICopCi0KLU9TX0NyZWF0ZU5ld1dpbmRvdz0KLU9TX0NyZWF0ZU5ld1dpbmRvd18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotT1NfQ3JlYXRlTmV3V2luZG93XzE9Y2FzdD0oV2luZG93QXR0cmlidXRlcykKLU9TX0NyZWF0ZU5ld1dpbmRvd18yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0NyZWF0ZU5ld1dpbmRvd18zPWNhc3Q9KFdpbmRvd1JlZiAqKQotCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbD0KLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8yPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93T3JpZW50YXRpb24pCi1PU19DcmVhdGVQb3B1cEFycm93Q29udHJvbF8zPWNhc3Q9KENvbnRyb2xQb3B1cEFycm93U2l6ZSkKLU9TX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sXzQ9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzM9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfND0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF81PQotT1NfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sXzY9Ci1PU19DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2xfNz0KLU9TX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbF84PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfMj0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF8zPQotT1NfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2xfNT0KLU9TX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbF82PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVQdXNoQnV0dG9uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sPQotT1NfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMT0KLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfMz1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm8gKikKLU9TX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2xfND1jYXN0PShDb250cm9sUHVzaEJ1dHRvbkljb25BbGlnbm1lbnQpCi1PU19DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sXzU9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2w9Ci1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMT1jYXN0PShjb25zdCBSZWN0ICopCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfMj1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF8zPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbF80PWNhc3Q9KEJvb2xlYW4pCi1PU19DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2xfNT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVJvb3RDb250cm9sPQotT1NfQ3JlYXRlUm9vdENvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVSb290Q29udHJvbF8xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbD0KLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzE9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzI9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzM9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzQ9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzU9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzY9Ci1PU19DcmVhdGVTY3JvbGxCYXJDb250cm9sXzc9Y2FzdD0oQ29udHJvbEFjdGlvblVQUCkKLU9TX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2xfOD1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2w9Ci1PU19DcmVhdGVTZXBhcmF0b3JDb250cm9sXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8xPQotT1NfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbF8yPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbD0KLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF8yPWNhc3Q9KFNJbnQzMikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfMz1jYXN0PShTSW50MzIpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzQ9Y2FzdD0oU0ludDMyKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF81PWNhc3Q9KENvbnRyb2xTbGlkZXJPcmllbnRhdGlvbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfNj1jYXN0PShVSW50MTYpCi1PU19DcmVhdGVTbGlkZXJDb250cm9sXzc9Y2FzdD0oQm9vbGVhbikKLU9TX0NyZWF0ZVNsaWRlckNvbnRyb2xfOD1jYXN0PShDb250cm9sQWN0aW9uVVBQKQotT1NfQ3JlYXRlU2xpZGVyQ29udHJvbF85PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlU3RhbmRhcmRBbGVydD0KLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfMD1jYXN0PShBbGVydFR5cGUpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19DcmVhdGVTdGFuZGFyZEFsZXJ0XzM9Y2FzdD0oY29uc3QgQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWMgKikKLU9TX0NyZWF0ZVN0YW5kYXJkQWxlcnRfND1jYXN0PShEaWFsb2dSZWYgKikKLQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2w9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVN0YXRpY1RleHRDb250cm9sXzE9Ci1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF8yPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2xfMz1jYXN0PShjb25zdCBDb250cm9sRm9udFN0eWxlUmVjICopCi1PU19DcmVhdGVTdGF0aWNUZXh0Q29udHJvbF80PWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfQ3JlYXRlVGFic0NvbnRyb2w9Ci1PU19DcmVhdGVUYWJzQ29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfMj1jYXN0PShDb250cm9sVGFiU2l6ZSkKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzM9Y2FzdD0oQ29udHJvbFRhYkRpcmVjdGlvbikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzQ9Y2FzdD0oVUludDE2KQotT1NfQ3JlYXRlVGFic0NvbnRyb2xfNT1jYXN0PShjb25zdCBDb250cm9sVGFiRW50cnkgKikKLU9TX0NyZWF0ZVRhYnNDb250cm9sXzY9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVUZXh0VG9Vbmljb2RlSW5mb0J5RW5jb2RpbmdfMT1jYXN0PShUZXh0VG9Vbmljb2RlSW5mbyAqKQotCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2Rpbmc9Ci1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMD1jYXN0PShUZXh0RW5jb2RpbmcpCi1PU19DcmVhdGVVbmljb2RlVG9UZXh0SW5mb0J5RW5jb2RpbmdfMT1jYXN0PShVbmljb2RlVG9UZXh0SW5mbyAqKQotCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2w9Ci1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19DcmVhdGVVc2VyUGFuZUNvbnRyb2xfMT0KLU9TX0NyZWF0ZVVzZXJQYW5lQ29udHJvbF8yPQotT1NfQ3JlYXRlVXNlclBhbmVDb250cm9sXzM9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19DcmVhdGVXaW5kb3dHcm91cD0KLU9TX0NyZWF0ZVdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93R3JvdXBBdHRyaWJ1dGVzKQotT1NfQ3JlYXRlV2luZG93R3JvdXBfMT1jYXN0PShXaW5kb3dHcm91cFJlZiAqKQotCi1PU19EYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXM9ZmxhZ3M9ZHluYW1pYwotT1NfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzXzA9Ci1PU19EYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXNfMT0KLU9TX0RhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlc18yPQotCi1PU19EYXRhQnJvd3NlckdldEF0dHJpYnV0ZXM9ZmxhZ3M9ZHluYW1pYwotT1NfRGF0YUJyb3dzZXJHZXRBdHRyaWJ1dGVzXzA9Ci1PU19EYXRhQnJvd3NlckdldEF0dHJpYnV0ZXNfMT0KLQotT1NfRGF0YUJyb3dzZXJHZXRNZXRyaWM9ZmxhZ3M9ZHluYW1pYwotT1NfRGF0YUJyb3dzZXJHZXRNZXRyaWNfMD0KLU9TX0RhdGFCcm93c2VyR2V0TWV0cmljXzE9Ci1PU19EYXRhQnJvd3NlckdldE1ldHJpY18yPQotT1NfRGF0YUJyb3dzZXJHZXRNZXRyaWNfMz0KLQotT1NfRGF0YUJyb3dzZXJTZXRNZXRyaWM9ZmxhZ3M9ZHluYW1pYwotT1NfRGF0YUJyb3dzZXJTZXRNZXRyaWNfMD0KLU9TX0RhdGFCcm93c2VyU2V0TWV0cmljXzE9Ci1PU19EYXRhQnJvd3NlclNldE1ldHJpY18yPQotT1NfRGF0YUJyb3dzZXJTZXRNZXRyaWNfMz0KLQotT1NfRGVsZXRlR2xvYmFsUmVmPWZsYWdzPW5vX2dlbgotT1NfRGVsZXRlR2xvYmFsUmVmXzA9Ci0KLU9TX0RlbGV0ZU1lbnU9Ci1PU19EZWxldGVNZW51XzA9Y2FzdD0oTWVudUlEKQotCi1PU19EZWxldGVNZW51SXRlbT0KLU9TX0RlbGV0ZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0RlbGV0ZU1lbnVJdGVtXzE9Y2FzdD0oc2hvcnQpCi0KLU9TX0RlbGV0ZU1lbnVJdGVtcz0KLU9TX0RlbGV0ZU1lbnVJdGVtc18wPWNhc3Q9KE1lbnVSZWYpCi1PU19EZWxldGVNZW51SXRlbXNfMT1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfRGVsZXRlTWVudUl0ZW1zXzI9Y2FzdD0oSXRlbUNvdW50KQotCi1PU19EaWZmUmduPQotT1NfRGlmZlJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX0RpZmZSZ25fMT1jYXN0PShSZ25IYW5kbGUpCi1PU19EaWZmUmduXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19EaXNhYmxlQ29udHJvbD0KLU9TX0Rpc2FibGVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfRGlzYWJsZU1lbnVDb21tYW5kPQotT1NfRGlzYWJsZU1lbnVDb21tYW5kXzA9Y2FzdD0oTWVudVJlZikKLU9TX0Rpc2FibGVNZW51Q29tbWFuZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19EaXNhYmxlTWVudUl0ZW09Ci1PU19EaXNhYmxlTWVudUl0ZW1fMD1jYXN0PShNZW51UmVmKQotT1NfRGlzYWJsZU1lbnVJdGVtXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfRGlzcG9zZUNvbnRyb2w9Ci1PU19EaXNwb3NlQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0Rpc3Bvc2VEcmFnPQotT1NfRGlzcG9zZURyYWdfMD1jYXN0PShEcmFnUmVmKQotCi1PU19EaXNwb3NlR1dvcmxkPQotT1NfRGlzcG9zZUdXb3JsZF8wPWNhc3Q9KEdXb3JsZFB0cikKLQotT1NfRGlzcG9zZUhhbmRsZT0KLU9TX0Rpc3Bvc2VIYW5kbGVfMD1jYXN0PShIYW5kbGUpCi0KLU9TX0Rpc3Bvc2VNZW51PQotT1NfRGlzcG9zZU1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19EaXNwb3NlUHRyPQotT1NfRGlzcG9zZVB0cl8wPWNhc3Q9KFB0cikKLQotT1NfRGlzcG9zZVJnbj0KLU9TX0Rpc3Bvc2VSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0Rpc3Bvc2VUZXh0VG9Vbmljb2RlSW5mbz0KLU9TX0Rpc3Bvc2VUZXh0VG9Vbmljb2RlSW5mb18wPWNhc3Q9VGV4dFRvVW5pY29kZUluZm8gKgotCi1PU19EaXNwb3NlVW5pY29kZVRvVGV4dEluZm89Ci1PU19EaXNwb3NlVW5pY29kZVRvVGV4dEluZm9fMD1jYXN0PVVuaWNvZGVUb1RleHRJbmZvICoKLQotT1NfRGlzcG9zZVdpbmRvdz0KLU9TX0Rpc3Bvc2VXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydD0KLU9TX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydF8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0RyYXdNZW51QmFyPQotCi1PU19EcmF3VGhlbWVCdXR0b249Ci1PU19EcmF3VGhlbWVCdXR0b25fMD1jYXN0PShSZWN0ICopCi1PU19EcmF3VGhlbWVCdXR0b25fMT1jYXN0PShUaGVtZUJ1dHRvbktpbmQpCi1PU19EcmF3VGhlbWVCdXR0b25fMj1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fMz1jYXN0PShjb25zdCBUaGVtZUJ1dHRvbkRyYXdJbmZvICopCi1PU19EcmF3VGhlbWVCdXR0b25fND1jYXN0PShUaGVtZUVyYXNlVVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzU9Y2FzdD0oVGhlbWVCdXR0b25EcmF3VVBQKQotT1NfRHJhd1RoZW1lQnV0dG9uXzY9Y2FzdD0oVUludDMyKQotCi1PU19EcmF3VGhlbWVFZGl0VGV4dEZyYW1lPQotT1NfRHJhd1RoZW1lRWRpdFRleHRGcmFtZV8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWVfMT1jYXN0PShUaGVtZURyYXdTdGF0ZSkKLQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0PQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lRm9jdXNSZWN0XzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfRHJhd1RoZW1lUG9wdXBBcnJvdz0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMD0KLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfMT1jYXN0PVRoZW1lQXJyb3dPcmllbnRhdGlvbgotT1NfRHJhd1RoZW1lUG9wdXBBcnJvd18yPWNhc3Q9KFRoZW1lUG9wdXBBcnJvd1NpemUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzM9Y2FzdD0oVGhlbWVEcmF3U3RhdGUpCi1PU19EcmF3VGhlbWVQb3B1cEFycm93XzQ9Y2FzdD0oVGhlbWVFcmFzZVVQUCkKLU9TX0RyYXdUaGVtZVBvcHVwQXJyb3dfNT1jYXN0PShVSW50MzIpCi0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcj0KLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX0RyYXdUaGVtZVNlcGFyYXRvcl8xPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotCi1PU19EcmF3VGhlbWVUZXh0Qm94PQotT1NfRHJhd1RoZW1lVGV4dEJveF8wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfRHJhd1RoZW1lVGV4dEJveF8xPWNhc3Q9KFRoZW1lRm9udElEKQotT1NfRHJhd1RoZW1lVGV4dEJveF8yPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotT1NfRHJhd1RoZW1lVGV4dEJveF8zPWNhc3Q9KEJvb2xlYW4pCi1PU19EcmF3VGhlbWVUZXh0Qm94XzQ9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfRHJhd1RoZW1lVGV4dEJveF81PWNhc3Q9KFNJbnQxNikKLU9TX0RyYXdUaGVtZVRleHRCb3hfNj1jYXN0PSh2b2lkICopCi0KLU9TX0VtYmVkQ29udHJvbD0KLU9TX0VtYmVkQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19FbWJlZENvbnRyb2xfMT1jYXN0PShDb250cm9sUmVmKQotCi1PU19FbXB0eVJlY3Q9Ci1PU19FbXB0eVJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi0KLU9TX0VtcHR5UmduPQotT1NfRW1wdHlSZ25fMD1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0VuYWJsZUNvbnRyb2w9Ci1PU19FbmFibGVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfRW5hYmxlTWVudUNvbW1hbmQ9Ci1PU19FbmFibGVNZW51Q29tbWFuZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19FbmFibGVNZW51Q29tbWFuZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19FbmFibGVNZW51SXRlbT0KLU9TX0VuYWJsZU1lbnVJdGVtXzA9Y2FzdD0oTWVudVJlZikKLU9TX0VuYWJsZU1lbnVJdGVtXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfRXJhc2VSZWN0PQotT1NfRXJhc2VSZWN0XzA9Y2FzdD0oY29uc3QgUmVjdCAqKQotCi1PU19GTUdldEFUU0ZvbnRSZWZGcm9tRm9udD0KLU9TX0ZNR2V0QVRTRm9udFJlZkZyb21Gb250XzA9Ci0KLU9TX0ZNR2V0Rm9udEZhbWlseUZyb21OYW1lPQotT1NfRk1HZXRGb250RmFtaWx5RnJvbU5hbWVfMD1jYXN0PShDb25zdFN0cjI1NVBhcmFtKQotCi1PU19GTUdldEZvbnRGYW1pbHlJbnN0YW5jZUZyb21Gb250PQotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udF8wPWNhc3Q9Rk1Gb250Ci1PU19GTUdldEZvbnRGYW1pbHlJbnN0YW5jZUZyb21Gb250XzE9Y2FzdD1GTUZvbnRGYW1pbHkgKgotT1NfRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udF8yPWNhc3Q9Rk1Gb250U3R5bGUgKgotCi1PU19GTUdldEZvbnRGcm9tQVRTRm9udFJlZj0KLU9TX0ZNR2V0Rm9udEZyb21BVFNGb250UmVmXzA9Ci0KLU9TX0ZNR2V0Rm9udEZyb21Gb250RmFtaWx5SW5zdGFuY2U9Ci1PU19GTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlXzA9Y2FzdD0oRk1Gb250RmFtaWx5KQotT1NfRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZV8xPWNhc3Q9KEZNRm9udFN0eWxlKQotT1NfRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZV8yPWNhc3Q9KEZNRm9udCAqKQotT1NfRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZV8zPWNhc3Q9KEZNRm9udFN0eWxlICopCi0KLU9TX0ZQSXNGb250UGFuZWxWaXNpYmxlPQotCi1PU19GUFNob3dIaWRlRm9udFBhbmVsPQotCi1PU19GU0dldENhdGFsb2dJbmZvPQotT1NfRlNHZXRDYXRhbG9nSW5mb18wPWNhc3Q9KEZTUmVmICopCi1PU19GU0dldENhdGFsb2dJbmZvXzE9Y2FzdD0oRlNDYXRhbG9nSW5mb0JpdG1hcCkKLU9TX0ZTR2V0Q2F0YWxvZ0luZm9fMj1jYXN0PShGU0NhdGFsb2dJbmZvICopCi1PU19GU0dldENhdGFsb2dJbmZvXzM9Y2FzdD0oSEZTVW5pU3RyMjU1ICopCi1PU19GU0dldENhdGFsb2dJbmZvXzQ9Y2FzdD0oRlNTcGVjICopCi1PU19GU0dldENhdGFsb2dJbmZvXzU9Y2FzdD0oRlNSZWYgKikKLQotT1NfRlNwR2V0RkluZm89Ci1PU19GU3BHZXRGSW5mb18wPWNhc3Q9KEZTU3BlYyAqKQotT1NfRlNwR2V0RkluZm9fMT1jYXN0PShGSW5mbyAqKQotCi1PU19GU3BNYWtlRlNSZWY9Ci1PU19GU3BNYWtlRlNSZWZfMD1jYXN0PShjb25zdCBGU1NwZWMgKikKLU9TX0ZTcE1ha2VGU1JlZl8xPWNhc3Q9KEZTUmVmICopCi0KLU9TX0ZpbmRTcGVjaWZpY0V2ZW50SW5RdWV1ZT0KLU9TX0ZpbmRTcGVjaWZpY0V2ZW50SW5RdWV1ZV8wPWNhc3Q9RXZlbnRRdWV1ZVJlZgotT1NfRmluZFNwZWNpZmljRXZlbnRJblF1ZXVlXzE9Y2FzdD1FdmVudENvbXBhcmF0b3JVUFAKLU9TX0ZpbmRTcGVjaWZpY0V2ZW50SW5RdWV1ZV8yPWNhc3Q9dm9pZCAqCi0KLU9TX0ZpbmRXaW5kb3c9Ci1PU19GaW5kV2luZG93XzA9Y2FzdD0oUG9pbnQgKiksZmxhZ3M9c3RydWN0Ci1PU19GaW5kV2luZG93XzE9Y2FzdD0oV2luZG93UmVmICopCi0KLU9TX0ZpeDJMb25nPQotT1NfRml4MkxvbmdfMD0KLQotT1NfRml4Mlg9Ci1PU19GaXgyWF8wPWNhc3Q9Rml4ZWQKLQotT1NfRnJvbnRXaW5kb3c9Ci0KLU9TX0dlc3RhbHQ9Ci1PU19HZXN0YWx0XzA9Y2FzdD1PU1R5cGUKLU9TX0dlc3RhbHRfMT1jYXN0PWxvbmcgKgotCi1PU19HZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0PQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dBdHRyaWJ1dGVzPQotT1NfR2V0QXZhaWxhYmxlV2luZG93QXR0cmlidXRlc18wPWNhc3Q9KFdpbmRvd0NsYXNzKQotCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcz0KLU9TX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzXzA9Y2FzdD0oR0RIYW5kbGUpCi1PU19HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0QmVzdENvbnRyb2xSZWN0PQotT1NfR2V0QmVzdENvbnRyb2xSZWN0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8xPWNhc3Q9KFJlY3QgKikKLU9TX0dldEJlc3RDb250cm9sUmVjdF8yPWNhc3Q9KFNJbnQxNiAqKQotCi1PU19HZXRDYXJldFRpbWU9Ci0KLU9TX0dldENsaXA9Ci1PU19HZXRDbGlwXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19HZXRDb250cm9sMzJCaXRNYXhpbXVtPQotT1NfR2V0Q29udHJvbDMyQml0TWF4aW11bV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2wzMkJpdE1pbmltdW09Ci1PU19HZXRDb250cm9sMzJCaXRNaW5pbXVtXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfR2V0Q29udHJvbDMyQml0VmFsdWU9Ci1PU19HZXRDb250cm9sMzJCaXRWYWx1ZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xBY3Rpb249Ci1PU19HZXRDb250cm9sQWN0aW9uXzA9Y2FzdD1Db250cm9sUmVmCi0KLU9TX0dldENvbnRyb2xCb3VuZHM9Ci1PU19HZXRDb250cm9sQm91bmRzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xCb3VuZHNfMT1jYXN0PShSZWN0ICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfM0lfNT0KLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xGb250U3R5bGVSZWNfMl8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEZvbnRTdHlsZVJlY18yXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRm9udFN0eWxlUmVjXzJfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTG9uZ0RhdGVSZWNfMl8zST0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTG9uZ0RhdGVSZWNfMl8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xvbmdEYXRlUmVjXzJfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xvbmdEYXRlUmVjXzJfM0lfMj1jYXN0PShSZXNUeXBlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Mb25nRGF0ZVJlY18yXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTG9uZ0RhdGVSZWNfMl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTG9uZ0RhdGVSZWNfMl8zSV81PWNhc3Q9KFNpemUgKikKLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJPQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0JfM0lfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zSV8zPWNhc3Q9KFNpemUpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zQl8zSV80PWNhc3Q9KHZvaWQgKikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNCXzNJXzU9Y2FzdD0oU2l6ZSAqKQotCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zST0KLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNJXzNJXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0lfMj1jYXN0PShSZXNUeXBlKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0lfMz1jYXN0PShTaXplKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM0lfM0lfND1jYXN0PSh2b2lkICopCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zSV8zSV81PWNhc3Q9KFNpemUgKikKLQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0k9Ci1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRGF0YV9fSVNJSV8zU18zSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJXzM9Y2FzdD0oU2l6ZSkKLU9TX0dldENvbnRyb2xEYXRhX19JU0lJXzNTXzNJXzQ9Y2FzdD0odm9pZCAqKQotT1NfR2V0Q29udHJvbERhdGFfX0lTSUlfM1NfM0lfNT1jYXN0PShTaXplICopCi0KLU9TX0dldENvbnRyb2xFdmVudFRhcmdldD0KLU9TX0dldENvbnRyb2xFdmVudFRhcmdldF8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xGZWF0dXJlcz0KLU9TX0dldENvbnRyb2xGZWF0dXJlc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sRmVhdHVyZXNfMT1jYXN0PVVJbnQzMiAqCi0KLU9TX0dldENvbnRyb2xLaW5kPQotT1NfR2V0Q29udHJvbEtpbmRfMD1jYXN0PUNvbnRyb2xSZWYKLU9TX0dldENvbnRyb2xLaW5kXzE9Ci0KLU9TX0dldENvbnRyb2xPd25lcj0KLU9TX0dldENvbnRyb2xPd25lcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xQcm9wZXJ0eT0KLU9TX0dldENvbnRyb2xQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRDb250cm9sUHJvcGVydHlfMT0KLU9TX0dldENvbnRyb2xQcm9wZXJ0eV8yPQotT1NfR2V0Q29udHJvbFByb3BlcnR5XzM9Ci1PU19HZXRDb250cm9sUHJvcGVydHlfND1jYXN0PVVJbnQzMiAqCi1PU19HZXRDb250cm9sUHJvcGVydHlfNT1jYXN0PXZvaWQgKgotCi1PU19HZXRDb250cm9sUmVmZXJlbmNlPQotT1NfR2V0Q29udHJvbFJlZmVyZW5jZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0dldENvbnRyb2xSZWdpb249Ci1PU19HZXRDb250cm9sUmVnaW9uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldENvbnRyb2xSZWdpb25fMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19HZXRDb250cm9sUmVnaW9uXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19HZXRDb250cm9sVmFsdWU9Ci1PU19HZXRDb250cm9sVmFsdWVfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDb250cm9sVmlld1NpemU9Ci1PU19HZXRDb250cm9sVmlld1NpemVfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19HZXRDdXJyZW50RXZlbnRCdXR0b25TdGF0ZT0KLQotT1NfR2V0Q3VycmVudEV2ZW50S2V5TW9kaWZpZXJzPQotCi1PU19HZXRDdXJyZW50RXZlbnRMb29wPQotCi1PU19HZXRDdXJyZW50RXZlbnRRdWV1ZT0KLQotT1NfR2V0Q3VycmVudFByb2Nlc3M9Ci1PU19HZXRDdXJyZW50UHJvY2Vzc18wPWNhc3Q9KFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLQotT1NfR2V0Q3VycmVudFNjcmFwPQotT1NfR2V0Q3VycmVudFNjcmFwXzA9Y2FzdD0oU2NyYXBSZWYgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJDYWxsYmFja3M9Ci1PU19HZXREYXRhQnJvd3NlckNhbGxiYWNrc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlckNhbGxiYWNrc18xPWNhc3Q9KERhdGFCcm93c2VyQ2FsbGJhY2tzICopCi0KLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50PQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnRfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzI9Y2FzdD0oQm9vbGVhbikKLU9TX0dldERhdGFCcm93c2VySXRlbUNvdW50XzM9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtU3RhdGUpCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1Db3VudF80PWNhc3Q9KFVJbnQzMiAqKQotCi1PU19HZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWU9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1EYXRhQnV0dG9uVmFsdWVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzE9Y2FzdD1UaGVtZUJ1dHRvblZhbHVlICoKLQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcz0KLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kc18xPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kc18yPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfMz1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5UGFydCkKLU9TX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHNfND1jYXN0PShSZWN0ICopCi0KLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlPQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGVfMT0KLU9TX0dldERhdGFCcm93c2VySXRlbVN0YXRlXzI9Y2FzdD1EYXRhQnJvd3Nlckl0ZW1TdGF0ZSAqCi0KLU9TX0dldERhdGFCcm93c2VySXRlbXM9Ci1PU19HZXREYXRhQnJvd3Nlckl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VySXRlbXNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX0dldERhdGFCcm93c2VySXRlbXNfMj1jYXN0PShCb29sZWFuKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtc18zPWNhc3Q9KERhdGFCcm93c2VySXRlbVN0YXRlKQotT1NfR2V0RGF0YUJyb3dzZXJJdGVtc180PWNhc3Q9KEhhbmRsZSkKLQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW49Ci1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbl8wPWNhc3Q9Q29udHJvbFJlZgotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW5fMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEICopCi1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbl8yPWNhc3Q9Qm9vbGVhbiAqCi0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQ9Ci1PU19HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHRfMT1jYXN0PVVJbnQxNiAqCi0KLU9TX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjPQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEKQotT1NfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMj1jYXN0PShEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYyAqKQotCi1PU19HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3M9Ci1PU19HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzE9Y2FzdD1EYXRhQnJvd3NlclByb3BlcnR5SUQKLU9TX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFnc18yPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlGbGFncyAqKQotCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0PQotT1NfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0XzE9Ci0KLU9TX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb249Ci1PU19HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb25fMT1jYXN0PShVSW50MzIgKikKLU9TX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb25fMj1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3I9Ci1PU19HZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcl8xPWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JfMj1jYXN0PShVSW50MzIgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncz0KLU9TX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFnc18xPWNhc3Q9RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyAqCi0KLU9TX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5PQotT1NfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHlfMD1jYXN0PShDb250cm9sUmVmKQotT1NfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHlfMT1jYXN0PURhdGFCcm93c2VyUHJvcGVydHlJRCAqCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb249Ci1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEKQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbl8yPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSW5kZXggKikKLQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQ9Ci1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRF8xPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Um93SW5kZXgpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRF8yPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEICopCi0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdz0KLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld1Jvd0luZGV4KQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93XzI9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoPQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8xPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSUQpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMj1jYXN0PShVSW50MTYgKikKLQotT1NfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQ9Ci1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodF8xPWNhc3Q9KFVJbnQxNiAqKQotCi1PU19HZXREYmxUaW1lPQotCi1PU19HZXREZXZpY2VMaXN0PQotCi1PU19HZXREcmFnQWxsb3dhYmxlQWN0aW9ucz0KLU9TX0dldERyYWdBbGxvd2FibGVBY3Rpb25zXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldERyYWdBbGxvd2FibGVBY3Rpb25zXzE9Y2FzdD0oRHJhZ0FjdGlvbnMgKikKLQotT1NfR2V0RHJhZ0Ryb3BBY3Rpb249Ci1PU19HZXREcmFnRHJvcEFjdGlvbl8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXREcmFnRHJvcEFjdGlvbl8xPWNhc3Q9KERyYWdBY3Rpb25zICopCi0KLU9TX0dldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyPQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXJfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXJfMT0KLU9TX0dldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyXzI9Y2FzdD0oRHJhZ0l0ZW1SZWYgKikKLQotT1NfR2V0RHJhZ01vZGlmaWVycz0KLU9TX0dldERyYWdNb2RpZmllcnNfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0RHJhZ01vZGlmaWVyc18xPWNhc3Q9KFNJbnQxNiAqKQotT1NfR2V0RHJhZ01vZGlmaWVyc18yPWNhc3Q9KFNJbnQxNiAqKQotT1NfR2V0RHJhZ01vZGlmaWVyc18zPWNhc3Q9KFNJbnQxNiAqKQotCi1PU19HZXREcmFnTW91c2U9Ci1PU19HZXREcmFnTW91c2VfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0RHJhZ01vdXNlXzE9Y2FzdD0oUG9pbnQgKikKLU9TX0dldERyYWdNb3VzZV8yPWNhc3Q9KFBvaW50ICopCi0KLU9TX0dldEV2ZW50Q2xhc3M9Ci1PU19HZXRFdmVudENsYXNzXzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0dldEV2ZW50RGlzcGF0Y2hlclRhcmdldD0KLQotT1NfR2V0RXZlbnRLaW5kPQotT1NfR2V0RXZlbnRLaW5kXzA9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzA9Y2FzdD1FdmVudFJlZgotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl8xPWNhc3Q9RXZlbnRQYXJhbU5hbWUKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfMj1jYXN0PUV2ZW50UGFyYW1UeXBlCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzM9Y2FzdD1FdmVudFBhcmFtVHlwZSAqCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUmVjdF8yXzQ9Y2FzdD0oVUludDMyKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1JlY3RfMl81PWNhc3Q9VUludDMyICoKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dSZWN0XzJfNj1jYXN0PXZvaWQgKgotCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl8wPWNhc3Q9KEV2ZW50UmVmKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl8zPWNhc3Q9KEV2ZW50UGFyYW1UeXBlICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzQ9Y2FzdD0oVUludDMyKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMl82PWNhc3Q9KHZvaWQgKikKLQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzM9Y2FzdD0oRXZlbnRQYXJhbVR5cGUgKikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl80PWNhc3Q9KFVJbnQzMikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzY9Y2FzdD0odm9pZCAqKQotCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzI9Ci1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3JfMl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yXzQ9Y2FzdD0oVUludDMyKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8yXzU9Y2FzdD0oVUludDMyICopCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNCXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0JfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNDXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ18yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zQ181PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0NfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNJXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zSV81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM0lfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNTXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU18yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zU181PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1NfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNaPQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1pfMD1jYXN0PShFdmVudFJlZikKLU9TX0dldEV2ZW50UGFyYW1ldGVyX19JSUlfM0lJXzNJXzNaXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zWl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1pfMz1jYXN0PShFdmVudFBhcmFtVHlwZSAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1pfND1jYXN0PShVSW50MzIpCi1PU19HZXRFdmVudFBhcmFtZXRlcl9fSUlJXzNJSV8zSV8zWl81PWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0RXZlbnRQYXJhbWV0ZXJfX0lJSV8zSUlfM0lfM1pfNj1jYXN0PSh2b2lkICopCi0KLU9TX0dldEV2ZW50VGltZT0KLU9TX0dldEV2ZW50VGltZV8wPWNhc3Q9KEV2ZW50UmVmKQotCi1PU19HZXRGbGF2b3JEYXRhPQotT1NfR2V0Rmxhdm9yRGF0YV8wPWNhc3Q9KERyYWdSZWYpCi1PU19HZXRGbGF2b3JEYXRhXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19HZXRGbGF2b3JEYXRhXzI9Y2FzdD0oRmxhdm9yVHlwZSkKLU9TX0dldEZsYXZvckRhdGFfMz1jYXN0PSh2b2lkICopCi1PU19HZXRGbGF2b3JEYXRhXzQ9Y2FzdD0oU2l6ZSAqKQotT1NfR2V0Rmxhdm9yRGF0YV81PQotCi1PU19HZXRGbGF2b3JEYXRhU2l6ZT0KLU9TX0dldEZsYXZvckRhdGFTaXplXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX0dldEZsYXZvckRhdGFTaXplXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19HZXRGbGF2b3JEYXRhU2l6ZV8yPWNhc3Q9KEZsYXZvclR5cGUpCi1PU19HZXRGbGF2b3JEYXRhU2l6ZV8zPWNhc3Q9KFNpemUgKikKLQotT1NfR2V0Rmxhdm9yVHlwZT0KLU9TX0dldEZsYXZvclR5cGVfMD1jYXN0PShEcmFnUmVmKQotT1NfR2V0Rmxhdm9yVHlwZV8xPWNhc3Q9KERyYWdJdGVtUmVmKQotT1NfR2V0Rmxhdm9yVHlwZV8yPQotT1NfR2V0Rmxhdm9yVHlwZV8zPWNhc3Q9KEZsYXZvclR5cGUgKikKLQotT1NfR2V0R1dvcmxkPQotT1NfR2V0R1dvcmxkXzA9Y2FzdD0oQ0dyYWZQdHIgKikKLU9TX0dldEdXb3JsZF8xPWNhc3Q9KEdESGFuZGxlICopCi0KLU9TX0dldEdsb2JhbE1vdXNlPQotT1NfR2V0R2xvYmFsTW91c2VfMD1jYXN0PShQb2ludCAqKQotCi1PU19HZXRIYW5kbGVTaXplPQotT1NfR2V0SGFuZGxlU2l6ZV8wPWNhc3Q9KEhhbmRsZSkKLQotT1NfR2V0SWNvbkZhbWlseURhdGE9Ci1PU19HZXRJY29uRmFtaWx5RGF0YV8wPWNhc3Q9SWNvbkZhbWlseUhhbmRsZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMT1jYXN0PU9TVHlwZQotT1NfR2V0SWNvbkZhbWlseURhdGFfMj1jYXN0PShIYW5kbGUpCi0KLU9TX0dldEljb25SZWY9Ci1PU19HZXRJY29uUmVmXzA9Y2FzdD0oU0ludDE2KQotT1NfR2V0SWNvblJlZl8xPWNhc3Q9KE9TVHlwZSkKLU9TX0dldEljb25SZWZfMj1jYXN0PShPU1R5cGUpCi1PU19HZXRJY29uUmVmXzM9Y2FzdD0oSWNvblJlZiAqKQotCi1PU19HZXRJY29uUmVmRnJvbUZpbGVJbmZvPQotT1NfR2V0SWNvblJlZkZyb21GaWxlSW5mb18wPWNhc3Q9Y29uc3QgRlNSZWYgKgotT1NfR2V0SWNvblJlZkZyb21GaWxlSW5mb18xPQotT1NfR2V0SWNvblJlZkZyb21GaWxlSW5mb18yPWNhc3Q9Y29uc3QgVW5pQ2hhciAqCi1PU19HZXRJY29uUmVmRnJvbUZpbGVJbmZvXzM9Y2FzdD1GU0NhdGFsb2dJbmZvQml0bWFwCi1PU19HZXRJY29uUmVmRnJvbUZpbGVJbmZvXzQ9Y2FzdD1jb25zdCBGU0NhdGFsb2dJbmZvICoKLU9TX0dldEljb25SZWZGcm9tRmlsZUluZm9fNT0KLU9TX0dldEljb25SZWZGcm9tRmlsZUluZm9fNj1jYXN0PUljb25SZWYgKgotT1NfR2V0SWNvblJlZkZyb21GaWxlSW5mb183PWNhc3Q9U0ludDE2ICoKLQotT1NfR2V0SWNvblJlZkZyb21JY29uRmFtaWx5UHRyPWZsYWdzPWR5bmFtaWMKLU9TX0dldEljb25SZWZGcm9tSWNvbkZhbWlseVB0cl8wPQotT1NfR2V0SWNvblJlZkZyb21JY29uRmFtaWx5UHRyXzE9Ci1PU19HZXRJY29uUmVmRnJvbUljb25GYW1pbHlQdHJfMj0KLQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEPQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzI9Y2FzdD0oVUludDMyKQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzM9Y2FzdD0oTWVudVJlZiAqKQotT1NfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEXzQ9Y2FzdD0oTWVudUl0ZW1JbmRleCAqKQotCi1PU19HZXRJbmRleGVkU3ViQ29udHJvbD0KLU9TX0dldEluZGV4ZWRTdWJDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0dldEluZGV4ZWRTdWJDb250cm9sXzE9Y2FzdD0oVUludDE2KQotT1NfR2V0SW5kZXhlZFN1YkNvbnRyb2xfMj1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0dldEl0ZW1NYXJrPQotT1NfR2V0SXRlbU1hcmtfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0SXRlbU1hcmtfMT0KLU9TX0dldEl0ZW1NYXJrXzI9Ci0KLU9TX0dldEtleWJvYXJkRm9jdXM9Ci1PU19HZXRLZXlib2FyZEZvY3VzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0S2V5Ym9hcmRGb2N1c18xPWNhc3Q9KENvbnRyb2xSZWYgKikKLQotT1NfR2V0TGFzdFVzZXJFdmVudFRpbWU9Ci0KLU9TX0dldE1CYXJIZWlnaHQ9Ci0KLU9TX0dldE1haW5EZXZpY2U9Ci0KLU9TX0dldE1haW5FdmVudFF1ZXVlPQotCi1PU19HZXRNZW51Q29tbWFuZE1hcms9Ci1PU19HZXRNZW51Q29tbWFuZE1hcmtfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudUNvbW1hbmRNYXJrXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19HZXRNZW51Q29tbWFuZE1hcmtfMj1jYXN0PShVbmlDaGFyICopCi0KLU9TX0dldE1lbnVFdmVudFRhcmdldD0KLU9TX0dldE1lbnVFdmVudFRhcmdldF8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX0dldE1lbnVGb250PQotT1NfR2V0TWVudUZvbnRfMD1jYXN0PShNZW51UmVmKQotT1NfR2V0TWVudUZvbnRfMT1jYXN0PShTSW50MTYgKikKLU9TX0dldE1lbnVGb250XzI9Y2FzdD0oVUludDE2ICopCi0KLU9TX0dldE1lbnVIZWlnaHQ9Ci1PU19HZXRNZW51SGVpZ2h0XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfR2V0TWVudUlEPQotT1NfR2V0TWVudUlEXzA9Y2FzdD0oTWVudVJlZikKLQotT1NfR2V0TWVudUl0ZW1Db21tYW5kSUQ9Ci1PU19HZXRNZW51SXRlbUNvbW1hbmRJRF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51SXRlbUNvbW1hbmRJRF8xPWNhc3Q9KFNJbnQxNikKLU9TX0dldE1lbnVJdGVtQ29tbWFuZElEXzI9Y2FzdD0oTWVudUNvbW1hbmQgKikKLQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51PQotT1NfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudV8xPWNhc3Q9KFNJbnQxNikKLU9TX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudV8yPWNhc3Q9KE1lbnVSZWYgKikKLQotT1NfR2V0TWVudUl0ZW1SZWZDb249Ci1PU19HZXRNZW51SXRlbVJlZkNvbl8wPWNhc3Q9KE1lbnVSZWYpCi1PU19HZXRNZW51SXRlbVJlZkNvbl8xPWNhc3Q9KFNJbnQxNikKLU9TX0dldE1lbnVJdGVtUmVmQ29uXzI9Y2FzdD0oVUludDMyICopCi0KLU9TX0dldE1lbnVUcmFja2luZ0RhdGE9Ci1PU19HZXRNZW51VHJhY2tpbmdEYXRhXzA9Y2FzdD0oTWVudVJlZikKLU9TX0dldE1lbnVUcmFja2luZ0RhdGFfMT0KLQotT1NfR2V0TWVudVdpZHRoPQotT1NfR2V0TWVudVdpZHRoXzA9Y2FzdD0oTWVudVJlZikKLQotT1NfR2V0TW91c2U9Ci1PU19HZXRNb3VzZV8wPWNhc3Q9KFBvaW50ICopCi0KLU9TX0dldE5leHREZXZpY2U9Ci1PU19HZXROZXh0RGV2aWNlXzA9Y2FzdD0oR0RIYW5kbGUpCi0KLU9TX0dldE5leHRXaW5kb3c9Ci1PU19HZXROZXh0V2luZG93XzA9Y2FzdD1XaW5kb3dSZWYKLQotT1NfR2V0UGl4RGVwdGg9Ci1PU19HZXRQaXhEZXB0aF8wPWNhc3Q9KFBpeE1hcEhhbmRsZSkKLQotT1NfR2V0UG9ydD0KLU9TX0dldFBvcnRfMD1jYXN0PShHcmFmUHRyICopCi0KLU9TX0dldFBvcnRCaXRNYXBGb3JDb3B5Qml0cz0KLU9TX0dldFBvcnRCaXRNYXBGb3JDb3B5Qml0c18wPWNhc3Q9KENHcmFmUHRyKQotCi1PU19HZXRQb3J0Qm91bmRzPQotT1NfR2V0UG9ydEJvdW5kc18wPWNhc3Q9KENHcmFmUHRyKQotT1NfR2V0UG9ydEJvdW5kc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0UHJldmlvdXNXaW5kb3c9Ci1PU19HZXRQcmV2aW91c1dpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfR2V0UHRyU2l6ZT0KLU9TX0dldFB0clNpemVfMD1jYXN0PShQdHIpCi0KLU9TX0dldFJlZ2lvbkJvdW5kcz0KLU9TX0dldFJlZ2lvbkJvdW5kc18wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX0dldFJlZ2lvbkJvdW5kc18xPWNhc3Q9KFJlY3QgKikKLQotT1NfR2V0Um9vdENvbnRyb2w9Ci1PU19HZXRSb290Q29udHJvbF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFJvb3RDb250cm9sXzE9Y2FzdD0oQ29udHJvbFJlZiAqKQotCi1PU19HZXRTY3JhcEZsYXZvckNvdW50PQotT1NfR2V0U2NyYXBGbGF2b3JDb3VudF8wPWNhc3Q9KFNjcmFwUmVmKQotT1NfR2V0U2NyYXBGbGF2b3JDb3VudF8xPWNhc3Q9KFVJbnQzMiAqKQotCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNCPQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQl8wPWNhc3Q9KFNjcmFwUmVmKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQl8xPWNhc3Q9KFNjcmFwRmxhdm9yVHlwZSkKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0JfMj1jYXN0PShTaXplICopCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNCXzM9Y2FzdD0odm9pZCAqKQotCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNDPQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQ18wPWNhc3Q9KFNjcmFwUmVmKQotT1NfR2V0U2NyYXBGbGF2b3JEYXRhX19JSV8zSV8zQ18xPWNhc3Q9KFNjcmFwRmxhdm9yVHlwZSkKLU9TX0dldFNjcmFwRmxhdm9yRGF0YV9fSUlfM0lfM0NfMj1jYXN0PShTaXplICopCi1PU19HZXRTY3JhcEZsYXZvckRhdGFfX0lJXzNJXzNDXzM9Y2FzdD0odm9pZCAqKQotCi1PU19HZXRTY3JhcEZsYXZvckluZm9MaXN0PQotT1NfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdF8wPWNhc3Q9KFNjcmFwUmVmKQotT1NfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdF8xPWNhc3Q9KFVJbnQzMiAqKQotT1NfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdF8yPWNhc3Q9KFNjcmFwRmxhdm9ySW5mbyAqKQotCi1PU19HZXRTY3JhcEZsYXZvclNpemU9Ci1PU19HZXRTY3JhcEZsYXZvclNpemVfMD1jYXN0PShTY3JhcFJlZikKLU9TX0dldFNjcmFwRmxhdm9yU2l6ZV8xPWNhc3Q9KFNjcmFwRmxhdm9yVHlwZSkKLU9TX0dldFNjcmFwRmxhdm9yU2l6ZV8yPWNhc3Q9KFNpemUgKikKLQotT1NfR2V0U2NyaXB0TWFuYWdlclZhcmlhYmxlPQotT1NfR2V0U2NyaXB0TWFuYWdlclZhcmlhYmxlXzA9Ci0KLU9TX0dldFN1cGVyQ29udHJvbD0KLU9TX0dldFN1cGVyQ29udHJvbF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19HZXRTdXBlckNvbnRyb2xfMT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0dldFRhYkNvbnRlbnRSZWN0PQotT1NfR2V0VGFiQ29udGVudFJlY3RfMD1jYXN0PUNvbnRyb2xSZWYKLU9TX0dldFRhYkNvbnRlbnRSZWN0XzE9Ci0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yPQotT1NfR2V0VGhlbWVCcnVzaEFzQ29sb3JfMD0KLU9TX0dldFRoZW1lQnJ1c2hBc0NvbG9yXzE9Ci1PU19HZXRUaGVtZUJydXNoQXNDb2xvcl8yPQotT1NfR2V0VGhlbWVCcnVzaEFzQ29sb3JfMz0KLQotT1NfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzPQotT1NfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzXzA9Ci1PU19HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHNfMT0KLU9TX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kc18yPQotT1NfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzXzM9Ci0KLU9TX0dldFRoZW1lQnV0dG9uUmVnaW9uPQotT1NfR2V0VGhlbWVCdXR0b25SZWdpb25fMD0KLU9TX0dldFRoZW1lQnV0dG9uUmVnaW9uXzE9Ci1PU19HZXRUaGVtZUJ1dHRvblJlZ2lvbl8yPQotT1NfR2V0VGhlbWVCdXR0b25SZWdpb25fMz1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX0dldFRoZW1lRHJhd2luZ1N0YXRlPQotT1NfR2V0VGhlbWVEcmF3aW5nU3RhdGVfMD1jYXN0PShUaGVtZURyYXdpbmdTdGF0ZSAqKQotCi1PU19HZXRUaGVtZUZvbnQ9Ci1PU19HZXRUaGVtZUZvbnRfMD1jYXN0PShUaGVtZUZvbnRJRCkKLU9TX0dldFRoZW1lRm9udF8xPWNhc3Q9KFNjcmlwdENvZGUpCi1PU19HZXRUaGVtZUZvbnRfMj1jYXN0PSh1bnNpZ25lZCBjaGFyICopCi1PU19HZXRUaGVtZUZvbnRfMz1jYXN0PShTSW50MTYgKikKLU9TX0dldFRoZW1lRm9udF80PWNhc3Q9KFN0eWxlICopCi0KLU9TX0dldFRoZW1lTWVudUl0ZW1FeHRyYT0KLU9TX0dldFRoZW1lTWVudUl0ZW1FeHRyYV8wPQotT1NfR2V0VGhlbWVNZW51SXRlbUV4dHJhXzE9Ci1PU19HZXRUaGVtZU1lbnVJdGVtRXh0cmFfMj0KLQotT1NfR2V0VGhlbWVNZXRyaWM9Ci1PU19HZXRUaGVtZU1ldHJpY18wPQotT1NfR2V0VGhlbWVNZXRyaWNfMT0KLQotT1NfR2V0VGhlbWVUZXh0Q29sb3I9Ci1PU19HZXRUaGVtZVRleHRDb2xvcl8wPQotT1NfR2V0VGhlbWVUZXh0Q29sb3JfMT0KLU9TX0dldFRoZW1lVGV4dENvbG9yXzI9Ci1PU19HZXRUaGVtZVRleHRDb2xvcl8zPQotCi1PU19HZXRUaGVtZVRleHREaW1lbnNpb25zPQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc18wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc18xPWNhc3Q9KFRoZW1lRm9udElEKQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc18yPWNhc3Q9KFRoZW1lRHJhd1N0YXRlKQotT1NfR2V0VGhlbWVUZXh0RGltZW5zaW9uc18zPWNhc3Q9KEJvb2xlYW4pCi1PU19HZXRUaGVtZVRleHREaW1lbnNpb25zXzQ9Y2FzdD0oUG9pbnQgKikKLU9TX0dldFRoZW1lVGV4dERpbWVuc2lvbnNfNT1jYXN0PShTSW50MTYgKikKLQotT1NfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQ9Ci0KLU9TX0dldFVzZXJGb2N1c1dpbmRvdz0KLQotT1NfR2V0V2luZG93QWN0aXZhdGlvblNjb3BlPQotT1NfR2V0V2luZG93QWN0aXZhdGlvblNjb3BlXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93QWN0aXZhdGlvblNjb3BlXzE9Y2FzdD0oV2luZG93QWN0aXZhdGlvblNjb3BlICopCi0KLU9TX0dldFdpbmRvd0JvdW5kcz0KLU9TX0dldFdpbmRvd0JvdW5kc18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd0JvdW5kc18xPWNhc3Q9KFdpbmRvd1JlZ2lvbkNvZGUpCi1PU19HZXRXaW5kb3dCb3VuZHNfMj1jYXN0PShSZWN0ICopCi0KLU9TX0dldFdpbmRvd0NsYXNzPQotT1NfR2V0V2luZG93Q2xhc3NfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dDbGFzc18xPWNhc3Q9V2luZG93Q2xhc3MgKgotCi1PU19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uPQotT1NfR2V0V2luZG93RGVmYXVsdEJ1dHRvbl8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0dldFdpbmRvd0RlZmF1bHRCdXR0b25fMT1jYXN0PShDb250cm9sUmVmICopCi0KLU9TX0dldFdpbmRvd0V2ZW50VGFyZ2V0PQotT1NfR2V0V2luZG93RXZlbnRUYXJnZXRfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0dldFdpbmRvd0Zyb21Qb3J0PQotT1NfR2V0V2luZG93RnJvbVBvcnRfMD1jYXN0PShDR3JhZlB0cikKLQotT1NfR2V0V2luZG93R3JvdXBPZkNsYXNzPQotT1NfR2V0V2luZG93R3JvdXBPZkNsYXNzXzA9Ci0KLU9TX0dldFdpbmRvd0xpc3Q9Ci0KLU9TX0dldFdpbmRvd01vZGFsaXR5PQotT1NfR2V0V2luZG93TW9kYWxpdHlfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19HZXRXaW5kb3dNb2RhbGl0eV8xPWNhc3Q9KFdpbmRvd01vZGFsaXR5ICopCi1PU19HZXRXaW5kb3dNb2RhbGl0eV8yPWNhc3Q9KFdpbmRvd1JlZiAqKQotCi1PU19HZXRXaW5kb3dQb3J0PQotT1NfR2V0V2luZG93UG9ydF8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfR2V0V2luZG93UmVnaW9uPQotT1NfR2V0V2luZG93UmVnaW9uXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93UmVnaW9uXzE9Y2FzdD0oV2luZG93UmVnaW9uQ29kZSkKLU9TX0dldFdpbmRvd1JlZ2lvbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfR2V0V2luZG93UmVzaXplTGltaXRzPQotT1NfR2V0V2luZG93UmVzaXplTGltaXRzXzA9Y2FzdD1XaW5kb3dSZWYKLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0c18xPWNhc3Q9SElTaXplICoKLU9TX0dldFdpbmRvd1Jlc2l6ZUxpbWl0c18yPWNhc3Q9SElTaXplICoKLQotT1NfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzPQotT1NfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzXzE9Y2FzdD0oUmVjdCAqKQotCi1PU19ISUNvbWJvQm94QXBwZW5kVGV4dEl0ZW09Ci1PU19ISUNvbWJvQm94QXBwZW5kVGV4dEl0ZW1fMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISUNvbWJvQm94QXBwZW5kVGV4dEl0ZW1fMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJQ29tYm9Cb3hBcHBlbmRUZXh0SXRlbV8yPWNhc3Q9KENGSW5kZXggKikKLQotT1NfSElDb21ib0JveENvcHlUZXh0SXRlbUF0SW5kZXg9Ci1PU19ISUNvbWJvQm94Q29weVRleHRJdGVtQXRJbmRleF8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJQ29tYm9Cb3hDb3B5VGV4dEl0ZW1BdEluZGV4XzE9Y2FzdD0oQ0ZJbmRleCkKLU9TX0hJQ29tYm9Cb3hDb3B5VGV4dEl0ZW1BdEluZGV4XzI9Y2FzdD0oQ0ZTdHJpbmdSZWYgKikKLQotT1NfSElDb21ib0JveENyZWF0ZT0KLU9TX0hJQ29tYm9Cb3hDcmVhdGVfMD1jYXN0PShjb25zdCBISVJlY3QgKikKLU9TX0hJQ29tYm9Cb3hDcmVhdGVfMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJQ29tYm9Cb3hDcmVhdGVfMj1jYXN0PShjb25zdCBDb250cm9sRm9udFN0eWxlUmVjICopCi1PU19ISUNvbWJvQm94Q3JlYXRlXzM9Y2FzdD0oQ0ZBcnJheVJlZikKLU9TX0hJQ29tYm9Cb3hDcmVhdGVfND1jYXN0PShPcHRpb25CaXRzKQotT1NfSElDb21ib0JveENyZWF0ZV81PWNhc3Q9KEhJVmlld1JlZiAqKQotCi1PU19ISUNvbWJvQm94R2V0SXRlbUNvdW50PQotT1NfSElDb21ib0JveEdldEl0ZW1Db3VudF8wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElDb21ib0JveEluc2VydFRleHRJdGVtQXRJbmRleD0KLU9TX0hJQ29tYm9Cb3hJbnNlcnRUZXh0SXRlbUF0SW5kZXhfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISUNvbWJvQm94SW5zZXJ0VGV4dEl0ZW1BdEluZGV4XzE9Y2FzdD0oQ0ZJbmRleCkKLU9TX0hJQ29tYm9Cb3hJbnNlcnRUZXh0SXRlbUF0SW5kZXhfMj1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfSElDb21ib0JveFJlbW92ZUl0ZW1BdEluZGV4PQotT1NfSElDb21ib0JveFJlbW92ZUl0ZW1BdEluZGV4XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElDb21ib0JveFJlbW92ZUl0ZW1BdEluZGV4XzE9Y2FzdD0oQ0ZJbmRleCkKLQotT1NfSElDb3B5QWNjZXNzaWJpbGl0eVJvbGVEZXNjcmlwdGlvbj0KLU9TX0hJQ29weUFjY2Vzc2liaWxpdHlSb2xlRGVzY3JpcHRpb25fMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJQ29weUFjY2Vzc2liaWxpdHlSb2xlRGVzY3JpcHRpb25fMT1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfSElDcmVhdGVUcmFuc2Zvcm1lZENHSW1hZ2U9ZmxhZ3M9ZHluYW1pYwotT1NfSElDcmVhdGVUcmFuc2Zvcm1lZENHSW1hZ2VfMD1jYXN0PUNHSW1hZ2VSZWYKLU9TX0hJQ3JlYXRlVHJhbnNmb3JtZWRDR0ltYWdlXzE9Ci1PU19ISUNyZWF0ZVRyYW5zZm9ybWVkQ0dJbWFnZV8yPWNhc3Q9Q0dJbWFnZVJlZiAqCi0KLU9TX0hJT2JqZWN0Q29weUNsYXNzSUQ9Ci1PU19ISU9iamVjdENvcHlDbGFzc0lEXzA9Y2FzdD0oSElPYmplY3RSZWYpCi0KLU9TX0hJT2JqZWN0Q3JlYXRlPQotT1NfSElPYmplY3RDcmVhdGVfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0hJT2JqZWN0Q3JlYXRlXzE9Y2FzdD0oRXZlbnRSZWYpCi1PU19ISU9iamVjdENyZWF0ZV8yPWNhc3Q9KEhJT2JqZWN0UmVmICopCi0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzcz0KLU9TX0hJT2JqZWN0UmVnaXN0ZXJTdWJjbGFzc18wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19ISU9iamVjdFJlZ2lzdGVyU3ViY2xhc3NfMj1jYXN0PShPcHRpb25CaXRzKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzM9Y2FzdD0oRXZlbnRIYW5kbGVyVVBQKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzQ9Y2FzdD0oVUludDMyKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzU9Y2FzdD0oY29uc3QgRXZlbnRUeXBlU3BlYyAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzY9Y2FzdD0odm9pZCAqKQotT1NfSElPYmplY3RSZWdpc3RlclN1YmNsYXNzXzc9Y2FzdD0oSElPYmplY3RDbGFzc1JlZiAqKQotCi1PU19ISVNjcm9sbFZpZXdDcmVhdGU9Ci1PU19ISVNjcm9sbFZpZXdDcmVhdGVfMD0KLU9TX0hJU2Nyb2xsVmlld0NyZWF0ZV8xPWNhc3Q9KEhJVmlld1JlZiopCi0KLU9TX0hJU2VhcmNoRmllbGRDaGFuZ2VBdHRyaWJ1dGVzPQotT1NfSElTZWFyY2hGaWVsZENoYW5nZUF0dHJpYnV0ZXNfMD1jYXN0PUhJVmlld1JlZgotT1NfSElTZWFyY2hGaWVsZENoYW5nZUF0dHJpYnV0ZXNfMT1jYXN0PU9wdGlvbkJpdHMKLU9TX0hJU2VhcmNoRmllbGRDaGFuZ2VBdHRyaWJ1dGVzXzI9Y2FzdD0oT3B0aW9uQml0cykKLQotT1NfSElTZWFyY2hGaWVsZENvcHlEZXNjcmlwdGl2ZVRleHQ9Ci1PU19ISVNlYXJjaEZpZWxkQ29weURlc2NyaXB0aXZlVGV4dF8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJU2VhcmNoRmllbGRDb3B5RGVzY3JpcHRpdmVUZXh0XzE9Y2FzdD1DRlN0cmluZ1JlZiAqCi0KLU9TX0hJU2VhcmNoRmllbGRDcmVhdGU9Ci1PU19ISVNlYXJjaEZpZWxkQ3JlYXRlXzA9Ci1PU19ISVNlYXJjaEZpZWxkQ3JlYXRlXzE9Ci1PU19ISVNlYXJjaEZpZWxkQ3JlYXRlXzI9Y2FzdD1NZW51UmVmCi1PU19ISVNlYXJjaEZpZWxkQ3JlYXRlXzM9Y2FzdD1DRlN0cmluZ1JlZgotT1NfSElTZWFyY2hGaWVsZENyZWF0ZV80PWNhc3Q9KEhJVmlld1JlZiopCi0KLU9TX0hJU2VhcmNoRmllbGRHZXRBdHRyaWJ1dGVzPQotT1NfSElTZWFyY2hGaWVsZEdldEF0dHJpYnV0ZXNfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVNlYXJjaEZpZWxkR2V0QXR0cmlidXRlc18xPWNhc3Q9T3B0aW9uQml0cyoKLQotT1NfSElTZWFyY2hGaWVsZFNldERlc2NyaXB0aXZlVGV4dD0KLU9TX0hJU2VhcmNoRmllbGRTZXREZXNjcmlwdGl2ZVRleHRfMD1jYXN0PUhJVmlld1JlZgotT1NfSElTZWFyY2hGaWVsZFNldERlc2NyaXB0aXZlVGV4dF8xPWNhc3Q9Q0ZTdHJpbmdSZWYKLQotT1NfSElUZXh0Vmlld0NyZWF0ZT0KLU9TX0hJVGV4dFZpZXdDcmVhdGVfMD0KLU9TX0hJVGV4dFZpZXdDcmVhdGVfMT0KLU9TX0hJVGV4dFZpZXdDcmVhdGVfMj0KLU9TX0hJVGV4dFZpZXdDcmVhdGVfMz1jYXN0PUhJVmlld1JlZiAqCi0KLU9TX0hJVGV4dFZpZXdHZXRUWE5PYmplY3Q9Ci1PU19ISVRleHRWaWV3R2V0VFhOT2JqZWN0XzA9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVRoZW1lRHJhd0JhY2tncm91bmQ9Ci1PU19ISVRoZW1lRHJhd0JhY2tncm91bmRfMD0KLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZF8xPQotT1NfSElUaGVtZURyYXdCYWNrZ3JvdW5kXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3QmFja2dyb3VuZF8zPQotCi1PU19ISVRoZW1lRHJhd0J1dHRvbj0KLU9TX0hJVGhlbWVEcmF3QnV0dG9uXzA9Y2FzdD0oY29uc3QgSElSZWN0ICopLGZsYWdzPW5vX291dAotT1NfSElUaGVtZURyYXdCdXR0b25fMT1jYXN0PShjb25zdCBISVRoZW1lQnV0dG9uRHJhd0luZm8gKikKLU9TX0hJVGhlbWVEcmF3QnV0dG9uXzI9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfSElUaGVtZURyYXdCdXR0b25fMz1jYXN0PShISVRoZW1lT3JpZW50YXRpb24pCi1PU19ISVRoZW1lRHJhd0J1dHRvbl80PWNhc3Q9KEhJUmVjdCAqKSxmbGFncz1ub19pbgotCi1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdD0KLU9TX0hJVGhlbWVEcmF3Rm9jdXNSZWN0XzA9Ci1PU19ISVRoZW1lRHJhd0ZvY3VzUmVjdF8xPQotT1NfSElUaGVtZURyYXdGb2N1c1JlY3RfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdGb2N1c1JlY3RfMz0KLQotT1NfSElUaGVtZURyYXdGcmFtZT0KLU9TX0hJVGhlbWVEcmF3RnJhbWVfMD0KLU9TX0hJVGhlbWVEcmF3RnJhbWVfMT0KLU9TX0hJVGhlbWVEcmF3RnJhbWVfMj1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElUaGVtZURyYXdGcmFtZV8zPQotCi1PU19ISVRoZW1lRHJhd0dlbmVyaWNXZWxsPQotT1NfSElUaGVtZURyYXdHZW5lcmljV2VsbF8wPWNhc3Q9KGNvbnN0IEhJUmVjdCAqKQotT1NfSElUaGVtZURyYXdHZW5lcmljV2VsbF8xPWNhc3Q9KGNvbnN0IEhJVGhlbWVCdXR0b25EcmF3SW5mbyAqKQotT1NfSElUaGVtZURyYXdHZW5lcmljV2VsbF8yPWNhc3Q9KENHQ29udGV4dFJlZikKLU9TX0hJVGhlbWVEcmF3R2VuZXJpY1dlbGxfMz1jYXN0PShISVRoZW1lT3JpZW50YXRpb24pCi0KLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3g9Ci1PU19ISVRoZW1lRHJhd0dyb3VwQm94XzA9Ci1PU19ISVRoZW1lRHJhd0dyb3VwQm94XzE9Ci1PU19ISVRoZW1lRHJhd0dyb3VwQm94XzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3R3JvdXBCb3hfMz0KLQotT1NfSElUaGVtZURyYXdHcm93Qm94PQotT1NfSElUaGVtZURyYXdHcm93Qm94XzA9Ci1PU19ISVRoZW1lRHJhd0dyb3dCb3hfMT0KLU9TX0hJVGhlbWVEcmF3R3Jvd0JveF8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd0dyb3dCb3hfMz0KLQotT1NfSElUaGVtZURyYXdQb3B1cEFycm93PQotT1NfSElUaGVtZURyYXdQb3B1cEFycm93XzA9Ci1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3dfMT0KLU9TX0hJVGhlbWVEcmF3UG9wdXBBcnJvd18yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd1BvcHVwQXJyb3dfMz0KLQotT1NfSElUaGVtZURyYXdTZXBhcmF0b3I9Ci1PU19ISVRoZW1lRHJhd1NlcGFyYXRvcl8wPQotT1NfSElUaGVtZURyYXdTZXBhcmF0b3JfMT0KLU9TX0hJVGhlbWVEcmF3U2VwYXJhdG9yXzI9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3U2VwYXJhdG9yXzM9Ci0KLU9TX0hJVGhlbWVEcmF3VGFiPQotT1NfSElUaGVtZURyYXdUYWJfMD1jYXN0PShjb25zdCBISVJlY3QgKiksZmxhZ3M9bm9fb3V0Ci1PU19ISVRoZW1lRHJhd1RhYl8xPWNhc3Q9KGNvbnN0IEhJVGhlbWVUYWJEcmF3SW5mbyAqKQotT1NfSElUaGVtZURyYXdUYWJfMj1jYXN0PShDR0NvbnRleHRSZWYpCi1PU19ISVRoZW1lRHJhd1RhYl8zPWNhc3Q9KEhJVGhlbWVPcmllbnRhdGlvbikKLU9TX0hJVGhlbWVEcmF3VGFiXzQ9Y2FzdD0oSElSZWN0ICopLGZsYWdzPW5vX2luCi0KLU9TX0hJVGhlbWVEcmF3VGFiUGFuZT0KLU9TX0hJVGhlbWVEcmF3VGFiUGFuZV8wPWNhc3Q9KGNvbnN0IEhJUmVjdCAqKQotT1NfSElUaGVtZURyYXdUYWJQYW5lXzE9Y2FzdD0oY29uc3QgSElUaGVtZVRhYlBhbmVEcmF3SW5mbyAqKQotT1NfSElUaGVtZURyYXdUYWJQYW5lXzI9Y2FzdD0oQ0dDb250ZXh0UmVmKQotT1NfSElUaGVtZURyYXdUYWJQYW5lXzM9Y2FzdD0oSElUaGVtZU9yaWVudGF0aW9uKQotCi1PU19ISVRoZW1lRHJhd1RleHRCb3g9Ci1PU19ISVRoZW1lRHJhd1RleHRCb3hfMD1jYXN0PUNGU3RyaW5nUmVmCi1PU19ISVRoZW1lRHJhd1RleHRCb3hfMT0KLU9TX0hJVGhlbWVEcmF3VGV4dEJveF8yPQotT1NfSElUaGVtZURyYXdUZXh0Qm94XzM9Y2FzdD1DR0NvbnRleHRSZWYKLU9TX0hJVGhlbWVEcmF3VGV4dEJveF80PQotCi1PU19ISVRoZW1lRHJhd1RyYWNrPQotT1NfSElUaGVtZURyYXdUcmFja18wPQotT1NfSElUaGVtZURyYXdUcmFja18xPQotT1NfSElUaGVtZURyYXdUcmFja18yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lRHJhd1RyYWNrXzM9Ci0KLU9TX0hJVGhlbWVHZXRCdXR0b25CYWNrZ3JvdW5kQm91bmRzPQotT1NfSElUaGVtZUdldEJ1dHRvbkJhY2tncm91bmRCb3VuZHNfMD0KLU9TX0hJVGhlbWVHZXRCdXR0b25CYWNrZ3JvdW5kQm91bmRzXzE9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQmFja2dyb3VuZEJvdW5kc18yPQotCi1PU19ISVRoZW1lR2V0QnV0dG9uQ29udGVudEJvdW5kcz0KLU9TX0hJVGhlbWVHZXRCdXR0b25Db250ZW50Qm91bmRzXzA9Ci1PU19ISVRoZW1lR2V0QnV0dG9uQ29udGVudEJvdW5kc18xPQotT1NfSElUaGVtZUdldEJ1dHRvbkNvbnRlbnRCb3VuZHNfMj0KLQotT1NfSElUaGVtZUdldFNjcm9sbEJhclRyYWNrUmVjdD0KLU9TX0hJVGhlbWVHZXRTY3JvbGxCYXJUcmFja1JlY3RfMD0KLU9TX0hJVGhlbWVHZXRTY3JvbGxCYXJUcmFja1JlY3RfMT0KLU9TX0hJVGhlbWVHZXRTY3JvbGxCYXJUcmFja1JlY3RfMj0KLU9TX0hJVGhlbWVHZXRTY3JvbGxCYXJUcmFja1JlY3RfMz0KLQotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zPQotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zXzA9Y2FzdD1DRlN0cmluZ1JlZgotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zXzE9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfMj0KLU9TX0hJVGhlbWVHZXRUZXh0RGltZW5zaW9uc18zPQotT1NfSElUaGVtZUdldFRleHREaW1lbnNpb25zXzQ9Ci1PU19ISVRoZW1lR2V0VGV4dERpbWVuc2lvbnNfNT0KLQotT1NfSElUaGVtZUdldFRyYWNrQm91bmRzPQotT1NfSElUaGVtZUdldFRyYWNrQm91bmRzXzA9Ci1PU19ISVRoZW1lR2V0VHJhY2tCb3VuZHNfMT0KLQotT1NfSElUaGVtZUdldFRyYWNrTGl2ZVZhbHVlPQotT1NfSElUaGVtZUdldFRyYWNrTGl2ZVZhbHVlXzA9Ci1PU19ISVRoZW1lR2V0VHJhY2tMaXZlVmFsdWVfMT0KLU9TX0hJVGhlbWVHZXRUcmFja0xpdmVWYWx1ZV8yPQotCi1PU19ISVRoZW1lR2V0VHJhY2tQYXJ0Qm91bmRzPQotT1NfSElUaGVtZUdldFRyYWNrUGFydEJvdW5kc18wPQotT1NfSElUaGVtZUdldFRyYWNrUGFydEJvdW5kc18xPQotT1NfSElUaGVtZUdldFRyYWNrUGFydEJvdW5kc18yPQotCi1PU19ISVRoZW1lR2V0VHJhY2tUaHVtYlBvc2l0aW9uRnJvbUJvdW5kcz0KLU9TX0hJVGhlbWVHZXRUcmFja1RodW1iUG9zaXRpb25Gcm9tQm91bmRzXzA9Ci1PU19ISVRoZW1lR2V0VHJhY2tUaHVtYlBvc2l0aW9uRnJvbUJvdW5kc18xPQotT1NfSElUaGVtZUdldFRyYWNrVGh1bWJQb3NpdGlvbkZyb21Cb3VuZHNfMj0KLQotT1NfSElUaGVtZUdldFRyYWNrVGh1bWJQb3NpdGlvbkZyb21PZmZzZXQ9Ci1PU19ISVRoZW1lR2V0VHJhY2tUaHVtYlBvc2l0aW9uRnJvbU9mZnNldF8wPWNhc3Q9SElUaGVtZVRyYWNrRHJhd0luZm8gKgotT1NfSElUaGVtZUdldFRyYWNrVGh1bWJQb3NpdGlvbkZyb21PZmZzZXRfMT1jYXN0PUhJUG9pbnQgKgotT1NfSElUaGVtZUdldFRyYWNrVGh1bWJQb3NpdGlvbkZyb21PZmZzZXRfMj0KLQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3M9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c18wPQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfMT0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzI9Ci1PU19ISVRoZW1lSGl0VGVzdFNjcm9sbEJhckFycm93c18zPQotT1NfSElUaGVtZUhpdFRlc3RTY3JvbGxCYXJBcnJvd3NfND0KLU9TX0hJVGhlbWVIaXRUZXN0U2Nyb2xsQmFyQXJyb3dzXzU9Ci0KLU9TX0hJVGhlbWVIaXRUZXN0VHJhY2s9Ci1PU19ISVRoZW1lSGl0VGVzdFRyYWNrXzA9Ci1PU19ISVRoZW1lSGl0VGVzdFRyYWNrXzE9Ci1PU19ISVRoZW1lSGl0VGVzdFRyYWNrXzI9Ci0KLU9TX0hJVGhlbWVTZXRGaWxsPWZsYWdzPWR5bmFtaWMKLU9TX0hJVGhlbWVTZXRGaWxsXzA9Y2FzdD1UaGVtZUJydXNoCi1PU19ISVRoZW1lU2V0RmlsbF8xPWNhc3Q9dm9pZCAqCi1PU19ISVRoZW1lU2V0RmlsbF8yPWNhc3Q9Q0dDb250ZXh0UmVmCi1PU19ISVRoZW1lU2V0RmlsbF8zPWNhc3Q9SElUaGVtZU9yaWVudGF0aW9uCi0KLU9TX0hJVGhlbWVTZXRUZXh0RmlsbD1mbGFncz1keW5hbWljCi1PU19ISVRoZW1lU2V0VGV4dEZpbGxfMD0KLU9TX0hJVGhlbWVTZXRUZXh0RmlsbF8xPQotT1NfSElUaGVtZVNldFRleHRGaWxsXzI9Ci1PU19ISVRoZW1lU2V0VGV4dEZpbGxfMz0KLQotT1NfSElWaWV3QWRkU3Vidmlldz0KLU9TX0hJVmlld0FkZFN1YnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdBZGRTdWJ2aWV3XzE9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdDaGFuZ2VBdHRyaWJ1dGVzPQotT1NfSElWaWV3Q2hhbmdlQXR0cmlidXRlc18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMT0KLU9TX0hJVmlld0NoYW5nZUF0dHJpYnV0ZXNfMj0KLQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXM9Ci1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18wPWNhc3Q9SElWaWV3UmVmCi1PU19ISVZpZXdDaGFuZ2VGZWF0dXJlc18xPQotT1NfSElWaWV3Q2hhbmdlRmVhdHVyZXNfMj0KLQotT1NfSElWaWV3Q2xpY2s9Ci1PU19ISVZpZXdDbGlja18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NsaWNrXzE9Y2FzdD0oRXZlbnRSZWYpCi0KLU9TX0hJVmlld0NvbnZlcnRQb2ludD0KLU9TX0hJVmlld0NvbnZlcnRQb2ludF8wPWNhc3Q9KEhJUG9pbnQgKikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRQb2ludF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlY3Q9Ci1PU19ISVZpZXdDb252ZXJ0UmVjdF8wPQotT1NfSElWaWV3Q29udmVydFJlY3RfMT1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdDb252ZXJ0UmVjdF8yPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3Q29udmVydFJlZ2lvbj0KLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMD1jYXN0PVJnbkhhbmRsZQotT1NfSElWaWV3Q29udmVydFJlZ2lvbl8xPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0NvbnZlcnRSZWdpb25fMj1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlPQotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMD1jYXN0PUhJVmlld1JlZgotT1NfSElWaWV3Q3JlYXRlT2Zmc2NyZWVuSW1hZ2VfMT1jYXN0PU9wdGlvbkJpdHMKLU9TX0hJVmlld0NyZWF0ZU9mZnNjcmVlbkltYWdlXzI9Y2FzdD0oSElSZWN0ICopCi1PU19ISVZpZXdDcmVhdGVPZmZzY3JlZW5JbWFnZV8zPWNhc3Q9Q0dJbWFnZVJlZiAqCi0KLU9TX0hJVmlld0RyYXdDR0ltYWdlPQotT1NfSElWaWV3RHJhd0NHSW1hZ2VfMD1jYXN0PUNHQ29udGV4dFJlZgotT1NfSElWaWV3RHJhd0NHSW1hZ2VfMT0KLU9TX0hJVmlld0RyYXdDR0ltYWdlXzI9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfSElWaWV3RmluZEJ5SUQ9Ci1PU19ISVZpZXdGaW5kQnlJRF8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0ZpbmRCeUlEXzE9Y2FzdD0oSElWaWV3SUQgKiksZmxhZ3M9c3RydWN0Ci1PU19ISVZpZXdGaW5kQnlJRF8yPWNhc3Q9KEhJVmlld1JlZiAqKQotCi1PU19ISVZpZXdHZXRCb3VuZHM9Ci1PU19ISVZpZXdHZXRCb3VuZHNfMD1jYXN0PUhJVmlld1JlZgotT1NfSElWaWV3R2V0Qm91bmRzXzE9Ci0KLU9TX0hJVmlld0dldEZlYXR1cmVzPQotT1NfSElWaWV3R2V0RmVhdHVyZXNfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdHZXRGZWF0dXJlc18xPWNhc3Q9SElWaWV3RmVhdHVyZXMgKgotCi1PU19ISVZpZXdHZXRGaXJzdFN1YnZpZXc9Ci1PU19ISVZpZXdHZXRGaXJzdFN1YnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0dldEZyYW1lPQotT1NfSElWaWV3R2V0RnJhbWVfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdHZXRGcmFtZV8xPWNhc3Q9KEhJUmVjdCAqKQotCi1PU19ISVZpZXdHZXRMYXN0U3Vidmlldz0KLU9TX0hJVmlld0dldExhc3RTdWJ2aWV3XzA9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdHZXRMYXlvdXRJbmZvPQotT1NfSElWaWV3R2V0TGF5b3V0SW5mb18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0dldExheW91dEluZm9fMT0KLQotT1NfSElWaWV3R2V0TmVlZHNEaXNwbGF5PQotT1NfSElWaWV3R2V0TmVlZHNEaXNwbGF5XzA9Y2FzdD1ISVZpZXdSZWYKLQotT1NfSElWaWV3R2V0TmV4dFZpZXc9Ci1PU19ISVZpZXdHZXROZXh0Vmlld18wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3R2V0Um9vdD0KLU9TX0hJVmlld0dldFJvb3RfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50cz0KLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld0dldFNpemVDb25zdHJhaW50c18xPWNhc3Q9KEhJU2l6ZSAqKQotT1NfSElWaWV3R2V0U2l6ZUNvbnN0cmFpbnRzXzI9Y2FzdD0oSElTaXplICopCi0KLU9TX0hJVmlld0dldFN1YnZpZXdIaXQ9Ci1PU19ISVZpZXdHZXRTdWJ2aWV3SGl0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8xPWNhc3Q9KENHUG9pbnQgKikKLU9TX0hJVmlld0dldFN1YnZpZXdIaXRfMj1jYXN0PShCb29sZWFuKQotT1NfSElWaWV3R2V0U3Vidmlld0hpdF8zPWNhc3Q9KEhJVmlld1JlZiAqKQotCi1PU19ISVZpZXdHZXRTdXBlcnZpZXc9Ci1PU19ISVZpZXdHZXRTdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0dldFZpZXdGb3JNb3VzZUV2ZW50PQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdHZXRWaWV3Rm9yTW91c2VFdmVudF8xPWNhc3Q9KEV2ZW50UmVmKQotT1NfSElWaWV3R2V0Vmlld0Zvck1vdXNlRXZlbnRfMj1jYXN0PShISVZpZXdSZWYgKikKLQotT1NfSElWaWV3SXNEcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld0lzRHJhd2luZ0VuYWJsZWRfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld0lzVmlzaWJsZT0KLU9TX0hJVmlld0lzVmlzaWJsZV8wPWNhc3Q9KEhJVmlld1JlZikKLQotT1NfSElWaWV3UmVtb3ZlRnJvbVN1cGVydmlldz0KLU9TX0hJVmlld1JlbW92ZUZyb21TdXBlcnZpZXdfMD1jYXN0PShISVZpZXdSZWYpCi0KLU9TX0hJVmlld1JlbmRlcj0KLU9TX0hJVmlld1JlbmRlcl8wPWNhc3Q9SElWaWV3UmVmCi0KLU9TX0hJVmlld1Njcm9sbFJlY3Q9Ci1PU19ISVZpZXdTY3JvbGxSZWN0XzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2Nyb2xsUmVjdF8xPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8yPQotT1NfSElWaWV3U2Nyb2xsUmVjdF8zPQotCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW49Ci1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXRCb3VuZHNPcmlnaW5fMT0KLU9TX0hJVmlld1NldEJvdW5kc09yaWdpbl8yPQotCi1PU19ISVZpZXdTZXREcmF3aW5nRW5hYmxlZD0KLU9TX0hJVmlld1NldERyYXdpbmdFbmFibGVkXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RHJhd2luZ0VuYWJsZWRfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXRGcmFtZT0KLU9TX0hJVmlld1NldEZyYW1lXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0RnJhbWVfMT1jYXN0PShjb25zdCBISVJlY3QgKikKLQotT1NfSElWaWV3U2V0TGF5b3V0SW5mbz0KLU9TX0hJVmlld1NldExheW91dEluZm9fMD1jYXN0PUhJVmlld1JlZgotT1NfSElWaWV3U2V0TGF5b3V0SW5mb18xPQotCi1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXk9Ci1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlfMD1jYXN0PShISVZpZXdSZWYpCi1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlfMT1jYXN0PShCb29sZWFuKQotCi1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlJblJlZ2lvbj0KLU9TX0hJVmlld1NldE5lZWRzRGlzcGxheUluUmVnaW9uXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0TmVlZHNEaXNwbGF5SW5SZWdpb25fMT1jYXN0PShSZ25IYW5kbGUpCi1PU19ISVZpZXdTZXROZWVkc0Rpc3BsYXlJblJlZ2lvbl8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0hJVmlld1NldFZpc2libGU9Ci1PU19ISVZpZXdTZXRWaXNpYmxlXzA9Y2FzdD0oSElWaWV3UmVmKQotT1NfSElWaWV3U2V0VmlzaWJsZV8xPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX0hJVmlld1NldFpPcmRlcj0KLU9TX0hJVmlld1NldFpPcmRlcl8wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NldFpPcmRlcl8xPWNhc3Q9KEhJVmlld1pPcmRlck9wKQotT1NfSElWaWV3U2V0Wk9yZGVyXzI9Y2FzdD0oSElWaWV3UmVmKQotCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrPQotT1NfSElWaWV3U2ltdWxhdGVDbGlja18wPWNhc3Q9KEhJVmlld1JlZikKLU9TX0hJVmlld1NpbXVsYXRlQ2xpY2tfMT1jYXN0PShISVZpZXdQYXJ0Q29kZSkKLU9TX0hJVmlld1NpbXVsYXRlQ2xpY2tfMj1jYXN0PShVSW50MzIpCi1PU19ISVZpZXdTaW11bGF0ZUNsaWNrXzM9Y2FzdD0oQ29udHJvbFBhcnRDb2RlICopCi0KLU9TX0hMb2NrPQotT1NfSExvY2tfMD1jYXN0PShIYW5kbGUpCi0KLU9TX0hNRGlzcGxheVRhZz0KLU9TX0hNRGlzcGxheVRhZ18wPWNhc3Q9Y29uc3QgSE1IZWxwQ29udGVudFJlYyAqCi0KLU9TX0hNR2V0VGFnRGVsYXk9Ci1PU19ITUdldFRhZ0RlbGF5XzA9Ci0KLU9TX0hNSGlkZVRhZz0KLQotT1NfSE1JbnN0YWxsQ29udHJvbENvbnRlbnRDYWxsYmFjaz0KLU9TX0hNSW5zdGFsbENvbnRyb2xDb250ZW50Q2FsbGJhY2tfMD1jYXN0PShDb250cm9sUmVmKQotT1NfSE1JbnN0YWxsQ29udHJvbENvbnRlbnRDYWxsYmFja18xPWNhc3Q9KEhNQ29udHJvbENvbnRlbnRVUFApCi0KLU9TX0hNU2V0VGFnRGVsYXk9Ci1PU19ITVNldFRhZ0RlbGF5XzA9Ci0KLU9TX0hVbmxvY2s9Ci1PU19IVW5sb2NrXzA9Y2FzdD0oSGFuZGxlKQotCi1PU19IYW5kbGVDb250cm9sQ2xpY2s9Ci1PU19IYW5kbGVDb250cm9sQ2xpY2tfMD1jYXN0PShDb250cm9sUmVmKQotT1NfSGFuZGxlQ29udHJvbENsaWNrXzE9ZmxhZ3M9c3RydWN0Ci1PU19IYW5kbGVDb250cm9sQ2xpY2tfMj1jYXN0PShFdmVudE1vZGlmaWVycykKLU9TX0hhbmRsZUNvbnRyb2xDbGlja18zPWNhc3Q9KENvbnRyb2xBY3Rpb25VUFApCi0KLU9TX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3I9Ci1PU19IYW5kbGVDb250cm9sU2V0Q3Vyc29yXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3JfMT1mbGFncz1zdHJ1Y3QKLU9TX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3JfMj1jYXN0PShFdmVudE1vZGlmaWVycykKLU9TX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3JfMz1jYXN0PShCb29sZWFuICopCi0KLU9TX0hpV29yZD0KLU9TX0hpV29yZF8wPQotCi1PU19IaWRlV2luZG93PQotT1NfSGlkZVdpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSGlsaXRlTWVudT0KLU9TX0hpbGl0ZU1lbnVfMD1jYXN0PShNZW51SUQpCi0KLU9TX0ljb25SZWZUb0ljb25GYW1pbHk9Ci1PU19JY29uUmVmVG9JY29uRmFtaWx5XzA9Y2FzdD1JY29uUmVmCi1PU19JY29uUmVmVG9JY29uRmFtaWx5XzE9Y2FzdD1JY29uU2VsZWN0b3JWYWx1ZQotT1NfSWNvblJlZlRvSWNvbkZhbWlseV8yPWNhc3Q9SWNvbkZhbWlseUhhbmRsZSAqCi0KLU9TX0luaXRDb250ZXh0dWFsTWVudXM9Ci0KLU9TX0luaXRDdXJzb3I9Ci0KLU9TX0luaXREYXRhQnJvd3NlckNhbGxiYWNrcz0KLU9TX0luaXREYXRhQnJvd3NlckNhbGxiYWNrc18wPWNhc3Q9KERhdGFCcm93c2VyQ2FsbGJhY2tzICopLGZsYWdzPWluaXQKLQotT1NfSW5pdERhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzPQotT1NfSW5pdERhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzXzA9Ci0KLU9TX0luc2VydE1lbnU9Ci1PU19JbnNlcnRNZW51XzA9Y2FzdD0oTWVudVJlZikKLU9TX0luc2VydE1lbnVfMT1jYXN0PShNZW51SUQpCi0KLU9TX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZz0KLU9TX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18wPWNhc3Q9KE1lbnVSZWYpCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18yPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMz1jYXN0PShNZW51SXRlbUF0dHJpYnV0ZXMpCi1PU19JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfND1jYXN0PShNZW51Q29tbWFuZCkKLQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcj0KLU9TX0luc3RhbGxFdmVudEhhbmRsZXJfMD1jYXN0PShFdmVudFRhcmdldFJlZikKLU9TX0luc3RhbGxFdmVudEhhbmRsZXJfMT1jYXN0PShFdmVudEhhbmRsZXJVUFApCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzI9Y2FzdD0oVUludDMyKQotT1NfSW5zdGFsbEV2ZW50SGFuZGxlcl8zPWNhc3Q9KGNvbnN0IEV2ZW50VHlwZVNwZWMgKikKLU9TX0luc3RhbGxFdmVudEhhbmRsZXJfND1jYXN0PSh2b2lkICopCi1PU19JbnN0YWxsRXZlbnRIYW5kbGVyXzU9Y2FzdD0oRXZlbnRIYW5kbGVyUmVmICopCi0KLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXI9Ci1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzA9Y2FzdD0oRXZlbnRMb29wUmVmKQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl8xPWNhc3Q9KEV2ZW50VGltZXJJbnRlcnZhbCkKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfMj1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi1PU19JbnN0YWxsRXZlbnRMb29wSWRsZVRpbWVyXzM9Y2FzdD0oRXZlbnRMb29wSWRsZVRpbWVyVVBQKQotT1NfSW5zdGFsbEV2ZW50TG9vcElkbGVUaW1lcl80PWNhc3Q9KHZvaWQgKikKLU9TX0luc3RhbGxFdmVudExvb3BJZGxlVGltZXJfNT1jYXN0PShFdmVudExvb3BUaW1lclJlZiAqKQotCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXI9Ci1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfMD1jYXN0PShFdmVudExvb3BSZWYpCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfMT1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfMj1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi1PU19JbnN0YWxsRXZlbnRMb29wVGltZXJfMz1jYXN0PShFdmVudExvb3BUaW1lclVQUCkKLU9TX0luc3RhbGxFdmVudExvb3BUaW1lcl80PWNhc3Q9KHZvaWQgKikKLU9TX0luc3RhbGxFdmVudExvb3BUaW1lcl81PWNhc3Q9KEV2ZW50TG9vcFRpbWVyUmVmICopCi0KLU9TX0luc3RhbGxSZWNlaXZlSGFuZGxlcj0KLU9TX0luc3RhbGxSZWNlaXZlSGFuZGxlcl8wPWNhc3Q9KERyYWdSZWNlaXZlSGFuZGxlclVQUCkKLU9TX0luc3RhbGxSZWNlaXZlSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0luc3RhbGxSZWNlaXZlSGFuZGxlcl8yPWNhc3Q9KHZvaWQgKikKLQotT1NfSW5zdGFsbFRyYWNraW5nSGFuZGxlcj0KLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXJfMD1jYXN0PShEcmFnVHJhY2tpbmdIYW5kbGVyVVBQKQotT1NfSW5zdGFsbFRyYWNraW5nSGFuZGxlcl8xPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0luc3RhbGxUcmFja2luZ0hhbmRsZXJfMj1jYXN0PSh2b2lkICopCi0KLU9TX0ludmFsV2luZG93UmVjdD0KLU9TX0ludmFsV2luZG93UmVjdF8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0ludmFsV2luZG93UmVjdF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLQotT1NfSW52YWxXaW5kb3dSZ249Ci1PU19JbnZhbFdpbmRvd1Jnbl8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX0ludmFsV2luZG93UmduXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19JbnZlcnRSZWN0PQotT1NfSW52ZXJ0UmVjdF8wPWNhc3Q9KGNvbnN0IFJlY3QgKikKLQotT1NfSXNDb250cm9sQWN0aXZlPQotT1NfSXNDb250cm9sQWN0aXZlXzA9Y2FzdD0oQ29udHJvbFJlZikKLQotT1NfSXNDb250cm9sRW5hYmxlZD0KLU9TX0lzQ29udHJvbEVuYWJsZWRfMD1jYXN0PShDb250cm9sUmVmKQotCi1PU19Jc0NvbnRyb2xWaXNpYmxlPQotT1NfSXNDb250cm9sVmlzaWJsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQ9Ci1PU19Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWRfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfSXNNZW51Q29tbWFuZEVuYWJsZWQ9Ci1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8wPWNhc3Q9KE1lbnVSZWYpCi1PU19Jc01lbnVDb21tYW5kRW5hYmxlZF8xPWNhc3Q9KE1lbnVDb21tYW5kKQotCi1PU19Jc01lbnVJdGVtRW5hYmxlZD0KLU9TX0lzTWVudUl0ZW1FbmFibGVkXzA9Y2FzdD0oTWVudVJlZikKLU9TX0lzTWVudUl0ZW1FbmFibGVkXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLQotT1NfSXNWYWxpZENvbnRyb2xIYW5kbGU9Ci1PU19Jc1ZhbGlkQ29udHJvbEhhbmRsZV8wPWNhc3Q9KENvbnRyb2xSZWYpCi0KLU9TX0lzVmFsaWRNZW51PQotT1NfSXNWYWxpZE1lbnVfMD1jYXN0PShNZW51UmVmKQotCi1PU19Jc1ZhbGlkV2luZG93UHRyPQotT1NfSXNWYWxpZFdpbmRvd1B0cl8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dBY3RpdmU9Ci1PU19Jc1dpbmRvd0FjdGl2ZV8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dDb2xsYXBzZWQ9Ci1PU19Jc1dpbmRvd0NvbGxhcHNlZF8wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfSXNXaW5kb3dWaXNpYmxlPQotT1NfSXNXaW5kb3dWaXNpYmxlXzA9Y2FzdD0oV2luZG93UmVmKQotCi1PU19KTklHZXRPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi1PU19KTklHZXRPYmplY3RfMD0KLQotT1NfS2V5VHJhbnNsYXRlPQotT1NfS2V5VHJhbnNsYXRlXzA9Y2FzdD1jb25zdCB2b2lkICoKLU9TX0tleVRyYW5zbGF0ZV8xPQotT1NfS2V5VHJhbnNsYXRlXzI9Y2FzdD1VSW50MzIgKgotCi1PU19MU0NvcHlBbGxSb2xlSGFuZGxlcnNGb3JDb250ZW50VHlwZT1mbGFncz1keW5hbWljCi1PU19MU0NvcHlBbGxSb2xlSGFuZGxlcnNGb3JDb250ZW50VHlwZV8wPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX0xTQ29weUFsbFJvbGVIYW5kbGVyc0ZvckNvbnRlbnRUeXBlXzE9Ci0KLU9TX0xTQ29weURpc3BsYXlOYW1lRm9yUmVmPQotT1NfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWZfMD1jYXN0PWNvbnN0IEZTUmVmICoKLU9TX0xTQ29weURpc3BsYXlOYW1lRm9yUmVmXzE9Y2FzdD1DRlN0cmluZ1JlZiAqCi0KLU9TX0xTRmluZEFwcGxpY2F0aW9uRm9ySW5mbz0KLU9TX0xTRmluZEFwcGxpY2F0aW9uRm9ySW5mb18wPWNhc3Q9T1NUeXBlCi1PU19MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm9fMT1jYXN0PUNGU3RyaW5nUmVmCi1PU19MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm9fMj1jYXN0PUNGU3RyaW5nUmVmCi1PU19MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm9fMz1jYXN0PUZTUmVmICoKLU9TX0xTRmluZEFwcGxpY2F0aW9uRm9ySW5mb180PWNhc3Q9Q0ZVUkxSZWYgKgotCi1PU19MU0dldEFwcGxpY2F0aW9uRm9ySW5mbz0KLU9TX0xTR2V0QXBwbGljYXRpb25Gb3JJbmZvXzA9Y2FzdD1PU1R5cGUKLU9TX0xTR2V0QXBwbGljYXRpb25Gb3JJbmZvXzE9Y2FzdD1PU1R5cGUKLU9TX0xTR2V0QXBwbGljYXRpb25Gb3JJbmZvXzI9Y2FzdD1DRlN0cmluZ1JlZgotT1NfTFNHZXRBcHBsaWNhdGlvbkZvckluZm9fMz1jYXN0PUxTUm9sZXNNYXNrCi1PU19MU0dldEFwcGxpY2F0aW9uRm9ySW5mb180PWNhc3Q9RlNSZWYgKgotT1NfTFNHZXRBcHBsaWNhdGlvbkZvckluZm9fNT1jYXN0PUNGVVJMUmVmICoKLQotT1NfTFNPcGVuQXBwbGljYXRpb249Ci1PU19MU09wZW5BcHBsaWNhdGlvbl8wPQotT1NfTFNPcGVuQXBwbGljYXRpb25fMT1jYXN0PVByb2Nlc3NTZXJpYWxOdW1iZXIgKgotCi1PU19MU09wZW5DRlVSTFJlZj0KLU9TX0xTT3BlbkNGVVJMUmVmXzA9Y2FzdD1DRlVSTFJlZgotT1NfTFNPcGVuQ0ZVUkxSZWZfMT1jYXN0PUNGVVJMUmVmICoKLQotT1NfTFNPcGVuVVJMc1dpdGhSb2xlPQotT1NfTFNPcGVuVVJMc1dpdGhSb2xlXzA9Y2FzdD1DRkFycmF5UmVmCi1PU19MU09wZW5VUkxzV2l0aFJvbGVfMT0KLU9TX0xTT3BlblVSTHNXaXRoUm9sZV8yPWNhc3Q9KGNvbnN0IEFFS2V5RGVzYyAqKQotT1NfTFNPcGVuVVJMc1dpdGhSb2xlXzM9Y2FzdD0oY29uc3QgTFNBcHBsaWNhdGlvblBhcmFtZXRlcnMgKikKLU9TX0xTT3BlblVSTHNXaXRoUm9sZV80PWNhc3Q9KFByb2Nlc3NTZXJpYWxOdW1iZXIgKikKLU9TX0xTT3BlblVSTHNXaXRoUm9sZV81PQotCi1PU19MaW5lVG89Ci1PU19MaW5lVG9fMD1jYXN0PShzaG9ydCkKLU9TX0xpbmVUb18xPWNhc3Q9KHNob3J0KQotCi1PU19Mb1dvcmQ9Ci1PU19Mb1dvcmRfMD0KLQotT1NfTG9uZzJGaXg9Ci1PU19Mb25nMkZpeF8wPQotCi1PU19NZW51U2VsZWN0PQotT1NfTWVudVNlbGVjdF8wPWNhc3Q9KFBvaW50ICopLGZsYWdzPXN0cnVjdAotCi1PU19Nb3ZlQ29udHJvbD0KLU9TX01vdmVDb250cm9sXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX01vdmVDb250cm9sXzE9Y2FzdD0oU0ludDE2KQotT1NfTW92ZUNvbnRyb2xfMj1jYXN0PShTSW50MTYpCi0KLU9TX01vdmVUbz0KLU9TX01vdmVUb18wPWNhc3Q9KHNob3J0KQotT1NfTW92ZVRvXzE9Y2FzdD0oc2hvcnQpCi0KLU9TX01vdmVXaW5kb3c9Ci1PU19Nb3ZlV2luZG93XzA9Y2FzdD0oV2luZG93UmVmKQotT1NfTW92ZVdpbmRvd18xPWNhc3Q9KHNob3J0KQotT1NfTW92ZVdpbmRvd18yPWNhc3Q9KHNob3J0KQotT1NfTW92ZVdpbmRvd18zPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX05hdkNyZWF0ZUNob29zZUZvbGRlckRpYWxvZz0KLU9TX05hdkNyZWF0ZUNob29zZUZvbGRlckRpYWxvZ18wPWNhc3Q9KGNvbnN0IE5hdkRpYWxvZ0NyZWF0aW9uT3B0aW9ucyAqKQotT1NfTmF2Q3JlYXRlQ2hvb3NlRm9sZGVyRGlhbG9nXzE9Y2FzdD0oTmF2RXZlbnRVUFApCi1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2dfMj1jYXN0PShOYXZPYmplY3RGaWx0ZXJVUFApCi1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2dfMz1jYXN0PSh2b2lkICopCi1PU19OYXZDcmVhdGVDaG9vc2VGb2xkZXJEaWFsb2dfND1jYXN0PShOYXZEaWFsb2dSZWYgKikKLQotT1NfTmF2Q3JlYXRlR2V0RmlsZURpYWxvZz0KLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfMD1jYXN0PShjb25zdCBOYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnMgKikKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfMT1jYXN0PShOYXZUeXBlTGlzdEhhbmRsZSkKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfMj1jYXN0PShOYXZFdmVudFVQUCkKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfMz1jYXN0PShOYXZQcmV2aWV3VVBQKQotT1NfTmF2Q3JlYXRlR2V0RmlsZURpYWxvZ180PWNhc3Q9KE5hdk9iamVjdEZpbHRlclVQUCkKLU9TX05hdkNyZWF0ZUdldEZpbGVEaWFsb2dfNT1jYXN0PSh2b2lkICopCi1PU19OYXZDcmVhdGVHZXRGaWxlRGlhbG9nXzY9Y2FzdD0oTmF2RGlhbG9nUmVmICopCi0KLU9TX05hdkNyZWF0ZVB1dEZpbGVEaWFsb2c9Ci1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzA9Y2FzdD0oY29uc3QgTmF2RGlhbG9nQ3JlYXRpb25PcHRpb25zICopCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzE9Y2FzdD0oT1NUeXBlKQotT1NfTmF2Q3JlYXRlUHV0RmlsZURpYWxvZ18yPWNhc3Q9KE9TVHlwZSkKLU9TX05hdkNyZWF0ZVB1dEZpbGVEaWFsb2dfMz1jYXN0PShOYXZFdmVudFVQUCkKLU9TX05hdkNyZWF0ZVB1dEZpbGVEaWFsb2dfND1jYXN0PSh2b2lkICopCi1PU19OYXZDcmVhdGVQdXRGaWxlRGlhbG9nXzU9Y2FzdD0oTmF2RGlhbG9nUmVmICopCi0KLU9TX05hdkRpYWxvZ0Rpc3Bvc2U9Ci1PU19OYXZEaWFsb2dEaXNwb3NlXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dHZXRSZXBseT0KLU9TX05hdkRpYWxvZ0dldFJlcGx5XzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotT1NfTmF2RGlhbG9nR2V0UmVwbHlfMT1jYXN0PShOYXZSZXBseVJlY29yZCAqKQotCi1PU19OYXZEaWFsb2dHZXRTYXZlRmlsZU5hbWU9Ci1PU19OYXZEaWFsb2dHZXRTYXZlRmlsZU5hbWVfMD1jYXN0PShOYXZEaWFsb2dSZWYpCi0KLU9TX05hdkRpYWxvZ0dldFVzZXJBY3Rpb249Ci1PU19OYXZEaWFsb2dHZXRVc2VyQWN0aW9uXzA9Y2FzdD0oTmF2RGlhbG9nUmVmKQotCi1PU19OYXZEaWFsb2dSdW49Ci1PU19OYXZEaWFsb2dSdW5fMD1jYXN0PShOYXZEaWFsb2dSZWYpCi0KLU9TX05hdkRpYWxvZ1NldEZpbHRlclR5cGVJZGVudGlmaWVycz1mbGFncz1keW5hbWljCi1PU19OYXZEaWFsb2dTZXRGaWx0ZXJUeXBlSWRlbnRpZmllcnNfMD0KLU9TX05hdkRpYWxvZ1NldEZpbHRlclR5cGVJZGVudGlmaWVyc18xPQotCi1PU19OYXZEaWFsb2dTZXRTYXZlRmlsZU5hbWU9Ci1PU19OYXZEaWFsb2dTZXRTYXZlRmlsZU5hbWVfMD1jYXN0PShOYXZEaWFsb2dSZWYpCi1PU19OYXZEaWFsb2dTZXRTYXZlRmlsZU5hbWVfMT1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfTmF2R2V0RGVmYXVsdERpYWxvZ0NyZWF0aW9uT3B0aW9ucz0KLU9TX05hdkdldERlZmF1bHREaWFsb2dDcmVhdGlvbk9wdGlvbnNfMD1jYXN0PShOYXZEaWFsb2dDcmVhdGlvbk9wdGlvbnMgKikKLQotT1NfTmV3Q29udHJvbD0KLU9TX05ld0NvbnRyb2xfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19OZXdDb250cm9sXzE9Y2FzdD0oY29uc3QgUmVjdCAqKQotT1NfTmV3Q29udHJvbF8yPWNhc3Q9KENvbnN0U3RyMjU1UGFyYW0pCi1PU19OZXdDb250cm9sXzM9Y2FzdD0oQm9vbGVhbikKLU9TX05ld0NvbnRyb2xfND1jYXN0PShTSW50MTYpCi1PU19OZXdDb250cm9sXzU9Y2FzdD0oU0ludDE2KQotT1NfTmV3Q29udHJvbF82PWNhc3Q9KFNJbnQxNikKLU9TX05ld0NvbnRyb2xfNz1jYXN0PShTSW50MTYpCi1PU19OZXdDb250cm9sXzg9Y2FzdD0oU0ludDMyKQotCi1PU19OZXdEcmFnPQotT1NfTmV3RHJhZ18wPWNhc3Q9KERyYWdSZWYgKikKLQotT1NfTmV3R1dvcmxkRnJvbVB0cj0KLU9TX05ld0dXb3JsZEZyb21QdHJfMD1jYXN0PShHV29ybGRQdHIgKikKLU9TX05ld0dXb3JsZEZyb21QdHJfMT1jYXN0PSh1bnNpZ25lZCBsb25nKQotT1NfTmV3R1dvcmxkRnJvbVB0cl8yPWNhc3Q9KGNvbnN0IFJlY3QgKikKLU9TX05ld0dXb3JsZEZyb21QdHJfMz1jYXN0PShDVGFiSGFuZGxlKQotT1NfTmV3R1dvcmxkRnJvbVB0cl80PWNhc3Q9KEdESGFuZGxlKQotT1NfTmV3R1dvcmxkRnJvbVB0cl81PWNhc3Q9KEdXb3JsZEZsYWdzKQotT1NfTmV3R1dvcmxkRnJvbVB0cl82PWNhc3Q9KFB0cikKLU9TX05ld0dXb3JsZEZyb21QdHJfNz1jYXN0PShsb25nKQotCi1PU19OZXdHbG9iYWxSZWY9ZmxhZ3M9bm9fZ2VuCi1PU19OZXdHbG9iYWxSZWZfMD0KLQotT1NfTmV3SGFuZGxlPQotT1NfTmV3SGFuZGxlXzA9Y2FzdD0oU2l6ZSkKLQotT1NfTmV3SGFuZGxlQ2xlYXI9Ci1PU19OZXdIYW5kbGVDbGVhcl8wPWNhc3Q9KFNpemUpCi0KLU9TX05ld1B0cj0KLU9TX05ld1B0cl8wPWNhc3Q9KFNpemUpCi0KLU9TX05ld1B0ckNsZWFyPQotT1NfTmV3UHRyQ2xlYXJfMD1jYXN0PShTaXplKQotCi1PU19OZXdSZ249Ci0KLU9TX09mZnNldFJlY3Q9Ci1PU19PZmZzZXRSZWN0XzA9Ci1PU19PZmZzZXRSZWN0XzE9Ci1PU19PZmZzZXRSZWN0XzI9Ci0KLU9TX09mZnNldFJnbj0KLU9TX09mZnNldFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX09mZnNldFJnbl8xPWNhc3Q9KHNob3J0KQotT1NfT2Zmc2V0UmduXzI9Y2FzdD0oc2hvcnQpCi0KLU9TX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lcj0KLU9TX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lcl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19PcGVuRGF0YUJyb3dzZXJDb250YWluZXJfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLQotT1NfT3BlblJnbj0KLQotT1NfUE1DcmVhdGVQYWdlRm9ybWF0PQotT1NfUE1DcmVhdGVQYWdlRm9ybWF0XzA9Y2FzdD0oUE1QYWdlRm9ybWF0ICopCi0KLU9TX1BNQ3JlYXRlUHJpbnRTZXR0aW5ncz0KLU9TX1BNQ3JlYXRlUHJpbnRTZXR0aW5nc18wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncyAqKQotCi1PU19QTUNyZWF0ZVNlc3Npb249Ci1PU19QTUNyZWF0ZVNlc3Npb25fMD1jYXN0PShQTVByaW50U2Vzc2lvbiAqKQotCi1PU19QTUZsYXR0ZW5QYWdlRm9ybWF0PQotT1NfUE1GbGF0dGVuUGFnZUZvcm1hdF8wPWNhc3Q9UE1QYWdlRm9ybWF0Ci1PU19QTUZsYXR0ZW5QYWdlRm9ybWF0XzE9Y2FzdD1IYW5kbGUgKgotCi1PU19QTUZsYXR0ZW5QcmludFNldHRpbmdzPQotT1NfUE1GbGF0dGVuUHJpbnRTZXR0aW5nc18wPWNhc3Q9UE1QcmludFNldHRpbmdzCi1PU19QTUZsYXR0ZW5QcmludFNldHRpbmdzXzE9Y2FzdD1IYW5kbGUgKgotCi1PU19QTUdldEFkanVzdGVkUGFnZVJlY3Q9Ci1PU19QTUdldEFkanVzdGVkUGFnZVJlY3RfMD1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTUdldEFkanVzdGVkUGFnZVJlY3RfMT1jYXN0PShQTVJlY3QgKikKLQotT1NfUE1HZXRBZGp1c3RlZFBhcGVyUmVjdD0KLU9TX1BNR2V0QWRqdXN0ZWRQYXBlclJlY3RfMD1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTUdldEFkanVzdGVkUGFwZXJSZWN0XzE9Y2FzdD0oUE1SZWN0ICopCi0KLU9TX1BNR2V0Q29sbGF0ZT0KLU9TX1BNR2V0Q29sbGF0ZV8wPWNhc3Q9UE1QcmludFNldHRpbmdzCi1PU19QTUdldENvbGxhdGVfMT0KLQotT1NfUE1HZXRDb3BpZXM9Ci1PU19QTUdldENvcGllc18wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNR2V0Q29waWVzXzE9Y2FzdD0oVUludDMyICopCi0KLU9TX1BNR2V0Rmlyc3RQYWdlPQotT1NfUE1HZXRGaXJzdFBhZ2VfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTUdldEZpcnN0UGFnZV8xPWNhc3Q9KFVJbnQzMiAqKQotCi1PU19QTUdldEpvYk5hbWVDRlN0cmluZz0KLU9TX1BNR2V0Sm9iTmFtZUNGU3RyaW5nXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1HZXRKb2JOYW1lQ0ZTdHJpbmdfMT1jYXN0PShDRlN0cmluZ1JlZiAqKQotCi1PU19QTUdldExhc3RQYWdlPQotT1NfUE1HZXRMYXN0UGFnZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNR2V0TGFzdFBhZ2VfMT1jYXN0PShVSW50MzIgKikKLQotT1NfUE1HZXRQYWdlUmFuZ2U9Ci1PU19QTUdldFBhZ2VSYW5nZV8wPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNR2V0UGFnZVJhbmdlXzE9Y2FzdD0oVUludDMyICopCi1PU19QTUdldFBhZ2VSYW5nZV8yPWNhc3Q9KFVJbnQzMiAqKQotCi1PU19QTUdldFJlc29sdXRpb249Ci1PU19QTUdldFJlc29sdXRpb25fMD1jYXN0PShQTVBhZ2VGb3JtYXQpCi1PU19QTUdldFJlc29sdXRpb25fMT1jYXN0PShQTVJlc29sdXRpb24gKikKLQotT1NfUE1SZWxlYXNlPQotT1NfUE1SZWxlYXNlXzA9Y2FzdD0oUE1PYmplY3QpCi0KLU9TX1BNU2Vzc2lvbkJlZ2luRG9jdW1lbnROb0RpYWxvZz0KLU9TX1BNU2Vzc2lvbkJlZ2luRG9jdW1lbnROb0RpYWxvZ18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXNzaW9uQmVnaW5Eb2N1bWVudE5vRGlhbG9nXzI9Y2FzdD0oUE1QYWdlRm9ybWF0KQotCi1PU19QTVNlc3Npb25CZWdpblBhZ2VOb0RpYWxvZz0KLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25CZWdpblBhZ2VOb0RpYWxvZ18xPWNhc3Q9KFBNUGFnZUZvcm1hdCkKLU9TX1BNU2Vzc2lvbkJlZ2luUGFnZU5vRGlhbG9nXzI9Y2FzdD0oY29uc3QgUE1SZWN0ICopCi0KLU9TX1BNU2Vzc2lvbkNvcHlEZXN0aW5hdGlvbkxvY2F0aW9uPQotT1NfUE1TZXNzaW9uQ29weURlc3RpbmF0aW9uTG9jYXRpb25fMD1jYXN0PVBNUHJpbnRTZXNzaW9uCi1PU19QTVNlc3Npb25Db3B5RGVzdGluYXRpb25Mb2NhdGlvbl8xPWNhc3Q9UE1QcmludFNldHRpbmdzCi1PU19QTVNlc3Npb25Db3B5RGVzdGluYXRpb25Mb2NhdGlvbl8yPWNhc3Q9KENGVVJMUmVmICopCi0KLU9TX1BNU2Vzc2lvbkNyZWF0ZVByaW50ZXJMaXN0PQotT1NfUE1TZXNzaW9uQ3JlYXRlUHJpbnRlckxpc3RfMD1jYXN0PVBNUHJpbnRTZXNzaW9uCi1PU19QTVNlc3Npb25DcmVhdGVQcmludGVyTGlzdF8xPWNhc3Q9Q0ZBcnJheVJlZiAqCi1PU19QTVNlc3Npb25DcmVhdGVQcmludGVyTGlzdF8yPWNhc3Q9Q0ZJbmRleCAqCi1PU19QTVNlc3Npb25DcmVhdGVQcmludGVyTGlzdF8zPWNhc3Q9UE1QcmludGVyICoKLQotT1NfUE1TZXNzaW9uRGVmYXVsdFBhZ2VGb3JtYXQ9Ci1PU19QTVNlc3Npb25EZWZhdWx0UGFnZUZvcm1hdF8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uRGVmYXVsdFBhZ2VGb3JtYXRfMT1jYXN0PShQTVBhZ2VGb3JtYXQpCi0KLU9TX1BNU2Vzc2lvbkRlZmF1bHRQcmludFNldHRpbmdzPQotT1NfUE1TZXNzaW9uRGVmYXVsdFByaW50U2V0dGluZ3NfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvbkRlZmF1bHRQcmludFNldHRpbmdzXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotCi1PU19QTVNlc3Npb25FbmREb2N1bWVudE5vRGlhbG9nPQotT1NfUE1TZXNzaW9uRW5kRG9jdW1lbnROb0RpYWxvZ18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotCi1PU19QTVNlc3Npb25FbmRQYWdlTm9EaWFsb2c9Ci1PU19QTVNlc3Npb25FbmRQYWdlTm9EaWFsb2dfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLQotT1NfUE1TZXNzaW9uRXJyb3I9Ci1PU19QTVNlc3Npb25FcnJvcl8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotCi1PU19QTVNlc3Npb25HZXREZXN0aW5hdGlvblR5cGU9Ci1PU19QTVNlc3Npb25HZXREZXN0aW5hdGlvblR5cGVfMD1jYXN0PVBNUHJpbnRTZXNzaW9uCi1PU19QTVNlc3Npb25HZXREZXN0aW5hdGlvblR5cGVfMT1jYXN0PVBNUHJpbnRTZXR0aW5ncwotT1NfUE1TZXNzaW9uR2V0RGVzdGluYXRpb25UeXBlXzI9Y2FzdD0oUE1EZXN0aW5hdGlvblR5cGUgKikKLQotT1NfUE1TZXNzaW9uR2V0R3JhcGhpY3NDb250ZXh0PQotT1NfUE1TZXNzaW9uR2V0R3JhcGhpY3NDb250ZXh0XzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25HZXRHcmFwaGljc0NvbnRleHRfMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX1BNU2Vzc2lvbkdldEdyYXBoaWNzQ29udGV4dF8yPWNhc3Q9KHZvaWQgKiopCi0KLU9TX1BNU2Vzc2lvblBhZ2VTZXR1cERpYWxvZz0KLU9TX1BNU2Vzc2lvblBhZ2VTZXR1cERpYWxvZ18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nXzE9Y2FzdD0oUE1QYWdlRm9ybWF0KQotT1NfUE1TZXNzaW9uUGFnZVNldHVwRGlhbG9nXzI9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19QTVNlc3Npb25QcmludERpYWxvZz0KLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25QcmludERpYWxvZ18xPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2Vzc2lvblByaW50RGlhbG9nXzI9Y2FzdD0oUE1QYWdlRm9ybWF0KQotT1NfUE1TZXNzaW9uUHJpbnREaWFsb2dfMz1jYXN0PShCb29sZWFuICopCi0KLU9TX1BNU2Vzc2lvblNldEN1cnJlbnRQcmludGVyPQotT1NfUE1TZXNzaW9uU2V0Q3VycmVudFByaW50ZXJfMD1jYXN0PVBNUHJpbnRTZXNzaW9uCi1PU19QTVNlc3Npb25TZXRDdXJyZW50UHJpbnRlcl8xPWNhc3Q9Q0ZTdHJpbmdSZWYKLQotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb249Ci1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbl8wPWNhc3Q9UE1QcmludFNlc3Npb24KLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzE9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNU2Vzc2lvblNldERlc3RpbmF0aW9uXzI9Y2FzdD1QTURlc3RpbmF0aW9uVHlwZQotT1NfUE1TZXNzaW9uU2V0RGVzdGluYXRpb25fMz1jYXN0PUNGU3RyaW5nUmVmCi1PU19QTVNlc3Npb25TZXREZXN0aW5hdGlvbl80PWNhc3Q9Q0ZVUkxSZWYKLQotT1NfUE1TZXNzaW9uU2V0RG9jdW1lbnRGb3JtYXRHZW5lcmF0aW9uPQotT1NfUE1TZXNzaW9uU2V0RG9jdW1lbnRGb3JtYXRHZW5lcmF0aW9uXzA9Y2FzdD0oUE1QcmludFNlc3Npb24pCi1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb25fMT1jYXN0PShDRlN0cmluZ1JlZikKLU9TX1BNU2Vzc2lvblNldERvY3VtZW50Rm9ybWF0R2VuZXJhdGlvbl8yPWNhc3Q9KENGQXJyYXlSZWYpCi1PU19QTVNlc3Npb25TZXREb2N1bWVudEZvcm1hdEdlbmVyYXRpb25fMz1jYXN0PShDRlR5cGVSZWYpCi0KLU9TX1BNU2Vzc2lvblNldEVycm9yPQotT1NfUE1TZXNzaW9uU2V0RXJyb3JfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblNldEVycm9yXzE9Ci0KLU9TX1BNU2Vzc2lvblVzZVNoZWV0cz0KLU9TX1BNU2Vzc2lvblVzZVNoZWV0c18wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzXzE9Y2FzdD0oV2luZG93UmVmKQotT1NfUE1TZXNzaW9uVXNlU2hlZXRzXzI9Y2FzdD0oUE1TaGVldERvbmVVUFApCi0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUGFnZUZvcm1hdD0KLU9TX1BNU2Vzc2lvblZhbGlkYXRlUGFnZUZvcm1hdF8wPWNhc3Q9KFBNUHJpbnRTZXNzaW9uKQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0XzE9Y2FzdD0oUE1QYWdlRm9ybWF0KQotT1NfUE1TZXNzaW9uVmFsaWRhdGVQYWdlRm9ybWF0XzI9Y2FzdD0oQm9vbGVhbiAqKQotCi1PU19QTVNlc3Npb25WYWxpZGF0ZVByaW50U2V0dGluZ3M9Ci1PU19QTVNlc3Npb25WYWxpZGF0ZVByaW50U2V0dGluZ3NfMD1jYXN0PShQTVByaW50U2Vzc2lvbikKLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5nc18xPWNhc3Q9KFBNUHJpbnRTZXR0aW5ncykKLU9TX1BNU2Vzc2lvblZhbGlkYXRlUHJpbnRTZXR0aW5nc18yPWNhc3Q9KEJvb2xlYW4gKikKLQotT1NfUE1TZXRDb2xsYXRlPQotT1NfUE1TZXRDb2xsYXRlXzA9Y2FzdD1QTVByaW50U2V0dGluZ3MKLU9TX1BNU2V0Q29sbGF0ZV8xPQotCi1PU19QTVNldEZpcnN0UGFnZT0KLU9TX1BNU2V0Rmlyc3RQYWdlXzA9Y2FzdD0oUE1QcmludFNldHRpbmdzKQotT1NfUE1TZXRGaXJzdFBhZ2VfMT1jYXN0PShVSW50MzIpCi1PU19QTVNldEZpcnN0UGFnZV8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1BNU2V0Sm9iTmFtZUNGU3RyaW5nPQotT1NfUE1TZXRKb2JOYW1lQ0ZTdHJpbmdfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNldEpvYk5hbWVDRlN0cmluZ18xPWNhc3Q9Q0ZTdHJpbmdSZWYKLQotT1NfUE1TZXRMYXN0UGFnZT0KLU9TX1BNU2V0TGFzdFBhZ2VfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNldExhc3RQYWdlXzE9Y2FzdD0oVUludDMyKQotT1NfUE1TZXRMYXN0UGFnZV8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1BNU2V0UGFnZVJhbmdlPQotT1NfUE1TZXRQYWdlUmFuZ2VfMD1jYXN0PShQTVByaW50U2V0dGluZ3MpCi1PU19QTVNldFBhZ2VSYW5nZV8xPWNhc3Q9KFVJbnQzMikKLU9TX1BNU2V0UGFnZVJhbmdlXzI9Y2FzdD0oVUludDMyKQotCi1PU19QTVVuZmxhdHRlblBhZ2VGb3JtYXQ9Ci1PU19QTVVuZmxhdHRlblBhZ2VGb3JtYXRfMD1jYXN0PUhhbmRsZQotT1NfUE1VbmZsYXR0ZW5QYWdlRm9ybWF0XzE9Y2FzdD1QTVBhZ2VGb3JtYXQgKgotCi1PU19QTVVuZmxhdHRlblByaW50U2V0dGluZ3M9Ci1PU19QTVVuZmxhdHRlblByaW50U2V0dGluZ3NfMD1jYXN0PUhhbmRsZQotT1NfUE1VbmZsYXR0ZW5QcmludFNldHRpbmdzXzE9Y2FzdD0oUE1QcmludFNldHRpbmdzICopCi0KLU9TX1BpY2tDb2xvcj0KLU9TX1BpY2tDb2xvcl8wPWNhc3Q9KENvbG9yUGlja2VySW5mbyAqKQotCi1PU19Qb3BVcE1lbnVTZWxlY3Q9Ci1PU19Qb3BVcE1lbnVTZWxlY3RfMD1jYXN0PShNZW51UmVmKQotT1NfUG9wVXBNZW51U2VsZWN0XzE9Y2FzdD0oc2hvcnQpCi1PU19Qb3BVcE1lbnVTZWxlY3RfMj1jYXN0PShzaG9ydCkKLU9TX1BvcFVwTWVudVNlbGVjdF8zPWNhc3Q9KHNob3J0KQotCi1PU19Qb3N0RXZlbnQ9Ci1PU19Qb3N0RXZlbnRfMD1jYXN0PShFdmVudEtpbmQpCi1PU19Qb3N0RXZlbnRfMT1jYXN0PShVSW50MzIpCi0KLU9TX1Bvc3RFdmVudFRvUXVldWU9Ci1PU19Qb3N0RXZlbnRUb1F1ZXVlXzA9Y2FzdD0oRXZlbnRRdWV1ZVJlZikKLU9TX1Bvc3RFdmVudFRvUXVldWVfMT1jYXN0PShFdmVudFJlZikKLU9TX1Bvc3RFdmVudFRvUXVldWVfMj1jYXN0PShFdmVudFByaW9yaXR5KQotCi1PU19QdEluUmVjdD0KLU9TX1B0SW5SZWN0XzA9Y2FzdD0oUG9pbnQgKiksZmxhZ3M9c3RydWN0Ci1PU19QdEluUmVjdF8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLQotT1NfUHRJblJnbj0KLU9TX1B0SW5SZ25fMD1jYXN0PShQb2ludCAqKSxmbGFncz1zdHJ1Y3QKLU9TX1B0SW5SZ25fMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1B1dFNjcmFwRmxhdm9yX19JSUlJXzNCPQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfMD1jYXN0PShTY3JhcFJlZikKLU9TX1B1dFNjcmFwRmxhdm9yX19JSUlJXzNCXzE9Y2FzdD0oU2NyYXBGbGF2b3JUeXBlKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfMj1jYXN0PShTY3JhcEZsYXZvckZsYWdzKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfMz1jYXN0PShTaXplKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0JfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1B1dFNjcmFwRmxhdm9yX19JSUlJXzNDPQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfMD1jYXN0PShTY3JhcFJlZikKLU9TX1B1dFNjcmFwRmxhdm9yX19JSUlJXzNDXzE9Y2FzdD0oU2NyYXBGbGF2b3JUeXBlKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfMj1jYXN0PShTY3JhcEZsYXZvckZsYWdzKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfMz1jYXN0PShTaXplKQotT1NfUHV0U2NyYXBGbGF2b3JfX0lJSUlfM0NfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1FEQmVnaW5DR0NvbnRleHQ9Ci1PU19RREJlZ2luQ0dDb250ZXh0XzA9Y2FzdD0oQ0dyYWZQdHIpCi1PU19RREJlZ2luQ0dDb250ZXh0XzE9Y2FzdD0oQ0dDb250ZXh0UmVmICopCi0KLU9TX1FERW5kQ0dDb250ZXh0PQotT1NfUURFbmRDR0NvbnRleHRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FERW5kQ0dDb250ZXh0XzE9Y2FzdD0oQ0dDb250ZXh0UmVmICopCi0KLU9TX1FERmx1c2hQb3J0QnVmZmVyPQotT1NfUURGbHVzaFBvcnRCdWZmZXJfMD1jYXN0PShDR3JhZlB0cikKLU9TX1FERmx1c2hQb3J0QnVmZmVyXzE9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19RRFJlZ2lvblRvUmVjdHM9Ci1PU19RRFJlZ2lvblRvUmVjdHNfMD1jYXN0PVJnbkhhbmRsZQotT1NfUURSZWdpb25Ub1JlY3RzXzE9Y2FzdD1RRFJlZ2lvblBhcnNlRGlyZWN0aW9uCi1PU19RRFJlZ2lvblRvUmVjdHNfMj1jYXN0PVJlZ2lvblRvUmVjdHNVUFAKLU9TX1FEUmVnaW9uVG9SZWN0c18zPWNhc3Q9dm9pZCAqCi0KLU9TX1JHQkJhY2tDb2xvcj0KLU9TX1JHQkJhY2tDb2xvcl8wPWNhc3Q9KGNvbnN0IFJHQkNvbG9yICopCi0KLU9TX1JHQkZvcmVDb2xvcj0KLU9TX1JHQkZvcmVDb2xvcl8wPWNhc3Q9KGNvbnN0IFJHQkNvbG9yICopCi0KLU9TX1JlYWRJY29uRmlsZT0KLU9TX1JlYWRJY29uRmlsZV8wPWNhc3Q9Y29uc3QgRlNTcGVjICoKLU9TX1JlYWRJY29uRmlsZV8xPWNhc3Q9SWNvbkZhbWlseUhhbmRsZSAqCi0KLU9TX1JlY2VpdmVOZXh0RXZlbnQ9Ci1PU19SZWNlaXZlTmV4dEV2ZW50XzA9Y2FzdD0oVUludDMyKQotT1NfUmVjZWl2ZU5leHRFdmVudF8xPWNhc3Q9KGNvbnN0IEV2ZW50VHlwZVNwZWMgKikKLU9TX1JlY2VpdmVOZXh0RXZlbnRfMj1jYXN0PShFdmVudFRpbWVvdXQpCi1PU19SZWNlaXZlTmV4dEV2ZW50XzM9Y2FzdD0oQm9vbGVhbikKLU9TX1JlY2VpdmVOZXh0RXZlbnRfND1jYXN0PShFdmVudFJlZiAqKQotCi1PU19SZWN0SW5SZ249Ci1PU19SZWN0SW5SZ25fMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19SZWN0SW5SZ25fMT1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1JlY3RSZ249Ci1PU19SZWN0UmduXzA9Y2FzdD0oUmduSGFuZGxlKQotT1NfUmVjdFJnbl8xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLQotT1NfUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50PQotCi1PU19SZWxlYXNlRXZlbnQ9Ci1PU19SZWxlYXNlRXZlbnRfMD1jYXN0PShFdmVudFJlZikKLQotT1NfUmVsZWFzZUljb25SZWY9Ci1PU19SZWxlYXNlSWNvblJlZl8wPWNhc3Q9SWNvblJlZgotCi1PU19SZWxlYXNlTWVudT0KLU9TX1JlbGVhc2VNZW51XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfUmVsZWFzZVdpbmRvdz0KLU9TX1JlbGVhc2VXaW5kb3dfMD1jYXN0PVdpbmRvd1JlZgotCi1PU19SZWxlYXNlV2luZG93R3JvdXA9Ci1PU19SZWxlYXNlV2luZG93R3JvdXBfMD1jYXN0PShXaW5kb3dHcm91cFJlZikKLQotT1NfUmVtb3ZlQ29udHJvbFByb3BlcnR5PQotT1NfUmVtb3ZlQ29udHJvbFByb3BlcnR5XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eV8xPQotT1NfUmVtb3ZlQ29udHJvbFByb3BlcnR5XzI9Ci0KLU9TX1JlbW92ZURhdGFCcm93c2VySXRlbXM9Ci1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1JlbW92ZURhdGFCcm93c2VySXRlbXNfMT1jYXN0PShEYXRhQnJvd3Nlckl0ZW1JRCkKLU9TX1JlbW92ZURhdGFCcm93c2VySXRlbXNfMj1jYXN0PShVSW50MzIpCi1PU19SZW1vdmVEYXRhQnJvd3Nlckl0ZW1zXzM9Y2FzdD0oY29uc3QgRGF0YUJyb3dzZXJJdGVtSUQgKikKLU9TX1JlbW92ZURhdGFCcm93c2VySXRlbXNfND1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi0KLU9TX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uPQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5fMD1jYXN0PShDb250cm9sUmVmKQotT1NfUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5fMT1jYXN0PShEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbklEKQotCi1PU19SZW1vdmVFdmVudEhhbmRsZXI9Ci1PU19SZW1vdmVFdmVudEhhbmRsZXJfMD1jYXN0PShFdmVudEhhbmRsZXJSZWYpCi0KLU9TX1JlbW92ZUV2ZW50TG9vcFRpbWVyPQotT1NfUmVtb3ZlRXZlbnRMb29wVGltZXJfMD1jYXN0PShFdmVudExvb3BUaW1lclJlZikKLQotT1NfUmVtb3ZlUmVjZWl2ZUhhbmRsZXI9Ci1PU19SZW1vdmVSZWNlaXZlSGFuZGxlcl8wPWNhc3Q9KERyYWdSZWNlaXZlSGFuZGxlclVQUCkKLU9TX1JlbW92ZVJlY2VpdmVIYW5kbGVyXzE9Y2FzdD0oV2luZG93UmVmKQotCi1PU19SZW1vdmVUcmFja2luZ0hhbmRsZXI9Ci1PU19SZW1vdmVUcmFja2luZ0hhbmRsZXJfMD1jYXN0PShEcmFnVHJhY2tpbmdIYW5kbGVyVVBQKQotT1NfUmVtb3ZlVHJhY2tpbmdIYW5kbGVyXzE9Y2FzdD0oV2luZG93UmVmKQotCi1PU19SZXBvc2l0aW9uV2luZG93PQotT1NfUmVwb3NpdGlvbldpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1JlcG9zaXRpb25XaW5kb3dfMT1jYXN0PShXaW5kb3dSZWYpCi1PU19SZXBvc2l0aW9uV2luZG93XzI9Ci0KLU9TX1Jlc2hhcGVDdXN0b21XaW5kb3c9Ci1PU19SZXNoYXBlQ3VzdG9tV2luZG93XzA9Y2FzdD1XaW5kb3dSZWYKLQotT1NfUmVzdG9yZUFwcGxpY2F0aW9uRG9ja1RpbGVJbWFnZT0KLQotT1NfUmV0YWluRXZlbnQ9Ci1PU19SZXRhaW5FdmVudF8wPWNhc3Q9KEV2ZW50UmVmKQotCi1PU19SZXRhaW5NZW51PQotT1NfUmV0YWluTWVudV8wPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1JldGFpbldpbmRvdz0KLU9TX1JldGFpbldpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfUmV2ZWFsRGF0YUJyb3dzZXJJdGVtPQotT1NfUmV2ZWFsRGF0YUJyb3dzZXJJdGVtXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1JldmVhbERhdGFCcm93c2VySXRlbV8xPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEKQotT1NfUmV2ZWFsRGF0YUJyb3dzZXJJdGVtXzI9Y2FzdD0oRGF0YUJyb3dzZXJQcm9wZXJ0eUlEKQotT1NfUmV2ZWFsRGF0YUJyb3dzZXJJdGVtXzM9Y2FzdD0oRGF0YUJyb3dzZXJSZXZlYWxPcHRpb25zKQotCi1PU19SdW5TdGFuZGFyZEFsZXJ0PQotT1NfUnVuU3RhbmRhcmRBbGVydF8wPWNhc3Q9KERpYWxvZ1JlZikKLU9TX1J1blN0YW5kYXJkQWxlcnRfMT1jYXN0PShNb2RhbEZpbHRlclVQUCkKLU9TX1J1blN0YW5kYXJkQWxlcnRfMj1jYXN0PShEaWFsb2dJdGVtSW5kZXggKikKLQotT1NfU2Nyb2xsUmVjdD0KLU9TX1Njcm9sbFJlY3RfMD1jYXN0PShjb25zdCBSZWN0ICopCi1PU19TY3JvbGxSZWN0XzE9Y2FzdD0oc2hvcnQpCi1PU19TY3JvbGxSZWN0XzI9Y2FzdD0oc2hvcnQpCi1PU19TY3JvbGxSZWN0XzM9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19TZWN0UmVjdD0KLU9TX1NlY3RSZWN0XzA9ZmxhZ3M9bm9fb3V0Ci1PU19TZWN0UmVjdF8xPWZsYWdzPW5vX291dAotT1NfU2VjdFJlY3RfMj1mbGFncz1ub19pbgotCi1PU19TZWN0UmduPQotT1NfU2VjdFJnbl8wPWNhc3Q9KFJnbkhhbmRsZSkKLU9TX1NlY3RSZ25fMT1jYXN0PShSZ25IYW5kbGUpCi1PU19TZWN0UmduXzI9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19TZWxlY3RXaW5kb3c9Ci1PU19TZWxlY3RXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NlbmRCZWhpbmQ9Ci1PU19TZW5kQmVoaW5kXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2VuZEJlaGluZF8xPWNhc3Q9KFdpbmRvd1JlZikKLQotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldD0KLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRfMD1jYXN0PShFdmVudFJlZikKLU9TX1NlbmRFdmVudFRvRXZlbnRUYXJnZXRfMT1jYXN0PShFdmVudFRhcmdldFJlZikKLQotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldFdpdGhPcHRpb25zPQotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldFdpdGhPcHRpb25zXzA9Y2FzdD1FdmVudFJlZgotT1NfU2VuZEV2ZW50VG9FdmVudFRhcmdldFdpdGhPcHRpb25zXzE9Y2FzdD0oRXZlbnRUYXJnZXRSZWYpCi1PU19TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0V2l0aE9wdGlvbnNfMj0KLQotT1NfU2V0QXBwbGljYXRpb25Eb2NrVGlsZUltYWdlPQotT1NfU2V0QXBwbGljYXRpb25Eb2NrVGlsZUltYWdlXzA9Y2FzdD0oQ0dJbWFnZVJlZikKLQotT1NfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3c9Ci1PU19TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvd18wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93XzE9Y2FzdD1Cb29sZWFuCi0KLU9TX1NldEJldmVsQnV0dG9uQ29udGVudEluZm89Ci1PU19TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldEJldmVsQnV0dG9uQ29udGVudEluZm9fMT1jYXN0PShDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIpCi0KLU9TX1NldENsaXA9Ci1PU19TZXRDbGlwXzA9Y2FzdD0oUmduSGFuZGxlKQotCi1PU19TZXRDb250cm9sMzJCaXRNYXhpbXVtPQotT1NfU2V0Q29udHJvbDMyQml0TWF4aW11bV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sMzJCaXRNYXhpbXVtXzE9Y2FzdD0oU0ludDMyKQotCi1PU19TZXRDb250cm9sMzJCaXRNaW5pbXVtPQotT1NfU2V0Q29udHJvbDMyQml0TWluaW11bV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sMzJCaXRNaW5pbXVtXzE9Y2FzdD0oU0ludDMyKQotCi1PU19TZXRDb250cm9sMzJCaXRWYWx1ZT0KLU9TX1NldENvbnRyb2wzMkJpdFZhbHVlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2wzMkJpdFZhbHVlXzE9Y2FzdD0oU0ludDMyKQotCi1PU19TZXRDb250cm9sQWN0aW9uPQotT1NfU2V0Q29udHJvbEFjdGlvbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sQWN0aW9uXzE9Y2FzdD0oQ29udHJvbEFjdGlvblVQUCkKLQotT1NfU2V0Q29udHJvbEJvdW5kcz0KLU9TX1NldENvbnRyb2xCb3VuZHNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbEJvdW5kc18xPWNhc3Q9KGNvbnN0IFJlY3QgKikKLQotT1NfU2V0Q29udHJvbENvbG9yUHJvYz0KLU9TX1NldENvbnRyb2xDb2xvclByb2NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbENvbG9yUHJvY18xPWNhc3Q9KENvbnRyb2xDb2xvclVQUCkKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlJPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJSV8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUlfMz1jYXN0PShTaXplKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlJXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mb18yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mb18yXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sQnV0dG9uQ29udGVudEluZm9fMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xCdXR0b25Db250ZW50SW5mb18yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvXzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzI9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblJlY18yXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uUmVjXzJfMz1jYXN0PShTaXplKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sRWRpdFRleHRTZWxlY3Rpb25SZWNfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Db250cm9sVGFiSW5mb1JlY1YxXzI9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NvbnRyb2xUYWJJbmZvUmVjVjFfMl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbFRhYkluZm9SZWNWMV8yXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbFRhYkluZm9SZWNWMV8yXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ29udHJvbFRhYkluZm9SZWNWMV8yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xvbmdEYXRlUmVjXzI9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xvbmdEYXRlUmVjXzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Mb25nRGF0ZVJlY18yXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Mb25nRGF0ZVJlY18yXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fTG9uZ0RhdGVSZWNfMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0xvbmdEYXRlUmVjXzJfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8yPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl8zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0I9Ci1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zQl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zQl8xPWNhc3Q9KENvbnRyb2xQYXJ0Q29kZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzI9Y2FzdD0oUmVzVHlwZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzM9Y2FzdD0oU2l6ZSkKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNCXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zST0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNJXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNJXzE9Y2FzdD0oQ29udHJvbFBhcnRDb2RlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMj1jYXN0PShSZXNUeXBlKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfMz1jYXN0PShTaXplKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM0lfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xEYXRhX19JSUlJXzNTPQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM1NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbERhdGFfX0lJSUlfM1NfMT1jYXN0PShDb250cm9sUGFydENvZGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18yPWNhc3Q9KFJlc1R5cGUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU18zPWNhc3Q9KFNpemUpCi1PU19TZXRDb250cm9sRGF0YV9fSUlJSV8zU180PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0Q29udHJvbEZvbnRTdHlsZT0KLU9TX1NldENvbnRyb2xGb250U3R5bGVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbEZvbnRTdHlsZV8xPWNhc3Q9KGNvbnN0IENvbnRyb2xGb250U3R5bGVSZWMgKikKLQotT1NfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZT0KLU9TX1NldENvbnRyb2xQb3B1cE1lbnVIYW5kbGVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZV8xPWNhc3Q9KE1lbnVSZWYpCi0KLU9TX1NldENvbnRyb2xQcm9wZXJ0eT0KLU9TX1NldENvbnRyb2xQcm9wZXJ0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sUHJvcGVydHlfMT0KLU9TX1NldENvbnRyb2xQcm9wZXJ0eV8yPQotT1NfU2V0Q29udHJvbFByb3BlcnR5XzM9Ci1PU19TZXRDb250cm9sUHJvcGVydHlfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldENvbnRyb2xSZWZlcmVuY2U9Ci1PU19TZXRDb250cm9sUmVmZXJlbmNlXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xSZWZlcmVuY2VfMT1jYXN0PShTSW50MzIpCi0KLU9TX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZz0KLU9TX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZ18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmdfMT1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfU2V0Q29udHJvbFZpZXdTaXplPQotT1NfU2V0Q29udHJvbFZpZXdTaXplXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldENvbnRyb2xWaWV3U2l6ZV8xPWNhc3Q9KFNJbnQzMikKLQotT1NfU2V0Q29udHJvbFZpc2liaWxpdHk9Ci1PU19TZXRDb250cm9sVmlzaWJpbGl0eV8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXRDb250cm9sVmlzaWJpbGl0eV8xPQotT1NfU2V0Q29udHJvbFZpc2liaWxpdHlfMj0KLQotT1NfU2V0Q3Vyc29yPQotT1NfU2V0Q3Vyc29yXzA9Y2FzdD0oY29uc3QgQ3Vyc29yICopCi0KLU9TX1NldERhdGFCcm93c2VyQ2FsbGJhY2tzPQotT1NfU2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJDYWxsYmFja3NfMT1jYXN0PShjb25zdCBEYXRhQnJvd3NlckNhbGxiYWNrcyAqKSxmbGFncz1pbml0Ci0KLU9TX1NldERhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzPQotT1NfU2V0RGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfMT0KLQotT1NfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzPQotT1NfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFyc18xPWNhc3Q9KEJvb2xlYW4pCi1PU19TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnNfMj1jYXN0PShCb29sZWFuKQotCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQm9vbGVhblZhbHVlPQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJvb2xlYW5WYWx1ZV8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhQm9vbGVhblZhbHVlXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlPQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUJ1dHRvblZhbHVlXzA9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtRGF0YVJlZikKLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFCdXR0b25WYWx1ZV8xPWNhc3Q9KFRoZW1lQnV0dG9uVmFsdWUpCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFJY29uPQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUljb25fMD1jYXN0PShEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUljb25fMT1jYXN0PShJY29uUmVmKQotCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSXRlbUlEPQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YUl0ZW1JRF8wPWNhc3Q9KERhdGFCcm93c2VySXRlbURhdGFSZWYpCi1PU19TZXREYXRhQnJvd3Nlckl0ZW1EYXRhSXRlbUlEXzE9Y2FzdD0oRGF0YUJyb3dzZXJJdGVtSUQpCi0KLU9TX1NldERhdGFCcm93c2VySXRlbURhdGFUZXh0PQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHRfMD1jYXN0PShEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHRfMT1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW49Ci1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbl8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbl8xPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSUQpCi1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbl8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQ9Ci1PU19TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0XzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHRfMT1jYXN0PShVSW50MTYpCi0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjPQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfMT0KLU9TX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjXzI9Ci0KLU9TX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncz0KLU9TX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFnc18wPWNhc3Q9Q29udHJvbFJlZgotT1NfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzXzE9Y2FzdD1EYXRhQnJvd3NlclByb3BlcnR5SUQKLU9TX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFnc18yPWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlGbGFncykKLQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbj0KLU9TX1NldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb25fMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbl8xPWNhc3Q9KFVJbnQzMikKLU9TX1NldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb25fMj1jYXN0PShVSW50MzIpCi0KLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtcz0KLU9TX1NldERhdGFCcm93c2VyU2VsZWN0ZWRJdGVtc18wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXNfMT1jYXN0PShVSW50MzIpCi1PU19TZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXNfMj1jYXN0PShjb25zdCBEYXRhQnJvd3Nlckl0ZW1JRCAqKQotT1NfU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zXzM9Y2FzdD0oRGF0YUJyb3dzZXJTZXRPcHRpb24pCi0KLU9TX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3M9Ci1PU19TZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3NfMT1jYXN0PShEYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKQotCi1PU19TZXREYXRhQnJvd3NlclNvcnRPcmRlcj0KLU9TX1NldERhdGFCcm93c2VyU29ydE9yZGVyXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyU29ydE9yZGVyXzE9Ci0KLU9TX1NldERhdGFCcm93c2VyU29ydFByb3BlcnR5PQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHlfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHlfMT1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb249Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMT0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb25fMj0KLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZT0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGVfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZV8xPQotCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3c9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93XzE9Ci1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dfMj0KLQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoPQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aF8xPWNhc3Q9KERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uSUQpCi1PU19TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGhfMj1jYXN0PShVSW50MTYpCi0KLU9TX1NldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0PQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHRfMT0KLQotT1NfU2V0RGF0YUJyb3dzZXJUYXJnZXQ9Ci1PU19TZXREYXRhQnJvd3NlclRhcmdldF8wPWNhc3Q9KENvbnRyb2xSZWYpCi1PU19TZXREYXRhQnJvd3NlclRhcmdldF8xPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEKQotCi1PU19TZXREcmFnQWxsb3dhYmxlQWN0aW9ucz0KLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1NldERyYWdBbGxvd2FibGVBY3Rpb25zXzE9Y2FzdD0oRHJhZ0FjdGlvbnMpCi1PU19TZXREcmFnQWxsb3dhYmxlQWN0aW9uc18yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldERyYWdEcm9wQWN0aW9uPQotT1NfU2V0RHJhZ0Ryb3BBY3Rpb25fMD1jYXN0PShEcmFnUmVmKQotT1NfU2V0RHJhZ0Ryb3BBY3Rpb25fMT1jYXN0PShEcmFnQWN0aW9ucykKLQotT1NfU2V0RHJhZ0ltYWdlV2l0aENHSW1hZ2U9Ci1PU19TZXREcmFnSW1hZ2VXaXRoQ0dJbWFnZV8wPWNhc3Q9KERyYWdSZWYpCi1PU19TZXREcmFnSW1hZ2VXaXRoQ0dJbWFnZV8xPWNhc3Q9KENHSW1hZ2VSZWYpCi1PU19TZXREcmFnSW1hZ2VXaXRoQ0dJbWFnZV8yPWNhc3Q9KEhJUG9pbnQgKikKLU9TX1NldERyYWdJbWFnZVdpdGhDR0ltYWdlXzM9Y2FzdD0oRHJhZ0ltYWdlRmxhZ3MpCi0KLU9TX1NldERyYWdJbnB1dFByb2M9Ci1PU19TZXREcmFnSW5wdXRQcm9jXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1NldERyYWdJbnB1dFByb2NfMT1jYXN0PShEcmFnSW5wdXRVUFApCi1PU19TZXREcmFnSW5wdXRQcm9jXzI9Y2FzdD0odm9pZCAqKQotCi1PU19TZXREcmFnSXRlbUZsYXZvckRhdGE9Ci1PU19TZXREcmFnSXRlbUZsYXZvckRhdGFfMD1jYXN0PShEcmFnUmVmKQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzE9Y2FzdD0oRHJhZ0l0ZW1SZWYpCi1PU19TZXREcmFnSXRlbUZsYXZvckRhdGFfMj1jYXN0PShGbGF2b3JUeXBlKQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzM9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhXzQ9Y2FzdD0oU2l6ZSkKLU9TX1NldERyYWdJdGVtRmxhdm9yRGF0YV81PWNhc3Q9KFVJbnQzMikKLQotT1NfU2V0RHJhZ1NlbmRQcm9jPQotT1NfU2V0RHJhZ1NlbmRQcm9jXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1NldERyYWdTZW5kUHJvY18xPWNhc3Q9KERyYWdTZW5kRGF0YVVQUCkKLU9TX1NldERyYWdTZW5kUHJvY18yPWNhc3Q9KHZvaWQgKikKLQotT1NfU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWU9Ci1PU19TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZV8wPWNhc3Q9KEV2ZW50TG9vcFRpbWVyUmVmKQotT1NfU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWVfMT1jYXN0PShFdmVudFRpbWVySW50ZXJ2YWwpCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yPQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMD1jYXN0PShFdmVudFJlZikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQb2ludF8yXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BvaW50XzJfMz1jYXN0PShVSW50MzIpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUG9pbnRfMl80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ISUNvbW1hbmRfMj0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfMD1jYXN0PShFdmVudFJlZikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSElDb21tYW5kXzJfMz1jYXN0PShVSW50MzIpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hJQ29tbWFuZF8yXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQz0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zQ18xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0NfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNDXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0NfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJPQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfMD1jYXN0PShFdmVudFJlZikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNJXzE9Y2FzdD0oRXZlbnRQYXJhbU5hbWUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zSV8yPWNhc3Q9KEV2ZW50UGFyYW1UeXBlKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM0lfMz1jYXN0PShVSW50MzIpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zSV80PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1M9Ci1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU18wPWNhc3Q9KEV2ZW50UmVmKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1NfMT1jYXN0PShFdmVudFBhcmFtTmFtZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTXzI9Y2FzdD0oRXZlbnRQYXJhbVR5cGUpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zU18zPWNhc3Q9KFVJbnQzMikKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNTXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zWj0KLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNaXzA9Y2FzdD0oRXZlbnRSZWYpCi1PU19TZXRFdmVudFBhcmFtZXRlcl9fSUlJSV8zWl8xPWNhc3Q9KEV2ZW50UGFyYW1OYW1lKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1pfMj1jYXN0PShFdmVudFBhcmFtVHlwZSkKLU9TX1NldEV2ZW50UGFyYW1ldGVyX19JSUlJXzNaXzM9Y2FzdD0oVUludDMyKQotT1NfU2V0RXZlbnRQYXJhbWV0ZXJfX0lJSUlfM1pfND1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX1NldEZvbnRJbmZvRm9yU2VsZWN0aW9uPQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb25fMD1jYXN0PShPU1R5cGUpCi1PU19TZXRGb250SW5mb0ZvclNlbGVjdGlvbl8xPWNhc3Q9KFVJbnQzMikKLU9TX1NldEZvbnRJbmZvRm9yU2VsZWN0aW9uXzI9Y2FzdD0odm9pZCAqKQotT1NfU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb25fMz1jYXN0PXZvaWQgKgotCi1PU19TZXRGcm9udFByb2Nlc3M9Ci1PU19TZXRGcm9udFByb2Nlc3NfMD1jYXN0PShjb25zdCBQcm9jZXNzU2VyaWFsTnVtYmVyICopCi0KLU9TX1NldEZyb250UHJvY2Vzc1dpdGhPcHRpb25zPQotT1NfU2V0RnJvbnRQcm9jZXNzV2l0aE9wdGlvbnNfMD1jYXN0PShjb25zdCBQcm9jZXNzU2VyaWFsTnVtYmVyICopCi1PU19TZXRGcm9udFByb2Nlc3NXaXRoT3B0aW9uc18xPQotCi1PU19TZXRHV29ybGQ9Ci1PU19TZXRHV29ybGRfMD1jYXN0PShDR3JhZlB0cikKLU9TX1NldEdXb3JsZF8xPWNhc3Q9KEdESGFuZGxlKQotCi1PU19TZXRIYW5kbGVTaXplPQotT1NfU2V0SGFuZGxlU2l6ZV8wPWNhc3Q9SGFuZGxlCi1PU19TZXRIYW5kbGVTaXplXzE9Ci0KLU9TX1NldEljb25GYW1pbHlEYXRhPQotT1NfU2V0SWNvbkZhbWlseURhdGFfMD1jYXN0PUljb25GYW1pbHlIYW5kbGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzE9Y2FzdD1PU1R5cGUKLU9TX1NldEljb25GYW1pbHlEYXRhXzI9Y2FzdD1IYW5kbGUKLQotT1NfU2V0SXRlbU1hcms9Ci1PU19TZXRJdGVtTWFya18wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRJdGVtTWFya18xPQotT1NfU2V0SXRlbU1hcmtfMj0KLQotT1NfU2V0S2V5Ym9hcmRGb2N1cz0KLU9TX1NldEtleWJvYXJkRm9jdXNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRLZXlib2FyZEZvY3VzXzE9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldEtleWJvYXJkRm9jdXNfMj1jYXN0PShDb250cm9sRm9jdXNQYXJ0KQotCi1PU19TZXRNZW51Q29tbWFuZE1hcms9Ci1PU19TZXRNZW51Q29tbWFuZE1hcmtfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUNvbW1hbmRNYXJrXzE9Y2FzdD0oTWVudUNvbW1hbmQpCi1PU19TZXRNZW51Q29tbWFuZE1hcmtfMj1jYXN0PShVbmlDaGFyKQotCi1PU19TZXRNZW51Rm9udD0KLU9TX1NldE1lbnVGb250XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVGb250XzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUZvbnRfMj1jYXN0PShVSW50MTYpCi0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleT0KLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbUNvbW1hbmRLZXlfMT1jYXN0PShNZW51SXRlbUluZGV4KQotT1NfU2V0TWVudUl0ZW1Db21tYW5kS2V5XzI9Y2FzdD0oQm9vbGVhbikKLU9TX1NldE1lbnVJdGVtQ29tbWFuZEtleV8zPWNhc3Q9KFVJbnQxNikKLQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51PQotT1NfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51XzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudV8xPWNhc3Q9KE1lbnVJdGVtSW5kZXgpCi1PU19TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnVfMj1jYXN0PShNZW51UmVmKQotCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGU9Ci1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1JY29uSGFuZGxlXzI9Y2FzdD0oVUludDgpCi1PU19TZXRNZW51SXRlbUljb25IYW5kbGVfMz1jYXN0PShIYW5kbGUpCi0KLU9TX1NldE1lbnVJdGVtS2V5R2x5cGg9Ci1PU19TZXRNZW51SXRlbUtleUdseXBoXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtS2V5R2x5cGhfMT1jYXN0PShTSW50MTYpCi1PU19TZXRNZW51SXRlbUtleUdseXBoXzI9Y2FzdD0oU0ludDE2KQotCi1PU19TZXRNZW51SXRlbU1vZGlmaWVycz0KLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzA9Y2FzdD0oTWVudVJlZikKLU9TX1NldE1lbnVJdGVtTW9kaWZpZXJzXzE9Y2FzdD0oU0ludDE2KQotT1NfU2V0TWVudUl0ZW1Nb2RpZmllcnNfMj1jYXN0PShVSW50OCkKLQotT1NfU2V0TWVudUl0ZW1SZWZDb249Ci1PU19TZXRNZW51SXRlbVJlZkNvbl8wPWNhc3Q9KE1lbnVSZWYpCi1PU19TZXRNZW51SXRlbVJlZkNvbl8xPWNhc3Q9KFNJbnQxNikKLU9TX1NldE1lbnVJdGVtUmVmQ29uXzI9Y2FzdD0oVUludDMyKQotCi1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nXzE9Y2FzdD0oTWVudUl0ZW1JbmRleCkKLU9TX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZ18yPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmc9Ci1PU19TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmdfMD1jYXN0PShNZW51UmVmKQotT1NfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi0KLU9TX1NldFBvcnQ9Ci1PU19TZXRQb3J0XzA9Y2FzdD0oR3JhZlB0cikKLQotT1NfU2V0UHQ9Ci1PU19TZXRQdF8wPWNhc3Q9KFBvaW50ICopCi1PU19TZXRQdF8xPWNhc3Q9KHNob3J0KQotT1NfU2V0UHRfMj1jYXN0PShzaG9ydCkKLQotT1NfU2V0UmVjdD0KLU9TX1NldFJlY3RfMD1jYXN0PShSZWN0ICopCi1PU19TZXRSZWN0XzE9Y2FzdD0oc2hvcnQpCi1PU19TZXRSZWN0XzI9Y2FzdD0oc2hvcnQpCi1PU19TZXRSZWN0XzM9Y2FzdD0oc2hvcnQpCi1PU19TZXRSZWN0XzQ9Y2FzdD0oc2hvcnQpCi0KLU9TX1NldFJlY3RSZ249Ci1PU19TZXRSZWN0UmduXzA9Y2FzdD0oUmduSGFuZGxlKQotT1NfU2V0UmVjdFJnbl8xPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdFJnbl8yPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdFJnbl8zPWNhc3Q9KHNob3J0KQotT1NfU2V0UmVjdFJnbl80PWNhc3Q9KHNob3J0KQotCi1PU19TZXRSb290TWVudT0KLU9TX1NldFJvb3RNZW51XzA9Y2FzdD0oTWVudVJlZikKLQotT1NfU2V0VGhlbWVCYWNrZ3JvdW5kPQotT1NfU2V0VGhlbWVCYWNrZ3JvdW5kXzA9Y2FzdD0oVGhlbWVCcnVzaCkKLU9TX1NldFRoZW1lQmFja2dyb3VuZF8xPWNhc3Q9KFNJbnQxNikKLU9TX1NldFRoZW1lQmFja2dyb3VuZF8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldFRoZW1lQ3Vyc29yPQotT1NfU2V0VGhlbWVDdXJzb3JfMD1jYXN0PShUaGVtZUN1cnNvcikKLQotT1NfU2V0VGhlbWVEcmF3aW5nU3RhdGU9Ci1PU19TZXRUaGVtZURyYXdpbmdTdGF0ZV8wPWNhc3Q9KFRoZW1lRHJhd2luZ1N0YXRlKQotT1NfU2V0VGhlbWVEcmF3aW5nU3RhdGVfMT1jYXN0PShCb29sZWFuKQotCi1PU19TZXRUaGVtZVRleHRDb2xvcj0KLU9TX1NldFRoZW1lVGV4dENvbG9yXzA9Ci1PU19TZXRUaGVtZVRleHRDb2xvcl8xPQotT1NfU2V0VGhlbWVUZXh0Q29sb3JfMj0KLQotT1NfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kPQotT1NfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kXzE9Y2FzdD0oVGhlbWVCcnVzaCkKLU9TX1NldFRoZW1lV2luZG93QmFja2dyb3VuZF8yPWNhc3Q9KEJvb2xlYW4pCi0KLU9TX1NldFVwQ29udHJvbEJhY2tncm91bmQ9Ci1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kXzA9Y2FzdD0oQ29udHJvbFJlZikKLU9TX1NldFVwQ29udHJvbEJhY2tncm91bmRfMT1jYXN0PShTSW50MTYpCi1PU19TZXRVcENvbnRyb2xCYWNrZ3JvdW5kXzI9Y2FzdD0oQm9vbGVhbikKLQotT1NfU2V0V2luZG93QWN0aXZhdGlvblNjb3BlPQotT1NfU2V0V2luZG93QWN0aXZhdGlvblNjb3BlXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93QWN0aXZhdGlvblNjb3BlXzE9Y2FzdD0oV2luZG93QWN0aXZhdGlvblNjb3BlKQotCi1PU19TZXRXaW5kb3dCb3VuZHM9Ci1PU19TZXRXaW5kb3dCb3VuZHNfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRXaW5kb3dCb3VuZHNfMT1jYXN0PShXaW5kb3dSZWdpb25Db2RlKQotT1NfU2V0V2luZG93Qm91bmRzXzI9Y2FzdD0oUmVjdCAqKQotCi1PU19TZXRXaW5kb3dEZWZhdWx0QnV0dG9uPQotT1NfU2V0V2luZG93RGVmYXVsdEJ1dHRvbl8wPWNhc3Q9KFdpbmRvd1JlZikKLU9TX1NldFdpbmRvd0RlZmF1bHRCdXR0b25fMT1jYXN0PShDb250cm9sUmVmKQotCi1PU19TZXRXaW5kb3dHcm91cD0KLU9TX1NldFdpbmRvd0dyb3VwXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93R3JvdXBfMT1jYXN0PShXaW5kb3dHcm91cFJlZikKLQotT1NfU2V0V2luZG93R3JvdXBPd25lcj0KLU9TX1NldFdpbmRvd0dyb3VwT3duZXJfMD1jYXN0PShXaW5kb3dHcm91cFJlZikKLU9TX1NldFdpbmRvd0dyb3VwT3duZXJfMT1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NldFdpbmRvd0dyb3VwUGFyZW50PQotT1NfU2V0V2luZG93R3JvdXBQYXJlbnRfMD1jYXN0PShXaW5kb3dHcm91cFJlZikKLU9TX1NldFdpbmRvd0dyb3VwUGFyZW50XzE9Y2FzdD0oV2luZG93R3JvdXBSZWYpCi0KLU9TX1NldFdpbmRvd01vZGFsaXR5PQotT1NfU2V0V2luZG93TW9kYWxpdHlfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TZXRXaW5kb3dNb2RhbGl0eV8xPWNhc3Q9KFdpbmRvd01vZGFsaXR5KQotT1NfU2V0V2luZG93TW9kYWxpdHlfMj1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NldFdpbmRvd1Jlc2l6ZUxpbWl0cz0KLU9TX1NldFdpbmRvd1Jlc2l6ZUxpbWl0c18wPWNhc3Q9V2luZG93UmVmCi1PU19TZXRXaW5kb3dSZXNpemVMaW1pdHNfMT1jYXN0PShISVNpemUgKikKLU9TX1NldFdpbmRvd1Jlc2l6ZUxpbWl0c18yPWNhc3Q9KEhJU2l6ZSAqKQotCi1PU19TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZz0KLU9TX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmdfMT1jYXN0PShDRlN0cmluZ1JlZikKLQotT1NfU2hvd1dpbmRvdz0KLU9TX1Nob3dXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi0KLU9TX1NpemVDb250cm9sPQotT1NfU2l6ZUNvbnRyb2xfMD1jYXN0PShDb250cm9sUmVmKQotT1NfU2l6ZUNvbnRyb2xfMT1jYXN0PShTSW50MTYpCi1PU19TaXplQ29udHJvbF8yPWNhc3Q9KFNJbnQxNikKLQotT1NfU2l6ZVdpbmRvdz0KLU9TX1NpemVXaW5kb3dfMD1jYXN0PShXaW5kb3dSZWYpCi1PU19TaXplV2luZG93XzE9Y2FzdD0oc2hvcnQpCi1PU19TaXplV2luZG93XzI9Y2FzdD0oc2hvcnQpCi1PU19TaXplV2luZG93XzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfU3RpbGxEb3duPQotCi1PU19TeXNCZWVwPQotT1NfU3lzQmVlcF8wPWNhc3Q9KHNob3J0KQotCi1PU19UWE5Db3B5PQotT1NfVFhOQ29weV8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOQ3V0PQotT1NfVFhOQ3V0XzA9Y2FzdD0oVFhOT2JqZWN0KQotCi1PU19UWE5EYXRhU2l6ZT0KLU9TX1RYTkRhdGFTaXplXzA9Y2FzdD0oVFhOT2JqZWN0KQotCi1PU19UWE5EZWxldGVPYmplY3Q9Ci1PU19UWE5EZWxldGVPYmplY3RfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTkVjaG9Nb2RlPQotT1NfVFhORWNob01vZGVfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5FY2hvTW9kZV8xPWNhc3Q9KFVuaUNoYXIpCi1PU19UWE5FY2hvTW9kZV8yPWNhc3Q9KFRleHRFbmNvZGluZykKLU9TX1RYTkVjaG9Nb2RlXzM9Y2FzdD0oQm9vbGVhbikKLQotT1NfVFhOR2V0RGF0YT0KLU9TX1RYTkdldERhdGFfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXREYXRhXzE9Y2FzdD0oVFhOT2Zmc2V0KQotT1NfVFhOR2V0RGF0YV8yPWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTkdldERhdGFfMz1jYXN0PShIYW5kbGUgKikKLQotT1NfVFhOR2V0SElSZWN0PQotT1NfVFhOR2V0SElSZWN0XzA9Y2FzdD1UWE5PYmplY3QKLU9TX1RYTkdldEhJUmVjdF8xPQotT1NfVFhOR2V0SElSZWN0XzI9Ci0KLU9TX1RYTkdldExpbmVDb3VudD0KLU9TX1RYTkdldExpbmVDb3VudF8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldExpbmVDb3VudF8xPWNhc3Q9KEl0ZW1Db3VudCAqKQotCi1PU19UWE5HZXRMaW5lTWV0cmljcz0KLU9TX1RYTkdldExpbmVNZXRyaWNzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0TGluZU1ldHJpY3NfMT1jYXN0PShVSW50MzIpCi1PU19UWE5HZXRMaW5lTWV0cmljc18yPWNhc3Q9KEZpeGVkICopCi1PU19UWE5HZXRMaW5lTWV0cmljc18zPWNhc3Q9KEZpeGVkICopCi0KLU9TX1RYTkdldFNlbGVjdGlvbj0KLU9TX1RYTkdldFNlbGVjdGlvbl8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTkdldFNlbGVjdGlvbl8xPWNhc3Q9KFRYTk9mZnNldCAqKQotT1NfVFhOR2V0U2VsZWN0aW9uXzI9Y2FzdD0oVFhOT2Zmc2V0ICopCi0KLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzPQotT1NfVFhOR2V0VFhOT2JqZWN0Q29udHJvbHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5HZXRUWE5PYmplY3RDb250cm9sc18xPWNhc3Q9KEl0ZW1Db3VudCkKLU9TX1RYTkdldFRYTk9iamVjdENvbnRyb2xzXzI9Y2FzdD0oY29uc3QgVFhOQ29udHJvbFRhZyAqKQotT1NfVFhOR2V0VFhOT2JqZWN0Q29udHJvbHNfMz1jYXN0PShUWE5Db250cm9sRGF0YSAqKQotCi1PU19UWE5HZXRWaWV3UmVjdD0KLU9TX1RYTkdldFZpZXdSZWN0XzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOR2V0Vmlld1JlY3RfMT0KLQotT1NfVFhOSElQb2ludFRvT2Zmc2V0PQotT1NfVFhOSElQb2ludFRvT2Zmc2V0XzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOSElQb2ludFRvT2Zmc2V0XzE9Y2FzdD0oSElQb2ludCAqKQotT1NfVFhOSElQb2ludFRvT2Zmc2V0XzI9Y2FzdD0oVFhOT2Zmc2V0ICopCi0KLU9TX1RYTkluaXRUZXh0ZW5zaW9uPQotT1NfVFhOSW5pdFRleHRlbnNpb25fMD1jYXN0PShjb25zdCBUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqKQotT1NfVFhOSW5pdFRleHRlbnNpb25fMT1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5Jbml0VGV4dGVuc2lvbl8yPWNhc3Q9KFRYTkluaXRPcHRpb25zKQotCi1PU19UWE5PZmZzZXRUb0hJUG9pbnQ9Ci1PU19UWE5PZmZzZXRUb0hJUG9pbnRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5PZmZzZXRUb0hJUG9pbnRfMT1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5PZmZzZXRUb0hJUG9pbnRfMj1jYXN0PShISVBvaW50ICopCi0KLU9TX1RYTlBhc3RlPQotT1NfVFhOUGFzdGVfMD1jYXN0PShUWE5PYmplY3QpCi0KLU9TX1RYTlNlbGVjdEFsbD0KLU9TX1RYTlNlbGVjdEFsbF8wPWNhc3Q9KFRYTk9iamVjdCkKLQotT1NfVFhOU2V0QmFja2dyb3VuZD0KLU9TX1RYTlNldEJhY2tncm91bmRfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRCYWNrZ3JvdW5kXzE9Y2FzdD0oY29uc3QgVFhOQmFja2dyb3VuZCAqKQotCi1PU19UWE5TZXREYXRhPQotT1NfVFhOU2V0RGF0YV8wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldERhdGFfMT1jYXN0PShUWE5EYXRhVHlwZSkKLU9TX1RYTlNldERhdGFfMj1jYXN0PShjb25zdCB2b2lkICopCi1PU19UWE5TZXREYXRhXzM9Y2FzdD0oQnl0ZUNvdW50KQotT1NfVFhOU2V0RGF0YV80PWNhc3Q9KFRYTk9mZnNldCkKLU9TX1RYTlNldERhdGFfNT1jYXN0PShUWE5PZmZzZXQpCi0KLU9TX1RYTlNldEZyYW1lQm91bmRzPQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TZXRGcmFtZUJvdW5kc18xPWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzI9Y2FzdD0oU0ludDMyKQotT1NfVFhOU2V0RnJhbWVCb3VuZHNfMz1jYXN0PShTSW50MzIpCi1PU19UWE5TZXRGcmFtZUJvdW5kc180PWNhc3Q9KFNJbnQzMikKLU9TX1RYTlNldEZyYW1lQm91bmRzXzU9Y2FzdD0oVFhORnJhbWVJRCkKLQotT1NfVFhOU2V0U2VsZWN0aW9uPQotT1NfVFhOU2V0U2VsZWN0aW9uXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzE9Y2FzdD0oVFhOT2Zmc2V0KQotT1NfVFhOU2V0U2VsZWN0aW9uXzI9Y2FzdD0oVFhOT2Zmc2V0KQotCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9scz0KLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzA9Y2FzdD0oVFhOT2JqZWN0KQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMT1jYXN0PShCb29sZWFuKQotT1NfVFhOU2V0VFhOT2JqZWN0Q29udHJvbHNfMj1jYXN0PShJdGVtQ291bnQpCi1PU19UWE5TZXRUWE5PYmplY3RDb250cm9sc18zPWNhc3Q9KGNvbnN0IFRYTkNvbnRyb2xUYWcgKikKLU9TX1RYTlNldFRYTk9iamVjdENvbnRyb2xzXzQ9Y2FzdD0oY29uc3QgVFhOQ29udHJvbERhdGEgKikKLQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXM9Ci1PU19UWE5TZXRUeXBlQXR0cmlidXRlc18wPWNhc3Q9KFRYTk9iamVjdCkKLU9TX1RYTlNldFR5cGVBdHRyaWJ1dGVzXzE9Y2FzdD0oSXRlbUNvdW50KQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMj1jYXN0PShjb25zdCBUWE5UeXBlQXR0cmlidXRlcyAqKQotT1NfVFhOU2V0VHlwZUF0dHJpYnV0ZXNfMz1jYXN0PShUWE5PZmZzZXQpCi1PU19UWE5TZXRUeXBlQXR0cmlidXRlc180PWNhc3Q9KFRYTk9mZnNldCkKLQotT1NfVFhOU2hvd1NlbGVjdGlvbj0KLU9TX1RYTlNob3dTZWxlY3Rpb25fMD1jYXN0PShUWE5PYmplY3QpCi1PU19UWE5TaG93U2VsZWN0aW9uXzE9Y2FzdD0oQm9vbGVhbikKLQotT1NfVGV4dEZhY2U9Ci1PU19UZXh0RmFjZV8wPWNhc3Q9KFN0eWxlUGFyYW1ldGVyKQotCi1PU19UZXh0Rm9udD0KLU9TX1RleHRGb250XzA9Y2FzdD0oc2hvcnQpCi0KLU9TX1RleHRTaXplPQotT1NfVGV4dFNpemVfMD1jYXN0PShzaG9ydCkKLQotT1NfVHJhY2tEcmFnPQotT1NfVHJhY2tEcmFnXzA9Y2FzdD0oRHJhZ1JlZikKLU9TX1RyYWNrRHJhZ18xPWNhc3Q9KGNvbnN0IEV2ZW50UmVjb3JkICopCi1PU19UcmFja0RyYWdfMj1jYXN0PShSZ25IYW5kbGUpCi0KLU9TX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zPQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfMD1jYXN0PShHcmFmUHRyKQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfMT1jYXN0PShPcHRpb25CaXRzKQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfMj1jYXN0PShFdmVudFRpbWVvdXQpCi1PU19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9uc18zPWNhc3Q9KFBvaW50ICopCi1PU19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9uc180PWNhc3Q9KFVJbnQzMiAqKQotT1NfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnNfNT1jYXN0PShNb3VzZVRyYWNraW5nUmVzdWx0ICopCi0KLU9TX1VUVHlwZUNyZWF0ZUFsbElkZW50aWZpZXJzRm9yVGFnPQotT1NfVVRUeXBlQ3JlYXRlQWxsSWRlbnRpZmllcnNGb3JUYWdfMD1jYXN0PShDRlN0cmluZ1JlZikKLU9TX1VUVHlwZUNyZWF0ZUFsbElkZW50aWZpZXJzRm9yVGFnXzE9Y2FzdD0oQ0ZTdHJpbmdSZWYpCi1PU19VVFR5cGVDcmVhdGVBbGxJZGVudGlmaWVyc0ZvclRhZ18yPWNhc3Q9KENGU3RyaW5nUmVmKQotCi1PU19VVFR5cGVDcmVhdGVQcmVmZXJyZWRJZGVudGlmaWVyRm9yVGFnPQotT1NfVVRUeXBlQ3JlYXRlUHJlZmVycmVkSWRlbnRpZmllckZvclRhZ18wPWNhc3Q9KENGU3RyaW5nUmVmKQotT1NfVVRUeXBlQ3JlYXRlUHJlZmVycmVkSWRlbnRpZmllckZvclRhZ18xPWNhc3Q9Q0ZTdHJpbmdSZWYKLU9TX1VUVHlwZUNyZWF0ZVByZWZlcnJlZElkZW50aWZpZXJGb3JUYWdfMj1jYXN0PUNGU3RyaW5nUmVmCi0KLU9TX1VuaW9uUmVjdD0KLU9TX1VuaW9uUmVjdF8wPWZsYWdzPW5vX291dAotT1NfVW5pb25SZWN0XzE9ZmxhZ3M9bm9fb3V0Ci1PU19VbmlvblJlY3RfMj1mbGFncz1ub19pbgotCi1PU19VbmlvblJnbj0KLU9TX1VuaW9uUmduXzA9Y2FzdD0oUmduSGFuZGxlKQotT1NfVW5pb25SZ25fMT1jYXN0PShSZ25IYW5kbGUpCi1PU19VbmlvblJnbl8yPWNhc3Q9KFJnbkhhbmRsZSkKLQotT1NfVXBkYXRlRGF0YUJyb3dzZXJJdGVtcz0KLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMD1jYXN0PShDb250cm9sUmVmKQotT1NfVXBkYXRlRGF0YUJyb3dzZXJJdGVtc18xPWNhc3Q9KERhdGFCcm93c2VySXRlbUlEKQotT1NfVXBkYXRlRGF0YUJyb3dzZXJJdGVtc18yPWNhc3Q9KFVJbnQzMikKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfMz1jYXN0PShjb25zdCBEYXRhQnJvd3Nlckl0ZW1JRCAqKQotT1NfVXBkYXRlRGF0YUJyb3dzZXJJdGVtc180PWNhc3Q9KERhdGFCcm93c2VyUHJvcGVydHlJRCkKLU9TX1VwZGF0ZURhdGFCcm93c2VySXRlbXNfNT1jYXN0PShEYXRhQnJvd3NlclByb3BlcnR5SUQpCi0KLU9TX1VwZ3JhZGVTY3JpcHRJbmZvVG9UZXh0RW5jb2Rpbmc9Ci1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nXzA9Y2FzdD1TY3JpcHRDb2RlCi1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nXzE9Y2FzdD1MYW5nQ29kZQotT1NfVXBncmFkZVNjcmlwdEluZm9Ub1RleHRFbmNvZGluZ18yPWNhc3Q9KFJlZ2lvbkNvZGUpCi1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nXzM9Y2FzdD1Db25zdFN0cjI1NVBhcmFtCi1PU19VcGdyYWRlU2NyaXB0SW5mb1RvVGV4dEVuY29kaW5nXzQ9Y2FzdD1UZXh0RW5jb2RpbmcgKgotCi1PU19XYWl0TW91c2VNb3ZlZD0KLU9TX1dhaXRNb3VzZU1vdmVkXzA9ZmxhZ3M9c3RydWN0Ci0KLU9TX1gyRml4PQotT1NfWDJGaXhfMD0KLQotT1NfWm9vbVdpbmRvd0lkZWFsPQotT1NfWm9vbVdpbmRvd0lkZWFsXzA9Y2FzdD0oV2luZG93UmVmKQotT1NfWm9vbVdpbmRvd0lkZWFsXzE9Y2FzdD0oV2luZG93UGFydENvZGUpCi1PU19ab29tV2luZG93SWRlYWxfMj1jYXN0PShQb2ludCAqKQotCi1PU19fX0JJR19FTkRJQU5fXz1mbGFncz1ub19nZW4KLQotT1NfZ2V0cGlkPQotCi1PU19rQ0ZOdW1iZXJGb3JtYXR0ZXJEZWNpbWFsU2VwYXJhdG9yPWZsYWdzPWNvbnN0Ci0KLU9TX2tGb250UGFuZWxBdHRyaWJ1dGVTaXplc0tleT1mbGFncz1jb25zdAotCi1PU19rRm9udFBhbmVsQXR0cmlidXRlVGFnc0tleT1mbGFncz1jb25zdAotCi1PU19rRm9udFBhbmVsQXR0cmlidXRlVmFsdWVzS2V5PWZsYWdzPWNvbnN0Ci0KLU9TX2tGb250UGFuZWxBdHRyaWJ1dGVzS2V5PWZsYWdzPWNvbnN0Ci0KLU9TX2tISVZpZXdXaW5kb3dDb250ZW50SUQ9ZmxhZ3M9Y29uc3QgYWRkcmVzcwotCi1PU19rUE1Eb2N1bWVudEZvcm1hdFBERj1mbGFncz1jb25zdAotCi1PU19rUE1HcmFwaGljc0NvbnRleHRDb3JlR3JhcGhpY3M9ZmxhZ3M9Y29uc3QKLQotT1Nfa1VUVGFnQ2xhc3NGaWxlbmFtZUV4dGVuc2lvbj1mbGFncz1jb25zdAotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVVRhYl8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNVVGFiXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWJfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1VUYWJfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9CaXRNYXBfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0JpdE1hcF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQml0TWFwXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ3Vyc29yXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcl8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DdXJzb3JfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0N1cnNvcl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SR0JDb2xvcl8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTTGF5b3V0UmVjb3JkXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU0xheW91dFJlY29yZF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNMYXlvdXRSZWNvcmRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQVRTVHJhcGV6b2lkXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0FUU1RyYXBlem9pZF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9BVFNUcmFwZXpvaWRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BhdGhFbGVtZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0NHUGF0aEVsZW1lbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fQ0dQYXRoRWxlbWVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9DR1BhdGhFbGVtZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fR0RldmljZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9HRGV2aWNlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0dEZXZpY2VfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fR0RldmljZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fSE1IZWxwQ29udGVudFJlY18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9ITUhlbHBDb250ZW50UmVjXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX0hNSGVscENvbnRlbnRSZWNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUGl4TWFwXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BpeE1hcF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXBfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludF8yXzNJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1BvaW50XzJfM0lJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl8zSUlfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX291dAotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUG9pbnRfMl8zSUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJSV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JHQkNvbG9yXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9SZWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1JlY3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX18zQ18zQkk9Ci1PU19tZW1tb3ZlX19fM0NfM0JJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1jcml0aWNhbCBub19pbgotT1NfbWVtbW92ZV9fXzNDXzNCSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9Y3JpdGljYWwgbm9fb3V0Ci1PU19tZW1tb3ZlX19fM0NfM0JJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19fM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWJfMkk9Ci1PU19tZW1tb3ZlX19fM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWJfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPWNyaXRpY2FsIG5vX2luCi1PU19tZW1tb3ZlX19fM0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWJfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fXzNJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVFhOVGFiXzJJXzI9Y2FzdD0oc2l6ZV90KQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUE1SZWN0PQotUE1SZWN0X3RvcD1jYXN0PShkb3VibGUpCi1QTVJlY3RfbGVmdD1jYXN0PShkb3VibGUpCi1QTVJlY3RfYm90dG9tPWNhc3Q9KGRvdWJsZSkKLVBNUmVjdF9yaWdodD1jYXN0PShkb3VibGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUE1SZXNvbHV0aW9uPQotUE1SZXNvbHV0aW9uX2hSZXM9Ci1QTVJlc29sdXRpb25fdlJlcz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9QaXhNYXA9Ci1QaXhNYXBfcG1WZXJzaW9uPQotUGl4TWFwX3BhY2tUeXBlPQotUGl4TWFwX3BhY2tTaXplPQotUGl4TWFwX2hSZXM9Ci1QaXhNYXBfdlJlcz0KLVBpeE1hcF9waXhlbFR5cGU9Ci1QaXhNYXBfcGl4ZWxTaXplPQotUGl4TWFwX2NtcENvdW50PQotUGl4TWFwX2NtcFNpemU9Ci1QaXhNYXBfcGl4ZWxGb3JtYXQ9Ci1QaXhNYXBfcG1UYWJsZT1jYXN0PShDVGFiSGFuZGxlKQotUGl4TWFwX3BtRXh0PWNhc3Q9KHZvaWQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9Qb2ludD0KLVBvaW50X3Y9Ci1Qb2ludF9oPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1Byb2dyZXNzVHJhY2tJbmZvPQotUHJvZ3Jlc3NUcmFja0luZm9fcGhhc2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUkdCQ29sb3I9Ci1SR0JDb2xvcl9yZWQ9Ci1SR0JDb2xvcl9ncmVlbj0KLVJHQkNvbG9yX2JsdWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fUmVjdD0KLVJlY3RfdG9wPQotUmVjdF9sZWZ0PQotUmVjdF9ib3R0b209Ci1SZWN0X3JpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1Njcm9sbEJhclRyYWNrSW5mbz0KLVNjcm9sbEJhclRyYWNrSW5mb192aWV3c2l6ZT0KLVNjcm9sbEJhclRyYWNrSW5mb19wcmVzc1N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1NsaWRlclRyYWNrSW5mbz0KLVNsaWRlclRyYWNrSW5mb190aHVtYkRpcj0KLVNsaWRlclRyYWNrSW5mb19wcmVzc1N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2FyYm9uX1RYTkJhY2tncm91bmQ9Ci1UWE5CYWNrZ3JvdW5kX2JnVHlwZT0KLVRYTkJhY2tncm91bmRfYmdfcmVkPWFjY2Vzc29yPWJnLmNvbG9yLnJlZAotVFhOQmFja2dyb3VuZF9iZ19ncmVlbj1hY2Nlc3Nvcj1iZy5jb2xvci5ncmVlbgotVFhOQmFja2dyb3VuZF9iZ19ibHVlPWFjY2Vzc29yPWJnLmNvbG9yLmJsdWUKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NhcmJvbl9UWE5UYWI9Ci1UWE5UYWJfdmFsdWU9Ci1UWE5UYWJfdGFiVHlwZT0KLVRYTlRhYl9maWxsZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jYXJib25fVGhlbWVCdXR0b25EcmF3SW5mbz0KLVRoZW1lQnV0dG9uRHJhd0luZm9fc3RhdGU9Y2FzdD0oVGhlbWVEcmF3U3RhdGUpCi1UaGVtZUJ1dHRvbkRyYXdJbmZvX3ZhbHVlPWNhc3Q9KFRoZW1lQnV0dG9uVmFsdWUpCi1UaGVtZUJ1dHRvbkRyYXdJbmZvX2Fkb3JubWVudD1jYXN0PShUaGVtZUJ1dHRvbkFkb3JubWVudCkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNkZS5DREUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3N2RlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNkZS5DREUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jZGVfQ0RFPQotQ0RFX0R0QWN0aW9uQXJnX3NpemVvZj0KLQotQ0RFX19EdEFjdGlvbkludm9rZT0KLUNERV9fRHRBY3Rpb25JbnZva2VfMD1jYXN0PVdpZGdldAotQ0RFX19EdEFjdGlvbkludm9rZV8xPWNhc3Q9Y2hhciAqCi1DREVfX0R0QWN0aW9uSW52b2tlXzI9Ci1DREVfX0R0QWN0aW9uSW52b2tlXzM9Ci1DREVfX0R0QWN0aW9uSW52b2tlXzQ9Y2FzdD1jaGFyICoKLUNERV9fRHRBY3Rpb25JbnZva2VfNT1jYXN0PWNoYXIgKgotQ0RFX19EdEFjdGlvbkludm9rZV82PWNhc3Q9Y2hhciAqCi1DREVfX0R0QWN0aW9uSW52b2tlXzc9Ci1DREVfX0R0QWN0aW9uSW52b2tlXzg9Y2FzdD1EdEFjdGlvbkNhbGxiYWNrUHJvYwotQ0RFX19EdEFjdGlvbkludm9rZV85PWNhc3Q9WHRQb2ludGVyCi0KLUNERV9fRHRBcHBJbml0aWFsaXplPQotQ0RFX19EdEFwcEluaXRpYWxpemVfMD1jYXN0PShYdEFwcENvbnRleHQpCi1DREVfX0R0QXBwSW5pdGlhbGl6ZV8xPWNhc3Q9KERpc3BsYXkgKikKLUNERV9fRHRBcHBJbml0aWFsaXplXzI9Y2FzdD1XaWRnZXQKLUNERV9fRHRBcHBJbml0aWFsaXplXzM9Y2FzdD0oY2hhciAqKQotQ0RFX19EdEFwcEluaXRpYWxpemVfND1jYXN0PShjaGFyICopCi0KLUNERV9fRHREYkxvYWQ9Ci0KLUNERV9fRHREdHNEYXRhVHlwZUlzQWN0aW9uPQotQ0RFX19EdER0c0RhdGFUeXBlSXNBY3Rpb25fMD1jYXN0PWNoYXIgKgotCi1DREVfX0R0RHRzRGF0YVR5cGVOYW1lcz0KLQotQ0RFX19EdER0c0RhdGFUeXBlVG9BdHRyaWJ1dGVWYWx1ZT0KLUNERV9fRHREdHNEYXRhVHlwZVRvQXR0cmlidXRlVmFsdWVfMD1jYXN0PWNoYXIgKgotQ0RFX19EdER0c0RhdGFUeXBlVG9BdHRyaWJ1dGVWYWx1ZV8xPWNhc3Q9Y2hhciAqCi1DREVfX0R0RHRzRGF0YVR5cGVUb0F0dHJpYnV0ZVZhbHVlXzI9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0ZpbGVUb0RhdGFUeXBlPQotQ0RFX19EdER0c0ZpbGVUb0RhdGFUeXBlXzA9Y2FzdD1jaGFyICoKLQotQ0RFX19EdER0c0ZyZWVBdHRyaWJ1dGVWYWx1ZT0KLUNERV9fRHREdHNGcmVlQXR0cmlidXRlVmFsdWVfMD1jYXN0PWNoYXIgKgotCi1DREVfX0R0RHRzRnJlZURhdGFUeXBlPQotQ0RFX19EdER0c0ZyZWVEYXRhVHlwZV8wPWNhc3Q9Y2hhciAqCi0KLUNERV9fRHREdHNGcmVlRGF0YVR5cGVOYW1lcz0KLUNERV9fRHREdHNGcmVlRGF0YVR5cGVOYW1lc18wPWNhc3Q9Y2hhciAqKgotCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGw9Ci1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfMD1jYXN0PShTdHJpbmcpCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfMT1jYXN0PShTdHJpbmcpCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfMj1jYXN0PShXaWRnZXRDbGFzcykKLUNERV9fWHRBcHBDcmVhdGVTaGVsbF8zPWNhc3Q9KERpc3BsYXkgKikKLUNERV9fWHRBcHBDcmVhdGVTaGVsbF80PWNhc3Q9KEFyZ0xpc3QpCi1DREVfX1h0QXBwQ3JlYXRlU2hlbGxfNT0KLQotQ0RFX19YdENyZWF0ZUFwcGxpY2F0aW9uQ29udGV4dD0KLQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplPQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzE9Y2FzdD0oRGlzcGxheSAqKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzI9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzM9Y2FzdD0oU3RyaW5nKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzQ9Y2FzdD0oWHJtT3B0aW9uRGVzY1JlYyAqKQotQ0RFX19YdERpc3BsYXlJbml0aWFsaXplXzU9Y2FzdD0oQ2FyZGluYWwpCi1DREVfX1h0RGlzcGxheUluaXRpYWxpemVfNj1jYXN0PShpbnQgKikKLUNERV9fWHREaXNwbGF5SW5pdGlhbGl6ZV83PWNhc3Q9KFN0cmluZyAqKQotCi1DREVfX1h0UmVhbGl6ZVdpZGdldD0KLUNERV9fWHRSZWFsaXplV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotCi1DREVfX1h0UmVzaXplV2lkZ2V0PQotQ0RFX19YdFJlc2l6ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLUNERV9fWHRSZXNpemVXaWRnZXRfMT0KLUNERV9fWHRSZXNpemVXaWRnZXRfMj0KLUNERV9fWHRSZXNpemVXaWRnZXRfMz0KLQotQ0RFX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkPQotQ0RFX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkXzA9Y2FzdD0oV2lkZ2V0KQotQ0RFX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkXzE9Ci0KLUNERV9fWHRUb29sa2l0SW5pdGlhbGl6ZT0KLQotQ0RFX190b3BMZXZlbFNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY2RlX0R0QWN0aW9uQXJnPQotRHRBY3Rpb25BcmdfYXJnQ2xhc3M9Ci1EdEFjdGlvbkFyZ19uYW1lPWFjY2Vzc29yPXUuZmlsZS5uYW1lLGNhc3Q9Y2hhciAqCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY29jb2EuQ29jb2EucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY29jb2EuQ29jb2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4MmYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNvY29hLkNvY29hLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX0NvY29hPQotQ29jb2FfSElDb2NvYVZpZXdDcmVhdGU9ZmxhZ3M9ZHluYW1pYwotQ29jb2FfSElDb2NvYVZpZXdDcmVhdGVfMD0KLUNvY29hX0hJQ29jb2FWaWV3Q3JlYXRlXzE9Ci1Db2NvYV9ISUNvY29hVmlld0NyZWF0ZV8yPQotCi1Db2NvYV9ISUphdmFWaWV3Q3JlYXRlV2l0aENvY29hVmlldz1mbGFncz1ub19nZW4KLUNvY29hX0hJSmF2YVZpZXdDcmVhdGVXaXRoQ29jb2FWaWV3XzA9Ci1Db2NvYV9ISUphdmFWaWV3Q3JlYXRlV2l0aENvY29hVmlld18xPQotCi1Db2NvYV9ISVdlYlZpZXdDcmVhdGU9Ci1Db2NvYV9ISVdlYlZpZXdDcmVhdGVfMD1jYXN0PUhJVmlld1JlZiAqCi0KLUNvY29hX0hJV2ViVmlld0dldFdlYlZpZXc9Ci1Db2NvYV9ISVdlYlZpZXdHZXRXZWJWaWV3XzA9Y2FzdD1ISVZpZXdSZWYKLQotQ29jb2FfTlNEZXZpY2VSR0JDb2xvclNwYWNlPWZsYWdzPWNvbnN0Ci0KLUNvY29hX1dlYkluaXRGb3JDYXJib249Ci0KLUNvY29hX21lbWNweT0KLUNvY29hX21lbWNweV8wPQotQ29jb2FfbWVtY3B5XzE9Y2FzdD0odm9pZCAqCi1Db2NvYV9tZW1jcHlfMj0KLQotQ29jb2Ffb2JqY19nZXRDbGFzcz0KLUNvY29hX29iamNfZ2V0Q2xhc3NfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzE9Y2FzdD0oU0VMKQotCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUY9ZmxhZ3M9bm9fZ2VuCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUZfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJRl8xPWNhc3Q9KFNFTCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJRl8yPQotCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUk9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSV8xPWNhc3Q9KFNFTCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSV8yPQotCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlJPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSV8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSV8xPWNhc3Q9KFNFTCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlfMj0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlfMz0KLQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUk9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlJSV8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUlfMT1jYXN0PShTRUwpCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlJSV8yPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUlfMz0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlJXzQ9Ci0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlJST0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlJSV8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUlJXzE9Y2FzdD0oU0VMKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUlJXzI9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlJSUlfMz0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUlJSV80PQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJSUlJXzU9Ci0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8yPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1BvaW50XzJfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8yXzE9Y2FzdD0oU0VMKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1BvaW50XzJfMj0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8yXzM9ZmxhZ3M9c3RydWN0Ci0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJJPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1JlY3RfMklfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJJXzE9Y2FzdD0oU0VMKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1JlY3RfMklfMj0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJJXzM9ZmxhZ3M9c3RydWN0Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUmVjdF8ySV80PQotCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8yPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUG9pbnRfMl8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUG9pbnRfMl8xPWNhc3Q9KFNFTCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1BvaW50XzJfMj0KLQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUG9pbnRfMkk9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8ySV8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUG9pbnRfMklfMT1jYXN0PShTRUwpCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNQb2ludF8ySV8yPWZsYWdzPXN0cnVjdAotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUG9pbnRfMklfMz0KLQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUmVjdF8yPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUmVjdF8yXzA9Y2FzdD0oaWQpCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJfMT1jYXN0PShTRUwpCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJfMj1mbGFncz1zdHJ1Y3QKLQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TUmVjdF8yST0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1JlY3RfMklfMD1jYXN0PShpZCkKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1JlY3RfMklfMT1jYXN0PShTRUwpCi1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJJXzI9ZmxhZ3M9c3RydWN0Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0XzJJXzM9Ci0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1NpemVfMj0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1NpemVfMl8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TU2l6ZV8yXzE9Y2FzdD0oU0VMKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2NvY29hX05TU2l6ZV8yXzI9ZmxhZ3M9c3RydWN0Ci0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzNJSUlJSUlJSUlJST0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzNJSUlJSUlJSUlJSV8wPWNhc3Q9KGlkKQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlfM0lJSUlJSUlJSUlJXzE9Y2FzdD1TRUwKLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzNJSUlJSUlJSUlJSV8yPQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlfM0lJSUlJSUlJSUlJXzM9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSV8zSUlJSUlJSUlJSUlfND0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzNJSUlJSUlJSUlJSV81PQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlfM0lJSUlJSUlJSUlJXzY9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSV8zSUlJSUlJSUlJSUlfNz0KLUNvY29hX29iamNfMW1zZ1NlbmRfX0lJXzNJSUlJSUlJSUlJSV84PQotQ29jb2Ffb2JqY18xbXNnU2VuZF9fSUlfM0lJSUlJSUlJSUlJXzk9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSV8zSUlJSUlJSUlJSUlfMTA9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSV8zSUlJSUlJSUlJSUlfMTE9Ci1Db2NvYV9vYmpjXzFtc2dTZW5kX19JSV8zSUlJSUlJSUlJSUlfMTI9Ci0KLUNvY29hX3NlbF9yZWdpc3Rlck5hbWU9Ci1Db2NvYV9zZWxfcmVnaXN0ZXJOYW1lXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9jb2NvYV9OU1BvaW50PQotTlNQb2ludF94PQotTlNQb2ludF95PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNSZWN0PQotTlNSZWN0X3g9YWNjZXNzb3I9b3JpZ2luLngKLU5TUmVjdF95PWFjY2Vzc29yPW9yaWdpbi55Ci1OU1JlY3Rfd2lkdGg9YWNjZXNzb3I9c2l6ZS53aWR0aAotTlNSZWN0X2hlaWdodD1hY2Nlc3Nvcj1zaXplLmhlaWdodAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfY29jb2FfTlNTaXplPQotTlNTaXplX3dpZHRoPQotTlNTaXplX2hlaWdodD0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nZGlwLkdkaXAucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ2RpcC5HZGlwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjE3MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nZGlwLkdkaXAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9CaXRtYXBEYXRhPQotQml0bWFwRGF0YV9XaWR0aD0KLUJpdG1hcERhdGFfSGVpZ2h0PQotQml0bWFwRGF0YV9TdHJpZGU9Ci1CaXRtYXBEYXRhX1BpeGVsRm9ybWF0PWNhc3Q9UGl4ZWxGb3JtYXQKLUJpdG1hcERhdGFfU2NhbjA9Y2FzdD12b2lkKgotQml0bWFwRGF0YV9SZXNlcnZlZD1jYXN0PVVJTlRfUFRSCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0NvbG9yUGFsZXR0ZT0KLUNvbG9yUGFsZXR0ZV9GbGFncz0KLUNvbG9yUGFsZXR0ZV9Db3VudD0KLUNvbG9yUGFsZXR0ZV9FbnRyaWVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9HZGlwPWZsYWdzPWNwcAotR2RpcF9CaXRtYXBEYXRhX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfQml0bWFwRGF0YV9kZWxldGVfMD0KLQotR2RpcF9CaXRtYXBEYXRhX25ldz1mbGFncz1uZXcKLQotR2RpcF9CaXRtYXBfR2V0SEJJVE1BUD1mbGFncz1jcHAKLUdkaXBfQml0bWFwX0dldEhCSVRNQVBfMD1jYXN0PShCaXRtYXAqKQotR2RpcF9CaXRtYXBfR2V0SEJJVE1BUF8xPWNhc3Q9KENvbG9yKiksZmxhZ3M9c3RydWN0Ci1HZGlwX0JpdG1hcF9HZXRIQklUTUFQXzI9Y2FzdD0oSEJJVE1BUCopCi0KLUdkaXBfQml0bWFwX0dldEhJQ09OPWZsYWdzPWNwcAotR2RpcF9CaXRtYXBfR2V0SElDT05fMD1jYXN0PShCaXRtYXAqKQotR2RpcF9CaXRtYXBfR2V0SElDT05fMT1jYXN0PShISUNPTiopCi0KLUdkaXBfQml0bWFwX0xvY2tCaXRzPWZsYWdzPWNwcAotR2RpcF9CaXRtYXBfTG9ja0JpdHNfMD1jYXN0PUJpdG1hcCoKLUdkaXBfQml0bWFwX0xvY2tCaXRzXzE9Y2FzdD1SZWN0KgotR2RpcF9CaXRtYXBfTG9ja0JpdHNfMj0KLUdkaXBfQml0bWFwX0xvY2tCaXRzXzM9Y2FzdD0oUGl4ZWxGb3JtYXQpCi1HZGlwX0JpdG1hcF9Mb2NrQml0c180PWNhc3Q9Qml0bWFwRGF0YSoKLQotR2RpcF9CaXRtYXBfVW5sb2NrQml0cz1mbGFncz1jcHAKLUdkaXBfQml0bWFwX1VubG9ja0JpdHNfMD1jYXN0PShCaXRtYXAqCi1HZGlwX0JpdG1hcF9VbmxvY2tCaXRzXzE9Y2FzdD0oQml0bWFwRGF0YSopCi0KLUdkaXBfQml0bWFwX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfQml0bWFwX2RlbGV0ZV8wPQotCi1HZGlwX0JpdG1hcF8xbmV3X19JPWZsYWdzPW5ldwotR2RpcF9CaXRtYXBfMW5ld19fSV8wPWNhc3Q9SElDT04KLQotR2RpcF9CaXRtYXBfMW5ld19fSUk9ZmxhZ3M9bmV3Ci1HZGlwX0JpdG1hcF8xbmV3X19JSV8wPWNhc3Q9SEJJVE1BUAotR2RpcF9CaXRtYXBfMW5ld19fSUlfMT1jYXN0PUhQQUxFVFRFCi0KLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJPWZsYWdzPW5ldwotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfMD0KLUdkaXBfQml0bWFwXzFuZXdfX0lJSUlJXzE9Ci1HZGlwX0JpdG1hcF8xbmV3X19JSUlJSV8yPQotR2RpcF9CaXRtYXBfMW5ld19fSUlJSUlfMz1jYXN0PVBpeGVsRm9ybWF0Ci1HZGlwX0JpdG1hcF8xbmV3X19JSUlJSV80PWNhc3Q9QllURSAqCi0KLUdkaXBfQml0bWFwXzFuZXdfX18zQ1o9ZmxhZ3M9bmV3Ci1HZGlwX0JpdG1hcF8xbmV3X19fM0NaXzA9Y2FzdD0oV0NIQVIqKQotR2RpcF9CaXRtYXBfMW5ld19fXzNDWl8xPQotCi1HZGlwX0JydXNoX0Nsb25lPWZsYWdzPWNwcAotR2RpcF9CcnVzaF9DbG9uZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQnJ1c2hfR2V0VHlwZT1mbGFncz1jcHAKLUdkaXBfQnJ1c2hfR2V0VHlwZV8wPWNhc3Q9KEJydXNoICopCi0KLUdkaXBfQ29sb3JQYWxldHRlX3NpemVvZj0KLQotR2RpcF9Db2xvcl9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX0NvbG9yX2RlbGV0ZV8wPQotCi1HZGlwX0NvbG9yX25ldz1mbGFncz1uZXcKLUdkaXBfQ29sb3JfbmV3XzA9Y2FzdD1BUkdCCi0KLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lPWZsYWdzPWNwcAotR2RpcF9Gb250RmFtaWx5X0dldEZhbWlseU5hbWVfMD1jYXN0PUZvbnRGYW1pbHkgKgotR2RpcF9Gb250RmFtaWx5X0dldEZhbWlseU5hbWVfMT1jYXN0PVdDSEFSICoKLUdkaXBfRm9udEZhbWlseV9HZXRGYW1pbHlOYW1lXzI9Y2FzdD1XQ0hBUgotCi1HZGlwX0ZvbnRGYW1pbHlfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9Gb250RmFtaWx5X2RlbGV0ZV8wPQotCi1HZGlwX0ZvbnRGYW1pbHlfbmV3PWZsYWdzPW5ldwotCi1HZGlwX0ZvbnRfR2V0RmFtaWx5PWZsYWdzPWNwcAotR2RpcF9Gb250X0dldEZhbWlseV8wPWNhc3Q9KEZvbnQgKikKLUdkaXBfRm9udF9HZXRGYW1pbHlfMT1jYXN0PShGb250RmFtaWx5ICopCi0KLUdkaXBfRm9udF9HZXRTaXplPWZsYWdzPWNwcAotR2RpcF9Gb250X0dldFNpemVfMD1jYXN0PShGb250ICopCi0KLUdkaXBfRm9udF9HZXRTdHlsZT1mbGFncz1jcHAKLUdkaXBfRm9udF9HZXRTdHlsZV8wPWNhc3Q9KEZvbnQgKikKLQotR2RpcF9Gb250X0lzQXZhaWxhYmxlPWZsYWdzPWNwcAotR2RpcF9Gb250X0lzQXZhaWxhYmxlXzA9Y2FzdD1Gb250ICoKLQotR2RpcF9Gb250X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfRm9udF9kZWxldGVfMD0KLQotR2RpcF9Gb250XzFuZXdfX0lJPWZsYWdzPW5ldwotR2RpcF9Gb250XzFuZXdfX0lJXzA9Y2FzdD0oSERDKQotR2RpcF9Gb250XzFuZXdfX0lJXzE9Y2FzdD0oSEZPTlQKLQotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUk9ZmxhZ3M9bmV3Ci1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV8wPWNhc3Q9Y29uc3QgV0NIQVIgKgotR2RpcF9Gb250XzFuZXdfX18zQ0ZJSUlfMT1jYXN0PVJFQUwKLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJXzI9Y2FzdD1JTlQKLUdkaXBfRm9udF8xbmV3X19fM0NGSUlJXzM9Y2FzdD1Vbml0Ci1HZGlwX0ZvbnRfMW5ld19fXzNDRklJSV80PWNhc3Q9Y29uc3QgRm9udENvbGxlY3Rpb24gKgotCi1HZGlwX0dkaXBsdXNTaHV0ZG93bj0KLUdkaXBfR2RpcGx1c1NodXRkb3duXzA9Y2FzdD1VTE9OR19QVFIKLQotR2RpcF9HZGlwbHVzU3RhcnR1cD0KLUdkaXBfR2RpcGx1c1N0YXJ0dXBfMD1jYXN0PShVTE9OR19QVFIgKikKLUdkaXBfR2RpcGx1c1N0YXJ0dXBfMT1jYXN0PWNvbnN0IEdkaXBsdXNTdGFydHVwSW5wdXQgKgotR2RpcF9HZGlwbHVzU3RhcnR1cF8yPWNhc3Q9R2RpcGx1c1N0YXJ0dXBPdXRwdXQgKgotCi1HZGlwX0dkaXBsdXNTdGFydHVwSW5wdXRfc2l6ZW9mPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY18xPWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfMj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzM9Y2FzdD0oUkVBTCkKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEFyY180PWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRBcmNfNT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQXJjXzY9Y2FzdD0oUkVBTCkKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfMT1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzI9Y2FzdD1SRUFMCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfMz1jYXN0PVJFQUwKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl80PWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfNT1jYXN0PVJFQUwKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZEJlemllcl82PWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRCZXppZXJfNz1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc1BhdGhfQWRkQmV6aWVyXzg9Y2FzdD0oUkVBTCkKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkTGluZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmVfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmVfMT1jYXN0PVJFQUwKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmVfMj1jYXN0PVJFQUwKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmVfMz1jYXN0PVJFQUwKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZExpbmVfND1jYXN0PVJFQUwKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkUGF0aD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFBhdGhfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFBhdGhfMT1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFBhdGhfMj1jYXN0PUJPT0wKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkUmVjdGFuZ2xlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfQWRkUmVjdGFuZ2xlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRSZWN0YW5nbGVfMT1mbGFncz1zdHJ1Y3QKLQotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfMT1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ18yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfMz1jYXN0PWNvbnN0IEZvbnRGYW1pbHkgKgotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzQ9Y2FzdD1JTlQKLUdkaXBfR3JhcGhpY3NQYXRoX0FkZFN0cmluZ181PWNhc3Q9KFJFQUwpCi1HZGlwX0dyYXBoaWNzUGF0aF9BZGRTdHJpbmdfNj1jYXN0PWNvbnN0IFBvaW50RiAqLGZsYWdzPXN0cnVjdAotR2RpcF9HcmFwaGljc1BhdGhfQWRkU3RyaW5nXzc9Y2FzdD1jb25zdCBTdHJpbmdGb3JtYXQgKgotCi1HZGlwX0dyYXBoaWNzUGF0aF9DbG9zZUZpZ3VyZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0Nsb3NlRmlndXJlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0ZsYXR0ZW49ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9GbGF0dGVuXzA9Y2FzdD1HcmFwaGljc1BhdGggKgotR2RpcF9HcmFwaGljc1BhdGhfRmxhdHRlbl8xPWNhc3Q9TWF0cml4ICoKLUdkaXBfR3JhcGhpY3NQYXRoX0ZsYXR0ZW5fMj0KLQotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfR2V0Qm91bmRzXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRCb3VuZHNfMT0KLUdkaXBfR3JhcGhpY3NQYXRoX0dldEJvdW5kc18yPWNhc3Q9TWF0cml4ICoKLUdkaXBfR3JhcGhpY3NQYXRoX0dldEJvdW5kc18zPWNhc3Q9UGVuICoKLQotR2RpcF9HcmFwaGljc1BhdGhfR2V0TGFzdFBvaW50PWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc1BhdGhfR2V0TGFzdFBvaW50XzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRMYXN0UG9pbnRfMT1jYXN0PShQb2ludEYgKikKLQotR2RpcF9HcmFwaGljc1BhdGhfR2V0UGF0aFBvaW50cz1mbGFncz1ub19nZW4gY3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoUG9pbnRzXzE9Y2FzdD1Qb2ludEYgKgotR2RpcF9HcmFwaGljc1BhdGhfR2V0UGF0aFBvaW50c18yPQotCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoVHlwZXM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoVHlwZXNfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBhdGhUeXBlc18xPWNhc3Q9QllURSAqCi1HZGlwX0dyYXBoaWNzUGF0aF9HZXRQYXRoVHlwZXNfMj0KLQotR2RpcF9HcmFwaGljc1BhdGhfR2V0UG9pbnRDb3VudD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0dldFBvaW50Q291bnRfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLQotR2RpcF9HcmFwaGljc1BhdGhfSXNPdXRsaW5lVmlzaWJsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfMT0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfMj0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzT3V0bGluZVZpc2libGVfMz1jYXN0PWNvbnN0IFBlbiAqCi1HZGlwX0dyYXBoaWNzUGF0aF9Jc091dGxpbmVWaXNpYmxlXzQ9Y2FzdD1jb25zdCBHcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzVmlzaWJsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX0lzVmlzaWJsZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotR2RpcF9HcmFwaGljc1BhdGhfSXNWaXNpYmxlXzE9Ci1HZGlwX0dyYXBoaWNzUGF0aF9Jc1Zpc2libGVfMj0KLUdkaXBfR3JhcGhpY3NQYXRoX0lzVmlzaWJsZV8zPWNhc3Q9Y29uc3QgR3JhcGhpY3MgKgotCi1HZGlwX0dyYXBoaWNzUGF0aF9TZXRGaWxsTW9kZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NQYXRoX1NldEZpbGxNb2RlXzA9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi1HZGlwX0dyYXBoaWNzUGF0aF9TZXRGaWxsTW9kZV8xPWNhc3Q9RmlsbE1vZGUKLQotR2RpcF9HcmFwaGljc1BhdGhfU3RhcnRGaWd1cmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9TdGFydEZpZ3VyZV8wPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX0dyYXBoaWNzUGF0aF9UcmFuc2Zvcm09ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzUGF0aF9UcmFuc2Zvcm1fMD1jYXN0PUdyYXBoaWNzUGF0aCAqCi1HZGlwX0dyYXBoaWNzUGF0aF9UcmFuc2Zvcm1fMT1jYXN0PU1hdHJpeCAqCi0KLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfR3JhcGhpY3NQYXRoX2RlbGV0ZV8wPQotCi1HZGlwX0dyYXBoaWNzUGF0aF8xbmV3X19JPWZsYWdzPW5ldwotR2RpcF9HcmFwaGljc1BhdGhfMW5ld19fSV8wPWNhc3Q9RmlsbE1vZGUKLQotR2RpcF9HcmFwaGljc1BhdGhfMW5ld19fXzNJXzNCSUk9ZmxhZ3M9bm9fZ2VuIG5ldwotR2RpcF9HcmFwaGljc1BhdGhfMW5ld19fXzNJXzNCSUlfMD1jYXN0PUZpbGxNb2RlCi1HZGlwX0dyYXBoaWNzUGF0aF8xbmV3X19fM0lfM0JJSV8xPQotR2RpcF9HcmFwaGljc1BhdGhfMW5ld19fXzNJXzNCSUlfMj0KLUdkaXBfR3JhcGhpY3NQYXRoXzFuZXdfX18zSV8zQklJXzM9Ci0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyYz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfMT1jYXN0PShQZW4gKikKLUdkaXBfR3JhcGhpY3NfRHJhd0FyY18yPQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfND0KLUdkaXBfR3JhcGhpY3NfRHJhd0FyY181PQotR2RpcF9HcmFwaGljc19EcmF3QXJjXzY9Ci1HZGlwX0dyYXBoaWNzX0RyYXdBcmNfNz0KLQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0VsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8yPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV8zPQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV80PQotR2RpcF9HcmFwaGljc19EcmF3RWxsaXBzZV81PQotCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUlJXzE9Y2FzdD0oSW1hZ2UgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8yPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlJSV8zPWNhc3Q9KElOVCkKLQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJST1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xPWNhc3Q9KEltYWdlICopCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzI9Y2FzdD1jb25zdCBSZWN0ICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzM9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV80PWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfNT1jYXN0PUlOVAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV82PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzc9Y2FzdD0oVW5pdCkKLUdkaXBfR3JhcGhpY3NfMURyYXdJbWFnZV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySUlJSUlJSUlfOD1jYXN0PUltYWdlQXR0cmlidXRlcyAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3SW1hZ2VfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMklJSUlJSUlJXzk9Y2FzdD1EcmF3SW1hZ2VBYm9ydAotR2RpcF9HcmFwaGljc18xRHJhd0ltYWdlX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJSUlJSUlJSV8xMD1jYXN0PVZPSUQgKgotCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3TGluZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzM9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzQ9Ci1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lXzU9Ci0KLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd0xpbmVzXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdMaW5lc18yPQotR2RpcF9HcmFwaGljc19EcmF3TGluZXNfMz1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQYXRoXzI9Y2FzdD0oR3JhcGhpY3NQYXRoICopCi0KLUdkaXBfR3JhcGhpY3NfRHJhd1BvbHlnb249ZmxhZ3M9bm9fZ2VuIGNwcAotR2RpcF9HcmFwaGljc19EcmF3UG9seWdvbl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzE9Y2FzdD0oUGVuICopCi1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdQb2x5Z29uXzM9Y2FzdD1JTlQKLQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV8xPWNhc3Q9KFBlbiAqKQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzI9Ci1HZGlwX0dyYXBoaWNzX0RyYXdSZWN0YW5nbGVfMz0KLUdkaXBfR3JhcGhpY3NfRHJhd1JlY3RhbmdsZV80PQotR2RpcF9HcmFwaGljc19EcmF3UmVjdGFuZ2xlXzU9Ci0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMj1jYXN0PWludAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8zPWNhc3Q9Rm9udCAqCi1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzU9Y2FzdD1CcnVzaCAqCi0KLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc18xRHJhd1N0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUlfMT1jYXN0PVdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzI9Y2FzdD1pbnQKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzM9Y2FzdD1Gb250ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzQ9ZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFEcmF3U3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJSV81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMURyYXdTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklJXzY9Y2FzdD0oQnJ1c2ggKikKLQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsRWxsaXBzZV8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbEVsbGlwc2VfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxFbGxpcHNlXzU9Y2FzdD0oSU5UKQotCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGF0aF8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQYXRoXzE9Y2FzdD0oQnJ1c2ggKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBhdGhfMj1jYXN0PShHcmFwaGljc1BhdGggKikKLQotR2RpcF9HcmFwaGljc19GaWxsUGllPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GaWxsUGllXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBpZV8xPWNhc3Q9KEJydXNoICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMj1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfMz1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfND1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNT1jYXN0PShJTlQpCi1HZGlwX0dyYXBoaWNzX0ZpbGxQaWVfNj1jYXN0PShSRUFMKQotR2RpcF9HcmFwaGljc19GaWxsUGllXzc9Y2FzdD0oUkVBTCkKLQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbj1mbGFncz1ub19nZW4gY3BwCi1HZGlwX0dyYXBoaWNzX0ZpbGxQb2x5Z29uXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8yPWNhc3Q9UG9pbnQgKgotR2RpcF9HcmFwaGljc19GaWxsUG9seWdvbl8zPWNhc3Q9KElOVCkKLUdkaXBfR3JhcGhpY3NfRmlsbFBvbHlnb25fND1jYXN0PUZpbGxNb2RlCi0KLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfMT1jYXN0PShCcnVzaCAqKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzI9Y2FzdD0oSU5UKQotR2RpcF9HcmFwaGljc19GaWxsUmVjdGFuZ2xlXzM9Y2FzdD1JTlQKLUdkaXBfR3JhcGhpY3NfRmlsbFJlY3RhbmdsZV80PWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzX0ZpbGxSZWN0YW5nbGVfNT1jYXN0PUlOVAotCi1HZGlwX0dyYXBoaWNzX0ZsdXNoPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19GbHVzaF8wPWNhc3Q9R3JhcGhpY3MgKgotR2RpcF9HcmFwaGljc19GbHVzaF8xPWNhc3Q9Rmx1c2hJbnRlbnRpb24KLQotR2RpcF9HcmFwaGljc19HZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRDbGlwXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0Q2xpcF8xPWNhc3Q9UmVnaW9uICoKLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT0KLQotR2RpcF9HcmFwaGljc18xR2V0Q2xpcEJvdW5kc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzI9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFHZXRDbGlwQm91bmRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RfMl8xPQotCi1HZGlwX0dyYXBoaWNzX0dldEhEQz1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0SERDXzA9Y2FzdD1HcmFwaGljcyAqCi0KLUdkaXBfR3JhcGhpY3NfR2V0SW50ZXJwb2xhdGlvbk1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX0dldEludGVycG9sYXRpb25Nb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRTbW9vdGhpbmdNb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9HcmFwaGljc19HZXRUZXh0UmVuZGVyaW5nSGludD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VGV4dFJlbmRlcmluZ0hpbnRfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzX0dldFRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfR2V0VHJhbnNmb3JtXzE9Y2FzdD1NYXRyaXggKgotCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19HZXRWaXNpYmxlQ2xpcEJvdW5kc18wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX0dldFZpc2libGVDbGlwQm91bmRzXzE9Ci0KLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMT1jYXN0PWNvbnN0IFdDSEFSICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1JlY3RGXzJfMz1jYXN0PWNvbnN0IEZvbnQgKgotR2RpcF9HcmFwaGljc18xTWVhc3VyZVN0cmluZ19fSV8zQ0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzQ9Y2FzdD1jb25zdCBQb2ludEYgKixmbGFncz1zdHJ1Y3QKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9U3RyaW5nRm9ybWF0ICoKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl82PQotCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMj1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMU1lYXN1cmVTdHJpbmdfX0lfM0NJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0Rl8yXzE9Y2FzdD1jb25zdCBXQ0hBUiAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8yPWNhc3Q9SU5UCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl8zPWNhc3Q9Y29uc3QgRm9udCAqCi1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl80PWNhc3Q9Y29uc3QgUG9pbnRGICosZmxhZ3M9c3RydWN0Ci1HZGlwX0dyYXBoaWNzXzFNZWFzdXJlU3RyaW5nX19JXzNDSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEZfMl81PWNhc3Q9UmVjdEYgKgotCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIREM9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1JlbGVhc2VIRENfMD1jYXN0PUdyYXBoaWNzICoKLUdkaXBfR3JhcGhpY3NfUmVsZWFzZUhEQ18xPWNhc3Q9SERDCi0KLUdkaXBfR3JhcGhpY3NfUmVzZXRDbGlwPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19SZXNldENsaXBfMD1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX0dyYXBoaWNzX1Jlc3RvcmU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1Jlc3RvcmVfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19SZXN0b3JlXzE9Y2FzdD1HcmFwaGljc1N0YXRlCi0KLUdkaXBfR3JhcGhpY3NfU2F2ZT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2F2ZV8wPWNhc3Q9KEdyYXBoaWNzICopCi0KLUdkaXBfR3JhcGhpY3NfU2NhbGVUcmFuc2Zvcm09ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NjYWxlVHJhbnNmb3JtXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfU2NhbGVUcmFuc2Zvcm1fMT0KLUdkaXBfR3JhcGhpY3NfU2NhbGVUcmFuc2Zvcm1fMj0KLUdkaXBfR3JhcGhpY3NfU2NhbGVUcmFuc2Zvcm1fMz1jYXN0PShNYXRyaXhPcmRlcikKLQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUk9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzXzFTZXRDbGlwX19JSV8xPWNhc3Q9R3JhcGhpY3NQYXRoICoKLQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUlJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJSV8xPWNhc3Q9UmVnaW9uICoKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lJSV8yPWNhc3Q9Q29tYmluZU1vZGUKLQotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfMVNldENsaXBfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdF8ySV8xPWNhc3Q9UmVjdCAqLGZsYWdzPXN0cnVjdAotR2RpcF9HcmFwaGljc18xU2V0Q2xpcF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9SZWN0XzJJXzI9Y2FzdD1Db21iaW5lTW9kZQotCi1HZGlwX0dyYXBoaWNzX1NldENvbXBvc2l0aW5nUXVhbGl0eT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0Q29tcG9zaXRpbmdRdWFsaXR5XzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzX1NldENvbXBvc2l0aW5nUXVhbGl0eV8xPWNhc3Q9Q29tcG9zaXRpbmdRdWFsaXR5Ci0KLUdkaXBfR3JhcGhpY3NfU2V0SW50ZXJwb2xhdGlvbk1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldEludGVycG9sYXRpb25Nb2RlXzA9Y2FzdD0oR3JhcGhpY3MgKikKLUdkaXBfR3JhcGhpY3NfU2V0SW50ZXJwb2xhdGlvbk1vZGVfMT1jYXN0PUludGVycG9sYXRpb25Nb2RlCi0KLUdkaXBfR3JhcGhpY3NfU2V0UGFnZVVuaXQ9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldFBhZ2VVbml0XzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzX1NldFBhZ2VVbml0XzE9Y2FzdD1Vbml0Ci0KLUdkaXBfR3JhcGhpY3NfU2V0UGl4ZWxPZmZzZXRNb2RlPWZsYWdzPWNwcAotR2RpcF9HcmFwaGljc19TZXRQaXhlbE9mZnNldE1vZGVfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19TZXRQaXhlbE9mZnNldE1vZGVfMT1jYXN0PVBpeGVsT2Zmc2V0TW9kZQotCi1HZGlwX0dyYXBoaWNzX1NldFNtb290aGluZ01vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldFNtb290aGluZ01vZGVfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19TZXRTbW9vdGhpbmdNb2RlXzE9Y2FzdD0oU21vb3RoaW5nTW9kZSkKLQotR2RpcF9HcmFwaGljc19TZXRUZXh0UmVuZGVyaW5nSGludD1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfU2V0VGV4dFJlbmRlcmluZ0hpbnRfMD1jYXN0PShHcmFwaGljcyAqKQotR2RpcF9HcmFwaGljc19TZXRUZXh0UmVuZGVyaW5nSGludF8xPWNhc3Q9VGV4dFJlbmRlcmluZ0hpbnQKLQotR2RpcF9HcmFwaGljc19TZXRUcmFuc2Zvcm09ZmxhZ3M9Y3BwCi1HZGlwX0dyYXBoaWNzX1NldFRyYW5zZm9ybV8wPWNhc3Q9KEdyYXBoaWNzICopCi1HZGlwX0dyYXBoaWNzX1NldFRyYW5zZm9ybV8xPWNhc3Q9KE1hdHJpeCAqKQotCi1HZGlwX0dyYXBoaWNzX1RyYW5zbGF0ZVRyYW5zZm9ybT1mbGFncz1jcHAKLUdkaXBfR3JhcGhpY3NfVHJhbnNsYXRlVHJhbnNmb3JtXzA9Y2FzdD1HcmFwaGljcyAqCi1HZGlwX0dyYXBoaWNzX1RyYW5zbGF0ZVRyYW5zZm9ybV8xPQotR2RpcF9HcmFwaGljc19UcmFuc2xhdGVUcmFuc2Zvcm1fMj0KLUdkaXBfR3JhcGhpY3NfVHJhbnNsYXRlVHJhbnNmb3JtXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfR3JhcGhpY3NfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9HcmFwaGljc19kZWxldGVfMD0KLQotR2RpcF9HcmFwaGljc19uZXc9ZmxhZ3M9bmV3Ci1HZGlwX0dyYXBoaWNzX25ld18wPWNhc3Q9KEhEQykKLQotR2RpcF9IYXRjaEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSGF0Y2hCcnVzaF9kZWxldGVfMD0KLQotR2RpcF9IYXRjaEJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMD1jYXN0PUhhdGNoU3R5bGUKLUdkaXBfSGF0Y2hCcnVzaF9uZXdfMT1jYXN0PUNvbG9yICosZmxhZ3M9c3RydWN0Ci1HZGlwX0hhdGNoQnJ1c2hfbmV3XzI9Y2FzdD1Db2xvciAqLGZsYWdzPXN0cnVjdAotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzA9Y2FzdD0oSW1hZ2VBdHRyaWJ1dGVzICopCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRDb2xvck1hdHJpeF8xPWNhc3Q9Q29sb3JNYXRyaXggKgotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0Q29sb3JNYXRyaXhfMj1jYXN0PUNvbG9yTWF0cml4RmxhZ3MKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX1NldENvbG9yTWF0cml4XzM9Y2FzdD1Db2xvckFkanVzdFR5cGUKLQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlQXR0cmlidXRlc19TZXRXcmFwTW9kZV8wPWNhc3Q9KEltYWdlQXR0cmlidXRlcyAqKQotR2RpcF9JbWFnZUF0dHJpYnV0ZXNfU2V0V3JhcE1vZGVfMT1jYXN0PVdyYXBNb2RlCi0KLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfSW1hZ2VBdHRyaWJ1dGVzX2RlbGV0ZV8wPQotCi1HZGlwX0ltYWdlQXR0cmlidXRlc19uZXc9ZmxhZ3M9bmV3Ci0KLUdkaXBfSW1hZ2VfR2V0SGVpZ2h0PWZsYWdzPWNwcAotR2RpcF9JbWFnZV9HZXRIZWlnaHRfMD1jYXN0PShJbWFnZSAqKQotCi1HZGlwX0ltYWdlX0dldExhc3RTdGF0dXM9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlX0dldExhc3RTdGF0dXNfMD1jYXN0PShJbWFnZSopCi0KLUdkaXBfSW1hZ2VfR2V0UGFsZXR0ZT1mbGFncz1jcHAKLUdkaXBfSW1hZ2VfR2V0UGFsZXR0ZV8wPWNhc3Q9KEltYWdlKikKLUdkaXBfSW1hZ2VfR2V0UGFsZXR0ZV8xPWNhc3Q9Q29sb3JQYWxldHRlKgotR2RpcF9JbWFnZV9HZXRQYWxldHRlXzI9Ci0KLUdkaXBfSW1hZ2VfR2V0UGFsZXR0ZVNpemU9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlX0dldFBhbGV0dGVTaXplXzA9Y2FzdD1JbWFnZSoKLQotR2RpcF9JbWFnZV9HZXRQaXhlbEZvcm1hdD1mbGFncz1jcHAKLUdkaXBfSW1hZ2VfR2V0UGl4ZWxGb3JtYXRfMD1jYXN0PShJbWFnZSopCi0KLUdkaXBfSW1hZ2VfR2V0V2lkdGg9ZmxhZ3M9Y3BwCi1HZGlwX0ltYWdlX0dldFdpZHRoXzA9Y2FzdD1JbWFnZSAqCi0KLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzPWZsYWdzPW5vX2dlbiBjcHAKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzA9Y2FzdD1MaW5lYXJHcmFkaWVudEJydXNoICoKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9TZXRJbnRlcnBvbGF0aW9uQ29sb3JzXzE9Y2FzdD1jb25zdCBDb2xvciAqCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0SW50ZXJwb2xhdGlvbkNvbG9yc18yPWNhc3Q9Y29uc3QgUkVBTCAqCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0SW50ZXJwb2xhdGlvbkNvbG9yc18zPQotCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0V3JhcE1vZGU9ZmxhZ3M9Y3BwCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfU2V0V3JhcE1vZGVfMD1jYXN0PUxpbmVhckdyYWRpZW50QnJ1c2ggKgotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX1NldFdyYXBNb2RlXzE9Y2FzdD1XcmFwTW9kZQotCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX2RlbGV0ZV8wPQotCi1HZGlwX0xpbmVhckdyYWRpZW50QnJ1c2hfbmV3PWZsYWdzPW5ldwotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX25ld18wPWZsYWdzPXN0cnVjdAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX25ld18xPWZsYWdzPXN0cnVjdAotR2RpcF9MaW5lYXJHcmFkaWVudEJydXNoX25ld18yPWNhc3Q9Q29sb3IgKixmbGFncz1zdHJ1Y3QKLUdkaXBfTGluZWFyR3JhZGllbnRCcnVzaF9uZXdfMz1jYXN0PUNvbG9yICosZmxhZ3M9c3RydWN0Ci0KLUdkaXBfTWF0cml4X0dldEVsZW1lbnRzPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfR2V0RWxlbWVudHNfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X0dldEVsZW1lbnRzXzE9Y2FzdD0oUkVBTCAqKQotCi1HZGlwX01hdHJpeF9JbnZlcnQ9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9JbnZlcnRfMD1jYXN0PShNYXRyaXggKikKLQotR2RpcF9NYXRyaXhfSXNJZGVudGl0eT1mbGFncz1jcHAKLUdkaXBfTWF0cml4X0lzSWRlbnRpdHlfMD1jYXN0PShNYXRyaXggKikKLQotR2RpcF9NYXRyaXhfTXVsdGlwbHk9ZmxhZ3M9Y3BwCi1HZGlwX01hdHJpeF9NdWx0aXBseV8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfTXVsdGlwbHlfMT1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X011bHRpcGx5XzI9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4X1JvdGF0ZT1mbGFncz1jcHAKLUdkaXBfTWF0cml4X1JvdGF0ZV8wPWNhc3Q9KE1hdHJpeCAqKQotR2RpcF9NYXRyaXhfUm90YXRlXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1JvdGF0ZV8yPWNhc3Q9KE1hdHJpeE9yZGVyKQotCi1HZGlwX01hdHJpeF9TY2FsZT1mbGFncz1jcHAKLUdkaXBfTWF0cml4X1NjYWxlXzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9TY2FsZV8xPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TY2FsZV8yPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TY2FsZV8zPWNhc3Q9KE1hdHJpeE9yZGVyKQotCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50cz1mbGFncz1jcHAKLUdkaXBfTWF0cml4X1NldEVsZW1lbnRzXzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c18xPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c18yPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c18zPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c180PWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c181PWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9TZXRFbGVtZW50c182PWNhc3Q9KFJFQUwpCi0KLUdkaXBfTWF0cml4X1NoZWFyPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfU2hlYXJfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4X1NoZWFyXzE9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NoZWFyXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1NoZWFyXzM9Y2FzdD0oTWF0cml4T3JkZXIpCi0KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Qb2ludEZfMklfMD1jYXN0PShNYXRyaXggKikKLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGXzJJXzE9Ci1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX1BvaW50Rl8ySV8yPQotCi1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JXzNGST1mbGFncz1ub19nZW4KLUdkaXBfTWF0cml4XzFUcmFuc2Zvcm1Qb2ludHNfX0lfM0ZJXzA9Ci1HZGlwX01hdHJpeF8xVHJhbnNmb3JtUG9pbnRzX19JXzNGSV8xPQotR2RpcF9NYXRyaXhfMVRyYW5zZm9ybVBvaW50c19fSV8zRklfMj0KLQotR2RpcF9NYXRyaXhfVHJhbnNsYXRlPWZsYWdzPWNwcAotR2RpcF9NYXRyaXhfVHJhbnNsYXRlXzA9Y2FzdD0oTWF0cml4ICopCi1HZGlwX01hdHJpeF9UcmFuc2xhdGVfMT1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfVHJhbnNsYXRlXzI9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X1RyYW5zbGF0ZV8zPWNhc3Q9KE1hdHJpeE9yZGVyKQotCi1HZGlwX01hdHJpeF9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX01hdHJpeF9kZWxldGVfMD0KLQotR2RpcF9NYXRyaXhfbmV3PWZsYWdzPW5ldwotR2RpcF9NYXRyaXhfbmV3XzA9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld18xPWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9uZXdfMj1jYXN0PShSRUFMKQotR2RpcF9NYXRyaXhfbmV3XzM9Y2FzdD0oUkVBTCkKLUdkaXBfTWF0cml4X25ld180PWNhc3Q9KFJFQUwpCi1HZGlwX01hdHJpeF9uZXdfNT1jYXN0PShSRUFMKQotCi1HZGlwX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9CaXRtYXBEYXRhXzJJPQotR2RpcF9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfQml0bWFwRGF0YV8ySV8wPWNhc3Q9UFZPSUQKLUdkaXBfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0JpdG1hcERhdGFfMklfMT1jYXN0PUNPTlNUIFZPSUQqCi0KLUdkaXBfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9nZGlwX0NvbG9yUGFsZXR0ZV8ySUk9Ci1HZGlwX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ2RpcF9Db2xvclBhbGV0dGVfMklJXzA9Y2FzdD1QVk9JRAotR2RpcF9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfQ29sb3JQYWxldHRlXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQqKQotR2RpcF9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfQ29sb3JQYWxldHRlXzJJSV8yPQotCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldENlbnRlckNvbG9yPWZsYWdzPWNwcAotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRDZW50ZXJDb2xvcl8wPWNhc3Q9KFBhdGhHcmFkaWVudEJydXNoICopCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldENlbnRlckNvbG9yXzE9Y2FzdD0oQ29sb3IgKiksZmxhZ3M9c3RydWN0Ci0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyUG9pbnQ9ZmxhZ3M9Y3BwCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldENlbnRlclBvaW50XzA9Y2FzdD0oUGF0aEdyYWRpZW50QnJ1c2ggKikKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfU2V0Q2VudGVyUG9pbnRfMT1mbGFncz1zdHJ1Y3QKLQotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRHcmFwaGljc1BhdGg9ZmxhZ3M9Y3BwCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldEdyYXBoaWNzUGF0aF8wPWNhc3Q9KFBhdGhHcmFkaWVudEJydXNoICopCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldEdyYXBoaWNzUGF0aF8xPWNhc3Q9KEdyYXBoaWNzUGF0aCAqKQotCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldFN1cnJvdW5kQ29sb3JzPWZsYWdzPW5vX2dlbgotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9TZXRTdXJyb3VuZENvbG9yc18wPWNhc3Q9KFBhdGhHcmFkaWVudEJydXNoICopCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldFN1cnJvdW5kQ29sb3JzXzE9Y2FzdD1Db2xvciAqCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX1NldFN1cnJvdW5kQ29sb3JzXzI9Y2FzdD1JTlQgKgotCi1HZGlwX1BhdGhHcmFkaWVudEJydXNoX2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfZGVsZXRlXzA9Ci0KLUdkaXBfUGF0aEdyYWRpZW50QnJ1c2hfbmV3PWZsYWdzPW5ldwotR2RpcF9QYXRoR3JhZGllbnRCcnVzaF9uZXdfMD1jYXN0PShHcmFwaGljc1BhdGggKikKLQotR2RpcF9QZW5fR2V0QnJ1c2g9ZmxhZ3M9Y3BwCi1HZGlwX1Blbl9HZXRCcnVzaF8wPWNhc3Q9KFBlbiAqKQotCi1HZGlwX1Blbl9TZXRCcnVzaD1mbGFncz1jcHAKLUdkaXBfUGVuX1NldEJydXNoXzA9Y2FzdD0oUGVuICopCi1HZGlwX1Blbl9TZXRCcnVzaF8xPWNhc3Q9QnJ1c2ggKgotCi1HZGlwX1Blbl9TZXREYXNoT2Zmc2V0PWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0RGFzaE9mZnNldF8wPWNhc3Q9KFBlbiAqKQotR2RpcF9QZW5fU2V0RGFzaE9mZnNldF8xPQotCi1HZGlwX1Blbl9TZXREYXNoUGF0dGVybj1mbGFncz1jcHAKLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuXzA9Y2FzdD0oUGVuICopCi1HZGlwX1Blbl9TZXREYXNoUGF0dGVybl8xPWNhc3Q9KFJFQUwgKikKLUdkaXBfUGVuX1NldERhc2hQYXR0ZXJuXzI9Y2FzdD1pbnQKLQotR2RpcF9QZW5fU2V0RGFzaFN0eWxlPWZsYWdzPWNwcAotR2RpcF9QZW5fU2V0RGFzaFN0eWxlXzA9Y2FzdD1QZW4gKgotR2RpcF9QZW5fU2V0RGFzaFN0eWxlXzE9Y2FzdD1EYXNoU3R5bGUKLQotR2RpcF9QZW5fU2V0TGluZUNhcD1mbGFncz1jcHAKLUdkaXBfUGVuX1NldExpbmVDYXBfMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldExpbmVDYXBfMT1jYXN0PShMaW5lQ2FwKQotR2RpcF9QZW5fU2V0TGluZUNhcF8yPWNhc3Q9KExpbmVDYXApCi1HZGlwX1Blbl9TZXRMaW5lQ2FwXzM9Y2FzdD0oRGFzaENhcCkKLQotR2RpcF9QZW5fU2V0TGluZUpvaW49ZmxhZ3M9Y3BwCi1HZGlwX1Blbl9TZXRMaW5lSm9pbl8wPWNhc3Q9KFBlbiAqKQotR2RpcF9QZW5fU2V0TGluZUpvaW5fMT1jYXN0PShMaW5lSm9pbikKLQotR2RpcF9QZW5fU2V0TWl0ZXJMaW1pdD1mbGFncz1jcHAKLUdkaXBfUGVuX1NldE1pdGVyTGltaXRfMD1jYXN0PShQZW4gKikKLUdkaXBfUGVuX1NldE1pdGVyTGltaXRfMT0KLQotR2RpcF9QZW5fU2V0V2lkdGg9ZmxhZ3M9Y3BwCi1HZGlwX1Blbl9TZXRXaWR0aF8wPWNhc3Q9KFBlbiAqKQotR2RpcF9QZW5fU2V0V2lkdGhfMT1jYXN0PVJFQUwKLQotR2RpcF9QZW5fZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9QZW5fZGVsZXRlXzA9Ci0KLUdkaXBfUGVuX25ldz1mbGFncz1uZXcKLUdkaXBfUGVuX25ld18wPWNhc3Q9KEJydXNoICopCi1HZGlwX1Blbl9uZXdfMT1jYXN0PShSRUFMKQotCi1HZGlwX1BvaW50X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfUG9pbnRfZGVsZXRlXzA9Ci0KLUdkaXBfUG9pbnRfbmV3PWZsYWdzPW5ldwotR2RpcF9Qb2ludF9uZXdfMD0KLUdkaXBfUG9pbnRfbmV3XzE9Ci0KLUdkaXBfUmVnaW9uX0dldEhSR049ZmxhZ3M9Y3BwCi1HZGlwX1JlZ2lvbl9HZXRIUkdOXzA9Y2FzdD0oUmVnaW9uICopCi1HZGlwX1JlZ2lvbl9HZXRIUkdOXzE9Y2FzdD0oR3JhcGhpY3MgKikKLQotR2RpcF9SZWdpb25fSXNJbmZpbml0ZT1mbGFncz1jcHAKLUdkaXBfUmVnaW9uX0lzSW5maW5pdGVfMD1jYXN0PShSZWdpb24gKikKLUdkaXBfUmVnaW9uX0lzSW5maW5pdGVfMT1jYXN0PShHcmFwaGljcyAqKQotCi1HZGlwX1JlZ2lvbl9kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1HZGlwX1JlZ2lvbl9kZWxldGVfMD0KLQotR2RpcF9SZWdpb25fMW5ld19fPWZsYWdzPW5ldwotCi1HZGlwX1JlZ2lvbl8xbmV3X19JPWZsYWdzPW5ldwotR2RpcF9SZWdpb25fMW5ld19fSV8wPWNhc3Q9SFJHTgotCi1HZGlwX1NvbGlkQnJ1c2hfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9Tb2xpZEJydXNoX2RlbGV0ZV8wPQotCi1HZGlwX1NvbGlkQnJ1c2hfbmV3PWZsYWdzPW5ldwotR2RpcF9Tb2xpZEJydXNoX25ld18wPWNhc3Q9KENvbG9yICosZmxhZ3M9c3RydWN0Ci0KLUdkaXBfU3RyaW5nRm9ybWF0X0Nsb25lPWZsYWdzPWNwcAotR2RpcF9TdHJpbmdGb3JtYXRfQ2xvbmVfMD1jYXN0PShTdHJpbmdGb3JtYXQgKikKLQotR2RpcF9TdHJpbmdGb3JtYXRfR2VuZXJpY0RlZmF1bHQ9YWNjZXNzb3I9U3RyaW5nRm9ybWF0OjpHZW5lcmljRGVmYXVsdAotCi1HZGlwX1N0cmluZ0Zvcm1hdF9HZW5lcmljVHlwb2dyYXBoaWM9YWNjZXNzb3I9U3RyaW5nRm9ybWF0OjpHZW5lcmljVHlwb2dyYXBoaWMKLQotR2RpcF9TdHJpbmdGb3JtYXRfR2V0Rm9ybWF0RmxhZ3M9ZmxhZ3M9Y3BwCi1HZGlwX1N0cmluZ0Zvcm1hdF9HZXRGb3JtYXRGbGFnc18wPWNhc3Q9KFN0cmluZ0Zvcm1hdCAqKQotCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRGb3JtYXRGbGFncz1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X1NldEZvcm1hdEZsYWdzXzA9Y2FzdD0oU3RyaW5nRm9ybWF0ICopCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRGb3JtYXRGbGFnc18xPWNhc3Q9U3RyaW5nRm9ybWF0RmxhZ3MKLQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0SG90a2V5UHJlZml4PWZsYWdzPWNwcAotR2RpcF9TdHJpbmdGb3JtYXRfU2V0SG90a2V5UHJlZml4XzA9Y2FzdD0oU3RyaW5nRm9ybWF0ICopCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRIb3RrZXlQcmVmaXhfMT1jYXN0PUhvdGtleVByZWZpeAotCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wcz1mbGFncz1jcHAKLUdkaXBfU3RyaW5nRm9ybWF0X1NldFRhYlN0b3BzXzA9Y2FzdD0oU3RyaW5nRm9ybWF0ICopCi1HZGlwX1N0cmluZ0Zvcm1hdF9TZXRUYWJTdG9wc18xPQotR2RpcF9TdHJpbmdGb3JtYXRfU2V0VGFiU3RvcHNfMj0KLUdkaXBfU3RyaW5nRm9ybWF0X1NldFRhYlN0b3BzXzM9Ci0KLUdkaXBfU3RyaW5nRm9ybWF0X2RlbGV0ZT1mbGFncz1kZWxldGUKLUdkaXBfU3RyaW5nRm9ybWF0X2RlbGV0ZV8wPQotCi1HZGlwX1RleHR1cmVCcnVzaF9TZXRUcmFuc2Zvcm09ZmxhZ3M9Y3BwCi1HZGlwX1RleHR1cmVCcnVzaF9TZXRUcmFuc2Zvcm1fMD1jYXN0PShUZXh0dXJlQnJ1c2ggKikKLUdkaXBfVGV4dHVyZUJydXNoX1NldFRyYW5zZm9ybV8xPWNhc3Q9TWF0cml4ICoKLQotR2RpcF9UZXh0dXJlQnJ1c2hfZGVsZXRlPWZsYWdzPWRlbGV0ZQotR2RpcF9UZXh0dXJlQnJ1c2hfZGVsZXRlXzA9Ci0KLUdkaXBfVGV4dHVyZUJydXNoX25ldz1mbGFncz1uZXcKLUdkaXBfVGV4dHVyZUJydXNoX25ld18wPWNhc3Q9SW1hZ2UgKgotR2RpcF9UZXh0dXJlQnJ1c2hfbmV3XzE9Y2FzdD1XcmFwTW9kZQotR2RpcF9UZXh0dXJlQnJ1c2hfbmV3XzI9Ci1HZGlwX1RleHR1cmVCcnVzaF9uZXdfMz0KLUdkaXBfVGV4dHVyZUJydXNoX25ld180PQotR2RpcF9UZXh0dXJlQnJ1c2hfbmV3XzU9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfR2RpcGx1c1N0YXJ0dXBJbnB1dD1mbGFncz1jcHAKLUdkaXBsdXNTdGFydHVwSW5wdXRfR2RpcGx1c1ZlcnNpb249Ci1HZGlwbHVzU3RhcnR1cElucHV0X0RlYnVnRXZlbnRDYWxsYmFjaz1jYXN0PURlYnVnRXZlbnRQcm9jCi1HZGlwbHVzU3RhcnR1cElucHV0X1N1cHByZXNzQmFja2dyb3VuZFRocmVhZD1jYXN0PUJPT0wKLUdkaXBsdXNTdGFydHVwSW5wdXRfU3VwcHJlc3NFeHRlcm5hbENvZGVjcz1jYXN0PUJPT0wKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUG9pbnRGPQotUG9pbnRGX1g9Y2FzdD1SRUFMCi1Qb2ludEZfWT1jYXN0PVJFQUwKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdD0KLVJlY3RfWD0KLVJlY3RfWT0KLVJlY3RfV2lkdGg9Ci1SZWN0X0hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dkaXBfUmVjdEY9Ci1SZWN0Rl9YPQotUmVjdEZfWT0KLVJlY3RGX1dpZHRoPQotUmVjdEZfSGVpZ2h0PQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLkdOT01FLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdub21lLkdOT01FLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGFmZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5HTk9NRS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dub21lX0dOT01FPQotR05PTUVfR25vbWVWRlNNaW1lQXBwbGljYXRpb25fc2l6ZW9mPQotCi1HTk9NRV9fZ19mcmVlPQotR05PTUVfX2dfZnJlZV8wPWNhc3Q9Z3BvaW50ZXIKLQotR05PTUVfX2dfbGlzdF9hcHBlbmQ9Ci1HTk9NRV9fZ19saXN0X2FwcGVuZF8wPWNhc3Q9KEdMaXN0ICopCi1HTk9NRV9fZ19saXN0X2FwcGVuZF8xPWNhc3Q9KGdwb2ludGVyKQotCi1HTk9NRV9fZ19saXN0X2ZyZWU9Ci1HTk9NRV9fZ19saXN0X2ZyZWVfMD1jYXN0PShHTGlzdCAqKQotCi1HTk9NRV9fZ19saXN0X25leHQ9Ci1HTk9NRV9fZ19saXN0X25leHRfMD0KLQotR05PTUVfX2dfb2JqZWN0X3VucmVmPQotR05PTUVfX2dfb2JqZWN0X3VucmVmXzA9Y2FzdD1ncG9pbnRlcgotCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXA9Ci1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfMD1jYXN0PShHbm9tZUljb25UaGVtZSAqKQotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzE9Y2FzdD1Hbm9tZVRodW1ibmFpbEZhY3RvcnkgKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzI9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF8zPWNhc3Q9Y29uc3QgY2hhciAqCi1HTk9NRV9fZ25vbWVfaWNvbl9sb29rdXBfND1jYXN0PUdub21lVkZTRmlsZUluZm8gKgotR05PTUVfX2dub21lX2ljb25fbG9va3VwXzU9Y2FzdD1jb25zdCBjaGFyICoKLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF82PWNhc3Q9R25vbWVJY29uTG9va3VwRmxhZ3MKLUdOT01FX19nbm9tZV9pY29uX2xvb2t1cF83PWNhc3Q9R25vbWVJY29uTG9va3VwUmVzdWx0RmxhZ3MgKgotCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbj0KLUdOT01FX19nbm9tZV9pY29uX3RoZW1lX2xvb2t1cF9pY29uXzA9Y2FzdD1Hbm9tZUljb25UaGVtZSAqCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl8xPWNhc3Q9Y29uc3QgY2hhciAqCi1HTk9NRV9fZ25vbWVfaWNvbl90aGVtZV9sb29rdXBfaWNvbl8yPQotR05PTUVfX2dub21lX2ljb25fdGhlbWVfbG9va3VwX2ljb25fMz1jYXN0PShjb25zdCBHbm9tZUljb25EYXRhICoqKQotR05PTUVfX2dub21lX2ljb25fdGhlbWVfbG9va3VwX2ljb25fND0KLQotR05PTUVfX2dub21lX2ljb25fdGhlbWVfbmV3PQotCi1HTk9NRV9fZ25vbWVfdmZzX2dldF9yZWdpc3RlcmVkX21pbWVfdHlwZXM9Ci0KLUdOT01FX19nbm9tZV92ZnNfaW5pdD0KLQotR05PTUVfX2dub21lX3Zmc19tYWtlX3VyaV9mcm9tX2lucHV0PQotR05PTUVfX2dub21lX3Zmc19tYWtlX3VyaV9mcm9tX2lucHV0XzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXRfd2l0aF9kaXJzPWZsYWdzPWR5bmFtaWMKLUdOT01FX19nbm9tZV92ZnNfbWFrZV91cmlfZnJvbV9pbnB1dF93aXRoX2RpcnNfMD1jYXN0PShjb25zdCBjaGFyICopCi1HTk9NRV9fZ25vbWVfdmZzX21ha2VfdXJpX2Zyb21faW5wdXRfd2l0aF9kaXJzXzE9Ci0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9hcHBsaWNhdGlvbl9mcmVlPQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2ZyZWVfMD1jYXN0PUdub21lVkZTTWltZUFwcGxpY2F0aW9uICoKLQotR05PTUVfX2dub21lX3Zmc19taW1lX2FwcGxpY2F0aW9uX2xhdW5jaD1mbGFncz1keW5hbWljCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfYXBwbGljYXRpb25fbGF1bmNoXzA9Y2FzdD0oR25vbWVWRlNNaW1lQXBwbGljYXRpb24gKikKLUdOT01FX19nbm9tZV92ZnNfbWltZV9hcHBsaWNhdGlvbl9sYXVuY2hfMT1jYXN0PShHTGlzdCAqKQotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZXh0ZW5zaW9uc19saXN0X2ZyZWU9Ci1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZXh0ZW5zaW9uc19saXN0X2ZyZWVfMD1jYXN0PUdMaXN0ICoKLQotR05PTUVfX2dub21lX3Zmc19taW1lX2dldF9kZWZhdWx0X2FwcGxpY2F0aW9uPQotR05PTUVfX2dub21lX3Zmc19taW1lX2dldF9kZWZhdWx0X2FwcGxpY2F0aW9uXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1HTk9NRV9fZ25vbWVfdmZzX21pbWVfZ2V0X2V4dGVuc2lvbnNfbGlzdD0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9nZXRfZXh0ZW5zaW9uc19saXN0XzA9Y2FzdD1jb25zdCBjaGFyICoKLQotR05PTUVfX2dub21lX3Zmc19taW1lX3JlZ2lzdGVyZWRfbWltZV90eXBlX2xpc3RfZnJlZT0KLUdOT01FX19nbm9tZV92ZnNfbWltZV9yZWdpc3RlcmVkX21pbWVfdHlwZV9saXN0X2ZyZWVfMD1jYXN0PUdMaXN0ICoKLQotR05PTUVfX2dub21lX3Zmc19taW1lX3R5cGVfZnJvbV9uYW1lPQotR05PTUVfX2dub21lX3Zmc19taW1lX3R5cGVfZnJvbV9uYW1lXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1HTk9NRV9fZ25vbWVfdmZzX3VybF9zaG93PWZsYWdzPWR5bmFtaWMKLUdOT01FX19nbm9tZV92ZnNfdXJsX3Nob3dfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLUdOT01FX21lbW1vdmU9Ci1HTk9NRV9tZW1tb3ZlXzA9Y2FzdD12b2lkICosZmxhZ3M9bm9faW4KLUdOT01FX21lbW1vdmVfMT1jYXN0PWNvbnN0IHZvaWQgKgotR05PTUVfbWVtbW92ZV8yPWNhc3Q9c2l6ZV90Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2dub21lX0dub21lVkZTTWltZUFwcGxpY2F0aW9uPQotR25vbWVWRlNNaW1lQXBwbGljYXRpb25faWQ9Y2FzdD1jaGFyICoKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX25hbWU9Y2FzdD1jaGFyICoKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX2NvbW1hbmQ9Y2FzdD1jaGFyICoKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX2Nhbl9vcGVuX211bHRpcGxlX2ZpbGVzPWNhc3Q9Z2Jvb2xlYW4KLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX2V4cGVjdHNfdXJpcz1jYXN0PUdub21lVkZTTWltZUFwcGxpY2F0aW9uQXJndW1lbnRUeXBlCi1Hbm9tZVZGU01pbWVBcHBsaWNhdGlvbl9zdXBwb3J0ZWRfdXJpX3NjaGVtZXM9Y2FzdD0oR0xpc3QgKikKLUdub21lVkZTTWltZUFwcGxpY2F0aW9uX3JlcXVpcmVzX3Rlcm1pbmFsPWNhc3Q9Z2Jvb2xlYW4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5nbm9tZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ3YWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9jb3B5cmlnaHQ9LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiBcCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gXAotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zXG4gXAotICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkgVmVyc2lvbiAyLjEgdGhhdFxuIFwKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIChsZ3BsLXYyMS50eHQpLiAgVGhlIExHUEwgaXMgYWxzb1xuIFwKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC5odG1sLiAgSWYgdGhlIHZlcnNpb25cbiBcCi0gKiBvZiB0aGUgTEdQTCBhdCBodHRwOi8vd3d3LmdudS5vcmcgaXMgZGlmZmVyZW50IHRvIHRoZSB2ZXJzaW9uIG9mXG4gXAotICogdGhlIExHUEwgYWNjb21wYW55aW5nIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCB0aGVyZSBpcyBhbnkgY29uZmxpY3RcbiBcCi0gKiBiZXR3ZWVuIHRoZSB0d28gbGljZW5zZSB2ZXJzaW9ucywgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIGFjY29tcGFueWluZ1xuIFwKLSAqIHRoaXMgZGlzdHJpYnV0aW9uIHNoYWxsIGdvdmVybi5cbiBcCi0gKiBcbiBcCi0gKiBDb250cmlidXRvcnM6XG4gXAotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuIFwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuR1RLLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5HVEsucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmNmUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5HVEsucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1RLPQotR1RLX19HVEtfV0lER0VUX0hFSUdIVD0KLUdUS19fR1RLX1dJREdFVF9IRUlHSFRfMD1jYXN0PUd0a1dpZGdldCAqCi0KLUdUS19fR1RLX1dJREdFVF9XSURUSD0KLUdUS19fR1RLX1dJREdFVF9XSURUSF8wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotR1RLX19nX3NpZ25hbF9jb25uZWN0PQotR1RLX19nX3NpZ25hbF9jb25uZWN0XzA9Y2FzdD0oZ3BvaW50ZXIpCi1HVEtfX2dfc2lnbmFsX2Nvbm5lY3RfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLUdUS19fZ19zaWduYWxfY29ubmVjdF8yPWNhc3Q9KEdDYWxsYmFjaykKLUdUS19fZ19zaWduYWxfY29ubmVjdF8zPWNhc3Q9Z3BvaW50ZXIKLQotR1RLX19ndGtfZXZlbnRzX3BlbmRpbmc9Ci0KLUdUS19fZ3RrX2luaXRfY2hlY2s9Ci1HVEtfX2d0a19pbml0X2NoZWNrXzA9Y2FzdD1pbnQgKgotR1RLX19ndGtfaW5pdF9jaGVja18xPWNhc3Q9Y2hhciAqKioKLQotR1RLX19ndGtfbWFpbj0KLQotR1RLX19ndGtfbWFpbl9pdGVyYXRpb249Ci0KLUdUS19fZ3RrX3BsdWdfbmV3PQotR1RLX19ndGtfcGx1Z19uZXdfMD0KLQotR1RLX19ndGtfd2lkZ2V0X2Rlc3Ryb3k9Ci1HVEtfX2d0a193aWRnZXRfZGVzdHJveV8wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotR1RLX19ndGtfd2lkZ2V0X3Nob3c9Ci1HVEtfX2d0a193aWRnZXRfc2hvd18wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotR1RLX19ndGtfd2lkZ2V0X3Nob3dfbm93PQotR1RLX19ndGtfd2lkZ2V0X3Nob3dfbm93XzA9Y2FzdD1HdGtXaWRnZXQgKgotCi1HVEtfX2d0a193aW5kb3dfbmV3PQotR1RLX19ndGtfd2luZG93X25ld18wPWNhc3Q9R3RrV2luZG93VHlwZQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGUyM2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTA3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR0ludGVyZmFjZUluZm89Ci1HSW50ZXJmYWNlSW5mb19pbnRlcmZhY2VfaW5pdD1jYXN0PShHSW50ZXJmYWNlSW5pdEZ1bmMpCi1HSW50ZXJmYWNlSW5mb19pbnRlcmZhY2VfZmluYWxpemU9Y2FzdD0oR0ludGVyZmFjZUZpbmFsaXplRnVuYykKLUdJbnRlcmZhY2VJbmZvX2ludGVyZmFjZV9kYXRhPWNhc3Q9KGdwb2ludGVyKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzcz0KLUdPYmplY3RDbGFzc19jb25zdHJ1Y3Rvcj1jYXN0PShHT2JqZWN0ICooKikoKSkKLUdPYmplY3RDbGFzc19zZXRfcHJvcGVydHk9Y2FzdD0odm9pZCAoKikoKSkKLUdPYmplY3RDbGFzc19nZXRfcHJvcGVydHk9Y2FzdD0odm9pZCAoKikoKSkKLUdPYmplY3RDbGFzc19kaXNwb3NlPWNhc3Q9KHZvaWQgKCopKCkpCi1HT2JqZWN0Q2xhc3NfZmluYWxpemU9Y2FzdD0odm9pZCAoKikoKSkKLUdPYmplY3RDbGFzc19kaXNwYXRjaF9wcm9wZXJ0aWVzX2NoYW5nZWQ9Y2FzdD0odm9pZCAoKikoKSkKLUdPYmplY3RDbGFzc19ub3RpZnk9Y2FzdD0odm9pZCAoKikoKSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm89Ci1HVHlwZUluZm9fY2xhc3Nfc2l6ZT1jYXN0PShndWludDE2KQotR1R5cGVJbmZvX2Jhc2VfaW5pdD1jYXN0PShHQmFzZUluaXRGdW5jKQotR1R5cGVJbmZvX2Jhc2VfZmluYWxpemU9Y2FzdD0oR0Jhc2VGaW5hbGl6ZUZ1bmMpCi1HVHlwZUluZm9fY2xhc3NfaW5pdD1jYXN0PShHQ2xhc3NJbml0RnVuYykKLUdUeXBlSW5mb19jbGFzc19maW5hbGl6ZT1jYXN0PShHQ2xhc3NGaW5hbGl6ZUZ1bmMpCi1HVHlwZUluZm9fY2xhc3NfZGF0YT1jYXN0PShnY29uc3Rwb2ludGVyKQotR1R5cGVJbmZvX2luc3RhbmNlX3NpemU9Y2FzdD0oZ3VpbnQxNikKLUdUeXBlSW5mb19uX3ByZWFsbG9jcz1jYXN0PShndWludDE2KQotR1R5cGVJbmZvX2luc3RhbmNlX2luaXQ9Y2FzdD0oR0luc3RhbmNlSW5pdEZ1bmMpCi1HVHlwZUluZm9fdmFsdWVfdGFibGU9Y2FzdD0oR1R5cGVWYWx1ZVRhYmxlICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVRdWVyeT0KLUdUeXBlUXVlcnlfdHlwZT1jYXN0PShHVHlwZSkKLUdUeXBlUXVlcnlfdHlwZV9uYW1lPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1HVHlwZVF1ZXJ5X2NsYXNzX3NpemU9Y2FzdD0oZ3VpbnQpCi1HVHlwZVF1ZXJ5X2luc3RhbmNlX3NpemU9Y2FzdD0oZ3VpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3I9Ci1HZGtDb2xvcl9waXhlbD1jYXN0PShndWludDMyKQotR2RrQ29sb3JfcmVkPWNhc3Q9KGd1aW50MTYpCi1HZGtDb2xvcl9ncmVlbj1jYXN0PShndWludDE2KQotR2RrQ29sb3JfYmx1ZT1jYXN0PShndWludDE2KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0RyYWdDb250ZXh0PQotR2RrRHJhZ0NvbnRleHRfcHJvdG9jb2w9Y2FzdD0oR2RrRHJhZ1Byb3RvY29sKQotR2RrRHJhZ0NvbnRleHRfaXNfc291cmNlPWNhc3Q9KGdib29sZWFuKQotR2RrRHJhZ0NvbnRleHRfc291cmNlX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0RyYWdDb250ZXh0X2Rlc3Rfd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRHJhZ0NvbnRleHRfdGFyZ2V0cz1jYXN0PShHTGlzdCAqKQotR2RrRHJhZ0NvbnRleHRfYWN0aW9ucz1jYXN0PShHZGtEcmFnQWN0aW9uKQotR2RrRHJhZ0NvbnRleHRfc3VnZ2VzdGVkX2FjdGlvbj1jYXN0PShHZGtEcmFnQWN0aW9uKQotR2RrRHJhZ0NvbnRleHRfYWN0aW9uPWNhc3Q9KEdka0RyYWdBY3Rpb24pCi1HZGtEcmFnQ29udGV4dF9zdGFydF90aW1lPWNhc3Q9KGd1aW50MzIpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnQ9Ci1HZGtFdmVudF90eXBlPWNhc3Q9KEdka0V2ZW50VHlwZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEFueT0KLUdka0V2ZW50QW55X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50QW55X3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b249Ci1HZGtFdmVudEJ1dHRvbl93aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudEJ1dHRvbl9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRCdXR0b25fdGltZT1jYXN0PShndWludDMyKQotR2RrRXZlbnRCdXR0b25feD1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRCdXR0b25feT1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRCdXR0b25fYXhlcz1jYXN0PShnZG91YmxlICopCi1HZGtFdmVudEJ1dHRvbl9zdGF0ZT1jYXN0PShndWludCkKLUdka0V2ZW50QnV0dG9uX2J1dHRvbj1jYXN0PShndWludCkKLUdka0V2ZW50QnV0dG9uX2RldmljZT1jYXN0PShHZGtEZXZpY2UgKikKLUdka0V2ZW50QnV0dG9uX3hfcm9vdD1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRCdXR0b25feV9yb290PWNhc3Q9KGdkb3VibGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRDcm9zc2luZz0KLUdka0V2ZW50Q3Jvc3Npbmdfd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRDcm9zc2luZ19zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRDcm9zc2luZ19zdWJ3aW5kb3c9Y2FzdD0oR2RrV2luZG93ICopCi1HZGtFdmVudENyb3NzaW5nX3RpbWU9Ci1HZGtFdmVudENyb3NzaW5nX3g9Ci1HZGtFdmVudENyb3NzaW5nX3k9Ci1HZGtFdmVudENyb3NzaW5nX3hfcm9vdD0KLUdka0V2ZW50Q3Jvc3NpbmdfeV9yb290PQotR2RrRXZlbnRDcm9zc2luZ19tb2RlPWNhc3Q9KEdka0Nyb3NzaW5nTW9kZSkKLUdka0V2ZW50Q3Jvc3NpbmdfZGV0YWlsPWNhc3Q9KEdka05vdGlmeVR5cGUpCi1HZGtFdmVudENyb3NzaW5nX2ZvY3VzPWNhc3Q9KGdib29sZWFuKQotR2RrRXZlbnRDcm9zc2luZ19zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEV4cG9zZT0KLUdka0V2ZW50RXhwb3NlX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50RXhwb3NlX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudEV4cG9zZV9hcmVhX3g9YWNjZXNzb3I9YXJlYS54Ci1HZGtFdmVudEV4cG9zZV9hcmVhX3k9YWNjZXNzb3I9YXJlYS55Ci1HZGtFdmVudEV4cG9zZV9hcmVhX3dpZHRoPWFjY2Vzc29yPWFyZWEud2lkdGgKLUdka0V2ZW50RXhwb3NlX2FyZWFfaGVpZ2h0PWFjY2Vzc29yPWFyZWEuaGVpZ2h0Ci1HZGtFdmVudEV4cG9zZV9yZWdpb249Y2FzdD0oR2RrUmVnaW9uICopCi1HZGtFdmVudEV4cG9zZV9jb3VudD1jYXN0PShnaW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Rm9jdXM9Ci1HZGtFdmVudEZvY3VzX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50Rm9jdXNfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50Rm9jdXNfaW49Y2FzdD0oZ2ludDE2KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50S2V5PQotR2RrRXZlbnRLZXlfd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRLZXlfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50S2V5X3RpbWU9Y2FzdD0oZ3VpbnQzMikKLUdka0V2ZW50S2V5X3N0YXRlPWNhc3Q9KGd1aW50KQotR2RrRXZlbnRLZXlfa2V5dmFsPWNhc3Q9KGd1aW50KQotR2RrRXZlbnRLZXlfbGVuZ3RoPWNhc3Q9KGdpbnQpCi1HZGtFdmVudEtleV9zdHJpbmc9Y2FzdD0oZ2NoYXIgKikKLUdka0V2ZW50S2V5X2hhcmR3YXJlX2tleWNvZGU9Y2FzdD0oZ3VpbnQxNikKLUdka0V2ZW50S2V5X2dyb3VwPWNhc3Q9KGd1aW50OCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudE1vdGlvbj0KLUdka0V2ZW50TW90aW9uX3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50TW90aW9uX3NlbmRfZXZlbnQ9Y2FzdD0oZ2ludDgpCi1HZGtFdmVudE1vdGlvbl90aW1lPWNhc3Q9KGd1aW50MzIpCi1HZGtFdmVudE1vdGlvbl94PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudE1vdGlvbl95PWNhc3Q9KGdkb3VibGUpCi1HZGtFdmVudE1vdGlvbl9heGVzPWNhc3Q9KGdkb3VibGUgKikKLUdka0V2ZW50TW90aW9uX3N0YXRlPWNhc3Q9KGd1aW50KQotR2RrRXZlbnRNb3Rpb25faXNfaGludD1jYXN0PShnaW50MTYpCi1HZGtFdmVudE1vdGlvbl9kZXZpY2U9Y2FzdD0oR2RrRGV2aWNlICopCi1HZGtFdmVudE1vdGlvbl94X3Jvb3Q9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50TW90aW9uX3lfcm9vdD1jYXN0PShnZG91YmxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50U2Nyb2xsPQotR2RrRXZlbnRTY3JvbGxfd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRTY3JvbGxfc2VuZF9ldmVudD1jYXN0PShnaW50OCkKLUdka0V2ZW50U2Nyb2xsX3RpbWU9Y2FzdD0oZ3VpbnQzMikKLUdka0V2ZW50U2Nyb2xsX3g9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50U2Nyb2xsX3k9Y2FzdD0oZ2RvdWJsZSkKLUdka0V2ZW50U2Nyb2xsX3N0YXRlPWNhc3Q9KGd1aW50KQotR2RrRXZlbnRTY3JvbGxfZGlyZWN0aW9uPWNhc3Q9KEdka1Njcm9sbERpcmVjdGlvbikKLUdka0V2ZW50U2Nyb2xsX2RldmljZT1jYXN0PShHZGtEZXZpY2UgKikKLUdka0V2ZW50U2Nyb2xsX3hfcm9vdD1jYXN0PShnZG91YmxlKQotR2RrRXZlbnRTY3JvbGxfeV9yb290PWNhc3Q9KGdkb3VibGUpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRWaXNpYmlsaXR5PQotR2RrRXZlbnRWaXNpYmlsaXR5X3dpbmRvdz1jYXN0PShHZGtXaW5kb3cgKikKLUdka0V2ZW50VmlzaWJpbGl0eV9zZW5kX2V2ZW50PWNhc3Q9KGdpbnQ4KQotR2RrRXZlbnRWaXNpYmlsaXR5X3N0YXRlPWNhc3Q9R2RrVmlzaWJpbGl0eVN0YXRlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRXaW5kb3dTdGF0ZT0KLUdka0V2ZW50V2luZG93U3RhdGVfd2luZG93PWNhc3Q9KEdka1dpbmRvdyAqKQotR2RrRXZlbnRXaW5kb3dTdGF0ZV9zZW5kX2V2ZW50PQotR2RrRXZlbnRXaW5kb3dTdGF0ZV9jaGFuZ2VkX21hc2s9Ci1HZGtFdmVudFdpbmRvd1N0YXRlX25ld193aW5kb3dfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrR0NWYWx1ZXM9Ci1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX3BpeGVsPWFjY2Vzc29yPWZvcmVncm91bmQucGl4ZWwsY2FzdD0oZ3VpbnQzMikKLUdka0dDVmFsdWVzX2ZvcmVncm91bmRfcmVkPWFjY2Vzc29yPWZvcmVncm91bmQucmVkLGNhc3Q9KGd1aW50MTYpCi1HZGtHQ1ZhbHVlc19mb3JlZ3JvdW5kX2dyZWVuPWFjY2Vzc29yPWZvcmVncm91bmQuZ3JlZW4sY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2ZvcmVncm91bmRfYmx1ZT1hY2Nlc3Nvcj1mb3JlZ3JvdW5kLmJsdWUsY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfcGl4ZWw9YWNjZXNzb3I9YmFja2dyb3VuZC5waXhlbCxjYXN0PShndWludDMyKQotR2RrR0NWYWx1ZXNfYmFja2dyb3VuZF9yZWQ9YWNjZXNzb3I9YmFja2dyb3VuZC5yZWQsY2FzdD0oZ3VpbnQxNikKLUdka0dDVmFsdWVzX2JhY2tncm91bmRfZ3JlZW49YWNjZXNzb3I9YmFja2dyb3VuZC5ncmVlbixjYXN0PShndWludDE2KQotR2RrR0NWYWx1ZXNfYmFja2dyb3VuZF9ibHVlPWFjY2Vzc29yPWJhY2tncm91bmQuYmx1ZSxjYXN0PShndWludDE2KQotR2RrR0NWYWx1ZXNfZm9udD1jYXN0PShHZGtGb250ICopCi1HZGtHQ1ZhbHVlc19mdW5jdGlvbj1jYXN0PShHZGtGdW5jdGlvbikKLUdka0dDVmFsdWVzX2ZpbGw9Y2FzdD0oR2RrRmlsbCkKLUdka0dDVmFsdWVzX3RpbGU9Y2FzdD0oR2RrUGl4bWFwICopCi1HZGtHQ1ZhbHVlc19zdGlwcGxlPWNhc3Q9KEdka1BpeG1hcCAqKQotR2RrR0NWYWx1ZXNfY2xpcF9tYXNrPWNhc3Q9KEdka1BpeG1hcCAqKQotR2RrR0NWYWx1ZXNfc3Vid2luZG93X21vZGU9Y2FzdD0oR2RrU3Vid2luZG93TW9kZSkKLUdka0dDVmFsdWVzX3RzX3hfb3JpZ2luPWNhc3Q9KGdpbnQpCi1HZGtHQ1ZhbHVlc190c195X29yaWdpbj1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfY2xpcF94X29yaWdpbj1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfY2xpcF95X29yaWdpbj1jYXN0PShnaW50KQotR2RrR0NWYWx1ZXNfZ3JhcGhpY3NfZXhwb3N1cmVzPWNhc3Q9KGdpbnQpCi1HZGtHQ1ZhbHVlc19saW5lX3dpZHRoPWNhc3Q9KGdpbnQpCi1HZGtHQ1ZhbHVlc19saW5lX3N0eWxlPWNhc3Q9KEdka0xpbmVTdHlsZSkKLUdka0dDVmFsdWVzX2NhcF9zdHlsZT1jYXN0PShHZGtDYXBTdHlsZSkKLUdka0dDVmFsdWVzX2pvaW5fc3R5bGU9Y2FzdD0oR2RrSm9pblN0eWxlKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0dlb21ldHJ5PQotR2RrR2VvbWV0cnlfbWluX3dpZHRoPQotR2RrR2VvbWV0cnlfbWluX2hlaWdodD0KLUdka0dlb21ldHJ5X21heF93aWR0aD0KLUdka0dlb21ldHJ5X21heF9oZWlnaHQ9Ci1HZGtHZW9tZXRyeV9iYXNlX3dpZHRoPQotR2RrR2VvbWV0cnlfYmFzZV9oZWlnaHQ9Ci1HZGtHZW9tZXRyeV93aWR0aF9pbmM9Ci1HZGtHZW9tZXRyeV9oZWlnaHRfaW5jPQotR2RrR2VvbWV0cnlfbWluX2FzcGVjdD0KLUdka0dlb21ldHJ5X21heF9hc3BlY3Q9Ci1HZGtHZW9tZXRyeV93aW5fZ3Jhdml0eT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtJbWFnZT0KLUdka0ltYWdlX3R5cGU9Y2FzdD0oR2RrSW1hZ2VUeXBlKQotR2RrSW1hZ2VfdmlzdWFsPWNhc3Q9KEdka1Zpc3VhbCAqKQotR2RrSW1hZ2VfYnl0ZV9vcmRlcj1jYXN0PShHZGtCeXRlT3JkZXIpCi1HZGtJbWFnZV93aWR0aD1jYXN0PShnaW50KQotR2RrSW1hZ2VfaGVpZ2h0PWNhc3Q9KGdpbnQpCi1HZGtJbWFnZV9kZXB0aD1jYXN0PShndWludDE2KQotR2RrSW1hZ2VfYnBwPWNhc3Q9KGd1aW50MTYpCi1HZGtJbWFnZV9icGw9Y2FzdD0oZ3VpbnQxNikKLUdka0ltYWdlX2JpdHNfcGVyX3BpeGVsPWNhc3Q9KGd1aW50MTYpCi1HZGtJbWFnZV9tZW09Y2FzdD0oZ3BvaW50ZXIpCi1HZGtJbWFnZV9jb2xvcm1hcD1jYXN0PShHZGtDb2xvcm1hcCAqKQotR2RrSW1hZ2Vfd2luZG93aW5nX2RhdGE9Y2FzdD0oZ3BvaW50ZXIpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrUmVjdGFuZ2xlPQotR2RrUmVjdGFuZ2xlX3g9Y2FzdD0oZ2ludCkKLUdka1JlY3RhbmdsZV95PWNhc3Q9KGdpbnQpCi1HZGtSZWN0YW5nbGVfd2lkdGg9Y2FzdD0oZ2ludCkKLUdka1JlY3RhbmdsZV9oZWlnaHQ9Y2FzdD0oZ2ludCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtWaXN1YWw9Ci1HZGtWaXN1YWxfdHlwZT1jYXN0PShHZGtWaXN1YWxUeXBlKQotR2RrVmlzdWFsX2RlcHRoPWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfYnl0ZV9vcmRlcj1jYXN0PShHZGtCeXRlT3JkZXIpCi1HZGtWaXN1YWxfY29sb3JtYXBfc2l6ZT1jYXN0PShnaW50KQotR2RrVmlzdWFsX2JpdHNfcGVyX3JnYj1jYXN0PShnaW50KQotR2RrVmlzdWFsX3JlZF9tYXNrPWNhc3Q9KGd1aW50MzIpCi1HZGtWaXN1YWxfcmVkX3NoaWZ0PWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfcmVkX3ByZWM9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9ncmVlbl9tYXNrPWNhc3Q9KGd1aW50MzIpCi1HZGtWaXN1YWxfZ3JlZW5fc2hpZnQ9Y2FzdD0oZ2ludCkKLUdka1Zpc3VhbF9ncmVlbl9wcmVjPWNhc3Q9KGdpbnQpCi1HZGtWaXN1YWxfYmx1ZV9tYXNrPWNhc3Q9KGd1aW50MzIpCi1HZGtWaXN1YWxfYmx1ZV9zaGlmdD1jYXN0PShnaW50KQotR2RrVmlzdWFsX2JsdWVfcHJlYz1jYXN0PShnaW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1dpbmRvd0F0dHI9Ci1HZGtXaW5kb3dBdHRyX3RpdGxlPWNhc3Q9Z2NoYXIgKgotR2RrV2luZG93QXR0cl9ldmVudF9tYXNrPQotR2RrV2luZG93QXR0cl94PQotR2RrV2luZG93QXR0cl95PQotR2RrV2luZG93QXR0cl93aWR0aD0KLUdka1dpbmRvd0F0dHJfaGVpZ2h0PQotR2RrV2luZG93QXR0cl93Y2xhc3M9Ci1HZGtXaW5kb3dBdHRyX3Zpc3VhbD1jYXN0PUdka1Zpc3VhbCAqCi1HZGtXaW5kb3dBdHRyX2NvbG9ybWFwPWNhc3Q9R2RrQ29sb3JtYXAgKgotR2RrV2luZG93QXR0cl93aW5kb3dfdHlwZT0KLUdka1dpbmRvd0F0dHJfY3Vyc29yPWNhc3Q9R2RrQ3Vyc29yICoKLUdka1dpbmRvd0F0dHJfd21jbGFzc19uYW1lPWNhc3Q9Z2NoYXIgKgotR2RrV2luZG93QXR0cl93bWNsYXNzX2NsYXNzPWNhc3Q9Z2NoYXIgKgotR2RrV2luZG93QXR0cl9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50PQotR3RrQWRqdXN0bWVudF9sb3dlcj1jYXN0PShnZG91YmxlKQotR3RrQWRqdXN0bWVudF91cHBlcj1jYXN0PShnZG91YmxlKQotR3RrQWRqdXN0bWVudF92YWx1ZT1jYXN0PShnZG91YmxlKQotR3RrQWRqdXN0bWVudF9zdGVwX2luY3JlbWVudD1jYXN0PShnZG91YmxlKQotR3RrQWRqdXN0bWVudF9wYWdlX2luY3JlbWVudD1jYXN0PShnZG91YmxlKQotR3RrQWRqdXN0bWVudF9wYWdlX3NpemU9Y2FzdD0oZ2RvdWJsZSkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBbGxvY2F0aW9uPQotR3RrQWxsb2NhdGlvbl94PQotR3RrQWxsb2NhdGlvbl95PQotR3RrQWxsb2NhdGlvbl93aWR0aD0KLUd0a0FsbG9jYXRpb25faGVpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0JvcmRlcj0KLUd0a0JvcmRlcl9sZWZ0PQotR3RrQm9yZGVyX3JpZ2h0PQotR3RrQm9yZGVyX3RvcD0KLUd0a0JvcmRlcl9ib3R0b209Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ2VsbFJlbmRlcmVyQ2xhc3M9Ci1HdGtDZWxsUmVuZGVyZXJDbGFzc19yZW5kZXI9Y2FzdD0odm9pZCgqKSgpKQotR3RrQ2VsbFJlbmRlcmVyQ2xhc3NfZ2V0X3NpemU9Y2FzdD0odm9pZCgqKSgpKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nPQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfY29sb3JzZWw9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ19jYW5jZWxfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfaGVscF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm89Ci1HdGtDb21ib19lbnRyeT1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0NvbWJvX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbj0KLUd0a0ZpbGVTZWxlY3Rpb25fZGlyX2xpc3Q9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVfbGlzdD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fc2VsZWN0aW9uX2VudHJ5PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9zZWxlY3Rpb25fdGV4dD1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fbWFpbl92Ym94PWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9va19idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2NhbmNlbF9idXR0b249Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hlbHBfYnV0dG9uPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X3B1bGxkb3duPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9oaXN0b3J5X21lbnU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2hpc3RvcnlfbGlzdD1jYXN0PShHTGlzdCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZGlhbG9nPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfZW50cnk9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9maWxlPWNhc3Q9KGdjaGFyICopCi1HdGtGaWxlU2VsZWN0aW9uX2NtcGxfc3RhdGU9Y2FzdD0oZ3BvaW50ZXIpCi1HdGtGaWxlU2VsZWN0aW9uX2ZpbGVvcF9jX2Rpcj1jYXN0PShHdGtXaWRnZXQgKikKLUd0a0ZpbGVTZWxlY3Rpb25fZmlsZW9wX2RlbF9maWxlPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9maWxlb3BfcmVuX2ZpbGU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1HdGtGaWxlU2VsZWN0aW9uX2J1dHRvbl9hcmVhPWNhc3Q9KEd0a1dpZGdldCAqKQotR3RrRmlsZVNlbGVjdGlvbl9hY3Rpb25fYXJlYT1jYXN0PShHdGtXaWRnZXQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZD0KLUd0a0ZpeGVkX2NoaWxkcmVuPWNhc3Q9KEdMaXN0ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrUmVxdWlzaXRpb249Ci1HdGtSZXF1aXNpdGlvbl93aWR0aD0KLUd0a1JlcXVpc2l0aW9uX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhPQotR3RrU2VsZWN0aW9uRGF0YV9zZWxlY3Rpb249Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtTZWxlY3Rpb25EYXRhX3R5cGU9Y2FzdD0oR2RrQXRvbSkKLUd0a1NlbGVjdGlvbkRhdGFfZm9ybWF0PWNhc3Q9KGdpbnQpCi1HdGtTZWxlY3Rpb25EYXRhX2RhdGE9Y2FzdD0oZ3VjaGFyICopCi1HdGtTZWxlY3Rpb25EYXRhX2xlbmd0aD1jYXN0PShnaW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldEVudHJ5PQotR3RrVGFyZ2V0RW50cnlfdGFyZ2V0PWNhc3Q9KGdjaGFyICopCi1HdGtUYXJnZXRFbnRyeV9mbGFncz1jYXN0PShndWludCkKLUd0a1RhcmdldEVudHJ5X2luZm89Y2FzdD0oZ3VpbnQpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcj0KLUd0a1RhcmdldFBhaXJfdGFyZ2V0PWNhc3Q9KEdka0F0b20pCi1HdGtUYXJnZXRQYWlyX2ZsYWdzPWNhc3Q9KGd1aW50KQotR3RrVGFyZ2V0UGFpcl9pbmZvPWNhc3Q9KGd1aW50KQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzPQotR3RrV2lkZ2V0Q2xhc3NfYWN0aXZhdGVfc2lnbmFsPQotR3RrV2lkZ2V0Q2xhc3Nfc2V0X3Njcm9sbF9hZGp1c3RtZW50c19zaWduYWw9Ci1HdGtXaWRnZXRDbGFzc19kaXNwYXRjaF9jaGlsZF9wcm9wZXJ0aWVzX2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvdz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaG93X2FsbD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19oaWRlPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2hpZGVfYWxsPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX21hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc191bm1hcD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19yZWFsaXplPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3VucmVhbGl6ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zaXplX3JlcXVlc3Q9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2l6ZV9hbGxvY2F0ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zdGF0ZV9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX3BhcmVudF9zZXQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfaGllcmFyY2h5X2NoYW5nZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc3R5bGVfc2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RpcmVjdGlvbl9jaGFuZ2VkPWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2dyYWJfbm90aWZ5PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2NoaWxkX25vdGlmeT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19tbmVtb25pY19hY3RpdmF0ZT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZ3JhYl9mb2N1cz1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1cz1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2J1dHRvbl9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfYnV0dG9uX3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Njcm9sbF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbW90aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZGVsZXRlX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kZXN0cm95X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2tleV9wcmVzc19ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfa2V5X3JlbGVhc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2VudGVyX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfbGVhdmVfbm90aWZ5X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19jb25maWd1cmVfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX2ZvY3VzX2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19mb2N1c19vdXRfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX21hcF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfdW5tYXBfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3Byb3BlcnR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2NsZWFyX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVxdWVzdF9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcHJveGltaXR5X2luX2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19wcm94aW1pdHlfb3V0X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc192aXNpYmlsaXR5X25vdGlmeV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfY2xpZW50X2V2ZW50PWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19ub19leHBvc2VfZXZlbnQ9Y2FzdD0oZ2Jvb2xlYW4oKikoKSkKLUd0a1dpZGdldENsYXNzX3dpbmRvd19zdGF0ZV9ldmVudD1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2VsZWN0aW9uX2dldD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zZWxlY3Rpb25fcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19iZWdpbj1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2VuZD1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfZ2V0PWNhc3Q9KHZvaWQoKikoKSkKLUd0a1dpZGdldENsYXNzX2RyYWdfZGF0YV9kZWxldGU9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19sZWF2ZT1jYXN0PSh2b2lkKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX21vdGlvbj1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfZHJhZ19kcm9wPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19kcmFnX2RhdGFfcmVjZWl2ZWQ9Y2FzdD0odm9pZCgqKSgpKQotR3RrV2lkZ2V0Q2xhc3NfcG9wdXBfbWVudT1jYXN0PShnYm9vbGVhbigqKSgpKQotR3RrV2lkZ2V0Q2xhc3Nfc2hvd19oZWxwPWNhc3Q9KGdib29sZWFuKCopKCkpCi1HdGtXaWRnZXRDbGFzc19nZXRfYWNjZXNzaWJsZT1jYXN0PShBdGtPYmplY3QqKCopKCkpCi1HdGtXaWRnZXRDbGFzc19zY3JlZW5fY2hhbmdlZD1jYXN0PSh2b2lkKCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfT1M9Ci1PU19DYWxsPQotT1NfQ2FsbF8wPQotT1NfQ2FsbF8xPQotT1NfQ2FsbF8yPQotT1NfQ2FsbF8zPQotCi1PU19HREtfRVZFTlRfVFlQRT0KLU9TX0dES19FVkVOVF9UWVBFXzA9Y2FzdD0oR2RrRXZlbnQgKikKLQotT1NfR0RLX0VWRU5UX1dJTkRPVz0KLU9TX0dES19FVkVOVF9XSU5ET1dfMD1jYXN0PShHZGtFdmVudEFueSAqKQotCi1PU19HREtfV0lORE9XSU5HX1gxMT1mbGFncz1ub19nZW4KLQotT1NfR0ludGVyZmFjZUluZm9fc2l6ZW9mPQotCi1PU19HUG9sbEZEX3NpemVvZj0KLQotT1NfR1RLX0FDQ0VMX0xBQkVMX0dFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfR0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLQotT1NfR1RLX0FDQ0VMX0xBQkVMX1NFVF9BQ0NFTF9TVFJJTkc9Ci1PU19HVEtfQUNDRUxfTEFCRUxfU0VUX0FDQ0VMX1NUUklOR18wPWNhc3Q9KEd0a0FjY2VsTGFiZWwgKikKLU9TX0dUS19BQ0NFTF9MQUJFTF9TRVRfQUNDRUxfU1RSSU5HXzE9Y2FzdD0oZ2NoYXIgKikKLQotT1NfR1RLX0VOVFJZX0lNX0NPTlRFWFQ9Ci1PU19HVEtfRU5UUllfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUj0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfSFNDUk9MTEJBUl8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX0dUS19TQ1JPTExFRF9XSU5ET1dfU0NST0xMQkFSX1NQQUNJTkc9Ci1PU19HVEtfU0NST0xMRURfV0lORE9XX1NDUk9MTEJBUl9TUEFDSU5HXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSPQotT1NfR1RLX1NDUk9MTEVEX1dJTkRPV19WU0NST0xMQkFSXzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLQotT1NfR1RLX1RFWFRWSUVXX0lNX0NPTlRFWFQ9Ci1PU19HVEtfVEVYVFZJRVdfSU1fQ09OVEVYVF8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX0dUS19UT09MVElQU19TRVRfQUNUSVZFPQotT1NfR1RLX1RPT0xUSVBTX1NFVF9BQ1RJVkVfMD1jYXN0PShHdGtUb29sdGlwcyAqKQotT1NfR1RLX1RPT0xUSVBTX1NFVF9BQ1RJVkVfMT1jYXN0PUd0a1Rvb2x0aXBzRGF0YSAqCi0KLU9TX0dUS19UT09MVElQU19USVBfV0lORE9XPQotT1NfR1RLX1RPT0xUSVBTX1RJUF9XSU5ET1dfMD1jYXN0PShHdGtUb29sdGlwcyAqKQotCi1PU19HVEtfV0lER0VUX0hFSUdIVD0KLU9TX0dUS19XSURHRVRfSEVJR0hUXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX0dUS19XSURHRVRfUkVRVUlTSVRJT05fSEVJR0hUPQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9IRUlHSFRfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9SRVFVSVNJVElPTl9XSURUSD0KLU9TX0dUS19XSURHRVRfUkVRVUlTSVRJT05fV0lEVEhfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9TRVRfSEVJR0hUPQotT1NfR1RLX1dJREdFVF9TRVRfSEVJR0hUXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19HVEtfV0lER0VUX1NFVF9IRUlHSFRfMT0KLQotT1NfR1RLX1dJREdFVF9TRVRfV0lEVEg9Ci1PU19HVEtfV0lER0VUX1NFVF9XSURUSF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfR1RLX1dJREdFVF9TRVRfV0lEVEhfMT0KLQotT1NfR1RLX1dJREdFVF9TRVRfWD0KLU9TX0dUS19XSURHRVRfU0VUX1hfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX0dUS19XSURHRVRfU0VUX1hfMT0KLQotT1NfR1RLX1dJREdFVF9TRVRfWT0KLU9TX0dUS19XSURHRVRfU0VUX1lfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX0dUS19XSURHRVRfU0VUX1lfMT0KLQotT1NfR1RLX1dJREdFVF9XSURUSD0KLU9TX0dUS19XSURHRVRfV0lEVEhfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9XSU5ET1c9Ci1PU19HVEtfV0lER0VUX1dJTkRPV18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19HVEtfV0lER0VUX1g9Ci1PU19HVEtfV0lER0VUX1hfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfR1RLX1dJREdFVF9ZPQotT1NfR1RLX1dJREdFVF9ZXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX0dUeXBlSW5mb19zaXplb2Y9Ci0KLU9TX0dUeXBlUXVlcnlfc2l6ZW9mPQotCi1PU19HZGtDb2xvcl9zaXplb2Y9Ci0KLU9TX0dka0RyYWdDb250ZXh0X3NpemVvZj0KLQotT1NfR2RrRXZlbnRBbnlfc2l6ZW9mPQotCi1PU19HZGtFdmVudEJ1dHRvbl9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50Q3Jvc3Npbmdfc2l6ZW9mPQotCi1PU19HZGtFdmVudEV4cG9zZV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50Rm9jdXNfc2l6ZW9mPQotCi1PU19HZGtFdmVudEtleV9zaXplb2Y9Ci0KLU9TX0dka0V2ZW50TW90aW9uX3NpemVvZj0KLQotT1NfR2RrRXZlbnRTY3JvbGxfc2l6ZW9mPQotCi1PU19HZGtFdmVudFZpc2liaWxpdHlfc2l6ZW9mPQotCi1PU19HZGtFdmVudFdpbmRvd1N0YXRlX3NpemVvZj0KLQotT1NfR2RrRXZlbnRfc2l6ZW9mPQotCi1PU19HZGtHQ1ZhbHVlc19zaXplb2Y9Ci0KLU9TX0dka0dlb21ldHJ5X3NpemVvZj0KLQotT1NfR2RrSW1hZ2Vfc2l6ZW9mPQotCi1PU19HZGtSZWN0YW5nbGVfc2l6ZW9mPQotCi1PU19HZGtWaXN1YWxfc2l6ZW9mPQotCi1PU19HZGtXaW5kb3dBdHRyX3NpemVvZj0KLQotT1NfR3RrQWRqdXN0bWVudF9zaXplb2Y9Ci0KLU9TX0d0a0FsbG9jYXRpb25fc2l6ZW9mPQotCi1PU19HdGtCb3JkZXJfc2l6ZW9mPQotCi1PU19HdGtDZWxsUmVuZGVyZXJQaXhidWZDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0NlbGxSZW5kZXJlclBpeGJ1Zl9zaXplb2Y9Ci0KLU9TX0d0a0NlbGxSZW5kZXJlclRleHRDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0NlbGxSZW5kZXJlclRleHRfc2l6ZW9mPQotCi1PU19HdGtDZWxsUmVuZGVyZXJUb2dnbGVDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0NlbGxSZW5kZXJlclRvZ2dsZV9zaXplb2Y9Ci0KLU9TX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nX3NpemVvZj0KLQotT1NfR3RrQ29tYm9fc2l6ZW9mPQotCi1PU19HdGtGaWxlU2VsZWN0aW9uX3NpemVvZj0KLQotT1NfR3RrRml4ZWRDbGFzc19zaXplb2Y9Ci0KLU9TX0d0a0ZpeGVkX3NpemVvZj0KLQotT1NfR3RrUmVxdWlzaXRpb25fc2l6ZW9mPQotCi1PU19HdGtTZWxlY3Rpb25EYXRhX3NpemVvZj0KLQotT1NfR3RrVGFyZ2V0RW50cnlfc2l6ZW9mPQotCi1PU19HdGtUYXJnZXRQYWlyX3NpemVvZj0KLQotT1NfR3RrVGV4dEl0ZXJfc2l6ZW9mPQotCi1PU19HdGtUcmVlSXRlcl9zaXplb2Y9Ci0KLU9TX1BhbmdvQXR0cmlidXRlX3NpemVvZj0KLQotT1NfUGFuZ29JdGVtX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRMaW5lX3NpemVvZj0KLQotT1NfUGFuZ29MYXlvdXRSdW5fc2l6ZW9mPQotCi1PU19QYW5nb0xvZ0F0dHJfc2l6ZW9mPQotCi1PU19QYW5nb1JlY3RhbmdsZV9zaXplb2Y9Ci0KLU9TX1hBbnlFdmVudF9zaXplb2Y9Ci0KLU9TX1hCdXR0b25FdmVudF9zaXplb2Y9Ci0KLU9TX1hDbGllbnRNZXNzYWdlRXZlbnRfc2l6ZW9mPQotCi1PU19YQ3Jvc3NpbmdFdmVudF9zaXplb2Y9Ci0KLU9TX1hFdmVudF9zaXplb2Y9Ci0KLU9TX1hFeHBvc2VFdmVudF9zaXplb2Y9Ci0KLU9TX1hGb2N1c0NoYW5nZUV2ZW50X3NpemVvZj0KLQotT1NfWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3NpemVvZj0KLQotT1NfWFZpc2liaWxpdHlFdmVudF9zaXplb2Y9Ci0KLU9TX1hXaW5kb3dDaGFuZ2VzX3NpemVvZj0KLQotT1NfWF9FVkVOVF9UWVBFPQotT1NfWF9FVkVOVF9UWVBFXzA9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX1hfRVZFTlRfV0lORE9XPQotT1NfWF9FVkVOVF9XSU5ET1dfMD1jYXN0PShYQW55RXZlbnQgKikKLQotT1NfX0NhbGw9Ci1PU19fQ2FsbF8wPQotT1NfX0NhbGxfMT0KLU9TX19DYWxsXzI9Ci0KLU9TX19GY0NvbmZpZ0FwcEZvbnRBZGRGaWxlPWZsYWdzPWR5bmFtaWMKLU9TX19GY0NvbmZpZ0FwcEZvbnRBZGRGaWxlXzA9Ci1PU19fRmNDb25maWdBcHBGb250QWRkRmlsZV8xPQotCi1PU19fR0RLX0RJU1BMQVk9Ci0KLU9TX19HREtfUElYTUFQX1hJRD0KLU9TX19HREtfUElYTUFQX1hJRF8wPWNhc3Q9R2RrUGl4bWFwICoKLQotT1NfX0dES19ST09UX1BBUkVOVD0KLQotT1NfX0dES19UWVBFX0NPTE9SPWZsYWdzPWNvbnN0Ci0KLU9TX19HREtfVFlQRV9QSVhCVUY9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19JU19CVVRUT049Ci1PU19fR1RLX0lTX0JVVFRPTl8wPQotCi1PU19fR1RLX0lTX0NFTExfUkVOREVSRVJfUElYQlVGPQotT1NfX0dUS19JU19DRUxMX1JFTkRFUkVSX1BJWEJVRl8wPQotCi1PU19fR1RLX0lTX0NFTExfUkVOREVSRVJfVEVYVD0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9URVhUXzA9Ci0KLU9TX19HVEtfSVNfQ0VMTF9SRU5ERVJFUl9UT0dHTEU9Ci1PU19fR1RLX0lTX0NFTExfUkVOREVSRVJfVE9HR0xFXzA9Ci0KLU9TX19HVEtfSVNfQ09OVEFJTkVSPQotT1NfX0dUS19JU19DT05UQUlORVJfMD0KLQotT1NfX0dUS19JU19JTUFHRV9NRU5VX0lURU09Ci1PU19fR1RLX0lTX0lNQUdFX01FTlVfSVRFTV8wPQotCi1PU19fR1RLX0lTX1BMVUc9Ci1PU19fR1RLX0lTX1BMVUdfMD0KLQotT1NfX0dUS19JU19XSU5ET1c9Ci1PU19fR1RLX0lTX1dJTkRPV18wPQotCi1PU19fR1RLX1NUT0NLX0NBTkNFTD1mbGFncz1jb25zdAotCi1PU19fR1RLX1NUT0NLX09LPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfVFlQRV9DRUxMX1JFTkRFUkVSX1BJWEJVRj1mbGFncz1jb25zdAotCi1PU19fR1RLX1RZUEVfQ0VMTF9SRU5ERVJFUl9URVhUPWZsYWdzPWNvbnN0Ci0KLU9TX19HVEtfVFlQRV9DRUxMX1JFTkRFUkVSX1RPR0dMRT1mbGFncz1jb25zdAotCi1PU19fR1RLX1RZUEVfRklYRUQ9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19UWVBFX01FTlU9ZmxhZ3M9Y29uc3QKLQotT1NfX0dUS19UWVBFX1dJREdFVD1mbGFncz1jb25zdAotCi1PU19fR1RLX1dJREdFVF9GTEFHUz0KLU9TX19HVEtfV0lER0VUX0ZMQUdTXzA9Ci0KLU9TX19HVEtfV0lER0VUX0hBU19ERUZBVUxUPQotT1NfX0dUS19XSURHRVRfSEFTX0RFRkFVTFRfMD0KLQotT1NfX0dUS19XSURHRVRfSEFTX0ZPQ1VTPQotT1NfX0dUS19XSURHRVRfSEFTX0ZPQ1VTXzA9Ci0KLU9TX19HVEtfV0lER0VUX0lTX1NFTlNJVElWRT0KLU9TX19HVEtfV0lER0VUX0lTX1NFTlNJVElWRV8wPQotCi1PU19fR1RLX1dJREdFVF9NQVBQRUQ9Ci1PU19fR1RLX1dJREdFVF9NQVBQRURfMD0KLQotT1NfX0dUS19XSURHRVRfU0VOU0lUSVZFPQotT1NfX0dUS19XSURHRVRfU0VOU0lUSVZFXzA9Ci0KLU9TX19HVEtfV0lER0VUX1NFVF9GTEFHUz0KLU9TX19HVEtfV0lER0VUX1NFVF9GTEFHU18wPQotT1NfX0dUS19XSURHRVRfU0VUX0ZMQUdTXzE9Ci0KLU9TX19HVEtfV0lER0VUX1NUQVRFPQotT1NfX0dUS19XSURHRVRfU1RBVEVfMD0KLQotT1NfX0dUS19XSURHRVRfVU5TRVRfRkxBR1M9Ci1PU19fR1RLX1dJREdFVF9VTlNFVF9GTEFHU18wPQotT1NfX0dUS19XSURHRVRfVU5TRVRfRkxBR1NfMT0KLQotT1NfX0dUS19XSURHRVRfVklTSUJMRT0KLU9TX19HVEtfV0lER0VUX1ZJU0lCTEVfMD0KLQotT1NfX0dfT0JKRUNUX0NMQVNTPQotT1NfX0dfT0JKRUNUX0NMQVNTXzA9Ci0KLU9TX19HX09CSkVDVF9HRVRfQ0xBU1M9Ci1PU19fR19PQkpFQ1RfR0VUX0NMQVNTXzA9Ci0KLU9TX19HX09CSkVDVF9UWVBFPQotT1NfX0dfT0JKRUNUX1RZUEVfMD0KLQotT1NfX0dfT0JKRUNUX1RZUEVfTkFNRT0KLU9TX19HX09CSkVDVF9UWVBFX05BTUVfMD0KLQotT1NfX0dfVFlQRV9CT09MRUFOPWZsYWdzPWNvbnN0Ci0KLU9TX19HX1RZUEVfSU5UPWZsYWdzPWNvbnN0Ci0KLU9TX19HX1RZUEVfU1RSSU5HPWZsYWdzPWNvbnN0Ci0KLU9TX19QQU5HT19QSVhFTFM9Ci1PU19fUEFOR09fUElYRUxTXzA9Ci0KLU9TX19QQU5HT19UWVBFX0ZPTlRfREVTQ1JJUFRJT049ZmxhZ3M9Y29uc3QKLQotT1NfX1hDaGVja0lmRXZlbnQ9Ci1PU19fWENoZWNrSWZFdmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hlY2tJZkV2ZW50XzE9Y2FzdD1YRXZlbnQgKgotT1NfX1hDaGVja0lmRXZlbnRfMj1jYXN0PShCb29sICgqKSgpKQotT1NfX1hDaGVja0lmRXZlbnRfMz1jYXN0PShYUG9pbnRlcikKLQotT1NfX1hDaGVja01hc2tFdmVudD0KLU9TX19YQ2hlY2tNYXNrRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrTWFza0V2ZW50XzE9Y2FzdD0obG9uZykKLU9TX19YQ2hlY2tNYXNrRXZlbnRfMj1jYXN0PShYRXZlbnQgKikKLQotT1NfX1hDaGVja1dpbmRvd0V2ZW50PQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja1dpbmRvd0V2ZW50XzE9Y2FzdD1XaW5kb3cKLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8yPWNhc3Q9KGxvbmcpCi1PU19fWENoZWNrV2luZG93RXZlbnRfMz1jYXN0PShYRXZlbnQgKikKLQotT1NfX1hEZWZhdWx0Um9vdFdpbmRvdz0KLU9TX19YRGVmYXVsdFJvb3RXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotCi1PU19fWERlZmF1bHRTY3JlZW49Ci1PU19fWERlZmF1bHRTY3JlZW5fMD1jYXN0PURpc3BsYXkgKgotCi1PU19fWEZsdXNoPQotT1NfX1hGbHVzaF8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hGcmVlPQotT1NfX1hGcmVlXzA9Y2FzdD12b2lkICoKLQotT1NfX1hHZXRTZWxlY3Rpb25Pd25lcj0KLU9TX19YR2V0U2VsZWN0aW9uT3duZXJfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldFNlbGVjdGlvbk93bmVyXzE9Y2FzdD0oQXRvbSkKLQotT1NfX1hJbnRlcm5BdG9tPQotT1NfX1hJbnRlcm5BdG9tXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YSW50ZXJuQXRvbV8xPWNhc3Q9Y2hhciAqCi1PU19fWEludGVybkF0b21fMj1jYXN0PUJvb2wKLQotT1NfX1hLZXlzeW1Ub0tleWNvZGU9Ci1PU19fWEtleXN5bVRvS2V5Y29kZV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEtleXN5bVRvS2V5Y29kZV8xPWNhc3Q9S2V5U3ltCi0KLU9TX19YTGlzdFByb3BlcnRpZXM9Ci1PU19fWExpc3RQcm9wZXJ0aWVzXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YTGlzdFByb3BlcnRpZXNfMT1jYXN0PVdpbmRvdwotT1NfX1hMaXN0UHJvcGVydGllc18yPWNhc3Q9aW50ICoKLQotT1NfX1hRdWVyeVRyZWU9Ci1PU19fWFF1ZXJ5VHJlZV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFF1ZXJ5VHJlZV8xPWNhc3Q9V2luZG93Ci1PU19fWFF1ZXJ5VHJlZV8yPWNhc3Q9V2luZG93ICoKLU9TX19YUXVlcnlUcmVlXzM9Y2FzdD1XaW5kb3cgKgotT1NfX1hRdWVyeVRyZWVfND1jYXN0PVdpbmRvdyAqKgotT1NfX1hRdWVyeVRyZWVfNT1jYXN0PXVuc2lnbmVkIGludCAqCi0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvdz0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMj0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd18zPQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzQ9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19YUmVuZGVyQ29tcG9zaXRlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyQ29tcG9zaXRlXzA9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMj0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzM9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV80PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzY9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV83PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfOD0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzk9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMD0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzExPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTI9Ci0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMD0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8xPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzI9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMz0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV80PWZsYWdzPW5vX291dAotCi1PU19fWFJlbmRlckZpbmRTdGFuZGFyZEZvcm1hdD1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZpbmRTdGFuZGFyZEZvcm1hdF8wPQotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXRfMT0KLQotT1NfX1hSZW5kZXJGaW5kVmlzdWFsRm9ybWF0PWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdF8wPQotT1NfX1hSZW5kZXJGaW5kVmlzdWFsRm9ybWF0XzE9Ci0KLU9TX19YUmVuZGVyRnJlZVBpY3R1cmU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGcmVlUGljdHVyZV8wPQotT1NfX1hSZW5kZXJGcmVlUGljdHVyZV8xPQotCi1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyUXVlcnlFeHRlbnNpb25fMD0KLU9TX19YUmVuZGVyUXVlcnlFeHRlbnNpb25fMT0KLU9TX19YUmVuZGVyUXVlcnlFeHRlbnNpb25fMj0KLQotT1NfX1hSZW5kZXJRdWVyeVZlcnNpb249ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJRdWVyeVZlcnNpb25fMD0KLU9TX19YUmVuZGVyUXVlcnlWZXJzaW9uXzE9Ci1PU19fWFJlbmRlclF1ZXJ5VmVyc2lvbl8yPQotCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlcz1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMT0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzI9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18zPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfND0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzU9Ci0KLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMD0KLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8xPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzI9Ci0KLU9TX19YU2VuZEV2ZW50PQotT1NfX1hTZW5kRXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNlbmRFdmVudF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YU2VuZEV2ZW50XzI9Ci1PU19fWFNlbmRFdmVudF8zPQotT1NfX1hTZW5kRXZlbnRfND1jYXN0PShYRXZlbnQgKikKLQotT1NfX1hTZXRFcnJvckhhbmRsZXI9Ci1PU19fWFNldEVycm9ySGFuZGxlcl8wPWNhc3Q9KFhFcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0SU9FcnJvckhhbmRsZXI9Ci1PU19fWFNldElPRXJyb3JIYW5kbGVyXzA9Y2FzdD0oWElPRXJyb3JIYW5kbGVyKQotCi1PU19fWFNldElucHV0Rm9jdXM9Ci1PU19fWFNldElucHV0Rm9jdXNfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZXRJbnB1dEZvY3VzXzE9Y2FzdD1XaW5kb3cKLU9TX19YU2V0SW5wdXRGb2N1c18yPQotT1NfX1hTZXRJbnB1dEZvY3VzXzM9Ci0KLU9TX19YU3luY2hyb25pemU9Ci1PU19fWFN5bmNocm9uaXplXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTeW5jaHJvbml6ZV8xPQotCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnQ9Ci1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzE9Ci1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMj1jYXN0PUJvb2wKLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8zPWNhc3Q9KHVuc2lnbmVkIGxvbmcpCi0KLU9TX19YVGVzdEZha2VLZXlFdmVudD0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMT0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzM9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudD0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8yPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzM9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfND1jYXN0PXVuc2lnbmVkIGxvbmcKLQotT1NfX1hXYXJwUG9pbnRlcj0KLU9TX19YV2FycFBvaW50ZXJfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hXYXJwUG9pbnRlcl8xPWNhc3Q9V2luZG93Ci1PU19fWFdhcnBQb2ludGVyXzI9Y2FzdD1XaW5kb3cKLU9TX19YV2FycFBvaW50ZXJfMz0KLU9TX19YV2FycFBvaW50ZXJfND0KLU9TX19YV2FycFBvaW50ZXJfNT0KLU9TX19YV2FycFBvaW50ZXJfNj0KLU9TX19YV2FycFBvaW50ZXJfNz0KLU9TX19YV2FycFBvaW50ZXJfOD0KLQotT1NfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcD1mbGFncz1keW5hbWljCi1PU19fYXRrX29iamVjdF9hZGRfcmVsYXRpb25zaGlwXzA9Y2FzdD0oQXRrT2JqZWN0ICopCi1PU19fYXRrX29iamVjdF9hZGRfcmVsYXRpb25zaGlwXzE9Y2FzdD0oQXRrUmVsYXRpb25UeXBlKQotT1NfX2F0a19vYmplY3RfYWRkX3JlbGF0aW9uc2hpcF8yPWNhc3Q9KEF0a09iamVjdCAqKQotCi1PU19fY2FsbD0KLU9TX19jYWxsXzA9Ci1PU19fY2FsbF8xPQotT1NfX2NhbGxfMj0KLU9TX19jYWxsXzM9Ci1PU19fY2FsbF80PQotT1NfX2NhbGxfNT0KLU9TX19jYWxsXzY9Ci1PU19fY2FsbF83PQotCi1PU19fZGxjbG9zZT0KLU9TX19kbGNsb3NlXzA9Y2FzdD0odm9pZCAqKQotCi1PU19fZGxvcGVuPQotT1NfX2Rsb3Blbl8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19kbG9wZW5fMT0KLQotT1NfX2Rsc3ltPQotT1NfX2Rsc3ltXzA9Y2FzdD0odm9pZCAqKQotT1NfX2Rsc3ltXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19fZ19jY2xvc3VyZV9uZXc9Ci1PU19fZ19jY2xvc3VyZV9uZXdfMD1jYXN0PShHQ2FsbGJhY2spCi1PU19fZ19jY2xvc3VyZV9uZXdfMT1jYXN0PShncG9pbnRlcikKLU9TX19nX2NjbG9zdXJlX25ld18yPWNhc3Q9KEdDbG9zdXJlTm90aWZ5KQotCi1PU19fZ19jbG9zdXJlX3JlZj0KLU9TX19nX2Nsb3N1cmVfcmVmXzA9Y2FzdD0oR0Nsb3N1cmUgKikKLQotT1NfX2dfY2xvc3VyZV91bnJlZj0KLU9TX19nX2Nsb3N1cmVfdW5yZWZfMD1jYXN0PShHQ2xvc3VyZSAqKQotCi1PU19fZ19maWxlbmFtZV9mcm9tX3VyaT0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXJpXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91cmlfMT1jYXN0PShjaGFyICoqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91cmlfMj1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOD0KLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfMT1jYXN0PShnc3NpemUpCi1PU19fZ19maWxlbmFtZV9mcm9tX3V0ZjhfMj1jYXN0PShnc2l6ZSAqKQotT1NfX2dfZmlsZW5hbWVfZnJvbV91dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2ZpbGVuYW1lX2Zyb21fdXRmOF80PWNhc3Q9KEdFcnJvciAqKikKLQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpPQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfX2dfZmlsZW5hbWVfdG9fdXJpXzI9Y2FzdD0oR0Vycm9yICoqKQotCi1PU19fZ19maWxlbmFtZV90b191dGY4PQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19maWxlbmFtZV90b191dGY4XzE9Y2FzdD0oZ3NzaXplKQotT1NfX2dfZmlsZW5hbWVfdG9fdXRmOF8yPWNhc3Q9KGdzaXplICopCi1PU19fZ19maWxlbmFtZV90b191dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2ZpbGVuYW1lX3RvX3V0ZjhfND1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2ZyZWU9Ci1PU19fZ19mcmVlXzA9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX2lkbGVfYWRkPQotT1NfX2dfaWRsZV9hZGRfMD1jYXN0PUdTb3VyY2VGdW5jCi1PU19fZ19pZGxlX2FkZF8xPWNhc3Q9Z3BvaW50ZXIKLQotT1NfX2dfbGlzdF9hcHBlbmQ9Ci1PU19fZ19saXN0X2FwcGVuZF8wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X2FwcGVuZF8xPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19saXN0X2RhdGE9Ci1PU19fZ19saXN0X2RhdGFfMD1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X2ZyZWU9Ci1PU19fZ19saXN0X2ZyZWVfMD1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19saXN0X2ZyZWVfMT0KLU9TX19nX2xpc3RfZnJlZV8xXzA9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9sZW5ndGg9Ci1PU19fZ19saXN0X2xlbmd0aF8wPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3RfbmV4dD0KLU9TX19nX2xpc3RfbmV4dF8wPQotCi1PU19fZ19saXN0X250aD0KLU9TX19nX2xpc3RfbnRoXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3RfbnRoXzE9Y2FzdD0oZ3VpbnQpCi0KLU9TX19nX2xpc3RfbnRoX2RhdGE9Ci1PU19fZ19saXN0X250aF9kYXRhXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3RfbnRoX2RhdGFfMT1jYXN0PShndWludCkKLQotT1NfX2dfbGlzdF9wcmVwZW5kPQotT1NfX2dfbGlzdF9wcmVwZW5kXzA9Y2FzdD0oR0xpc3QgKikKLU9TX19nX2xpc3RfcHJlcGVuZF8xPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19saXN0X3ByZXZpb3VzPQotT1NfX2dfbGlzdF9wcmV2aW91c18wPQotCi1PU19fZ19saXN0X3JlbW92ZV9saW5rPQotT1NfX2dfbGlzdF9yZW1vdmVfbGlua18wPWNhc3Q9KEdMaXN0ICopCi1PU19fZ19saXN0X3JlbW92ZV9saW5rXzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9yZXZlcnNlPQotT1NfX2dfbGlzdF9yZXZlcnNlXzA9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2dfbGlzdF9zZXRfbmV4dD0KLU9TX19nX2xpc3Rfc2V0X25leHRfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9zZXRfbmV4dF8xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19nX2xpc3Rfc2V0X3ByZXZpb3VzPQotT1NfX2dfbGlzdF9zZXRfcHJldmlvdXNfMD1jYXN0PShHTGlzdCAqKQotT1NfX2dfbGlzdF9zZXRfcHJldmlvdXNfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ19sb2NhbGVfZnJvbV91dGY4PQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ19sb2NhbGVfZnJvbV91dGY4XzE9Y2FzdD0oZ3NzaXplKQotT1NfX2dfbG9jYWxlX2Zyb21fdXRmOF8yPWNhc3Q9KGdzaXplICopCi1PU19fZ19sb2NhbGVfZnJvbV91dGY4XzM9Y2FzdD0oZ3NpemUgKikKLU9TX19nX2xvY2FsZV9mcm9tX3V0ZjhfND1jYXN0PShHRXJyb3IgKiopCi0KLU9TX19nX2xvY2FsZV90b191dGY4PQotT1NfX2dfbG9jYWxlX3RvX3V0ZjhfMD1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfbG9jYWxlX3RvX3V0ZjhfMT1jYXN0PShnc3NpemUpCi1PU19fZ19sb2NhbGVfdG9fdXRmOF8yPWNhc3Q9KGdzaXplICopCi1PU19fZ19sb2NhbGVfdG9fdXRmOF8zPWNhc3Q9KGdzaXplICopCi1PU19fZ19sb2NhbGVfdG9fdXRmOF80PWNhc3Q9KEdFcnJvciAqKikKLQotT1NfX2dfbG9nX2RlZmF1bHRfaGFuZGxlcj0KLU9TX19nX2xvZ19kZWZhdWx0X2hhbmRsZXJfMD1jYXN0PShnY2hhciAqKQotT1NfX2dfbG9nX2RlZmF1bHRfaGFuZGxlcl8xPWNhc3Q9KEdMb2dMZXZlbEZsYWdzKQotT1NfX2dfbG9nX2RlZmF1bHRfaGFuZGxlcl8yPWNhc3Q9KGdjaGFyICopCi1PU19fZ19sb2dfZGVmYXVsdF9oYW5kbGVyXzM9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX2xvZ19yZW1vdmVfaGFuZGxlcj0KLU9TX19nX2xvZ19yZW1vdmVfaGFuZGxlcl8wPWNhc3Q9KGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfX2dfbG9nX3JlbW92ZV9oYW5kbGVyXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2dfbG9nX3NldF9oYW5kbGVyPQotT1NfX2dfbG9nX3NldF9oYW5kbGVyXzA9Y2FzdD0oZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ19sb2dfc2V0X2hhbmRsZXJfMT1jYXN0PShHTG9nTGV2ZWxGbGFncykKLU9TX19nX2xvZ19zZXRfaGFuZGxlcl8yPWNhc3Q9KEdMb2dGdW5jKQotT1NfX2dfbG9nX3NldF9oYW5kbGVyXzM9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX21haW5fY29udGV4dF9hY3F1aXJlPQotT1NfX2dfbWFpbl9jb250ZXh0X2FjcXVpcmVfMD1jYXN0PUdNYWluQ29udGV4dCAqCi0KLU9TX19nX21haW5fY29udGV4dF9jaGVjaz0KLU9TX19nX21haW5fY29udGV4dF9jaGVja18wPWNhc3Q9R01haW5Db250ZXh0ICoKLU9TX19nX21haW5fY29udGV4dF9jaGVja18xPQotT1NfX2dfbWFpbl9jb250ZXh0X2NoZWNrXzI9Y2FzdD1HUG9sbEZEICoKLU9TX19nX21haW5fY29udGV4dF9jaGVja18zPQotCi1PU19fZ19tYWluX2NvbnRleHRfZGVmYXVsdD0KLQotT1NfX2dfbWFpbl9jb250ZXh0X2dldF9wb2xsX2Z1bmM9Ci1PU19fZ19tYWluX2NvbnRleHRfZ2V0X3BvbGxfZnVuY18wPWNhc3Q9R01haW5Db250ZXh0ICoKLQotT1NfX2dfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbj0KLU9TX19nX21haW5fY29udGV4dF9pdGVyYXRpb25fMD1jYXN0PUdNYWluQ29udGV4dCAqCi1PU19fZ19tYWluX2NvbnRleHRfaXRlcmF0aW9uXzE9Ci0KLU9TX19nX21haW5fY29udGV4dF9wZW5kaW5nPQotT1NfX2dfbWFpbl9jb250ZXh0X3BlbmRpbmdfMD1jYXN0PUdNYWluQ29udGV4dCAqCi0KLU9TX19nX21haW5fY29udGV4dF9wcmVwYXJlPQotT1NfX2dfbWFpbl9jb250ZXh0X3ByZXBhcmVfMD1jYXN0PUdNYWluQ29udGV4dCAqCi1PU19fZ19tYWluX2NvbnRleHRfcHJlcGFyZV8xPQotCi1PU19fZ19tYWluX2NvbnRleHRfcXVlcnk9Ci1PU19fZ19tYWluX2NvbnRleHRfcXVlcnlfMD1jYXN0PUdNYWluQ29udGV4dCAqCi1PU19fZ19tYWluX2NvbnRleHRfcXVlcnlfMT0KLU9TX19nX21haW5fY29udGV4dF9xdWVyeV8yPQotT1NfX2dfbWFpbl9jb250ZXh0X3F1ZXJ5XzM9Y2FzdD1HUG9sbEZEICoKLU9TX19nX21haW5fY29udGV4dF9xdWVyeV80PQotCi1PU19fZ19tYWluX2NvbnRleHRfcmVsZWFzZT0KLU9TX19nX21haW5fY29udGV4dF9yZWxlYXNlXzA9Y2FzdD1HTWFpbkNvbnRleHQgKgotCi1PU19fZ19tYWxsb2M9Ci1PU19fZ19tYWxsb2NfMD1jYXN0PShndWxvbmcpCi0KLU9TX19nX29iamVjdF9nZXQ9Ci1PU19fZ19vYmplY3RfZ2V0XzA9Y2FzdD1HT2JqZWN0ICoKLU9TX19nX29iamVjdF9nZXRfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX19nX29iamVjdF9nZXRfMj0KLU9TX19nX29iamVjdF9nZXRfMz1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1zZW50aW5lbAotCi1PU19fZ19vYmplY3RfZ2V0X3FkYXRhPQotT1NfX2dfb2JqZWN0X2dldF9xZGF0YV8wPWNhc3Q9KEdPYmplY3QgKikKLU9TX19nX29iamVjdF9nZXRfcWRhdGFfMT1jYXN0PShHUXVhcmspCi0KLU9TX19nX29iamVjdF9uZXc9Ci1PU19fZ19vYmplY3RfbmV3XzA9Y2FzdD0oR1R5cGUpCi1PU19fZ19vYmplY3RfbmV3XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2dfb2JqZWN0X3JlZj0KLU9TX19nX29iamVjdF9yZWZfMD1jYXN0PShncG9pbnRlcikKLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCRklfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JGSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkZJXzM9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9c2VudGluZWwKLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JJSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQklJXzM9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9c2VudGluZWwKLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkpJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkpJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCSklfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JKSV8yPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkpJXzM9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9c2VudGluZWwKLQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJPQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzI9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMz1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1zZW50aW5lbAotCi1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWkk9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWklfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xb2JqZWN0XzFzZXRfX0lfM0JaSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFvYmplY3RfMXNldF9fSV8zQlpJXzI9Ci1PU19fMWdfMW9iamVjdF8xc2V0X19JXzNCWklfMz1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1zZW50aW5lbAotCi1PU19fZ19vYmplY3Rfc2V0X3FkYXRhPQotT1NfX2dfb2JqZWN0X3NldF9xZGF0YV8wPWNhc3Q9KEdPYmplY3QgKikKLU9TX19nX29iamVjdF9zZXRfcWRhdGFfMT1jYXN0PShHUXVhcmspCi1PU19fZ19vYmplY3Rfc2V0X3FkYXRhXzI9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX29iamVjdF91bnJlZj0KLU9TX19nX29iamVjdF91bnJlZl8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19xdWFya19mcm9tX3N0cmluZz0KLU9TX19nX3F1YXJrX2Zyb21fc3RyaW5nXzA9Y2FzdD1jb25zdCBnY2hhciAqLGZsYWdzPW5vX291dAotCi1PU19fZ19zZXRfcHJnbmFtZT0KLU9TX19nX3NldF9wcmduYW1lXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nX3NpZ25hbF9jb25uZWN0PQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9jb25uZWN0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ19zaWduYWxfY29ubmVjdF8yPWNhc3Q9KEdDYWxsYmFjaykKLU9TX19nX3NpZ25hbF9jb25uZWN0XzM9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2FmdGVyPQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXJfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2FmdGVyXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ19zaWduYWxfY29ubmVjdF9hZnRlcl8yPWNhc3Q9KEdDYWxsYmFjaykKLU9TX19nX3NpZ25hbF9jb25uZWN0X2FmdGVyXzM9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmU9Ci1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfMj1jYXN0PShHQ2xvc3VyZSAqKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV8zPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ19zaWduYWxfY29ubmVjdF9jbG9zdXJlX2J5X2lkPQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZF8xPWNhc3Q9KGd1aW50KQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZF8yPWNhc3Q9KEdRdWFyaykKLU9TX19nX3NpZ25hbF9jb25uZWN0X2Nsb3N1cmVfYnlfaWRfMz1jYXN0PShHQ2xvc3VyZSAqKQotT1NfX2dfc2lnbmFsX2Nvbm5lY3RfY2xvc3VyZV9ieV9pZF80PWNhc3Q9KGdib29sZWFuKQotCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0I9Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfMD1jYXN0PShncG9pbnRlcikKLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJPQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSV8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSV8yPQotCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJST0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklJXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JJSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopLGZsYWdzPW5vX291dAotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCSUlfMj0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQklJXzM9Ci0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8zQj0KLU9TX18xZ18xc2lnbmFsXzFlbWl0XzFieV8xbmFtZV9fSV8zQl8zQl8wPWNhc3Q9KGdwb2ludGVyKQotT1NfXzFnXzFzaWduYWxfMWVtaXRfMWJ5XzFuYW1lX19JXzNCXzNCXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci1PU19fMWdfMXNpZ25hbF8xZW1pdF8xYnlfMW5hbWVfX0lfM0JfM0JfMj0KLQotT1NfX2dfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdD0KLU9TX19nX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3RfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3RfMT1jYXN0PShndWxvbmcpCi0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkPQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Jsb2NrX21hdGNoZWRfMD1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzE9Y2FzdD0oR1NpZ25hbE1hdGNoVHlwZSkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzI9Y2FzdD0oZ3VpbnQpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF8zPWNhc3Q9KEdRdWFyaykKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzQ9Y2FzdD0oR0Nsb3N1cmUgKikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc19ibG9ja19tYXRjaGVkXzU9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfYmxvY2tfbWF0Y2hlZF82PWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkPQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF8wPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF8xPWNhc3Q9KEdTaWduYWxNYXRjaFR5cGUpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzI9Y2FzdD0oZ3VpbnQpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzM9Y2FzdD0oR1F1YXJrKQotT1NfX2dfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZF80PWNhc3Q9KEdDbG9zdXJlICopCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzU9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRjaGVkXzY9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWQ9Ci1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzE9Y2FzdD0oR1NpZ25hbE1hdGNoVHlwZSkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfMj1jYXN0PShndWludCkKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfMz1jYXN0PShHUXVhcmspCi1PU19fZ19zaWduYWxfaGFuZGxlcnNfdW5ibG9ja19tYXRjaGVkXzQ9Y2FzdD0oR0Nsb3N1cmUgKikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfNT1jYXN0PShncG9pbnRlcikKLU9TX19nX3NpZ25hbF9oYW5kbGVyc191bmJsb2NrX21hdGNoZWRfNj1jYXN0PShncG9pbnRlcikKLQotT1NfX2dfc2lnbmFsX2xvb2t1cD0KLU9TX19nX3NpZ25hbF9sb29rdXBfMD1jYXN0PWNvbnN0IGdjaGFyICosZmxhZ3M9bm9fb3V0Ci1PU19fZ19zaWduYWxfbG9va3VwXzE9Ci0KLU9TX19nX3NpZ25hbF9zdG9wX2VtaXNzaW9uX2J5X25hbWU9Ci1PU19fZ19zaWduYWxfc3RvcF9lbWlzc2lvbl9ieV9uYW1lXzA9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ19zaWduYWxfc3RvcF9lbWlzc2lvbl9ieV9uYW1lXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nX3NsaXN0X2RhdGE9Ci1PU19fZ19zbGlzdF9kYXRhXzA9Y2FzdD0oR1NMaXN0ICopCi0KLU9TX19nX3NsaXN0X2ZyZWU9Ci1PU19fZ19zbGlzdF9mcmVlXzA9Y2FzdD0oR1NMaXN0ICopCi0KLU9TX19nX3NsaXN0X2xlbmd0aD0KLU9TX19nX3NsaXN0X2xlbmd0aF8wPWNhc3Q9KEdTTGlzdCAqKQotCi1PU19fZ19zbGlzdF9uZXh0PQotT1NfX2dfc2xpc3RfbmV4dF8wPWNhc3Q9R1NMaXN0ICoKLQotT1NfX2dfc291cmNlX3JlbW92ZT0KLU9TX19nX3NvdXJjZV9yZW1vdmVfMD1jYXN0PWd1aW50Ci0KLU9TX19nX3N0cmZyZWV2PQotT1NfX2dfc3RyZnJlZXZfMD1jYXN0PShnY2hhciAqKikKLQotT1NfX2dfc3RydG9kPQotT1NfX2dfc3RydG9kXzA9Y2FzdD1jb25zdCBnY2hhciAqCi1PU19fZ19zdHJ0b2RfMT1jYXN0PWdjaGFyICoqCi0KLU9TX19nX3RocmVhZF9pbml0PQotT1NfX2dfdGhyZWFkX2luaXRfMD1jYXN0PUdUaHJlYWRGdW5jdGlvbnMgKgotCi1PU19fZ190aHJlYWRfc3VwcG9ydGVkPQotCi1PU19fZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljPQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18xPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpY18yPWNhc3Q9KGNvbnN0IEdJbnRlcmZhY2VJbmZvICopCi0KLU9TX19nX3R5cGVfY2xhc3NfcGVlaz0KLU9TX19nX3R5cGVfY2xhc3NfcGVla18wPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50PQotT1NfX2dfdHlwZV9jbGFzc19wZWVrX3BhcmVudF8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ190eXBlX2Zyb21fbmFtZT0KLU9TX19nX3R5cGVfZnJvbV9uYW1lXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2dfdHlwZV9pbnRlcmZhY2VfcGVla19wYXJlbnQ9Ci1PU19fZ190eXBlX2ludGVyZmFjZV9wZWVrX3BhcmVudF8wPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ190eXBlX2lzX2E9Ci1PU19fZ190eXBlX2lzX2FfMD1jYXN0PShHVHlwZSkKLU9TX19nX3R5cGVfaXNfYV8xPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX25hbWU9Ci1PU19fZ190eXBlX25hbWVfMD1jYXN0PShHVHlwZSkKLQotT1NfX2dfdHlwZV9wYXJlbnQ9Ci1PU19fZ190eXBlX3BhcmVudF8wPWNhc3Q9KEdUeXBlKQotCi1PU19fZ190eXBlX3F1ZXJ5PQotT1NfX2dfdHlwZV9xdWVyeV8wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9xdWVyeV8xPWNhc3Q9KEdUeXBlUXVlcnkgKikKLQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWM9Ci1PU19fZ190eXBlX3JlZ2lzdGVyX3N0YXRpY18wPWNhc3Q9KEdUeXBlKQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2dfdHlwZV9yZWdpc3Rlcl9zdGF0aWNfMj1jYXN0PShjb25zdCBHVHlwZUluZm8gKikKLU9TX19nX3R5cGVfcmVnaXN0ZXJfc3RhdGljXzM9Y2FzdD0oR1R5cGVGbGFncykKLQotT1NfX2dfdXRmMTZfdG9fdXRmOD0KLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMD1jYXN0PShjb25zdCBndW5pY2hhcjIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ191dGYxNl90b191dGY4XzE9Y2FzdD0oZ2xvbmcpCi1PU19fZ191dGYxNl90b191dGY4XzI9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX19nX3V0ZjE2X3RvX3V0ZjhfMz1jYXN0PShnbG9uZyAqKSxmbGFncz1jcml0aWNhbAotT1NfX2dfdXRmMTZfdG9fdXRmOF80PWNhc3Q9KEdFcnJvciAqKiksZmxhZ3M9Y3JpdGljYWwKLQotT1NfX2dfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcj0KLU9TX19nX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXJfMD1jYXN0PWNvbnN0IGdjaGFyICoKLU9TX19nX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXJfMT0KLQotT1NfX2dfdXRmOF9wb2ludGVyX3RvX29mZnNldD0KLU9TX19nX3V0ZjhfcG9pbnRlcl90b19vZmZzZXRfMD1jYXN0PWNvbnN0IGdjaGFyICoKLU9TX19nX3V0ZjhfcG9pbnRlcl90b19vZmZzZXRfMT1jYXN0PWNvbnN0IGdjaGFyICoKLQotT1NfX2dfdXRmOF9zdHJsZW49Ci1PU19fZ191dGY4X3N0cmxlbl8wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotT1NfX2dfdXRmOF9zdHJsZW5fMT0KLQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJPQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19JSV8zSV8zSV8zSV8xPWNhc3Q9KGdsb25nKQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX0lJXzNJXzNJXzNJXzI9Y2FzdD0oZ2xvbmcgKiksZmxhZ3M9Y3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19JSV8zSV8zSV8zSV8zPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fSUlfM0lfM0lfM0lfND1jYXN0PShHRXJyb3IgKiopLGZsYWdzPWNyaXRpY2FsCi0KLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJPQotT1NfXzFnXzF1dGY4XzF0b18xdXRmMTZfX18zQklfM0lfM0lfM0lfMD1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX18xZ18xdXRmOF8xdG9fMXV0ZjE2X19fM0JJXzNJXzNJXzNJXzE9Y2FzdD0oZ2xvbmcpCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV8yPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV8zPWNhc3Q9KGdsb25nICopLGZsYWdzPWNyaXRpY2FsCi1PU19fMWdfMXV0ZjhfMXRvXzF1dGYxNl9fXzNCSV8zSV8zSV8zSV80PWNhc3Q9KEdFcnJvciAqKiksZmxhZ3M9Y3JpdGljYWwKLQotT1NfX2dka19hdG9tX2ludGVybj0KLU9TX19nZGtfYXRvbV9pbnRlcm5fMD1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nZGtfYXRvbV9pbnRlcm5fMT0KLQotT1NfX2dka19hdG9tX25hbWU9Ci1PU19fZ2RrX2F0b21fbmFtZV8wPWNhc3Q9KEdka0F0b20pCi0KLU9TX19nZGtfYmVlcD0KLQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YT0KLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMT1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX19nZGtfYml0bWFwX2NyZWF0ZV9mcm9tX2RhdGFfMj1jYXN0PShnaW50KQotT1NfX2dka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfY2Fpcm9fcmVnaW9uPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfY2Fpcm9fcmVnaW9uXzA9Ci1PU19fZ2RrX2NhaXJvX3JlZ2lvbl8xPQotCi1PU19fZ2RrX2NhaXJvX3NldF9zb3VyY2VfY29sb3I9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19jYWlyb19zZXRfc291cmNlX2NvbG9yXzA9Ci1PU19fZ2RrX2NhaXJvX3NldF9zb3VyY2VfY29sb3JfMT0KLQotT1NfX2dka19jb2xvcl93aGl0ZT0KLU9TX19nZGtfY29sb3Jfd2hpdGVfMD1jYXN0PShHZGtDb2xvcm1hcCAqKQotT1NfX2dka19jb2xvcl93aGl0ZV8xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX2luCi0KLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3I9Ci1PU19fZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9yXzA9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLU9TX19nZGtfY29sb3JtYXBfYWxsb2NfY29sb3JfMT1jYXN0PShHZGtDb2xvciAqKQotT1NfX2dka19jb2xvcm1hcF9hbGxvY19jb2xvcl8yPWNhc3Q9KGdib29sZWFuKQotT1NfX2dka19jb2xvcm1hcF9hbGxvY19jb2xvcl8zPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzPQotT1NfX2dka19jb2xvcm1hcF9mcmVlX2NvbG9yc18wPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2NvbG9ybWFwX2ZyZWVfY29sb3JzXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19jb2xvcm1hcF9nZXRfc3lzdGVtPQotCi1PU19fZ2RrX2NvbG9ybWFwX3F1ZXJ5X2NvbG9yPQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcl8wPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX2NvbG9ybWFwX3F1ZXJ5X2NvbG9yXzE9Y2FzdD0oZ3Vsb25nKQotT1NfX2dka19jb2xvcm1hcF9xdWVyeV9jb2xvcl8yPWNhc3Q9KEdka0NvbG9yICopCi0KLU9TX19nZGtfY3Vyc29yX2Rlc3Ryb3k9Ci1PU19fZ2RrX2N1cnNvcl9kZXN0cm95XzA9Y2FzdD0oR2RrQ3Vyc29yICopCi0KLU9TX19nZGtfY3Vyc29yX25ldz0KLU9TX19nZGtfY3Vyc29yX25ld18wPWNhc3Q9KEdka0N1cnNvclR5cGUpCi0KLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeGJ1Zj1mbGFncz1keW5hbWljCi1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhidWZfMD0KLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeGJ1Zl8xPQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4YnVmXzI9Ci1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhidWZfMz0KLQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwPQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzA9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfMT1jYXN0PShHZGtQaXhtYXAgKikKLU9TX19nZGtfY3Vyc29yX25ld19mcm9tX3BpeG1hcF8yPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzM9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXBfND1jYXN0PShnaW50KQotT1NfX2dka19jdXJzb3JfbmV3X2Zyb21fcGl4bWFwXzU9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kaXNwbGF5X2dldF9kZWZhdWx0PWZsYWdzPWR5bmFtaWMKLQotT1NfX2dka19kaXNwbGF5X3N1cHBvcnRzX2N1cnNvcl9jb2xvcj1mbGFncz1keW5hbWljCi1PU19fZ2RrX2Rpc3BsYXlfc3VwcG9ydHNfY3Vyc29yX2NvbG9yXzA9Ci0KLU9TX19nZGtfZHJhZ19zdGF0dXM9Ci1PU19fZ2RrX2RyYWdfc3RhdHVzXzA9Y2FzdD0oR2RrRHJhZ0NvbnRleHQgKikKLU9TX19nZGtfZHJhZ19zdGF0dXNfMT1jYXN0PShHZGtEcmFnQWN0aW9uKQotT1NfX2dka19kcmFnX3N0YXR1c18yPWNhc3Q9KGd1aW50MzIpCi0KLU9TX19nZGtfZHJhd19hcmM9Ci1PU19fZ2RrX2RyYXdfYXJjXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19hcmNfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2FyY18yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY181PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfYXJjXzY9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19hcmNfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2FyY184PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19kcmF3YWJsZT0KLU9TX19nZGtfZHJhd19kcmF3YWJsZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzI9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19kcmF3YWJsZV8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzU9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19kcmF3YWJsZV82PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfZHJhd2FibGVfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2RyYXdhYmxlXzg9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3X2ltYWdlPQotT1NfX2dka19kcmF3X2ltYWdlXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19pbWFnZV8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfaW1hZ2VfMj1jYXN0PUdka0ltYWdlICoKLU9TX19nZGtfZHJhd19pbWFnZV8zPQotT1NfX2dka19kcmF3X2ltYWdlXzQ9Ci1PU19fZ2RrX2RyYXdfaW1hZ2VfNT0KLU9TX19nZGtfZHJhd19pbWFnZV82PQotT1NfX2dka19kcmF3X2ltYWdlXzc9Ci1PU19fZ2RrX2RyYXdfaW1hZ2VfOD0KLQotT1NfX2dka19kcmF3X2xheW91dD0KLU9TX19nZGtfZHJhd19sYXlvdXRfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X2xheW91dF8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfbGF5b3V0XzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19sYXlvdXRfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xheW91dF80PWNhc3Q9KFBhbmdvTGF5b3V0ICopCi0KLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnM9Ci1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzA9Y2FzdD1HZGtEcmF3YWJsZSAqCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X2xheW91dF93aXRoX2NvbG9yc18zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGF5b3V0X3dpdGhfY29sb3JzXzQ9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfNT1mbGFncz1ub19vdXQKLU9TX19nZGtfZHJhd19sYXlvdXRfd2l0aF9jb2xvcnNfNj1mbGFncz1ub19vdXQKLQotT1NfX2dka19kcmF3X2xpbmU9Ci1PU19fZ2RrX2RyYXdfbGluZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfbGluZV8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfbGluZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV8zPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV80PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfbGluZV81PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19saW5lcz0KLU9TX19nZGtfZHJhd19saW5lc18wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdfbGluZXNfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X2xpbmVzXzI9Y2FzdD0oR2RrUG9pbnQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ2RrX2RyYXdfbGluZXNfMz1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfcGl4YnVmPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfZHJhd19waXhidWZfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzI9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl81PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzY9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19waXhidWZfNz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl84PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcGl4YnVmXzk9Y2FzdD0oR2RrUmdiRGl0aGVyKQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xMD1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3BpeGJ1Zl8xMT1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdfcG9pbnQ9Ci1PU19fZ2RrX2RyYXdfcG9pbnRfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3X3BvaW50XzE9Y2FzdD1HZGtHQyAqCi1PU19fZ2RrX2RyYXdfcG9pbnRfMj0KLU9TX19nZGtfZHJhd19wb2ludF8zPQotCi1PU19fZ2RrX2RyYXdfcG9seWdvbj0KLU9TX19nZGtfZHJhd19wb2x5Z29uXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19wb2x5Z29uXzE9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZHJhd19wb2x5Z29uXzI9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19wb2x5Z29uXzM9Y2FzdD0oR2RrUG9pbnQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fZ2RrX2RyYXdfcG9seWdvbl80PWNhc3Q9KGdpbnQpCi0KLU9TX19nZGtfZHJhd19yZWN0YW5nbGU9Ci1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzA9Y2FzdD0oR2RrRHJhd2FibGUgKikKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfMT1jYXN0PShHZGtHQyAqKQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzM9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZHJhd19yZWN0YW5nbGVfND1jYXN0PShnaW50KQotT1NfX2dka19kcmF3X3JlY3RhbmdsZV81PWNhc3Q9KGdpbnQpCi1PU19fZ2RrX2RyYXdfcmVjdGFuZ2xlXzY9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19kcmF3YWJsZV9nZXRfZGVwdGg9Ci1PU19fZ2RrX2RyYXdhYmxlX2dldF9kZXB0aF8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi0KLU9TX19nZGtfZHJhd2FibGVfZ2V0X2ltYWdlPQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMD1jYXN0PShHZGtEcmF3YWJsZSAqKQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMT1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMj1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfMz1jYXN0PShnaW50KQotT1NfX2dka19kcmF3YWJsZV9nZXRfaW1hZ2VfND1jYXN0PShnaW50KQotCi1PU19fZ2RrX2RyYXdhYmxlX2dldF9zaXplPQotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZV8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX2RyYXdhYmxlX2dldF9zaXplXzE9Y2FzdD0oZ2ludCAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfX2dka19kcmF3YWJsZV9nZXRfc2l6ZV8yPWNhc3Q9KGdpbnQgKiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfX2dka19kcmF3YWJsZV9nZXRfdmlzaWJsZV9yZWdpb249Ci1PU19fZ2RrX2RyYXdhYmxlX2dldF92aXNpYmxlX3JlZ2lvbl8wPWNhc3Q9KEdka0RyYXdhYmxlICopCi0KLU9TX19nZGtfZXJyb3JfdHJhcF9wb3A9Ci0KLU9TX19nZGtfZXJyb3JfdHJhcF9wdXNoPQotCi1PU19fZ2RrX2V2ZW50X2NvcHk9Ci1PU19fZ2RrX2V2ZW50X2NvcHlfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2V2ZW50X2ZyZWU9Ci1PU19fZ2RrX2V2ZW50X2ZyZWVfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2V2ZW50X2dldD0KLQotT1NfX2dka19ldmVudF9nZXRfY29vcmRzPQotT1NfX2dka19ldmVudF9nZXRfY29vcmRzXzA9Y2FzdD0oR2RrRXZlbnQgKikKLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkc18xPWNhc3Q9KGdkb3VibGUgKikKLU9TX19nZGtfZXZlbnRfZ2V0X2Nvb3Jkc18yPWNhc3Q9KGdkb3VibGUgKikKLQotT1NfX2dka19ldmVudF9nZXRfZ3JhcGhpY3NfZXhwb3NlPQotT1NfX2dka19ldmVudF9nZXRfZ3JhcGhpY3NfZXhwb3NlXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfZXZlbnRfZ2V0X3Jvb3RfY29vcmRzPQotT1NfX2dka19ldmVudF9nZXRfcm9vdF9jb29yZHNfMD1jYXN0PShHZGtFdmVudCAqKQotT1NfX2dka19ldmVudF9nZXRfcm9vdF9jb29yZHNfMT1jYXN0PShnZG91YmxlICopCi1PU19fZ2RrX2V2ZW50X2dldF9yb290X2Nvb3Jkc18yPWNhc3Q9KGdkb3VibGUgKikKLQotT1NfX2dka19ldmVudF9nZXRfc3RhdGU9Ci1PU19fZ2RrX2V2ZW50X2dldF9zdGF0ZV8wPWNhc3Q9KEdka0V2ZW50ICopCi1PU19fZ2RrX2V2ZW50X2dldF9zdGF0ZV8xPWNhc3Q9KEdka01vZGlmaWVyVHlwZSAqKQotCi1PU19fZ2RrX2V2ZW50X2dldF90aW1lPQotT1NfX2dka19ldmVudF9nZXRfdGltZV8wPWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19nZGtfZXZlbnRfaGFuZGxlcl9zZXQ9Ci1PU19fZ2RrX2V2ZW50X2hhbmRsZXJfc2V0XzA9Y2FzdD0oR2RrRXZlbnRGdW5jKQotT1NfX2dka19ldmVudF9oYW5kbGVyX3NldF8xPWNhc3Q9KGdwb2ludGVyKQotT1NfX2dka19ldmVudF9oYW5kbGVyX3NldF8yPWNhc3Q9KEdEZXN0cm95Tm90aWZ5KQotCi1PU19fZ2RrX2V2ZW50X3BlZWs9Ci0KLU9TX19nZGtfZXZlbnRfcHV0PQotT1NfX2dka19ldmVudF9wdXRfMD1jYXN0PShHZGtFdmVudCAqKQotCi1PU19fZ2RrX2ZsdXNoPQotCi1PU19fZ2RrX2ZyZWVfdGV4dF9saXN0PQotT1NfX2dka19mcmVlX3RleHRfbGlzdF8wPWNhc3Q9KGdjaGFyICoqKQotCi1PU19fZ2RrX2djX2dldF92YWx1ZXM9Ci1PU19fZ2RrX2djX2dldF92YWx1ZXNfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19nZXRfdmFsdWVzXzE9Y2FzdD0oR2RrR0NWYWx1ZXMgKiksZmxhZ3M9bm9faW4KLQotT1NfX2dka19nY19uZXc9Ci1PU19fZ2RrX2djX25ld18wPWNhc3Q9KEdka0RyYXdhYmxlICopCi0KLU9TX19nZGtfZ2Nfc2V0X2JhY2tncm91bmQ9Ci1PU19fZ2RrX2djX3NldF9iYWNrZ3JvdW5kXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2JhY2tncm91bmRfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dka19nY19zZXRfY2xpcF9tYXNrPQotT1NfX2dka19nY19zZXRfY2xpcF9tYXNrXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2NsaXBfbWFza18xPWNhc3Q9KEdka0JpdG1hcCAqKQotCi1PU19fZ2RrX2djX3NldF9jbGlwX29yaWdpbj0KLU9TX19nZGtfZ2Nfc2V0X2NsaXBfb3JpZ2luXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2NsaXBfb3JpZ2luXzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZ2Nfc2V0X2NsaXBfb3JpZ2luXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19nY19zZXRfY2xpcF9yZWN0YW5nbGU9Ci1PU19fZ2RrX2djX3NldF9jbGlwX3JlY3RhbmdsZV8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9jbGlwX3JlY3RhbmdsZV8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19vdXQKLQotT1NfX2dka19nY19zZXRfY2xpcF9yZWdpb249Ci1PU19fZ2RrX2djX3NldF9jbGlwX3JlZ2lvbl8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9jbGlwX3JlZ2lvbl8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX2djX3NldF9kYXNoZXM9Ci1PU19fZ2RrX2djX3NldF9kYXNoZXNfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfZGFzaGVzXzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfZ2Nfc2V0X2Rhc2hlc18yPWNhc3Q9KGdpbnQ4ICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfX2dka19nY19zZXRfZGFzaGVzXzM9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19nY19zZXRfZXhwb3N1cmVzPQotT1NfX2dka19nY19zZXRfZXhwb3N1cmVzXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2V4cG9zdXJlc18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX2djX3NldF9maWxsPQotT1NfX2dka19nY19zZXRfZmlsbF8wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9maWxsXzE9Y2FzdD0oR2RrRmlsbCkKLQotT1NfX2dka19nY19zZXRfZm9yZWdyb3VuZD0KLU9TX19nZGtfZ2Nfc2V0X2ZvcmVncm91bmRfMD1jYXN0PShHZGtHQyAqKQotT1NfX2dka19nY19zZXRfZm9yZWdyb3VuZF8xPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX2djX3NldF9mdW5jdGlvbj0KLU9TX19nZGtfZ2Nfc2V0X2Z1bmN0aW9uXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X2Z1bmN0aW9uXzE9Y2FzdD0oR2RrRnVuY3Rpb24pCi0KLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlcz0KLU9TX19nZGtfZ2Nfc2V0X2xpbmVfYXR0cmlidXRlc18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXNfMT1jYXN0PShnaW50KQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzXzI9Y2FzdD0oR2RrTGluZVN0eWxlKQotT1NfX2dka19nY19zZXRfbGluZV9hdHRyaWJ1dGVzXzM9Y2FzdD0oR2RrQ2FwU3R5bGUpCi1PU19fZ2RrX2djX3NldF9saW5lX2F0dHJpYnV0ZXNfND1jYXN0PShHZGtKb2luU3R5bGUpCi0KLU9TX19nZGtfZ2Nfc2V0X3N0aXBwbGU9Ci1PU19fZ2RrX2djX3NldF9zdGlwcGxlXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X3N0aXBwbGVfMT1jYXN0PShHZGtQaXhtYXAgKikKLQotT1NfX2dka19nY19zZXRfc3Vid2luZG93PQotT1NfX2dka19nY19zZXRfc3Vid2luZG93XzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X3N1YndpbmRvd18xPWNhc3Q9KEdka1N1YndpbmRvd01vZGUpCi0KLU9TX19nZGtfZ2Nfc2V0X3RpbGU9Ci1PU19fZ2RrX2djX3NldF90aWxlXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X3RpbGVfMT1jYXN0PShHZGtQaXhtYXAgKikKLQotT1NfX2dka19nY19zZXRfdHNfb3JpZ2luPQotT1NfX2dka19nY19zZXRfdHNfb3JpZ2luXzA9Y2FzdD0oR2RrR0MgKikKLU9TX19nZGtfZ2Nfc2V0X3RzX29yaWdpbl8xPQotT1NfX2dka19nY19zZXRfdHNfb3JpZ2luXzI9Ci0KLU9TX19nZGtfZ2Nfc2V0X3ZhbHVlcz0KLU9TX19nZGtfZ2Nfc2V0X3ZhbHVlc18wPWNhc3Q9KEdka0dDICopCi1PU19fZ2RrX2djX3NldF92YWx1ZXNfMT1jYXN0PShHZGtHQ1ZhbHVlcyAqKSxmbGFncz1ub19vdXQKLU9TX19nZGtfZ2Nfc2V0X3ZhbHVlc18yPWNhc3Q9KEdka0dDVmFsdWVzTWFzaykKLQotT1NfX2dka19rZXlib2FyZF91bmdyYWI9Ci1PU19fZ2RrX2tleWJvYXJkX3VuZ3JhYl8wPQotCi1PU19fZ2RrX2tleW1hcF9nZXRfZGVmYXVsdD0KLQotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlPQotT1NfX2dka19rZXltYXBfdHJhbnNsYXRlX2tleWJvYXJkX3N0YXRlXzA9Y2FzdD1HZGtLZXltYXAqCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfMT0KLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV8yPWNhc3Q9R2RrTW9kaWZpZXJUeXBlCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfMz0KLU9TX19nZGtfa2V5bWFwX3RyYW5zbGF0ZV9rZXlib2FyZF9zdGF0ZV80PWNhc3Q9Z3VpbnQqCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfNT1jYXN0PWdpbnQqCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfNj1jYXN0PWdpbnQqCi1PU19fZ2RrX2tleW1hcF90cmFuc2xhdGVfa2V5Ym9hcmRfc3RhdGVfNz1jYXN0PUdka01vZGlmaWVyVHlwZSAqCi0KLU9TX19nZGtfa2V5dmFsX3RvX2xvd2VyPQotT1NfX2dka19rZXl2YWxfdG9fbG93ZXJfMD0KLQotT1NfX2dka19rZXl2YWxfdG9fdW5pY29kZT0KLU9TX19nZGtfa2V5dmFsX3RvX3VuaWNvZGVfMD0KLQotT1NfX2dka19wYW5nb19jb250ZXh0X2dldD0KLQotT1NfX2dka19wYW5nb19jb250ZXh0X3NldF9jb2xvcm1hcD0KLU9TX19nZGtfcGFuZ29fY29udGV4dF9zZXRfY29sb3JtYXBfMD1jYXN0PVBhbmdvQ29udGV4dCAqCi1PU19fZ2RrX3BhbmdvX2NvbnRleHRfc2V0X2NvbG9ybWFwXzE9Y2FzdD0oR2RrQ29sb3JtYXAgKikKLQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uPQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uXzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbl8xPQotT1NfX2dka19wYW5nb19sYXlvdXRfZ2V0X2NsaXBfcmVnaW9uXzI9Ci1PU19fZ2RrX3BhbmdvX2xheW91dF9nZXRfY2xpcF9yZWdpb25fMz0KLU9TX19nZGtfcGFuZ29fbGF5b3V0X2dldF9jbGlwX3JlZ2lvbl80PQotCi1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWE9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfMD1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV8xPQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzI9Ci1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfMz0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV80PQotT1NfX2dka19waXhidWZfY29weV9hcmVhXzU9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9jb3B5X2FyZWFfNj0KLU9TX19nZGtfcGl4YnVmX2NvcHlfYXJlYV83PQotCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZT0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzA9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV8xPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV8yPWNhc3Q9KEdka0NvbG9ybWFwICopCi1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV8zPQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfND0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzU9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfZnJvbV9kcmF3YWJsZV82PQotT1NfX2dka19waXhidWZfZ2V0X2Zyb21fZHJhd2FibGVfNz0KLU9TX19nZGtfcGl4YnVmX2dldF9mcm9tX2RyYXdhYmxlXzg9Ci0KLU9TX19nZGtfcGl4YnVmX2dldF9oYXNfYWxwaGE9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfaGFzX2FscGhhXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi0KLU9TX19nZGtfcGl4YnVmX2dldF9oZWlnaHQ9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfaGVpZ2h0XzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi0KLU9TX19nZGtfcGl4YnVmX2dldF9waXhlbHM9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfcGl4ZWxzXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi0KLU9TX19nZGtfcGl4YnVmX2dldF9yb3dzdHJpZGU9Ci1PU19fZ2RrX3BpeGJ1Zl9nZXRfcm93c3RyaWRlXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi0KLU9TX19nZGtfcGl4YnVmX2dldF93aWR0aD0KLU9TX19nZGtfcGl4YnVmX2dldF93aWR0aF8wPWNhc3Q9KGNvbnN0IEdka1BpeGJ1ZiAqKQotCi1PU19fZ2RrX3BpeGJ1Zl9uZXc9Ci1PU19fZ2RrX3BpeGJ1Zl9uZXdfMD1jYXN0PShHZGtDb2xvcnNwYWNlKQotT1NfX2dka19waXhidWZfbmV3XzE9Y2FzdD0oZ2Jvb2xlYW4pCi1PU19fZ2RrX3BpeGJ1Zl9uZXdfMj0KLU9TX19nZGtfcGl4YnVmX25ld18zPQotT1NfX2dka19waXhidWZfbmV3XzQ9Ci0KLU9TX19nZGtfcGl4YnVmX25ld19mcm9tX2ZpbGU9Ci1PU19fZ2RrX3BpeGJ1Zl9uZXdfZnJvbV9maWxlXzA9Y2FzdD1jb25zdCBjaGFyICoKLU9TX19nZGtfcGl4YnVmX25ld19mcm9tX2ZpbGVfMT1jYXN0PUdFcnJvcioqCi0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl9waXhtYXBfYW5kX21hc2s9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfcGl4bWFwX2FuZF9tYXNrXzA9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfcGl4bWFwX2FuZF9tYXNrXzE9Y2FzdD0oR2RrRHJhd2FibGUgKiopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfcGl4bWFwX2FuZF9tYXNrXzI9Y2FzdD0oR2RrQml0bWFwICoqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3BpeG1hcF9hbmRfbWFza18zPQotCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGU9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMD1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV8xPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfMj1jYXN0PShHZGtHQyAqKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzM9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfND0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV81PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzY9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfNz0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV84PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzk9Y2FzdD0oR2RrUmdiRGl0aGVyKQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzEwPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlXzExPQotCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGE9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMD1jYXN0PShHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8xPWNhc3Q9KEdka0RyYXdhYmxlICopCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMj0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8zPQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzQ9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfNT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV82PQotT1NfX2dka19waXhidWZfcmVuZGVyX3RvX2RyYXdhYmxlX2FscGhhXzc9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfOD1jYXN0PShHZGtQaXhidWZBbHBoYU1vZGUpCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfOT0KLU9TX19nZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYV8xMD1jYXN0PShHZGtSZ2JEaXRoZXIpCi1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMTE9Ci1PU19fZ2RrX3BpeGJ1Zl9yZW5kZXJfdG9fZHJhd2FibGVfYWxwaGFfMTI9Ci0KLU9TX19nZGtfcGl4YnVmX3NjYWxlPQotT1NfX2dka19waXhidWZfc2NhbGVfMD1jYXN0PShjb25zdCBHZGtQaXhidWYgKikKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzE9Y2FzdD0oR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV8yPQotT1NfX2dka19waXhidWZfc2NhbGVfMz0KLU9TX19nZGtfcGl4YnVmX3NjYWxlXzQ9Ci1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV81PQotT1NfX2dka19waXhidWZfc2NhbGVfNj1jYXN0PShkb3VibGUpCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV83PWNhc3Q9KGRvdWJsZSkKLU9TX19nZGtfcGl4YnVmX3NjYWxlXzg9Y2FzdD0oZG91YmxlKQotT1NfX2dka19waXhidWZfc2NhbGVfOT1jYXN0PShkb3VibGUpCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV8xMD0KLQotT1NfX2dka19waXhidWZfc2NhbGVfc2ltcGxlPQotT1NfX2dka19waXhidWZfc2NhbGVfc2ltcGxlXzA9Y2FzdD0oY29uc3QgR2RrUGl4YnVmICopCi1PU19fZ2RrX3BpeGJ1Zl9zY2FsZV9zaW1wbGVfMT0KLU9TX19nZGtfcGl4YnVmX3NjYWxlX3NpbXBsZV8yPQotT1NfX2dka19waXhidWZfc2NhbGVfc2ltcGxlXzM9Y2FzdD0oR2RrSW50ZXJwVHlwZSkKLQotT1NfX2dka19waXhtYXBfZm9yZWlnbl9uZXc9Ci1PU19fZ2RrX3BpeG1hcF9mb3JlaWduX25ld18wPQotCi1PU19fZ2RrX3BpeG1hcF9uZXc9Ci1PU19fZ2RrX3BpeG1hcF9uZXdfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfcGl4bWFwX25ld18xPWNhc3Q9KGdpbnQpCi1PU19fZ2RrX3BpeG1hcF9uZXdfMj1jYXN0PShnaW50KQotT1NfX2dka19waXhtYXBfbmV3XzM9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19wb2ludGVyX2dyYWI9Ci1PU19fZ2RrX3BvaW50ZXJfZ3JhYl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka19wb2ludGVyX2dyYWJfMT1jYXN0PShnYm9vbGVhbikKLU9TX19nZGtfcG9pbnRlcl9ncmFiXzI9Y2FzdD0oR2RrRXZlbnRNYXNrKQotT1NfX2dka19wb2ludGVyX2dyYWJfMz1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfcG9pbnRlcl9ncmFiXzQ9Y2FzdD0oR2RrQ3Vyc29yICopCi1PU19fZ2RrX3BvaW50ZXJfZ3JhYl81PWNhc3Q9KGd1aW50MzIpCi0KLU9TX19nZGtfcG9pbnRlcl9pc19ncmFiYmVkPQotCi1PU19fZ2RrX3BvaW50ZXJfdW5ncmFiPQotT1NfX2dka19wb2ludGVyX3VuZ3JhYl8wPWNhc3Q9KGd1aW50MzIpCi0KLU9TX19nZGtfcHJvcGVydHlfZ2V0PQotT1NfX2dka19wcm9wZXJ0eV9nZXRfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfcHJvcGVydHlfZ2V0XzE9Y2FzdD0oR2RrQXRvbSkKLU9TX19nZGtfcHJvcGVydHlfZ2V0XzI9Y2FzdD0oR2RrQXRvbSkKLU9TX19nZGtfcHJvcGVydHlfZ2V0XzM9Ci1PU19fZ2RrX3Byb3BlcnR5X2dldF80PQotT1NfX2dka19wcm9wZXJ0eV9nZXRfNT0KLU9TX19nZGtfcHJvcGVydHlfZ2V0XzY9Y2FzdD0oR2RrQXRvbSAqKQotT1NfX2dka19wcm9wZXJ0eV9nZXRfNz1jYXN0PShnaW50ICopCi1PU19fZ2RrX3Byb3BlcnR5X2dldF84PWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfcHJvcGVydHlfZ2V0Xzk9Y2FzdD0oZ3VjaGFyICoqKQotCi1PU19fZ2RrX3JlZ2lvbl9kZXN0cm95PQotT1NfX2dka19yZWdpb25fZGVzdHJveV8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotCi1PU19fZ2RrX3JlZ2lvbl9lbXB0eT0KLU9TX19nZGtfcmVnaW9uX2VtcHR5XzA9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfcmVnaW9uX2dldF9jbGlwYm94PQotT1NfX2dka19yZWdpb25fZ2V0X2NsaXBib3hfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX2dldF9jbGlwYm94XzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi0KLU9TX19nZGtfcmVnaW9uX2dldF9yZWN0YW5nbGVzPQotT1NfX2dka19yZWdpb25fZ2V0X3JlY3RhbmdsZXNfMD1jYXN0PShHZGtSZWdpb24gKikKLU9TX19nZGtfcmVnaW9uX2dldF9yZWN0YW5nbGVzXzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICoqKQotT1NfX2dka19yZWdpb25fZ2V0X3JlY3RhbmdsZXNfMj1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfcmVnaW9uX2ludGVyc2VjdD0KLU9TX19nZGtfcmVnaW9uX2ludGVyc2VjdF8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25faW50ZXJzZWN0XzE9Y2FzdD0oR2RrUmVnaW9uICopCi0KLU9TX19nZGtfcmVnaW9uX25ldz0KLQotT1NfX2dka19yZWdpb25fb2Zmc2V0PQotT1NfX2dka19yZWdpb25fb2Zmc2V0XzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9vZmZzZXRfMT1jYXN0PShnaW50KQotT1NfX2dka19yZWdpb25fb2Zmc2V0XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19yZWdpb25fcG9pbnRfaW49Ci1PU19fZ2RrX3JlZ2lvbl9wb2ludF9pbl8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fcG9pbnRfaW5fMT1jYXN0PShnaW50KQotT1NfX2dka19yZWdpb25fcG9pbnRfaW5fMj1jYXN0PShnaW50KQotCi1PU19fZ2RrX3JlZ2lvbl9wb2x5Z29uPQotT1NfX2dka19yZWdpb25fcG9seWdvbl8wPWNhc3Q9KEdka1BvaW50ICopCi1PU19fZ2RrX3JlZ2lvbl9wb2x5Z29uXzE9Ci1PU19fZ2RrX3JlZ2lvbl9wb2x5Z29uXzI9Y2FzdD0oR2RrRmlsbFJ1bGUpCi0KLU9TX19nZGtfcmVnaW9uX3JlY3RfaW49Ci1PU19fZ2RrX3JlZ2lvbl9yZWN0X2luXzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl9yZWN0X2luXzE9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX291dAotCi1PU19fZ2RrX3JlZ2lvbl9yZWN0YW5nbGU9Ci1PU19fZ2RrX3JlZ2lvbl9yZWN0YW5nbGVfMD1mbGFncz1ub19vdXQKLQotT1NfX2dka19yZWdpb25fc3VidHJhY3Q9Ci1PU19fZ2RrX3JlZ2lvbl9zdWJ0cmFjdF8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fc3VidHJhY3RfMT1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19yZWdpb25fdW5pb249Ci1PU19fZ2RrX3JlZ2lvbl91bmlvbl8wPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka19yZWdpb25fdW5pb25fMT1jYXN0PShHZGtSZWdpb24gKikKLQotT1NfX2dka19yZWdpb25fdW5pb25fd2l0aF9yZWN0PQotT1NfX2dka19yZWdpb25fdW5pb25fd2l0aF9yZWN0XzA9Y2FzdD0oR2RrUmVnaW9uICopCi1PU19fZ2RrX3JlZ2lvbl91bmlvbl93aXRoX3JlY3RfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfcmdiX2luaXQ9Ci0KLU9TX19nZGtfc2NyZWVuX2dldF9kZWZhdWx0PWZsYWdzPWR5bmFtaWMKLQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfYXRfcG9pbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfYXRfcG9pbnRfMD1jYXN0PShHZGtTY3JlZW4gKikKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2F0X3BvaW50XzE9Y2FzdD0oZ2ludCkKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2F0X3BvaW50XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfYXRfd2luZG93PWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2F0X3dpbmRvd18wPWNhc3Q9KEdka1NjcmVlbiAqKQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfYXRfd2luZG93XzE9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2dlb21ldHJ5PWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfc2NyZWVuX2dldF9tb25pdG9yX2dlb21ldHJ5XzA9Y2FzdD0oR2RrU2NyZWVuICopCi1PU19fZ2RrX3NjcmVlbl9nZXRfbW9uaXRvcl9nZW9tZXRyeV8xPQotT1NfX2dka19zY3JlZW5fZ2V0X21vbml0b3JfZ2VvbWV0cnlfMj1mbGFncz1ub19pbgotCi1PU19fZ2RrX3NjcmVlbl9nZXRfbl9tb25pdG9ycz1mbGFncz1keW5hbWljCi1PU19fZ2RrX3NjcmVlbl9nZXRfbl9tb25pdG9yc18wPWNhc3Q9KEdka1NjcmVlbiAqKQotCi1PU19fZ2RrX3NjcmVlbl9nZXRfbnVtYmVyPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfc2NyZWVuX2dldF9udW1iZXJfMD1jYXN0PShHZGtTY3JlZW4gKikKLQotT1NfX2dka19zY3JlZW5faGVpZ2h0PQotCi1PU19fZ2RrX3NjcmVlbl93aWR0aD0KLQotT1NfX2dka19zY3JlZW5fd2lkdGhfbW09Ci0KLU9TX19nZGtfc2V0X3Byb2dyYW1fY2xhc3M9Ci1PU19fZ2RrX3NldF9wcm9ncmFtX2NsYXNzXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0PQotT1NfX2dka190ZXh0X3Byb3BlcnR5X3RvX3V0ZjhfbGlzdF8wPWNhc3Q9KEdka0F0b20pCi1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0XzE9Ci1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0XzI9Y2FzdD0oZ3VjaGFyICopCi1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0XzM9Ci1PU19fZ2RrX3RleHRfcHJvcGVydHlfdG9fdXRmOF9saXN0XzQ9Y2FzdD0oZ2NoYXIgKioqKQotCi1PU19fZ2RrX3VuaWNvZGVfdG9fa2V5dmFsPQotT1NfX2dka191bmljb2RlX3RvX2tleXZhbF8wPQotCi1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dD0KLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0XzE9Y2FzdD0oR2RrQXRvbSAqKQotT1NfX2dka191dGY4X3RvX2NvbXBvdW5kX3RleHRfMj1jYXN0PShnaW50ICopCi1PU19fZ2RrX3V0ZjhfdG9fY29tcG91bmRfdGV4dF8zPWNhc3Q9KGd1Y2hhciAqKikKLU9TX19nZGtfdXRmOF90b19jb21wb3VuZF90ZXh0XzQ9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ2RrX3V0ZjhfdG9fc3RyaW5nX3RhcmdldD0KLU9TX19nZGtfdXRmOF90b19zdHJpbmdfdGFyZ2V0XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2dka192aXN1YWxfZ2V0X3N5c3RlbT0KLQotT1NfX2dka193aW5kb3dfYWRkX2ZpbHRlcj0KLU9TX19nZGtfd2luZG93X2FkZF9maWx0ZXJfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19hZGRfZmlsdGVyXzE9Y2FzdD1HZGtGaWx0ZXJGdW5jCi1PU19fZ2RrX3dpbmRvd19hZGRfZmlsdGVyXzI9Y2FzdD1ncG9pbnRlcgotCi1PU19fZ2RrX3dpbmRvd19hdF9wb2ludGVyPQotT1NfX2dka193aW5kb3dfYXRfcG9pbnRlcl8wPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfd2luZG93X2F0X3BvaW50ZXJfMT1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfd2luZG93X2JlZ2luX3BhaW50X3JlY3Q9Ci1PU19fZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0XzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfYmVnaW5fcGFpbnRfcmVjdF8xPWNhc3Q9R2RrUmVjdGFuZ2xlICosZmxhZ3M9bm9fb3V0Ci0KLU9TX19nZGtfd2luZG93X2NsZWFyX2FyZWE9Ci1PU19fZ2RrX3dpbmRvd19jbGVhcl9hcmVhXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfY2xlYXJfYXJlYV8xPQotT1NfX2dka193aW5kb3dfY2xlYXJfYXJlYV8yPQotT1NfX2dka193aW5kb3dfY2xlYXJfYXJlYV8zPQotT1NfX2dka193aW5kb3dfY2xlYXJfYXJlYV80PQotCi1PU19fZ2RrX3dpbmRvd19kZXN0cm95PQotT1NfX2dka193aW5kb3dfZGVzdHJveV8wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZW5kX3BhaW50PQotT1NfX2dka193aW5kb3dfZW5kX3BhaW50XzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19mb2N1cz0KLU9TX19nZGtfd2luZG93X2ZvY3VzXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfZm9jdXNfMT0KLQotT1NfX2dka193aW5kb3dfZnJlZXplX3VwZGF0ZXM9Ci1PU19fZ2RrX3dpbmRvd19mcmVlemVfdXBkYXRlc18wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZ2V0X2NoaWxkcmVuPQotT1NfX2dka193aW5kb3dfZ2V0X2NoaWxkcmVuXzA9Y2FzdD1HZGtXaW5kb3cgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfZXZlbnRzPQotT1NfX2dka193aW5kb3dfZ2V0X2V2ZW50c18wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka193aW5kb3dfZ2V0X2ZyYW1lX2V4dGVudHM9Ci1PU19fZ2RrX3dpbmRvd19nZXRfZnJhbWVfZXh0ZW50c18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X2ZyYW1lX2V4dGVudHNfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9faW4KLQotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm89Ci1PU19fZ2RrX3dpbmRvd19nZXRfaW50ZXJuYWxfcGFpbnRfaW5mb18wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X2dldF9pbnRlcm5hbF9wYWludF9pbmZvXzE9Y2FzdD1HZGtEcmF3YWJsZSAqKgotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm9fMj1jYXN0PWdpbnQgKgotT1NfX2dka193aW5kb3dfZ2V0X2ludGVybmFsX3BhaW50X2luZm9fMz1jYXN0PWdpbnQgKgotCi1PU19fZ2RrX3dpbmRvd19nZXRfb3JpZ2luPQotT1NfX2dka193aW5kb3dfZ2V0X29yaWdpbl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfZ2V0X29yaWdpbl8xPWNhc3Q9KGdpbnQgKikKLU9TX19nZGtfd2luZG93X2dldF9vcmlnaW5fMj1jYXN0PShnaW50ICopCi0KLU9TX19nZGtfd2luZG93X2dldF9wYXJlbnQ9Ci1PU19fZ2RrX3dpbmRvd19nZXRfcGFyZW50XzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X2dldF9wb2ludGVyPQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXJfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X2dldF9wb2ludGVyXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2dka193aW5kb3dfZ2V0X3BvaW50ZXJfMj1jYXN0PShnaW50ICopCi1PU19fZ2RrX3dpbmRvd19nZXRfcG9pbnRlcl8zPWNhc3Q9KEdka01vZGlmaWVyVHlwZSAqKQotCi1PU19fZ2RrX3dpbmRvd19nZXRfcG9zaXRpb249Ci1PU19fZ2RrX3dpbmRvd19nZXRfcG9zaXRpb25fMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19nZXRfcG9zaXRpb25fMT1jYXN0PWdpbnQgKgotT1NfX2dka193aW5kb3dfZ2V0X3Bvc2l0aW9uXzI9Y2FzdD1naW50ICoKLQotT1NfX2dka193aW5kb3dfZ2V0X3VzZXJfZGF0YT0KLU9TX19nZGtfd2luZG93X2dldF91c2VyX2RhdGFfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X2dldF91c2VyX2RhdGFfMT1jYXN0PShncG9pbnRlciAqKQotCi1PU19fZ2RrX3dpbmRvd19oaWRlPQotT1NfX2dka193aW5kb3dfaGlkZV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlY3Q9Ci1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlY3RfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVjdF8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19vdXQKLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVjdF8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlZ2lvbj0KLU9TX19nZGtfd2luZG93X2ludmFsaWRhdGVfcmVnaW9uXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19pbnZhbGlkYXRlX3JlZ2lvbl8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka193aW5kb3dfaW52YWxpZGF0ZV9yZWdpb25fMj1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka193aW5kb3dfbG9va3VwPQotT1NfX2dka193aW5kb3dfbG9va3VwXzA9Ci0KLU9TX19nZGtfd2luZG93X2xvd2VyPQotT1NfX2dka193aW5kb3dfbG93ZXJfMD1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2dka193aW5kb3dfbW92ZT0KLU9TX19nZGtfd2luZG93X21vdmVfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19tb3ZlXzE9Ci1PU19fZ2RrX3dpbmRvd19tb3ZlXzI9Ci0KLU9TX19nZGtfd2luZG93X25ldz0KLU9TX19nZGtfd2luZG93X25ld18wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfbmV3XzE9ZmxhZ3M9bm9fb3V0Ci1PU19fZ2RrX3dpbmRvd19uZXdfMj0KLQotT1NfX2dka193aW5kb3dfcHJvY2Vzc19hbGxfdXBkYXRlcz0KLQotT1NfX2dka193aW5kb3dfcHJvY2Vzc191cGRhdGVzPQotT1NfX2dka193aW5kb3dfcHJvY2Vzc191cGRhdGVzXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19wcm9jZXNzX3VwZGF0ZXNfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka193aW5kb3dfcmFpc2U9Ci1PU19fZ2RrX3dpbmRvd19yYWlzZV8wPWNhc3Q9KEdka1dpbmRvdyAqKQotCi1PU19fZ2RrX3dpbmRvd19yZW1vdmVfZmlsdGVyPQotT1NfX2dka193aW5kb3dfcmVtb3ZlX2ZpbHRlcl8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfcmVtb3ZlX2ZpbHRlcl8xPWNhc3Q9KEdka0ZpbHRlckZ1bmMpCi1PU19fZ2RrX3dpbmRvd19yZW1vdmVfZmlsdGVyXzI9Y2FzdD0oZ3BvaW50ZXIpCi0KLU9TX19nZGtfd2luZG93X3Jlc2l6ZT0KLU9TX19nZGtfd2luZG93X3Jlc2l6ZV8wPWNhc3Q9R2RrV2luZG93ICoKLU9TX19nZGtfd2luZG93X3Jlc2l6ZV8xPQotT1NfX2dka193aW5kb3dfcmVzaXplXzI9Ci0KLU9TX19nZGtfd2luZG93X3Njcm9sbD0KLU9TX19nZGtfd2luZG93X3Njcm9sbF8wPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2dka193aW5kb3dfc2Nyb2xsXzE9Ci1PU19fZ2RrX3dpbmRvd19zY3JvbGxfMj0KLQotT1NfX2dka193aW5kb3dfc2V0X2FjY2VwdF9mb2N1cz1mbGFncz1keW5hbWljCi1PU19fZ2RrX3dpbmRvd19zZXRfYWNjZXB0X2ZvY3VzXzA9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2dka193aW5kb3dfc2V0X2FjY2VwdF9mb2N1c18xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2dka193aW5kb3dfc2V0X2JhY2tfcGl4bWFwPQotT1NfX2dka193aW5kb3dfc2V0X2JhY2tfcGl4bWFwXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfYmFja19waXhtYXBfMT1jYXN0PShHZGtQaXhtYXAgKikKLU9TX19nZGtfd2luZG93X3NldF9iYWNrX3BpeG1hcF8yPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2dka193aW5kb3dfc2V0X2N1cnNvcj0KLU9TX19nZGtfd2luZG93X3NldF9jdXJzb3JfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9jdXJzb3JfMT1jYXN0PShHZGtDdXJzb3IgKikKLQotT1NfX2dka193aW5kb3dfc2V0X2RlYnVnX3VwZGF0ZXM9Ci1PU19fZ2RrX3dpbmRvd19zZXRfZGVidWdfdXBkYXRlc18wPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ2RrX3dpbmRvd19zZXRfZGVjb3JhdGlvbnM9Ci1PU19fZ2RrX3dpbmRvd19zZXRfZGVjb3JhdGlvbnNfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9kZWNvcmF0aW9uc18xPWNhc3Q9KEdka1dNRGVjb3JhdGlvbikKLQotT1NfX2dka193aW5kb3dfc2V0X2V2ZW50cz0KLU9TX19nZGtfd2luZG93X3NldF9ldmVudHNfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19zZXRfZXZlbnRzXzE9Ci0KLU9TX19nZGtfd2luZG93X3NldF9pY29uPQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF9pY29uXzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl8yPWNhc3Q9KEdka1BpeG1hcCAqKQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fMz1jYXN0PShHZGtCaXRtYXAgKikKLQotT1NfX2dka193aW5kb3dfc2V0X2ljb25fbGlzdD0KLU9TX19nZGtfd2luZG93X3NldF9pY29uX2xpc3RfMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19zZXRfaWNvbl9saXN0XzE9Y2FzdD1HTGlzdCAqCi0KLU9TX19nZGtfd2luZG93X3NldF9rZWVwX2Fib3ZlPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfd2luZG93X3NldF9rZWVwX2Fib3ZlXzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfa2VlcF9hYm92ZV8xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2dka193aW5kb3dfc2V0X292ZXJyaWRlX3JlZGlyZWN0PQotT1NfX2dka193aW5kb3dfc2V0X292ZXJyaWRlX3JlZGlyZWN0XzA9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ2RrX3dpbmRvd19zZXRfb3ZlcnJpZGVfcmVkaXJlY3RfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2dka193aW5kb3dfc2V0X3VzZXJfZGF0YT0KLU9TX19nZGtfd2luZG93X3NldF91c2VyX2RhdGFfMD1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19nZGtfd2luZG93X3NldF91c2VyX2RhdGFfMT1jYXN0PWdwb2ludGVyCi0KLU9TX19nZGtfd2luZG93X3NoYXBlX2NvbWJpbmVfcmVnaW9uPQotT1NfX2dka193aW5kb3dfc2hhcGVfY29tYmluZV9yZWdpb25fMD1jYXN0PUdka1dpbmRvdyAqCi1PU19fZ2RrX3dpbmRvd19zaGFwZV9jb21iaW5lX3JlZ2lvbl8xPWNhc3Q9KEdka1JlZ2lvbiAqKQotT1NfX2dka193aW5kb3dfc2hhcGVfY29tYmluZV9yZWdpb25fMj0KLU9TX19nZGtfd2luZG93X3NoYXBlX2NvbWJpbmVfcmVnaW9uXzM9Ci0KLU9TX19nZGtfd2luZG93X3Nob3c9Ci1PU19fZ2RrX3dpbmRvd19zaG93XzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X3Nob3dfdW5yYWlzZWQ9Ci1PU19fZ2RrX3dpbmRvd19zaG93X3VucmFpc2VkXzA9Y2FzdD0oR2RrV2luZG93ICopCi0KLU9TX19nZGtfd2luZG93X3RoYXdfdXBkYXRlcz0KLU9TX19nZGtfd2luZG93X3RoYXdfdXBkYXRlc18wPWNhc3Q9R2RrV2luZG93ICoKLQotT1NfX2dka194MTFfYXRvbV90b194YXRvbT0KLU9TX19nZGtfeDExX2F0b21fdG9feGF0b21fMD1jYXN0PShHZGtBdG9tKQotCi1PU19fZ2RrX3gxMV9jb2xvcm1hcF9nZXRfeGNvbG9ybWFwPQotT1NfX2dka194MTFfY29sb3JtYXBfZ2V0X3hjb2xvcm1hcF8wPWNhc3Q9R2RrQ29sb3JtYXAgKgotCi1PU19fZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGRpc3BsYXk9Ci1PU19fZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGRpc3BsYXlfMD1jYXN0PUdka0RyYXdhYmxlICoKLQotT1NfX2dka194MTFfZHJhd2FibGVfZ2V0X3hpZD0KLU9TX19nZGtfeDExX2RyYXdhYmxlX2dldF94aWRfMD1jYXN0PUdka0RyYXdhYmxlICoKLQotT1NfX2dka194MTFfc2NyZWVuX2dldF93aW5kb3dfbWFuYWdlcl9uYW1lPWZsYWdzPWR5bmFtaWMKLU9TX19nZGtfeDExX3NjcmVlbl9nZXRfd2luZG93X21hbmFnZXJfbmFtZV8wPWNhc3Q9KEdka1NjcmVlbiAqKQotCi1PU19fZ2RrX3gxMV9zY3JlZW5fbG9va3VwX3Zpc3VhbD1mbGFncz1keW5hbWljCi1PU19fZ2RrX3gxMV9zY3JlZW5fbG9va3VwX3Zpc3VhbF8wPWNhc3Q9KEdka1NjcmVlbiAqKQotT1NfX2dka194MTFfc2NyZWVuX2xvb2t1cF92aXN1YWxfMT1jYXN0PShWaXN1YWxJRCkKLQotT1NfX2dka194MTFfdmlzdWFsX2dldF94dmlzdWFsPQotT1NfX2dka194MTFfdmlzdWFsX2dldF94dmlzdWFsXzA9Y2FzdD1HZGtWaXN1YWwgKgotCi1PU19fZ3RrX2FjY2VsX2dyb3VwX25ldz0KLQotT1NfX2d0a19hY2NlbF9ncm91cHNfYWN0aXZhdGU9Ci1PU19fZ3RrX2FjY2VsX2dyb3Vwc19hY3RpdmF0ZV8wPWNhc3Q9KEdPYmplY3QgKikKLU9TX19ndGtfYWNjZWxfZ3JvdXBzX2FjdGl2YXRlXzE9Y2FzdD0oZ3VpbnQpCi1PU19fZ3RrX2FjY2VsX2dyb3Vwc19hY3RpdmF0ZV8yPWNhc3Q9KEdka01vZGlmaWVyVHlwZSkKLQotT1NfX2d0a19hY2NlbF9sYWJlbF9zZXRfYWNjZWxfd2lkZ2V0PQotT1NfX2d0a19hY2NlbF9sYWJlbF9zZXRfYWNjZWxfd2lkZ2V0XzA9Y2FzdD0oR3RrQWNjZWxMYWJlbCAqKQotT1NfX2d0a19hY2NlbF9sYWJlbF9zZXRfYWNjZWxfd2lkZ2V0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfYWRqdXN0bWVudF9jaGFuZ2VkPQotT1NfX2d0a19hZGp1c3RtZW50X2NoYW5nZWRfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfYWRqdXN0bWVudF9uZXc9Ci1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzA9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfMT1jYXN0PShnZG91YmxlKQotT1NfX2d0a19hZGp1c3RtZW50X25ld18yPWNhc3Q9KGdkb3VibGUpCi1PU19fZ3RrX2FkanVzdG1lbnRfbmV3XzM9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfYWRqdXN0bWVudF9uZXdfND1jYXN0PShnZG91YmxlKQotT1NfX2d0a19hZGp1c3RtZW50X25ld181PQotCi1PU19fZ3RrX2FkanVzdG1lbnRfc2V0X3ZhbHVlPQotT1NfX2d0a19hZGp1c3RtZW50X3NldF92YWx1ZV8wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLU9TX19ndGtfYWRqdXN0bWVudF9zZXRfdmFsdWVfMT1jYXN0PShnZG91YmxlKQotCi1PU19fZ3RrX2FkanVzdG1lbnRfdmFsdWVfY2hhbmdlZD0KLU9TX19ndGtfYWRqdXN0bWVudF92YWx1ZV9jaGFuZ2VkXzA9Y2FzdD0oR3RrQWRqdXN0bWVudCAqKQotCi1PU19fZ3RrX2Fycm93X25ldz0KLU9TX19ndGtfYXJyb3dfbmV3XzA9Y2FzdD0oR3RrQXJyb3dUeXBlKQotT1NfX2d0a19hcnJvd19uZXdfMT1jYXN0PShHdGtTaGFkb3dUeXBlKQotCi1PU19fZ3RrX2Fycm93X3NldD0KLU9TX19ndGtfYXJyb3dfc2V0XzA9Y2FzdD0oR3RrQXJyb3cgKikKLU9TX19ndGtfYXJyb3dfc2V0XzE9Y2FzdD0oR3RrQXJyb3dUeXBlKQotT1NfX2d0a19hcnJvd19zZXRfMj1jYXN0PShHdGtTaGFkb3dUeXBlKQotCi1PU19fZ3RrX2Jpbl9nZXRfY2hpbGQ9Ci1PU19fZ3RrX2Jpbl9nZXRfY2hpbGRfMD1jYXN0PShHdGtCaW4gKikKLQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmc9Ci1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ18wPWNhc3Q9KEd0a0JveCAqKQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzI9Ci1PU19fZ3RrX2JveF9zZXRfY2hpbGRfcGFja2luZ18zPQotT1NfX2d0a19ib3hfc2V0X2NoaWxkX3BhY2tpbmdfND0KLU9TX19ndGtfYm94X3NldF9jaGlsZF9wYWNraW5nXzU9Ci0KLU9TX19ndGtfYm94X3NldF9zcGFjaW5nPQotT1NfX2d0a19ib3hfc2V0X3NwYWNpbmdfMD1jYXN0PShHdGtCb3ggKikKLU9TX19ndGtfYm94X3NldF9zcGFjaW5nXzE9Ci0KLU9TX19ndGtfYnV0dG9uX2NsaWNrZWQ9Ci1PU19fZ3RrX2J1dHRvbl9jbGlja2VkXzA9Y2FzdD0oR3RrQnV0dG9uICopCi0KLU9TX19ndGtfYnV0dG9uX2dldF9yZWxpZWY9Ci1PU19fZ3RrX2J1dHRvbl9nZXRfcmVsaWVmXzA9Y2FzdD1HdGtCdXR0b24gKgotCi1PU19fZ3RrX2J1dHRvbl9uZXc9Ci0KLU9TX19ndGtfYnV0dG9uX3NldF9yZWxpZWY9Ci1PU19fZ3RrX2J1dHRvbl9zZXRfcmVsaWVmXzA9Y2FzdD0oR3RrQnV0dG9uICopCi1PU19fZ3RrX2J1dHRvbl9zZXRfcmVsaWVmXzE9Y2FzdD0oR3RrUmVsaWVmU3R5bGUpCi0KLU9TX19ndGtfY2FsZW5kYXJfZGlzcGxheV9vcHRpb25zPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY2FsZW5kYXJfZGlzcGxheV9vcHRpb25zXzA9Y2FzdD0oR3RrQ2FsZW5kYXIgKikKLU9TX19ndGtfY2FsZW5kYXJfZGlzcGxheV9vcHRpb25zXzE9Y2FzdD0oR3RrQ2FsZW5kYXJEaXNwbGF5T3B0aW9ucykKLQotT1NfX2d0a19jYWxlbmRhcl9nZXRfZGF0ZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX2NhbGVuZGFyX2dldF9kYXRlXzA9Y2FzdD0oR3RrQ2FsZW5kYXIgKikKLU9TX19ndGtfY2FsZW5kYXJfZ2V0X2RhdGVfMT1jYXN0PShndWludCAqKQotT1NfX2d0a19jYWxlbmRhcl9nZXRfZGF0ZV8yPWNhc3Q9KGd1aW50ICopCi1PU19fZ3RrX2NhbGVuZGFyX2dldF9kYXRlXzM9Y2FzdD0oZ3VpbnQgKikKLQotT1NfX2d0a19jYWxlbmRhcl9uZXc9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ3RrX2NhbGVuZGFyX3NlbGVjdF9kYXk9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19jYWxlbmRhcl9zZWxlY3RfZGF5XzA9Y2FzdD0oR3RrQ2FsZW5kYXIgKikKLU9TX19ndGtfY2FsZW5kYXJfc2VsZWN0X2RheV8xPWNhc3Q9KGd1aW50KQotCi1PU19fZ3RrX2NhbGVuZGFyX3NlbGVjdF9tb250aD1mbGFncz1keW5hbWljCi1PU19fZ3RrX2NhbGVuZGFyX3NlbGVjdF9tb250aF8wPWNhc3Q9KEd0a0NhbGVuZGFyICopCi1PU19fZ3RrX2NhbGVuZGFyX3NlbGVjdF9tb250aF8xPWNhc3Q9KGd1aW50KQotT1NfX2d0a19jYWxlbmRhcl9zZWxlY3RfbW9udGhfMj1jYXN0PShndWludCkKLQotT1NfX2d0a19jYWxlbmRhcl9zZXRfZGlzcGxheV9vcHRpb25zPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY2FsZW5kYXJfc2V0X2Rpc3BsYXlfb3B0aW9uc18wPWNhc3Q9KEd0a0NhbGVuZGFyICopCi1PU19fZ3RrX2NhbGVuZGFyX3NldF9kaXNwbGF5X29wdGlvbnNfMT1jYXN0PShHdGtDYWxlbmRhckRpc3BsYXlPcHRpb25zKQotCi1PU19fZ3RrX2NlbGxfbGF5b3V0X2NsZWFyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY2VsbF9sYXlvdXRfY2xlYXJfMD0KLQotT1NfX2d0a19jZWxsX2xheW91dF9wYWNrX3N0YXJ0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY2VsbF9sYXlvdXRfcGFja19zdGFydF8wPQotT1NfX2d0a19jZWxsX2xheW91dF9wYWNrX3N0YXJ0XzE9Ci1PU19fZ3RrX2NlbGxfbGF5b3V0X3BhY2tfc3RhcnRfMj0KLQotT1NfX2d0a19jZWxsX2xheW91dF9zZXRfYXR0cmlidXRlcz1mbGFncz1ub19nZW4KLU9TX19ndGtfY2VsbF9sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMD0KLU9TX19ndGtfY2VsbF9sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMT0KLU9TX19ndGtfY2VsbF9sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMj0KLU9TX19ndGtfY2VsbF9sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMz0KLU9TX19ndGtfY2VsbF9sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfND0KLQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplPQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzA9Y2FzdD0oR3RrQ2VsbFJlbmRlcmVyICopCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfZ2V0X3NpemVfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfY2VsbF9yZW5kZXJlcl9nZXRfc2l6ZV8yPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzM9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzQ9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzU9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX2dldF9zaXplXzY9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfcGl4YnVmX25ldz0KLQotT1NfX2d0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3PQotCi1PU19fZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldz0KLQotT1NfX2d0a19jaGVja19idXR0b25fbmV3PQotCi1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9nZXRfYWN0aXZlPQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fZ2V0X2FjdGl2ZV8wPWNhc3Q9KEd0a0NoZWNrTWVudUl0ZW0gKikKLQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWw9Ci1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbF8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmU9Ci1PU19fZ3RrX2NoZWNrX21lbnVfaXRlbV9zZXRfYWN0aXZlXzA9Y2FzdD0oR3RrQ2hlY2tNZW51SXRlbSAqKQotT1NfX2d0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2NoZWNrX3ZlcnNpb249Ci1PU19fZ3RrX2NoZWNrX3ZlcnNpb25fMD0KLU9TX19ndGtfY2hlY2tfdmVyc2lvbl8xPQotT1NfX2d0a19jaGVja192ZXJzaW9uXzI9Ci0KLU9TX19ndGtfY2xpcGJvYXJkX2NsZWFyPQotT1NfX2d0a19jbGlwYm9hcmRfY2xlYXJfMD1jYXN0PShHdGtDbGlwYm9hcmQgKikKLQotT1NfX2d0a19jbGlwYm9hcmRfZ2V0PQotT1NfX2d0a19jbGlwYm9hcmRfZ2V0XzA9Y2FzdD0oR2RrQXRvbSkKLQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YT0KLU9TX19ndGtfY2xpcGJvYXJkX3NldF93aXRoX2RhdGFfMD1jYXN0PShHdGtDbGlwYm9hcmQgKikKLU9TX19ndGtfY2xpcGJvYXJkX3NldF93aXRoX2RhdGFfMT1jYXN0PShjb25zdCBHdGtUYXJnZXRFbnRyeSAqKQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8yPWNhc3Q9KGd1aW50KQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV8zPWNhc3Q9KEd0a0NsaXBib2FyZEdldEZ1bmMpCi1PU19fZ3RrX2NsaXBib2FyZF9zZXRfd2l0aF9kYXRhXzQ9Y2FzdD0oR3RrQ2xpcGJvYXJkQ2xlYXJGdW5jKQotT1NfX2d0a19jbGlwYm9hcmRfc2V0X3dpdGhfZGF0YV81PWNhc3Q9KEdPYmplY3QgKikKLQotT1NfX2d0a19jbGlwYm9hcmRfd2FpdF9mb3JfY29udGVudHM9Ci1PU19fZ3RrX2NsaXBib2FyZF93YWl0X2Zvcl9jb250ZW50c18wPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a19jbGlwYm9hcmRfd2FpdF9mb3JfY29udGVudHNfMT1jYXN0PShHZGtBdG9tKQotCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9kaWFsb2dfbmV3PQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZGlhbG9nX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX2dldF9jdXJyZW50X2NvbG9yPQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZ2V0X2N1cnJlbnRfY29sb3JfMD1jYXN0PShHdGtDb2xvclNlbGVjdGlvbiAqKQotT1NfX2d0a19jb2xvcl9zZWxlY3Rpb25fZ2V0X2N1cnJlbnRfY29sb3JfMT1jYXN0PShHZGtDb2xvciAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9zZXRfY3VycmVudF9jb2xvcj0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9jdXJyZW50X2NvbG9yXzA9Y2FzdD0oR3RrQ29sb3JTZWxlY3Rpb24gKikKLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9jdXJyZW50X2NvbG9yXzE9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9oYXNfcGFsZXR0ZT0KLU9TX19ndGtfY29sb3Jfc2VsZWN0aW9uX3NldF9oYXNfcGFsZXR0ZV8wPWNhc3Q9KEd0a0NvbG9yU2VsZWN0aW9uICopCi1PU19fZ3RrX2NvbG9yX3NlbGVjdGlvbl9zZXRfaGFzX3BhbGV0dGVfMT0KLQotT1NfX2d0a19jb21ib19ib3hfZW50cnlfbmV3X3RleHQ9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ3RrX2NvbWJvX2JveF9nZXRfYWN0aXZlPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY29tYm9fYm94X2dldF9hY3RpdmVfMD0KLQotT1NfX2d0a19jb21ib19ib3hfZ2V0X21vZGVsPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY29tYm9fYm94X2dldF9tb2RlbF8wPQotCi1PU19fZ3RrX2NvbWJvX2JveF9pbnNlcnRfdGV4dD1mbGFncz1keW5hbWljCi1PU19fZ3RrX2NvbWJvX2JveF9pbnNlcnRfdGV4dF8wPQotT1NfX2d0a19jb21ib19ib3hfaW5zZXJ0X3RleHRfMT0KLU9TX19ndGtfY29tYm9fYm94X2luc2VydF90ZXh0XzI9Ci0KLU9TX19ndGtfY29tYm9fYm94X25ld190ZXh0PWZsYWdzPWR5bmFtaWMKLQotT1NfX2d0a19jb21ib19ib3hfcG9wZG93bj1mbGFncz1keW5hbWljCi1PU19fZ3RrX2NvbWJvX2JveF9wb3Bkb3duXzA9Ci0KLU9TX19ndGtfY29tYm9fYm94X3BvcHVwPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY29tYm9fYm94X3BvcHVwXzA9Ci0KLU9TX19ndGtfY29tYm9fYm94X3JlbW92ZV90ZXh0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY29tYm9fYm94X3JlbW92ZV90ZXh0XzA9Ci1PU19fZ3RrX2NvbWJvX2JveF9yZW1vdmVfdGV4dF8xPQotCi1PU19fZ3RrX2NvbWJvX2JveF9zZXRfYWN0aXZlPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfY29tYm9fYm94X3NldF9hY3RpdmVfMD0KLU9TX19ndGtfY29tYm9fYm94X3NldF9hY3RpdmVfMT0KLQotT1NfX2d0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlPQotT1NfX2d0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlXzA9Y2FzdD0oR3RrQ29tYm8gKikKLQotT1NfX2d0a19jb21ib19uZXc9Ci0KLU9TX19ndGtfY29tYm9fc2V0X2Nhc2Vfc2Vuc2l0aXZlPQotT1NfX2d0a19jb21ib19zZXRfY2FzZV9zZW5zaXRpdmVfMD1jYXN0PShHdGtDb21ibyAqKQotT1NfX2d0a19jb21ib19zZXRfY2FzZV9zZW5zaXRpdmVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzPQotT1NfX2d0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzXzA9Y2FzdD0oR3RrQ29tYm8gKikKLU9TX19ndGtfY29tYm9fc2V0X3BvcGRvd25fc3RyaW5nc18xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19ndGtfY29udGFpbmVyX2FkZD0KLU9TX19ndGtfY29udGFpbmVyX2FkZF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotT1NfX2d0a19jb250YWluZXJfYWRkXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfY29udGFpbmVyX2ZvcmFsbD0KLU9TX19ndGtfY29udGFpbmVyX2ZvcmFsbF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotT1NfX2d0a19jb250YWluZXJfZm9yYWxsXzE9Y2FzdD1HdGtDYWxsYmFjawotT1NfX2d0a19jb250YWluZXJfZm9yYWxsXzI9Y2FzdD1ncG9pbnRlcgotCi1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfYm9yZGVyX3dpZHRoPQotT1NfX2d0a19jb250YWluZXJfZ2V0X2JvcmRlcl93aWR0aF8wPWNhc3Q9KEd0a0NvbnRhaW5lciAqKQotCi1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfY2hpbGRyZW49Ci1PU19fZ3RrX2NvbnRhaW5lcl9nZXRfY2hpbGRyZW5fMD1jYXN0PShHdGtDb250YWluZXIgKikKLQotT1NfX2d0a19jb250YWluZXJfcmVtb3ZlPQotT1NfX2d0a19jb250YWluZXJfcmVtb3ZlXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9yZW1vdmVfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19jb250YWluZXJfcmVzaXplX2NoaWxkcmVuPQotT1NfX2d0a19jb250YWluZXJfcmVzaXplX2NoaWxkcmVuXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi0KLU9TX19ndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGg9Ci1PU19fZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoXzA9Y2FzdD0oR3RrQ29udGFpbmVyICopCi1PU19fZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoXzE9Y2FzdD0oZ3VpbnQpCi0KLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b249Ci1PU19fZ3RrX2RpYWxvZ19hZGRfYnV0dG9uXzA9Y2FzdD0oR3RrRGlhbG9nICopCi1PU19fZ3RrX2RpYWxvZ19hZGRfYnV0dG9uXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfZGlhbG9nX2FkZF9idXR0b25fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2RpYWxvZ19ydW49Ci1PU19fZ3RrX2RpYWxvZ19ydW5fMD1jYXN0PShHdGtEaWFsb2cgKikKLQotT1NfX2d0a19kcmFnX2JlZ2luPQotT1NfX2d0a19kcmFnX2JlZ2luXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfYmVnaW5fMT1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi1PU19fZ3RrX2RyYWdfYmVnaW5fMj1jYXN0PShHZGtEcmFnQWN0aW9uKQotT1NfX2d0a19kcmFnX2JlZ2luXzM9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19iZWdpbl80PWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGQ9Ci1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfZHJhZ19jaGVja190aHJlc2hvbGRfMj1jYXN0PShnaW50KQotT1NfX2d0a19kcmFnX2NoZWNrX3RocmVzaG9sZF8zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2RyYWdfY2hlY2tfdGhyZXNob2xkXzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXQ9Ci1PU19fZ3RrX2RyYWdfZGVzdF9maW5kX3RhcmdldF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXRfMT1jYXN0PShHZGtEcmFnQ29udGV4dCAqKQotT1NfX2d0a19kcmFnX2Rlc3RfZmluZF90YXJnZXRfMj1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi0KLU9TX19ndGtfZHJhZ19kZXN0X3NldD0KLU9TX19ndGtfZHJhZ19kZXN0X3NldF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzE9Y2FzdD0oR3RrRGVzdERlZmF1bHRzKQotT1NfX2d0a19kcmFnX2Rlc3Rfc2V0XzI9Y2FzdD0oY29uc3QgR3RrVGFyZ2V0RW50cnkgKikKLU9TX19ndGtfZHJhZ19kZXN0X3NldF8zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2RyYWdfZGVzdF9zZXRfND1jYXN0PShHZGtEcmFnQWN0aW9uKQotCi1PU19fZ3RrX2RyYWdfZGVzdF91bnNldD0KLU9TX19ndGtfZHJhZ19kZXN0X3Vuc2V0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfZHJhZ19maW5pc2g9Ci1PU19fZ3RrX2RyYWdfZmluaXNoXzA9Y2FzdD0oR2RrRHJhZ0NvbnRleHQgKikKLU9TX19ndGtfZHJhZ19maW5pc2hfMT1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfZHJhZ19maW5pc2hfMj1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfZHJhZ19maW5pc2hfMz1jYXN0PShndWludDMyKQotCi1PU19fZ3RrX2RyYWdfZ2V0X2RhdGE9Ci1PU19fZ3RrX2RyYWdfZ2V0X2RhdGFfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZHJhZ19nZXRfZGF0YV8xPWNhc3Q9KEdka0RyYWdDb250ZXh0ICopCi1PU19fZ3RrX2RyYWdfZ2V0X2RhdGFfMj1jYXN0PShHZGtBdG9tKQotT1NfX2d0a19kcmFnX2dldF9kYXRhXzM9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2d0a19kcmFnX3NldF9pY29uX3BpeGJ1Zj0KLU9TX19ndGtfZHJhZ19zZXRfaWNvbl9waXhidWZfMD1jYXN0PShHZGtEcmFnQ29udGV4dCAqKQotT1NfX2d0a19kcmFnX3NldF9pY29uX3BpeGJ1Zl8xPWNhc3Q9KEdka1BpeGJ1ZiAqKQotT1NfX2d0a19kcmFnX3NldF9pY29uX3BpeGJ1Zl8yPQotT1NfX2d0a19kcmFnX3NldF9pY29uX3BpeGJ1Zl8zPQotCi1PU19fZ3RrX2RyYXdpbmdfYXJlYV9uZXc9Ci0KLU9TX19ndGtfZWRpdGFibGVfY29weV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX2VkaXRhYmxlX2NvcHlfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkPQotT1NfX2d0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfc2VsZWN0aW9uPQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfc2VsZWN0aW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfdGV4dD0KLU9TX19ndGtfZWRpdGFibGVfZGVsZXRlX3RleHRfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9kZWxldGVfdGV4dF8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2RlbGV0ZV90ZXh0XzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19lZGl0YWJsZV9nZXRfY2hhcnM9Ci1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18wPWNhc3Q9KEd0a0VkaXRhYmxlICopCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9jaGFyc18yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X2VkaXRhYmxlPQotT1NfX2d0a19lZGl0YWJsZV9nZXRfZWRpdGFibGVfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotCi1PU19fZ3RrX2VkaXRhYmxlX2dldF9wb3NpdGlvbj0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X3Bvc2l0aW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9nZXRfc2VsZWN0aW9uX2JvdW5kcz0KLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9nZXRfc2VsZWN0aW9uX2JvdW5kc18xPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfZWRpdGFibGVfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfZWRpdGFibGVfaW5zZXJ0X3RleHQ9Ci1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0XzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfaW5zZXJ0X3RleHRfMT1jYXN0PShnY2hhciAqKQotT1NfX2d0a19lZGl0YWJsZV9pbnNlcnRfdGV4dF8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0XzM9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX2VkaXRhYmxlX3Bhc3RlX2NsaXBib2FyZD0KLU9TX19ndGtfZWRpdGFibGVfcGFzdGVfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLQotT1NfX2d0a19lZGl0YWJsZV9zZWxlY3RfcmVnaW9uPQotT1NfX2d0a19lZGl0YWJsZV9zZWxlY3RfcmVnaW9uXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbl8xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2VkaXRhYmxlX3NlbGVjdF9yZWdpb25fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VkaXRhYmxlX3NldF9lZGl0YWJsZT0KLU9TX19ndGtfZWRpdGFibGVfc2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrRWRpdGFibGUgKikKLU9TX19ndGtfZWRpdGFibGVfc2V0X2VkaXRhYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZWRpdGFibGVfc2V0X3Bvc2l0aW9uPQotT1NfX2d0a19lZGl0YWJsZV9zZXRfcG9zaXRpb25fMD1jYXN0PShHdGtFZGl0YWJsZSAqKQotT1NfX2d0a19lZGl0YWJsZV9zZXRfcG9zaXRpb25fMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VudHJ5X2dldF9pbnZpc2libGVfY2hhcj0KLU9TX19ndGtfZW50cnlfZ2V0X2ludmlzaWJsZV9jaGFyXzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0PQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0XzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0X29mZnNldHM9Ci1PU19fZ3RrX2VudHJ5X2dldF9sYXlvdXRfb2Zmc2V0c18wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X2dldF9sYXlvdXRfb2Zmc2V0c18xPQotT1NfX2d0a19lbnRyeV9nZXRfbGF5b3V0X29mZnNldHNfMj0KLQotT1NfX2d0a19lbnRyeV9nZXRfbWF4X2xlbmd0aD0KLU9TX19ndGtfZW50cnlfZ2V0X21heF9sZW5ndGhfMD1jYXN0PShHdGtFbnRyeSAqKQotCi1PU19fZ3RrX2VudHJ5X2dldF90ZXh0PQotT1NfX2d0a19lbnRyeV9nZXRfdGV4dF8wPWNhc3Q9KEd0a0VudHJ5ICopCi0KLU9TX19ndGtfZW50cnlfZ2V0X3Zpc2liaWxpdHk9Ci1PU19fZ3RrX2VudHJ5X2dldF92aXNpYmlsaXR5XzA9Y2FzdD0oR3RrRW50cnkgKikKLQotT1NfX2d0a19lbnRyeV9uZXc9Ci0KLU9TX19ndGtfZW50cnlfc2V0X2FjdGl2YXRlc19kZWZhdWx0PQotT1NfX2d0a19lbnRyeV9zZXRfYWN0aXZhdGVzX2RlZmF1bHRfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfYWN0aXZhdGVzX2RlZmF1bHRfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19lbnRyeV9zZXRfYWxpZ25tZW50PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZW50cnlfc2V0X2FsaWdubWVudF8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9hbGlnbm1lbnRfMT1jYXN0PShnZmxvYXQpCi0KLU9TX19ndGtfZW50cnlfc2V0X2hhc19mcmFtZT0KLU9TX19ndGtfZW50cnlfc2V0X2hhc19mcmFtZV8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9oYXNfZnJhbWVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19lbnRyeV9zZXRfaW52aXNpYmxlX2NoYXI9Ci1PU19fZ3RrX2VudHJ5X3NldF9pbnZpc2libGVfY2hhcl8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF9pbnZpc2libGVfY2hhcl8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfZW50cnlfc2V0X21heF9sZW5ndGg9Ci1PU19fZ3RrX2VudHJ5X3NldF9tYXhfbGVuZ3RoXzA9Y2FzdD0oR3RrRW50cnkgKikKLU9TX19ndGtfZW50cnlfc2V0X21heF9sZW5ndGhfMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX2VudHJ5X3NldF90ZXh0PQotT1NfX2d0a19lbnRyeV9zZXRfdGV4dF8wPWNhc3Q9KEd0a0VudHJ5ICopCi1PU19fZ3RrX2VudHJ5X3NldF90ZXh0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19lbnRyeV9zZXRfdmlzaWJpbGl0eT0KLU9TX19ndGtfZW50cnlfc2V0X3Zpc2liaWxpdHlfMD1jYXN0PShHdGtFbnRyeSAqKQotT1NfX2d0a19lbnRyeV9zZXRfdmlzaWJpbGl0eV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2VudHJ5X3RleHRfaW5kZXhfdG9fbGF5b3V0X2luZGV4PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZW50cnlfdGV4dF9pbmRleF90b19sYXlvdXRfaW5kZXhfMD0KLU9TX19ndGtfZW50cnlfdGV4dF9pbmRleF90b19sYXlvdXRfaW5kZXhfMT0KLQotT1NfX2d0a19lbnVtZXJhdGVfcHJpbnRlcnM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19lbnVtZXJhdGVfcHJpbnRlcnNfMD0KLU9TX19ndGtfZW51bWVyYXRlX3ByaW50ZXJzXzE9Y2FzdD0oZ3BvaW50ZXIpCi1PU19fZ3RrX2VudW1lcmF0ZV9wcmludGVyc18yPWNhc3Q9KEdEZXN0cm95Tm90aWZ5KQotT1NfX2d0a19lbnVtZXJhdGVfcHJpbnRlcnNfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19ldmVudHNfcGVuZGluZz0KLQotT1NfX2d0a19leHBhbmRlcl9nZXRfZXhwYW5kZWQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19leHBhbmRlcl9nZXRfZXhwYW5kZWRfMD0KLQotT1NfX2d0a19leHBhbmRlcl9nZXRfbGFiZWxfd2lkZ2V0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZXhwYW5kZXJfZ2V0X2xhYmVsX3dpZGdldF8wPQotCi1PU19fZ3RrX2V4cGFuZGVyX25ldz1mbGFncz1keW5hbWljCi1PU19fZ3RrX2V4cGFuZGVyX25ld18wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotCi1PU19fZ3RrX2V4cGFuZGVyX3NldF9leHBhbmRlZD1mbGFncz1keW5hbWljCi1PU19fZ3RrX2V4cGFuZGVyX3NldF9leHBhbmRlZF8wPQotT1NfX2d0a19leHBhbmRlcl9zZXRfZXhwYW5kZWRfMT0KLQotT1NfX2d0a19leHBhbmRlcl9zZXRfbGFiZWw9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19leHBhbmRlcl9zZXRfbGFiZWxfMD0KLU9TX19ndGtfZXhwYW5kZXJfc2V0X2xhYmVsXzE9Y2FzdD1jb25zdCBnY2hhciAqCi0KLU9TX19ndGtfZXhwYW5kZXJfc2V0X2xhYmVsX3dpZGdldD1mbGFncz1keW5hbWljCi1PU19fZ3RrX2V4cGFuZGVyX3NldF9sYWJlbF93aWRnZXRfMD0KLU9TX19ndGtfZXhwYW5kZXJfc2V0X2xhYmVsX3dpZGdldF8xPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9hZGRfZmlsdGVyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2FkZF9maWx0ZXJfMD0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2FkZF9maWx0ZXJfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfZGlhbG9nX25ldz1mbGFncz1ub19nZW4KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMD0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMT0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMj0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfMz0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfND0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNT0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNj0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2RpYWxvZ19uZXdfNz0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2N1cnJlbnRfZm9sZGVyPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9jdXJyZW50X2ZvbGRlcl8wPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9nZXRfZmlsZW5hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2ZpbGVuYW1lXzA9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX2dldF9maWxlbmFtZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfZ2V0X2ZpbGVuYW1lc18wPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9mb2xkZXI9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfZm9sZGVyXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9mb2xkZXJfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2N1cnJlbnRfbmFtZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9uYW1lXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfY3VycmVudF9uYW1lXzE9Ci0KLU9TX19ndGtfZmlsZV9jaG9vc2VyX3NldF9leHRyYV93aWRnZXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2V4dHJhX3dpZGdldF8wPQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2V4dHJhX3dpZGdldF8xPQotCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfZmlsZW5hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X2ZpbGVuYW1lXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfZmlsZW5hbWVfMT0KLQotT1NfX2d0a19maWxlX2Nob29zZXJfc2V0X3NlbGVjdF9tdWx0aXBsZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfc2VsZWN0X211bHRpcGxlXzA9Ci1PU19fZ3RrX2ZpbGVfY2hvb3Nlcl9zZXRfc2VsZWN0X211bHRpcGxlXzE9Ci0KLU9TX19ndGtfZmlsZV9maWx0ZXJfYWRkX3BhdHRlcm49ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2ZpbHRlcl9hZGRfcGF0dGVybl8wPQotT1NfX2d0a19maWxlX2ZpbHRlcl9hZGRfcGF0dGVybl8xPQotCi1PU19fZ3RrX2ZpbGVfZmlsdGVyX25ldz1mbGFncz1keW5hbWljCi0KLU9TX19ndGtfZmlsZV9maWx0ZXJfc2V0X25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19maWxlX2ZpbHRlcl9zZXRfbmFtZV8wPQotT1NfX2d0a19maWxlX2ZpbHRlcl9zZXRfbmFtZV8xPQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZT0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9zZWxlY3Rpb25zPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9nZXRfc2VsZWN0aW9uc18wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVvcF9idXR0b25zPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVvcF9idXR0b25zXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldz0KLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfZmlsZW5hbWU9Ci1PU19fZ3RrX2ZpbGVfc2VsZWN0aW9uX3NldF9maWxlbmFtZV8wPWNhc3Q9KEd0a0ZpbGVTZWxlY3Rpb24gKikKLU9TX19ndGtfZmlsZV9zZWxlY3Rpb25fc2V0X2ZpbGVuYW1lXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlPQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlXzA9Y2FzdD0oR3RrRmlsZVNlbGVjdGlvbiAqKQotT1NfX2d0a19maWxlX3NlbGVjdGlvbl9zZXRfc2VsZWN0X211bHRpcGxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfZml4ZWRfbW92ZT0KLU9TX19ndGtfZml4ZWRfbW92ZV8wPWNhc3Q9KEd0a0ZpeGVkICopCi1PU19fZ3RrX2ZpeGVkX21vdmVfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfZml4ZWRfbW92ZV8yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX2ZpeGVkX21vdmVfMz1jYXN0PShnaW50KQotCi1PU19fZ3RrX2ZpeGVkX25ldz0KLQotT1NfX2d0a19maXhlZF9zZXRfaGFzX3dpbmRvdz0KLU9TX19ndGtfZml4ZWRfc2V0X2hhc193aW5kb3dfMD1jYXN0PShHdGtGaXhlZCAqKQotT1NfX2d0a19maXhlZF9zZXRfaGFzX3dpbmRvd18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lPQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfZ2V0X2ZvbnRfbmFtZV8wPWNhc3Q9KEd0a0ZvbnRTZWxlY3Rpb25EaWFsb2cgKikKLQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfbmV3PQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfc2V0X2ZvbnRfbmFtZT0KLU9TX19ndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9mb250X25hbWVfMD1jYXN0PShHdGtGb250U2VsZWN0aW9uRGlhbG9nICopCi1PU19fZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZm9udF9uYW1lXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19mcmFtZV9nZXRfbGFiZWxfd2lkZ2V0PQotT1NfX2d0a19mcmFtZV9nZXRfbGFiZWxfd2lkZ2V0XzA9Y2FzdD0oR3RrRnJhbWUgKikKLQotT1NfX2d0a19mcmFtZV9uZXc9Ci1PU19fZ3RrX2ZyYW1lX25ld18wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfZnJhbWVfc2V0X2xhYmVsPQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ZyYW1lX3NldF9sYWJlbF93aWRnZXQ9Ci1PU19fZ3RrX2ZyYW1lX3NldF9sYWJlbF93aWRnZXRfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfbGFiZWxfd2lkZ2V0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfZnJhbWVfc2V0X3NoYWRvd190eXBlPQotT1NfX2d0a19mcmFtZV9zZXRfc2hhZG93X3R5cGVfMD1jYXN0PShHdGtGcmFtZSAqKQotT1NfX2d0a19mcmFtZV9zZXRfc2hhZG93X3R5cGVfMT1jYXN0PShHdGtTaGFkb3dUeXBlKQotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50PQotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50X3N0YXRlPQotT1NfX2d0a19nZXRfY3VycmVudF9ldmVudF9zdGF0ZV8wPWNhc3Q9R2RrTW9kaWZpZXJUeXBlKgotCi1PU19fZ3RrX2dldF9jdXJyZW50X2V2ZW50X3RpbWU9Ci0KLU9TX19ndGtfZ2V0X2RlZmF1bHRfbGFuZ3VhZ2U9Ci0KLU9TX19ndGtfZ2V0X2V2ZW50X3dpZGdldD0KLU9TX19ndGtfZ2V0X2V2ZW50X3dpZGdldF8wPWNhc3Q9R2RrRXZlbnQgKgotCi1PU19fZ3RrX2dyYWJfYWRkPQotT1NfX2d0a19ncmFiX2FkZF8wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotT1NfX2d0a19ncmFiX2dldF9jdXJyZW50PQotCi1PU19fZ3RrX2dyYWJfcmVtb3ZlPQotT1NfX2d0a19ncmFiX3JlbW92ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX2hib3hfbmV3PQotT1NfX2d0a19oYm94X25ld18wPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a19oYm94X25ld18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfaHNjYWxlX25ldz0KLU9TX19ndGtfaHNjYWxlX25ld18wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a19oc2Nyb2xsYmFyX25ldz0KLU9TX19ndGtfaHNjcm9sbGJhcl9uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfaHNlcGFyYXRvcl9uZXc9Ci0KLU9TX19ndGtfaWNvbl9mYWN0b3J5X2xvb2t1cF9kZWZhdWx0PQotT1NfX2d0a19pY29uX2ZhY3RvcnlfbG9va3VwX2RlZmF1bHRfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uPQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl8wPWNhc3Q9KEd0a0ljb25TZXQgKikKLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMT1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19pY29uX3NldF9yZW5kZXJfaWNvbl8yPWNhc3Q9R3RrVGV4dERpcmVjdGlvbikKLU9TX19ndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fMz1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzQ9Y2FzdD0oR3RrSWNvblNpemUpCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX2ljb25fc2V0X3JlbmRlcl9pY29uXzY9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19fZ3RrX2ljb25fc291cmNlX2ZyZWU9Ci1PU19fZ3RrX2ljb25fc291cmNlX2ZyZWVfMD1jYXN0PUd0a0ljb25Tb3VyY2UgKgotCi1PU19fZ3RrX2ljb25fc291cmNlX25ldz0KLQotT1NfX2d0a19pY29uX3NvdXJjZV9zZXRfcGl4YnVmPQotT1NfX2d0a19pY29uX3NvdXJjZV9zZXRfcGl4YnVmXzA9Y2FzdD1HdGtJY29uU291cmNlICoKLU9TX19ndGtfaWNvbl9zb3VyY2Vfc2V0X3BpeGJ1Zl8xPWNhc3Q9R2RrUGl4YnVmICoKLQotT1NfX2d0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzcz0KLU9TX19ndGtfaW1fY29udGV4dF9maWx0ZXJfa2V5cHJlc3NfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLU9TX19ndGtfaW1fY29udGV4dF9maWx0ZXJfa2V5cHJlc3NfMT1jYXN0PShHZGtFdmVudEtleSAqKQotCi1PU19fZ3RrX2ltX2NvbnRleHRfZm9jdXNfaW49Ci1PU19fZ3RrX2ltX2NvbnRleHRfZm9jdXNfaW5fMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2ZvY3VzX291dD0KLU9TX19ndGtfaW1fY29udGV4dF9mb2N1c19vdXRfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZz0KLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMT1jYXN0PShnY2hhciAqKikKLU9TX19ndGtfaW1fY29udGV4dF9nZXRfcHJlZWRpdF9zdHJpbmdfMj1jYXN0PShQYW5nb0F0dHJMaXN0ICoqKQotT1NfX2d0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZ18zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X2dldF90eXBlPQotCi1PU19fZ3RrX2ltX2NvbnRleHRfcmVzZXQ9Ci1PU19fZ3RrX2ltX2NvbnRleHRfcmVzZXRfMD1jYXN0PShHdGtJTUNvbnRleHQgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jbGllbnRfd2luZG93PQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jbGllbnRfd2luZG93XzA9Y2FzdD0oR3RrSU1Db250ZXh0ICopCi1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2NsaWVudF93aW5kb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jdXJzb3JfbG9jYXRpb249Ci1PU19fZ3RrX2ltX2NvbnRleHRfc2V0X2N1cnNvcl9sb2NhdGlvbl8wPWNhc3Q9KEd0a0lNQ29udGV4dCAqKQotT1NfX2d0a19pbV9jb250ZXh0X3NldF9jdXJzb3JfbG9jYXRpb25fMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXM9Ci1PU19fZ3RrX2ltX211bHRpY29udGV4dF9hcHBlbmRfbWVudWl0ZW1zXzA9Y2FzdD0oR3RrSU1NdWx0aWNvbnRleHQgKikKLU9TX19ndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXNfMT1jYXN0PShHdGtNZW51U2hlbGwgKikKLQotT1NfX2d0a19pbV9tdWx0aWNvbnRleHRfbmV3PQotCi1PU19fZ3RrX2ltYWdlX21lbnVfaXRlbV9uZXdfd2l0aF9sYWJlbD0KLU9TX19ndGtfaW1hZ2VfbWVudV9pdGVtX25ld193aXRoX2xhYmVsXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlPQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlXzA9Y2FzdD0oR3RrSW1hZ2VNZW51SXRlbSAqKQotT1NfX2d0a19pbWFnZV9tZW51X2l0ZW1fc2V0X2ltYWdlXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfaW1hZ2VfbmV3PQotCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeGJ1Zj0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4YnVmXzA9Y2FzdD1HZGtQaXhidWYgKgotCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeG1hcD0KLU9TX19ndGtfaW1hZ2VfbmV3X2Zyb21fcGl4bWFwXzA9Y2FzdD0oR2RrUGl4bWFwICopCi1PU19fZ3RrX2ltYWdlX25ld19mcm9tX3BpeG1hcF8xPWNhc3Q9KEdka0JpdG1hcCAqKQotCi1PU19fZ3RrX2ltYWdlX3NldF9mcm9tX3BpeGJ1Zj0KLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmXzA9Y2FzdD0oR3RrSW1hZ2UgKikKLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmXzE9Y2FzdD0oR2RrUGl4YnVmICopCi0KLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwPQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXBfMD1jYXN0PShHdGtJbWFnZSAqKQotT1NfX2d0a19pbWFnZV9zZXRfZnJvbV9waXhtYXBfMT1jYXN0PShHZGtCaXRtYXAgKikKLU9TX19ndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwXzI9Y2FzdD0oR2RrQml0bWFwICopCi0KLU9TX19ndGtfaW5pdF9jaGVjaz0KLU9TX19ndGtfaW5pdF9jaGVja18wPWNhc3Q9KGludCAqKQotT1NfX2d0a19pbml0X2NoZWNrXzE9Y2FzdD0oY2hhciAqKiopCi0KLU9TX19ndGtfbGFiZWxfZ2V0X2xheW91dD0KLU9TX19ndGtfbGFiZWxfZ2V0X2xheW91dF8wPWNhc3Q9KEd0a0xhYmVsICopCi0KLU9TX19ndGtfbGFiZWxfZ2V0X21uZW1vbmljX2tleXZhbD0KLU9TX19ndGtfbGFiZWxfZ2V0X21uZW1vbmljX2tleXZhbF8wPWNhc3Q9R3RrTGFiZWwgKgotCi1PU19fZ3RrX2xhYmVsX25ldz0KLU9TX19ndGtfbGFiZWxfbmV3XzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19sYWJlbF9uZXdfd2l0aF9tbmVtb25pYz0KLU9TX19ndGtfbGFiZWxfbmV3X3dpdGhfbW5lbW9uaWNfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzPQotT1NfX2d0a19sYWJlbF9zZXRfYXR0cmlidXRlc18wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzXzE9Y2FzdD0oUGFuZ29BdHRyTGlzdCAqKQotCi1PU19fZ3RrX2xhYmVsX3NldF9qdXN0aWZ5PQotT1NfX2d0a19sYWJlbF9zZXRfanVzdGlmeV8wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF9qdXN0aWZ5XzE9Y2FzdD0oR3RrSnVzdGlmaWNhdGlvbikKLQotT1NfX2d0a19sYWJlbF9zZXRfbGluZV93cmFwPQotT1NfX2d0a19sYWJlbF9zZXRfbGluZV93cmFwXzA9Y2FzdD0oR3RrTGFiZWwgKikKLU9TX19ndGtfbGFiZWxfc2V0X2xpbmVfd3JhcF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSUk9Ci1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSUlfMD1jYXN0PShHdGtMYWJlbCAqKQotT1NfXzFndGtfMWxhYmVsXzFzZXRfMXRleHRfX0lJXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfXzFndGtfMWxhYmVsXzFzZXRfMXRleHRfX0lfM0I9Ci1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSV8zQl8wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fMWd0a18xbGFiZWxfMXNldF8xdGV4dF9fSV8zQl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pYz0KLU9TX19ndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pY18wPWNhc3Q9KEd0a0xhYmVsICopCi1PU19fZ3RrX2xhYmVsX3NldF90ZXh0X3dpdGhfbW5lbW9uaWNfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX2xpc3RfYXBwZW5kX2l0ZW1zPQotT1NfX2d0a19saXN0X2FwcGVuZF9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9hcHBlbmRfaXRlbXNfMT1jYXN0PShHTGlzdCAqKQotCi1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXM9Ci1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXNfMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfY2xlYXJfaXRlbXNfMT0KLU9TX19ndGtfbGlzdF9jbGVhcl9pdGVtc18yPQotCi1PU19fZ3RrX2xpc3RfaW5zZXJ0X2l0ZW1zPQotT1NfX2d0a19saXN0X2luc2VydF9pdGVtc18wPWNhc3Q9KEd0a0xpc3QgKikKLU9TX19ndGtfbGlzdF9pbnNlcnRfaXRlbXNfMT1jYXN0PShHTGlzdCAqKQotT1NfX2d0a19saXN0X2luc2VydF9pdGVtc18yPQotCi1PU19fZ3RrX2xpc3RfaXRlbV9uZXdfd2l0aF9sYWJlbD0KLU9TX19ndGtfbGlzdF9pdGVtX25ld193aXRoX2xhYmVsXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19saXN0X3JlbW92ZV9pdGVtcz0KLU9TX19ndGtfbGlzdF9yZW1vdmVfaXRlbXNfMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfcmVtb3ZlX2l0ZW1zXzE9Y2FzdD0oR0xpc3QgKikKLQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtPQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtXzA9Y2FzdD0oR3RrTGlzdCAqKQotT1NfX2d0a19saXN0X3NlbGVjdF9pdGVtXzE9Ci0KLU9TX19ndGtfbGlzdF9zdG9yZV9hcHBlbmQ9Ci1PU19fZ3RrX2xpc3Rfc3RvcmVfYXBwZW5kXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fZ3RrX2xpc3Rfc3RvcmVfYXBwZW5kXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a19saXN0X3N0b3JlX2NsZWFyPQotT1NfX2d0a19saXN0X3N0b3JlX2NsZWFyXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi0KLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnQ9Ci1PU19fZ3RrX2xpc3Rfc3RvcmVfaW5zZXJ0XzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fZ3RrX2xpc3Rfc3RvcmVfaW5zZXJ0XzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9pbnNlcnRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX2xpc3Rfc3RvcmVfbmV3dj0KLU9TX19ndGtfbGlzdF9zdG9yZV9uZXd2XzA9Y2FzdD0oZ2ludCkKLU9TX19ndGtfbGlzdF9zdG9yZV9uZXd2XzE9Y2FzdD0oR1R5cGUgKikKLQotT1NfX2d0a19saXN0X3N0b3JlX3JlbW92ZT0KLU9TX19ndGtfbGlzdF9zdG9yZV9yZW1vdmVfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX19ndGtfbGlzdF9zdG9yZV9yZW1vdmVfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUlfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSUlfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlJSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUlJXzQ9Ci0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKST0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKSV8wPWNhc3Q9KEd0a0xpc3RTdG9yZSAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlKSV8yPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUpJXzM9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJSklfND0KLQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzA9Y2FzdD0oR3RrTGlzdFN0b3JlICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzI9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfMz1mbGFncz1ub19vdXQKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV80PQotCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWkk9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWklfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJWklfMj0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlaSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSVpJXzQ9Ci0KLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfMD1jYXN0PShHdGtMaXN0U3RvcmUgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzFsaXN0XzFzdG9yZV8xc2V0X19JSUlfM0JJXzI9Ci1PU19fMWd0a18xbGlzdF8xc3RvcmVfMXNldF9fSUlJXzNCSV8zPQotT1NfXzFndGtfMWxpc3RfMXN0b3JlXzFzZXRfX0lJSV8zQklfND0KLQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2FsbD0KLU9TX19ndGtfbGlzdF91bnNlbGVjdF9hbGxfMD1jYXN0PShHdGtMaXN0ICopCi0KLU9TX19ndGtfbGlzdF91bnNlbGVjdF9pdGVtPQotT1NfX2d0a19saXN0X3Vuc2VsZWN0X2l0ZW1fMD1jYXN0PShHdGtMaXN0ICopCi1PU19fZ3RrX2xpc3RfdW5zZWxlY3RfaXRlbV8xPQotCi1PU19fZ3RrX21haW49Ci0KLU9TX19ndGtfbWFpbl9kb19ldmVudD0KLU9TX19ndGtfbWFpbl9kb19ldmVudF8wPWNhc3Q9KEdka0V2ZW50ICopCi0KLU9TX19ndGtfbWFpbl9pdGVyYXRpb249Ci0KLU9TX19ndGtfbWFqb3JfdmVyc2lvbj1mbGFncz1jb25zdAotCi1PU19fZ3RrX21lbnVfYmFyX25ldz0KLQotT1NfX2d0a19tZW51X2l0ZW1fcmVtb3ZlX3N1Ym1lbnU9Ci1PU19fZ3RrX21lbnVfaXRlbV9yZW1vdmVfc3VibWVudV8wPWNhc3Q9KEd0a01lbnVJdGVtICopCi0KLU9TX19ndGtfbWVudV9pdGVtX3NldF9zdWJtZW51PQotT1NfX2d0a19tZW51X2l0ZW1fc2V0X3N1Ym1lbnVfMD1jYXN0PShHdGtNZW51SXRlbSAqKQotT1NfX2d0a19tZW51X2l0ZW1fc2V0X3N1Ym1lbnVfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a19tZW51X25ldz0KLQotT1NfX2d0a19tZW51X3BvcGRvd249Ci1PU19fZ3RrX21lbnVfcG9wZG93bl8wPWNhc3Q9KEd0a01lbnUgKikKLQotT1NfX2d0a19tZW51X3BvcHVwPQotT1NfX2d0a19tZW51X3BvcHVwXzA9Y2FzdD0oR3RrTWVudSAqKQotT1NfX2d0a19tZW51X3BvcHVwXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX21lbnVfcG9wdXBfMj1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfbWVudV9wb3B1cF8zPWNhc3Q9KEd0a01lbnVQb3NpdGlvbkZ1bmMpCi1PU19fZ3RrX21lbnVfcG9wdXBfND1jYXN0PShncG9pbnRlcikKLU9TX19ndGtfbWVudV9wb3B1cF81PWNhc3Q9KGd1aW50KQotT1NfX2d0a19tZW51X3BvcHVwXzY9Y2FzdD0oZ3VpbnQzMikKLQotT1NfX2d0a19tZW51X3NoZWxsX2RlYWN0aXZhdGU9Ci1PU19fZ3RrX21lbnVfc2hlbGxfZGVhY3RpdmF0ZV8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotCi1PU19fZ3RrX21lbnVfc2hlbGxfaW5zZXJ0PQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19tZW51X3NoZWxsX2luc2VydF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbWVudV9zaGVsbF9zZWxlY3RfaXRlbT0KLU9TX19ndGtfbWVudV9zaGVsbF9zZWxlY3RfaXRlbV8wPWNhc3Q9KEd0a01lbnVTaGVsbCAqKQotT1NfX2d0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfbWVudV9zaGVsbF9zZXRfdGFrZV9mb2N1cz1mbGFncz1keW5hbWljCi1PU19fZ3RrX21lbnVfc2hlbGxfc2V0X3Rha2VfZm9jdXNfMD1jYXN0PShHdGtNZW51U2hlbGwgKikKLU9TX19ndGtfbWVudV9zaGVsbF9zZXRfdGFrZV9mb2N1c18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ldz0KLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3XzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ld18xPWNhc3Q9KEd0a0RpYWxvZ0ZsYWdzKQotT1NfX2d0a19tZXNzYWdlX2RpYWxvZ19uZXdfMj1jYXN0PShHdGtNZXNzYWdlVHlwZSkKLU9TX19ndGtfbWVzc2FnZV9kaWFsb2dfbmV3XzM9Y2FzdD0oR3RrQnV0dG9uc1R5cGUpCi1PU19fZ3RrX21lc3NhZ2VfZGlhbG9nX25ld180PWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfbWljcm9fdmVyc2lvbj1mbGFncz1jb25zdAotCi1PU19fZ3RrX21pbm9yX3ZlcnNpb249ZmxhZ3M9Y29uc3QKLQotT1NfX2d0a19taXNjX3NldF9hbGlnbm1lbnQ9Ci1PU19fZ3RrX21pc2Nfc2V0X2FsaWdubWVudF8wPWNhc3Q9KEd0a01pc2MgKikKLU9TX19ndGtfbWlzY19zZXRfYWxpZ25tZW50XzE9Y2FzdD0oZ2Zsb2F0KQotT1NfX2d0a19taXNjX3NldF9hbGlnbm1lbnRfMj1jYXN0PShnZmxvYXQpCi0KLU9TX19ndGtfbm90ZWJvb2tfZ2V0X2N1cnJlbnRfcGFnZT0KLU9TX19ndGtfbm90ZWJvb2tfZ2V0X2N1cnJlbnRfcGFnZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi0KLU9TX19ndGtfbm90ZWJvb2tfZ2V0X3Njcm9sbGFibGU9Ci1PU19fZ3RrX25vdGVib29rX2dldF9zY3JvbGxhYmxlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLQotT1NfX2d0a19ub3RlYm9va19pbnNlcnRfcGFnZT0KLU9TX19ndGtfbm90ZWJvb2tfaW5zZXJ0X3BhZ2VfMD1jYXN0PShHdGtOb3RlYm9vayAqKQotT1NfX2d0a19ub3RlYm9va19pbnNlcnRfcGFnZV8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19ub3RlYm9va19pbnNlcnRfcGFnZV8yPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19ub3RlYm9va19pbnNlcnRfcGFnZV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbm90ZWJvb2tfbmV3PQotCi1PU19fZ3RrX25vdGVib29rX3JlbW92ZV9wYWdlPQotT1NfX2d0a19ub3RlYm9va19yZW1vdmVfcGFnZV8wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX3JlbW92ZV9wYWdlXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19ub3RlYm9va19zZXRfY3VycmVudF9wYWdlPQotT1NfX2d0a19ub3RlYm9va19zZXRfY3VycmVudF9wYWdlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfc2V0X2N1cnJlbnRfcGFnZV8xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Njcm9sbGFibGU9Ci1PU19fZ3RrX25vdGVib29rX3NldF9zY3JvbGxhYmxlXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Njcm9sbGFibGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19ub3RlYm9va19zZXRfc2hvd190YWJzPQotT1NfX2d0a19ub3RlYm9va19zZXRfc2hvd190YWJzXzA9Y2FzdD0oR3RrTm90ZWJvb2sgKikKLU9TX19ndGtfbm90ZWJvb2tfc2V0X3Nob3dfdGFic18xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX25vdGVib29rX3NldF90YWJfcG9zPQotT1NfX2d0a19ub3RlYm9va19zZXRfdGFiX3Bvc18wPWNhc3Q9KEd0a05vdGVib29rICopCi1PU19fZ3RrX25vdGVib29rX3NldF90YWJfcG9zXzE9Y2FzdD0oR3RrUG9zaXRpb25UeXBlKQotCi1PU19fZ3RrX29iamVjdF9zaW5rPQotT1NfX2d0a19vYmplY3Rfc2lua18wPWNhc3Q9KEd0a09iamVjdCAqKQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X2JvdHRvbV9tYXJnaW49ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYWdlX3NldHVwX2dldF9ib3R0b21fbWFyZ2luXzA9Ci1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X2JvdHRvbV9tYXJnaW5fMT0KLQotT1NfX2d0a19wYWdlX3NldHVwX2dldF9sZWZ0X21hcmdpbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X2xlZnRfbWFyZ2luXzA9Ci1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X2xlZnRfbWFyZ2luXzE9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfb3JpZW50YXRpb249ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYWdlX3NldHVwX2dldF9vcmllbnRhdGlvbl8wPQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X3BhZ2VfaGVpZ2h0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFnZV9oZWlnaHRfMD0KLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFnZV9oZWlnaHRfMT0KLQotT1NfX2d0a19wYWdlX3NldHVwX2dldF9wYWdlX3dpZHRoPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFnZV93aWR0aF8wPQotT1NfX2d0a19wYWdlX3NldHVwX2dldF9wYWdlX3dpZHRoXzE9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFwZXJfaGVpZ2h0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFwZXJfaGVpZ2h0XzA9Ci1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X3BhcGVyX2hlaWdodF8xPQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X3BhcGVyX3NpemU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYWdlX3NldHVwX2dldF9wYXBlcl9zaXplXzA9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfcGFwZXJfd2lkdGg9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYWdlX3NldHVwX2dldF9wYXBlcl93aWR0aF8wPQotT1NfX2d0a19wYWdlX3NldHVwX2dldF9wYXBlcl93aWR0aF8xPQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X3JpZ2h0X21hcmdpbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfZ2V0X3JpZ2h0X21hcmdpbl8wPQotT1NfX2d0a19wYWdlX3NldHVwX2dldF9yaWdodF9tYXJnaW5fMT0KLQotT1NfX2d0a19wYWdlX3NldHVwX2dldF90b3BfbWFyZ2luPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFnZV9zZXR1cF9nZXRfdG9wX21hcmdpbl8wPQotT1NfX2d0a19wYWdlX3NldHVwX2dldF90b3BfbWFyZ2luXzE9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9uZXc9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X2JvdHRvbV9tYXJnaW49ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYWdlX3NldHVwX3NldF9ib3R0b21fbWFyZ2luXzA9Ci1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X2JvdHRvbV9tYXJnaW5fMT0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfYm90dG9tX21hcmdpbl8yPQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X2xlZnRfbWFyZ2luPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfbGVmdF9tYXJnaW5fMD0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfbGVmdF9tYXJnaW5fMT0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfbGVmdF9tYXJnaW5fMj0KLQotT1NfX2d0a19wYWdlX3NldHVwX3NldF9vcmllbnRhdGlvbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X29yaWVudGF0aW9uXzA9Ci1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X29yaWVudGF0aW9uXzE9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfcGFwZXJfc2l6ZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X3BhcGVyX3NpemVfMD0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfcGFwZXJfc2l6ZV8xPQotCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X3JpZ2h0X21hcmdpbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X3JpZ2h0X21hcmdpbl8wPQotT1NfX2d0a19wYWdlX3NldHVwX3NldF9yaWdodF9tYXJnaW5fMT0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfcmlnaHRfbWFyZ2luXzI9Ci0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfdG9wX21hcmdpbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhZ2Vfc2V0dXBfc2V0X3RvcF9tYXJnaW5fMD0KLU9TX19ndGtfcGFnZV9zZXR1cF9zZXRfdG9wX21hcmdpbl8xPQotT1NfX2d0a19wYWdlX3NldHVwX3NldF90b3BfbWFyZ2luXzI9Ci0KLU9TX19ndGtfcGFpbnRfYXJyb3c9Ci1PU19fZ3RrX3BhaW50X2Fycm93XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfYXJyb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfYXJyb3dfMj0KLU9TX19ndGtfcGFpbnRfYXJyb3dfMz0KLU9TX19ndGtfcGFpbnRfYXJyb3dfND0KLU9TX19ndGtfcGFpbnRfYXJyb3dfNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfYXJyb3dfNj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9hcnJvd183PQotT1NfX2d0a19wYWludF9hcnJvd184PQotT1NfX2d0a19wYWludF9hcnJvd185PQotT1NfX2d0a19wYWludF9hcnJvd18xMD0KLU9TX19ndGtfcGFpbnRfYXJyb3dfMTE9Ci1PU19fZ3RrX3BhaW50X2Fycm93XzEyPQotCi1PU19fZ3RrX3BhaW50X2JveD0KLU9TX19ndGtfcGFpbnRfYm94XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfYm94XzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ3RrX3BhaW50X2JveF8yPQotT1NfX2d0a19wYWludF9ib3hfMz0KLU9TX19ndGtfcGFpbnRfYm94XzQ9Ci1PU19fZ3RrX3BhaW50X2JveF81PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9ib3hfNj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9ib3hfNz0KLU9TX19ndGtfcGFpbnRfYm94Xzg9Ci1PU19fZ3RrX3BhaW50X2JveF85PQotT1NfX2d0a19wYWludF9ib3hfMTA9Ci0KLU9TX19ndGtfcGFpbnRfYm94X2dhcD0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3BhaW50X2JveF9nYXBfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfYm94X2dhcF8yPQotT1NfX2d0a19wYWludF9ib3hfZ2FwXzM9Ci1PU19fZ3RrX3BhaW50X2JveF9nYXBfND0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF81PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9ib3hfZ2FwXzY9Y2FzdD0oZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfYm94X2dhcF83PQotT1NfX2d0a19wYWludF9ib3hfZ2FwXzg9Ci1PU19fZ3RrX3BhaW50X2JveF9nYXBfOT0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF8xMD0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF8xMT0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF8xMj0KLU9TX19ndGtfcGFpbnRfYm94X2dhcF8xMz0KLQotT1NfX2d0a19wYWludF9jaGVjaz0KLU9TX19ndGtfcGFpbnRfY2hlY2tfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19wYWludF9jaGVja18xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF9jaGVja18yPQotT1NfX2d0a19wYWludF9jaGVja18zPQotT1NfX2d0a19wYWludF9jaGVja180PQotT1NfX2d0a19wYWludF9jaGVja181PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9jaGVja182PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X2NoZWNrXzc9Ci1PU19fZ3RrX3BhaW50X2NoZWNrXzg9Ci1PU19fZ3RrX3BhaW50X2NoZWNrXzk9Ci1PU19fZ3RrX3BhaW50X2NoZWNrXzEwPQotCi1PU19fZ3RrX3BhaW50X2V4cGFuZGVyPQotT1NfX2d0a19wYWludF9leHBhbmRlcl8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3BhaW50X2V4cGFuZGVyXzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ3RrX3BhaW50X2V4cGFuZGVyXzI9Ci1PU19fZ3RrX3BhaW50X2V4cGFuZGVyXzM9Ci1PU19fZ3RrX3BhaW50X2V4cGFuZGVyXzQ9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3BhaW50X2V4cGFuZGVyXzU9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfZXhwYW5kZXJfNj0KLU9TX19ndGtfcGFpbnRfZXhwYW5kZXJfNz0KLU9TX19ndGtfcGFpbnRfZXhwYW5kZXJfOD0KLQotT1NfX2d0a19wYWludF9leHRlbnNpb249Ci1PU19fZ3RrX3BhaW50X2V4dGVuc2lvbl8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3BhaW50X2V4dGVuc2lvbl8xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF9leHRlbnNpb25fMj0KLU9TX19ndGtfcGFpbnRfZXh0ZW5zaW9uXzM9Ci1PU19fZ3RrX3BhaW50X2V4dGVuc2lvbl80PQotT1NfX2d0a19wYWludF9leHRlbnNpb25fNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfZXh0ZW5zaW9uXzY9Y2FzdD0oZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfZXh0ZW5zaW9uXzc9Ci1PU19fZ3RrX3BhaW50X2V4dGVuc2lvbl84PQotT1NfX2d0a19wYWludF9leHRlbnNpb25fOT0KLU9TX19ndGtfcGFpbnRfZXh0ZW5zaW9uXzEwPQotT1NfX2d0a19wYWludF9leHRlbnNpb25fMTE9Ci0KLU9TX19ndGtfcGFpbnRfZmxhdF9ib3g9Ci1PU19fZ3RrX3BhaW50X2ZsYXRfYm94XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfMj0KLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfMz0KLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfND0KLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfZmxhdF9ib3hfNj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9mbGF0X2JveF83PQotT1NfX2d0a19wYWludF9mbGF0X2JveF84PQotT1NfX2d0a19wYWludF9mbGF0X2JveF85PQotT1NfX2d0a19wYWludF9mbGF0X2JveF8xMD0KLQotT1NfX2d0a19wYWludF9mb2N1cz0KLU9TX19ndGtfcGFpbnRfZm9jdXNfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19wYWludF9mb2N1c18xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF9mb2N1c18yPQotT1NfX2d0a19wYWludF9mb2N1c18zPWZsYWdzPW5vX291dAotT1NfX2d0a19wYWludF9mb2N1c180PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9mb2N1c181PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X2ZvY3VzXzY9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzc9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzg9Ci1PU19fZ3RrX3BhaW50X2ZvY3VzXzk9Ci0KLU9TX19ndGtfcGFpbnRfaGFuZGxlPQotT1NfX2d0a19wYWludF9oYW5kbGVfMD1jYXN0PUd0a1N0eWxlICoKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzE9Y2FzdD1HZGtXaW5kb3cgKgotT1NfX2d0a19wYWludF9oYW5kbGVfMj0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzM9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV80PWZsYWdzPW5vX291dAotT1NfX2d0a19wYWludF9oYW5kbGVfNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzY9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfaGFuZGxlXzc9Ci1PU19fZ3RrX3BhaW50X2hhbmRsZV84PQotT1NfX2d0a19wYWludF9oYW5kbGVfOT0KLU9TX19ndGtfcGFpbnRfaGFuZGxlXzEwPQotT1NfX2d0a19wYWludF9oYW5kbGVfMTE9Ci0KLU9TX19ndGtfcGFpbnRfaGxpbmU9Ci1PU19fZ3RrX3BhaW50X2hsaW5lXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfaGxpbmVfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfaGxpbmVfMj0KLU9TX19ndGtfcGFpbnRfaGxpbmVfMz0KLU9TX19ndGtfcGFpbnRfaGxpbmVfND1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfaGxpbmVfNT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9obGluZV82PQotT1NfX2d0a19wYWludF9obGluZV83PQotT1NfX2d0a19wYWludF9obGluZV84PQotCi1PU19fZ3RrX3BhaW50X2xheW91dD0KLU9TX19ndGtfcGFpbnRfbGF5b3V0XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfbGF5b3V0XzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ3RrX3BhaW50X2xheW91dF8yPQotT1NfX2d0a19wYWludF9sYXlvdXRfMz0KLU9TX19ndGtfcGFpbnRfbGF5b3V0XzQ9Ci1PU19fZ3RrX3BhaW50X2xheW91dF81PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9sYXlvdXRfNj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wYWludF9sYXlvdXRfNz0KLU9TX19ndGtfcGFpbnRfbGF5b3V0Xzg9Ci1PU19fZ3RrX3BhaW50X2xheW91dF85PWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fZ3RrX3BhaW50X29wdGlvbj0KLU9TX19ndGtfcGFpbnRfb3B0aW9uXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfb3B0aW9uXzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ3RrX3BhaW50X29wdGlvbl8yPQotT1NfX2d0a19wYWludF9vcHRpb25fMz0KLU9TX19ndGtfcGFpbnRfb3B0aW9uXzQ9Ci1PU19fZ3RrX3BhaW50X29wdGlvbl81PWNhc3Q9R3RrV2lkZ2V0ICoKLU9TX19ndGtfcGFpbnRfb3B0aW9uXzY9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfb3B0aW9uXzc9Ci1PU19fZ3RrX3BhaW50X29wdGlvbl84PQotT1NfX2d0a19wYWludF9vcHRpb25fOT0KLU9TX19ndGtfcGFpbnRfb3B0aW9uXzEwPQotCi1PU19fZ3RrX3BhaW50X3NoYWRvdz0KLU9TX19ndGtfcGFpbnRfc2hhZG93XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfcGFpbnRfc2hhZG93XzE9Y2FzdD0oR2RrV2luZG93ICopCi1PU19fZ3RrX3BhaW50X3NoYWRvd18yPQotT1NfX2d0a19wYWludF9zaGFkb3dfMz0KLU9TX19ndGtfcGFpbnRfc2hhZG93XzQ9Ci1PU19fZ3RrX3BhaW50X3NoYWRvd181PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9zaGFkb3dfNj1jYXN0PShnY2hhciAqKQotT1NfX2d0a19wYWludF9zaGFkb3dfNz0KLU9TX19ndGtfcGFpbnRfc2hhZG93Xzg9Ci1PU19fZ3RrX3BhaW50X3NoYWRvd185PQotT1NfX2d0a19wYWludF9zaGFkb3dfMTA9Ci0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcD0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3BhaW50X3NoYWRvd19nYXBfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8yPQotT1NfX2d0a19wYWludF9zaGFkb3dfZ2FwXzM9Ci1PU19fZ3RrX3BhaW50X3NoYWRvd19nYXBfND0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF81PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF9zaGFkb3dfZ2FwXzY9Y2FzdD0oZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF83PQotT1NfX2d0a19wYWludF9zaGFkb3dfZ2FwXzg9Ci1PU19fZ3RrX3BhaW50X3NoYWRvd19nYXBfOT0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8xMD0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8xMT0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8xMj0KLU9TX19ndGtfcGFpbnRfc2hhZG93X2dhcF8xMz0KLQotT1NfX2d0a19wYWludF9zbGlkZXI9Ci1PU19fZ3RrX3BhaW50X3NsaWRlcl8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3BhaW50X3NsaWRlcl8xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF9zbGlkZXJfMj0KLU9TX19ndGtfcGFpbnRfc2xpZGVyXzM9Ci1PU19fZ3RrX3BhaW50X3NsaWRlcl80PQotT1NfX2d0a19wYWludF9zbGlkZXJfNT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfcGFpbnRfc2xpZGVyXzY9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfcGFpbnRfc2xpZGVyXzc9Ci1PU19fZ3RrX3BhaW50X3NsaWRlcl84PQotT1NfX2d0a19wYWludF9zbGlkZXJfOT0KLU9TX19ndGtfcGFpbnRfc2xpZGVyXzEwPQotT1NfX2d0a19wYWludF9zbGlkZXJfMTE9Ci0KLU9TX19ndGtfcGFpbnRfdGFiPQotT1NfX2d0a19wYWludF90YWJfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19wYWludF90YWJfMT1jYXN0PShHZGtXaW5kb3cgKikKLU9TX19ndGtfcGFpbnRfdGFiXzI9Ci1PU19fZ3RrX3BhaW50X3RhYl8zPQotT1NfX2d0a19wYWludF90YWJfND0KLU9TX19ndGtfcGFpbnRfdGFiXzU9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3BhaW50X3RhYl82PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X3RhYl83PQotT1NfX2d0a19wYWludF90YWJfOD0KLU9TX19ndGtfcGFpbnRfdGFiXzk9Ci1PU19fZ3RrX3BhaW50X3RhYl8xMD0KLQotT1NfX2d0a19wYWludF92bGluZT0KLU9TX19ndGtfcGFpbnRfdmxpbmVfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19wYWludF92bGluZV8xPWNhc3Q9KEdka1dpbmRvdyAqKQotT1NfX2d0a19wYWludF92bGluZV8yPQotT1NfX2d0a19wYWludF92bGluZV8zPQotT1NfX2d0a19wYWludF92bGluZV80PWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a19wYWludF92bGluZV81PWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3BhaW50X3ZsaW5lXzY9Ci1PU19fZ3RrX3BhaW50X3ZsaW5lXzc9Ci1PU19fZ3RrX3BhaW50X3ZsaW5lXzg9Ci0KLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfZGlzcGxheV9uYW1lPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfZGlzcGxheV9uYW1lXzA9Ci0KLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfaGVpZ2h0PWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfaGVpZ2h0XzA9Ci1PU19fZ3RrX3BhcGVyX3NpemVfZ2V0X2hlaWdodF8xPQotCi1PU19fZ3RrX3BhcGVyX3NpemVfZ2V0X25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYXBlcl9zaXplX2dldF9uYW1lXzA9Ci0KLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfcHBkX25hbWU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYXBlcl9zaXplX2dldF9wcGRfbmFtZV8wPQotCi1PU19fZ3RrX3BhcGVyX3NpemVfZ2V0X3dpZHRoPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfd2lkdGhfMD0KLU9TX19ndGtfcGFwZXJfc2l6ZV9nZXRfd2lkdGhfMT0KLQotT1NfX2d0a19wYXBlcl9zaXplX2lzX2N1c3RvbT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhcGVyX3NpemVfaXNfY3VzdG9tXzA9Ci0KLU9TX19ndGtfcGFwZXJfc2l6ZV9uZXc9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wYXBlcl9zaXplX25ld18wPQotCi1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2N1c3RvbT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2N1c3RvbV8wPQotT1NfX2d0a19wYXBlcl9zaXplX25ld19jdXN0b21fMT0KLU9TX19ndGtfcGFwZXJfc2l6ZV9uZXdfY3VzdG9tXzI9Ci1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2N1c3RvbV8zPQotT1NfX2d0a19wYXBlcl9zaXplX25ld19jdXN0b21fND0KLQotT1NfX2d0a19wYXBlcl9zaXplX25ld19mcm9tX3BwZD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2Zyb21fcHBkXzA9Ci1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2Zyb21fcHBkXzE9Ci1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2Zyb21fcHBkXzI9Ci1PU19fZ3RrX3BhcGVyX3NpemVfbmV3X2Zyb21fcHBkXzM9Ci0KLU9TX19ndGtfcGx1Z19nZXRfaWQ9Ci1PU19fZ3RrX3BsdWdfZ2V0X2lkXzA9Y2FzdD0oR3RrUGx1ZyAqKQotCi1PU19fZ3RrX3BsdWdfbmV3PQotT1NfX2d0a19wbHVnX25ld18wPQotCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfcHJpbnRlcj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfcHJpbnRlcl8wPQotCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfc2V0dGluZ3M9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9qb2JfZ2V0X3NldHRpbmdzXzA9Ci0KLU9TX19ndGtfcHJpbnRfam9iX2dldF9zdGF0dXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9qb2JfZ2V0X3N0YXR1c18wPQotCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfc3VyZmFjZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfc3VyZmFjZV8wPQotT1NfX2d0a19wcmludF9qb2JfZ2V0X3N1cmZhY2VfMT1jYXN0PUdFcnJvciAqKgotCi1PU19fZ3RrX3ByaW50X2pvYl9nZXRfdGl0bGU9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9qb2JfZ2V0X3RpdGxlXzA9Ci0KLU9TX19ndGtfcHJpbnRfam9iX25ldz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X2pvYl9uZXdfMD1jYXN0PWNvbnN0IGdjaGFyICoKLU9TX19ndGtfcHJpbnRfam9iX25ld18xPQotT1NfX2d0a19wcmludF9qb2JfbmV3XzI9Ci1PU19fZ3RrX3ByaW50X2pvYl9uZXdfMz0KLQotT1NfX2d0a19wcmludF9qb2Jfc2VuZD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X2pvYl9zZW5kXzA9Ci1PU19fZ3RrX3ByaW50X2pvYl9zZW5kXzE9Ci1PU19fZ3RrX3ByaW50X2pvYl9zZW5kXzI9Y2FzdD1ncG9pbnRlcgotT1NfX2d0a19wcmludF9qb2Jfc2VuZF8zPWNhc3Q9R0Rlc3Ryb3lOb3RpZnkKLQotT1NfX2d0a19wcmludF9qb2Jfc2V0X3NvdXJjZV9maWxlPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfam9iX3NldF9zb3VyY2VfZmlsZV8wPQotT1NfX2d0a19wcmludF9qb2Jfc2V0X3NvdXJjZV9maWxlXzE9Y2FzdD1jb25zdCBnY2hhciAqCi1PU19fZ3RrX3ByaW50X2pvYl9zZXRfc291cmNlX2ZpbGVfMj1jYXN0PUdFcnJvciAqKgotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2ZvcmVhY2g9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19mb3JlYWNoXzA9Ci1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2ZvcmVhY2hfMT0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZm9yZWFjaF8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldF8wPQotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldF9jb2xsYXRlPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X2NvbGxhdGVfMD0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfbl9jb3BpZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfbl9jb3BpZXNfMD0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfb3JpZW50YXRpb249ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfb3JpZW50YXRpb25fMD0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcGFnZV9yYW5nZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcGFnZV9yYW5nZXNfMD0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3BhZ2VfcmFuZ2VzXzE9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldF9wYXBlcl9oZWlnaHQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcGFwZXJfaGVpZ2h0XzA9Ci1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldF9wYXBlcl9oZWlnaHRfMT0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcGFwZXJfd2lkdGg9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcGFwZXJfd2lkdGhfMD0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3BhcGVyX3dpZHRoXzE9Ci0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3ByaW50X3BhZ2VzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3ByaW50X3BhZ2VzXzA9Ci0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3ByaW50ZXI9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19nZXRfcHJpbnRlcl8wPQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX2dldF9yZXNvbHV0aW9uPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfc2V0dGluZ3NfZ2V0X3Jlc29sdXRpb25fMD0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19uZXc9ZmxhZ3M9ZHluYW1pYwotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF8wPQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfMT1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfMj1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9jb2xsYXRlPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X2NvbGxhdGVfMD0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X2NvbGxhdGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfbl9jb3BpZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfbl9jb3BpZXNfMD0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X25fY29waWVzXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfb3JpZW50YXRpb249ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfb3JpZW50YXRpb25fMD0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X29yaWVudGF0aW9uXzE9Ci0KLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X3BhZ2VfcmFuZ2VzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfc2V0dGluZ3Nfc2V0X3BhZ2VfcmFuZ2VzXzA9Ci1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9wYWdlX3Jhbmdlc18xPQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfcGFnZV9yYW5nZXNfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9wcmludF9wYWdlcz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9wcmludF9wYWdlc18wPQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfcHJpbnRfcGFnZXNfMT0KLQotT1NfX2d0a19wcmludF9zZXR0aW5nc19zZXRfcHJpbnRlcj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9wcmludGVyXzA9Ci1PU19fZ3RrX3ByaW50X3NldHRpbmdzX3NldF9wcmludGVyXzE9Ci0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfZ2V0X2N1cnJlbnRfcGFnZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX2dldF9jdXJyZW50X3BhZ2VfMD0KLQotT1NfX2d0a19wcmludF91bml4X2RpYWxvZ19nZXRfcGFnZV9zZXR1cD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX2dldF9wYWdlX3NldHVwXzA9Ci0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfZ2V0X3NlbGVjdGVkX3ByaW50ZXI9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludF91bml4X2RpYWxvZ19nZXRfc2VsZWN0ZWRfcHJpbnRlcl8wPQotCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX2dldF9zZXR0aW5ncz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX2dldF9zZXR0aW5nc18wPQotCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX25ldz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX25ld18wPWNhc3Q9Y29uc3QgZ2NoYXIgKgotT1NfX2d0a19wcmludF91bml4X2RpYWxvZ19uZXdfMT1jYXN0PUd0a1dpbmRvdyAqCi0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X2N1cnJlbnRfcGFnZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX3NldF9jdXJyZW50X3BhZ2VfMD0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X2N1cnJlbnRfcGFnZV8xPWNhc3Q9Z2ludAotCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX3NldF9tYW51YWxfY2FwYWJpbGl0aWVzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X21hbnVhbF9jYXBhYmlsaXRpZXNfMD0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X21hbnVhbF9jYXBhYmlsaXRpZXNfMT0KLQotT1NfX2d0a19wcmludF91bml4X2RpYWxvZ19zZXRfcGFnZV9zZXR1cD1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX3NldF9wYWdlX3NldHVwXzA9Ci1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX3NldF9wYWdlX3NldHVwXzE9Ci0KLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X3NldHRpbmdzPWZsYWdzPWR5bmFtaWMKLU9TX19ndGtfcHJpbnRfdW5peF9kaWFsb2dfc2V0X3NldHRpbmdzXzA9Ci1PU19fZ3RrX3ByaW50X3VuaXhfZGlhbG9nX3NldF9zZXR0aW5nc18xPQotCi1PU19fZ3RrX3ByaW50ZXJfZ2V0X2JhY2tlbmQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludGVyX2dldF9iYWNrZW5kXzA9Ci0KLU9TX19ndGtfcHJpbnRlcl9nZXRfbmFtZT1mbGFncz1keW5hbWljCi1PU19fZ3RrX3ByaW50ZXJfZ2V0X25hbWVfMD0KLQotT1NfX2d0a19wcmludGVyX2lzX2RlZmF1bHQ9ZmxhZ3M9ZHluYW1pYwotT1NfX2d0a19wcmludGVyX2lzX2RlZmF1bHRfMD0KLQotT1NfX2d0a19wcm9ncmVzc19iYXJfbmV3PQotCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9wdWxzZT0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3B1bHNlXzA9Y2FzdD0oR3RrUHJvZ3Jlc3NCYXIgKikKLQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X2ZyYWN0aW9uPQotT1NfX2d0a19wcm9ncmVzc19iYXJfc2V0X2ZyYWN0aW9uXzA9Y2FzdD0oR3RrUHJvZ3Jlc3NCYXIgKikKLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9mcmFjdGlvbl8xPWNhc3Q9KGdkb3VibGUpCi0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbj0KLU9TX19ndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbl8wPWNhc3Q9KEd0a1Byb2dyZXNzQmFyICopCi1PU19fZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfb3JpZW50YXRpb25fMT1jYXN0PShHdGtQcm9ncmVzc0Jhck9yaWVudGF0aW9uKQotCi1PU19fZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXA9Ci1PU19fZ3RrX3JhZGlvX2J1dHRvbl9nZXRfZ3JvdXBfMD1jYXN0PShHdGtSYWRpb0J1dHRvbiAqKQotCi1PU19fZ3RrX3JhZGlvX2J1dHRvbl9uZXc9Ci1PU19fZ3RrX3JhZGlvX2J1dHRvbl9uZXdfMD1jYXN0PShHU0xpc3QgKikKLQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fZ2V0X2dyb3VwPQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fZ2V0X2dyb3VwXzA9Y2FzdD1HdGtSYWRpb01lbnVJdGVtICoKLQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3PQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3XzA9Y2FzdD0oR1NMaXN0ICopCi0KLU9TX19ndGtfcmFkaW9fbWVudV9pdGVtX25ld193aXRoX2xhYmVsPQotT1NfX2d0a19yYWRpb19tZW51X2l0ZW1fbmV3X3dpdGhfbGFiZWxfMD1jYXN0PShHU0xpc3QgKikKLU9TX19ndGtfcmFkaW9fbWVudV9pdGVtX25ld193aXRoX2xhYmVsXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19yYW5nZV9nZXRfYWRqdXN0bWVudD0KLU9TX19ndGtfcmFuZ2VfZ2V0X2FkanVzdG1lbnRfMD1jYXN0PShHdGtSYW5nZSAqKQotCi1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzPQotT1NfX2d0a19yYW5nZV9zZXRfaW5jcmVtZW50c18wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzXzE9Ci1PU19fZ3RrX3JhbmdlX3NldF9pbmNyZW1lbnRzXzI9Ci0KLU9TX19ndGtfcmFuZ2Vfc2V0X2ludmVydGVkPQotT1NfX2d0a19yYW5nZV9zZXRfaW52ZXJ0ZWRfMD1jYXN0PShHdGtSYW5nZSAqKQotT1NfX2d0a19yYW5nZV9zZXRfaW52ZXJ0ZWRfMT0KLQotT1NfX2d0a19yYW5nZV9zZXRfcmFuZ2U9Ci1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZV8wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF9yYW5nZV8xPQotT1NfX2d0a19yYW5nZV9zZXRfcmFuZ2VfMj0KLQotT1NfX2d0a19yYW5nZV9zZXRfdmFsdWU9Ci1PU19fZ3RrX3JhbmdlX3NldF92YWx1ZV8wPWNhc3Q9KEd0a1JhbmdlICopCi1PU19fZ3RrX3JhbmdlX3NldF92YWx1ZV8xPQotCi1PU19fZ3RrX3JjX3BhcnNlX3N0cmluZz0KLU9TX19ndGtfcmNfcGFyc2Vfc3RyaW5nXzA9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a19yY19zdHlsZV9nZXRfYmdfcGl4bWFwX25hbWU9Ci1PU19fZ3RrX3JjX3N0eWxlX2dldF9iZ19waXhtYXBfbmFtZV8wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2JnX3BpeG1hcF9uYW1lXzE9Ci0KLU9TX19ndGtfcmNfc3R5bGVfZ2V0X2NvbG9yX2ZsYWdzPQotT1NfX2d0a19yY19zdHlsZV9nZXRfY29sb3JfZmxhZ3NfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX2dldF9jb2xvcl9mbGFnc18xPQotCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZz0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnXzA9Y2FzdD0oR3RrUmNTdHlsZSAqKQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfMT0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnXzI9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2JnX3BpeG1hcF9uYW1lPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfcGl4bWFwX25hbWVfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9iZ19waXhtYXBfbmFtZV8xPQotT1NfX2d0a19yY19zdHlsZV9zZXRfYmdfcGl4bWFwX25hbWVfMj1jYXN0PShjaGFyICopCi0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X2NvbG9yX2ZsYWdzPQotT1NfX2d0a19yY19zdHlsZV9zZXRfY29sb3JfZmxhZ3NfMD1jYXN0PShHdGtSY1N0eWxlICopCi1PU19fZ3RrX3JjX3N0eWxlX3NldF9jb2xvcl9mbGFnc18xPQotT1NfX2d0a19yY19zdHlsZV9zZXRfY29sb3JfZmxhZ3NfMj0KLQotT1NfX2d0a19yY19zdHlsZV9zZXRfZmc9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9mZ18wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfc2V0X2ZnXzE9Ci1PU19fZ3RrX3JjX3N0eWxlX3NldF9mZ18yPWZsYWdzPW5vX291dAotCi1PU19fZ3RrX3JjX3N0eWxlX3NldF90ZXh0PQotT1NfX2d0a19yY19zdHlsZV9zZXRfdGV4dF8wPWNhc3Q9KEd0a1JjU3R5bGUgKikKLU9TX19ndGtfcmNfc3R5bGVfc2V0X3RleHRfMT0KLU9TX19ndGtfcmNfc3R5bGVfc2V0X3RleHRfMj1mbGFncz1ub19vdXQKLQotT1NfX2d0a19zY2FsZV9zZXRfZGlnaXRzPQotT1NfX2d0a19zY2FsZV9zZXRfZGlnaXRzXzA9Y2FzdD0oR3RrU2NhbGUgKikKLU9TX19ndGtfc2NhbGVfc2V0X2RpZ2l0c18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWU9Ci1PU19fZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlXzA9Y2FzdD0oR3RrU2NhbGUgKikKLU9TX19ndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfYWRkX3dpdGhfdmlld3BvcnQ9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19hZGRfd2l0aF92aWV3cG9ydF8wPWNhc3Q9R3RrU2Nyb2xsZWRXaW5kb3cgKgotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfYWRkX3dpdGhfdmlld3BvcnRfMT1jYXN0PUd0a1dpZGdldCAqCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9oYWRqdXN0bWVudD0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9oYWRqdXN0bWVudF8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9wb2xpY3k9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfcG9saWN5XzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X2dldF9wb2xpY3lfMT1jYXN0PShHdGtQb2xpY3lUeXBlICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfcG9saWN5XzI9Y2FzdD0oR3RrUG9saWN5VHlwZSAqKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfc2hhZG93X3R5cGU9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfc2hhZG93X3R5cGVfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfdmFkanVzdG1lbnQ9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19nZXRfdmFkanVzdG1lbnRfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19uZXc9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19uZXdfMT1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wbGFjZW1lbnQ9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcGxhY2VtZW50XzA9Y2FzdD0oR3RrU2Nyb2xsZWRXaW5kb3cgKikKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wbGFjZW1lbnRfMT1jYXN0PShHdGtDb3JuZXJUeXBlKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcG9saWN5PQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3BvbGljeV8wPWNhc3Q9KEd0a1Njcm9sbGVkV2luZG93ICopCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfcG9saWN5XzE9Y2FzdD0oR3RrUG9saWN5VHlwZSkKLU9TX19ndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3lfMj1jYXN0PShHdGtQb2xpY3lUeXBlKQotCi1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfc2hhZG93X3R5cGU9Ci1PU19fZ3RrX3Njcm9sbGVkX3dpbmRvd19zZXRfc2hhZG93X3R5cGVfMD1jYXN0PShHdGtTY3JvbGxlZFdpbmRvdyAqKQotT1NfX2d0a19zY3JvbGxlZF93aW5kb3dfc2V0X3NoYWRvd190eXBlXzE9Y2FzdD0oR3RrU2hhZG93VHlwZSkKLQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9mcmVlPQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9mcmVlXzA9Y2FzdD0oR3RrU2VsZWN0aW9uRGF0YSAqKQotCi1PU19fZ3RrX3NlbGVjdGlvbl9kYXRhX3NldD0KLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0XzA9Y2FzdD0oR3RrU2VsZWN0aW9uRGF0YSAqKQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXRfMT1jYXN0PShHZGtBdG9tKQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXRfMj1jYXN0PShnaW50KQotT1NfX2d0a19zZWxlY3Rpb25fZGF0YV9zZXRfMz1jYXN0PShjb25zdCBndWNoYXIgKikKLU9TX19ndGtfc2VsZWN0aW9uX2RhdGFfc2V0XzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a19zZXBhcmF0b3JfbWVudV9pdGVtX25ldz0KLQotT1NfX2d0a19zZXRfbG9jYWxlPQotCi1PU19fZ3RrX3NldHRpbmdzX2dldF9kZWZhdWx0PQotCi1PU19fZ3RrX3NvY2tldF9nZXRfaWQ9Ci1PU19fZ3RrX3NvY2tldF9nZXRfaWRfMD1jYXN0PUd0a1NvY2tldCAqCi0KLU9TX19ndGtfc29ja2V0X25ldz0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9nZXRfYWRqdXN0bWVudD0KLU9TX19ndGtfc3Bpbl9idXR0b25fZ2V0X2FkanVzdG1lbnRfMD1jYXN0PUd0a1NwaW5CdXR0b24qCi0KLU9TX19ndGtfc3Bpbl9idXR0b25fZ2V0X2RpZ2l0cz0KLU9TX19ndGtfc3Bpbl9idXR0b25fZ2V0X2RpZ2l0c18wPWNhc3Q9R3RrU3BpbkJ1dHRvbioKLQotT1NfX2d0a19zcGluX2J1dHRvbl9uZXc9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX25ld18wPWNhc3Q9R3RrQWRqdXN0bWVudCAqCi1PU19fZ3RrX3NwaW5fYnV0dG9uX25ld18xPQotT1NfX2d0a19zcGluX2J1dHRvbl9uZXdfMj0KLQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfZGlnaXRzPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfZGlnaXRzXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfZGlnaXRzXzE9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X2luY3JlbWVudHM9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9pbmNyZW1lbnRzXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfaW5jcmVtZW50c18xPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfaW5jcmVtZW50c18yPQotCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF9yYW5nZT0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3JhbmdlXzA9Y2FzdD1HdGtTcGluQnV0dG9uKgotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfcmFuZ2VfMT0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3JhbmdlXzI9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3ZhbHVlPQotT1NfX2d0a19zcGluX2J1dHRvbl9zZXRfdmFsdWVfMD1jYXN0PShHdGtTcGluQnV0dG9uKikKLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3ZhbHVlXzE9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fc2V0X3dyYXA9Ci1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF93cmFwXzA9Y2FzdD0oR3RrU3BpbkJ1dHRvbiopCi1PU19fZ3RrX3NwaW5fYnV0dG9uX3NldF93cmFwXzE9Ci0KLU9TX19ndGtfc3Bpbl9idXR0b25fdXBkYXRlPQotT1NfX2d0a19zcGluX2J1dHRvbl91cGRhdGVfMD1jYXN0PShHdGtTcGluQnV0dG9uKikKLQotT1NfX2d0a19zdHlsZV9nZXRfYmFzZT0KLU9TX19ndGtfc3R5bGVfZ2V0X2Jhc2VfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfYmFzZV8xPQotT1NfX2d0a19zdHlsZV9nZXRfYmFzZV8yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2JnPQotT1NfX2d0a19zdHlsZV9nZXRfYmdfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfYmdfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X2JnXzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfYmdfZ2M9Ci1PU19fZ3RrX3N0eWxlX2dldF9iZ19nY18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9iZ19nY18xPQotT1NfX2d0a19zdHlsZV9nZXRfYmdfZ2NfMj1jYXN0PShHZGtHQyAqKiksZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfYmxhY2s9Ci1PU19fZ3RrX3N0eWxlX2dldF9ibGFja18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9ibGFja18xPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2JsYWNrX2djPQotT1NfX2d0a19zdHlsZV9nZXRfYmxhY2tfZ2NfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfYmxhY2tfZ2NfMT1jYXN0PShHZGtHQyAqKiksZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfZGFyaz0KLU9TX19ndGtfc3R5bGVfZ2V0X2RhcmtfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfZGFya18xPQotT1NfX2d0a19zdHlsZV9nZXRfZGFya18yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2RhcmtfZ2M9Ci1PU19fZ3RrX3N0eWxlX2dldF9kYXJrX2djXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2RhcmtfZ2NfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X2RhcmtfZ2NfMj1jYXN0PShHZGtHQyAqKiksZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfZmc9Ci1PU19fZ3RrX3N0eWxlX2dldF9mZ18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9mZ18xPQotT1NfX2d0a19zdHlsZV9nZXRfZmdfMj1mbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9mZ19nYz0KLU9TX19ndGtfc3R5bGVfZ2V0X2ZnX2djXzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2ZnX2djXzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9mZ19nY18yPWNhc3Q9KEdka0dDICoqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3N0eWxlX2dldF9mb250X2Rlc2M9Ci1PU19fZ3RrX3N0eWxlX2dldF9mb250X2Rlc2NfMD1jYXN0PShHdGtTdHlsZSAqKQotCi1PU19fZ3RrX3N0eWxlX2dldF9saWdodD0KLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0XzA9Y2FzdD0oR3RrU3R5bGUgKikKLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0XzE9Ci1PU19fZ3RrX3N0eWxlX2dldF9saWdodF8yPWZsYWdzPW5vX2luCi0KLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0X2djPQotT1NfX2d0a19zdHlsZV9nZXRfbGlnaHRfZ2NfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfbGlnaHRfZ2NfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X2xpZ2h0X2djXzI9Y2FzdD0oR2RrR0MgKiopCi0KLU9TX19ndGtfc3R5bGVfZ2V0X21pZF9nYz0KLU9TX19ndGtfc3R5bGVfZ2V0X21pZF9nY18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF9taWRfZ2NfMT0KLU9TX19ndGtfc3R5bGVfZ2V0X21pZF9nY18yPWNhc3Q9KEdka0dDICoqKQotCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0PQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF8wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0XzE9Ci1PU19fZ3RrX3N0eWxlX2dldF90ZXh0XzI9ZmxhZ3M9bm9faW4KLQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF9hYV9nYz0KLU9TX19ndGtfc3R5bGVfZ2V0X3RleHRfYWFfZ2NfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF9hYV9nY18xPQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF9hYV9nY18yPWNhc3Q9KEdka0dDICoqKQotCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0X2djPQotT1NfX2d0a19zdHlsZV9nZXRfdGV4dF9nY18wPWNhc3Q9KEd0a1N0eWxlICopCi1PU19fZ3RrX3N0eWxlX2dldF90ZXh0X2djXzE9Ci1PU19fZ3RrX3N0eWxlX2dldF90ZXh0X2djXzI9Y2FzdD0oR2RrR0MgKiopCi0KLU9TX19ndGtfc3R5bGVfZ2V0X3doaXRlX2djPQotT1NfX2d0a19zdHlsZV9nZXRfd2hpdGVfZ2NfMD1jYXN0PShHdGtTdHlsZSAqKQotT1NfX2d0a19zdHlsZV9nZXRfd2hpdGVfZ2NfMT1jYXN0PShHZGtHQyAqKikKLQotT1NfX2d0a19zdHlsZV9nZXRfeHRoaWNrbmVzcz0KLU9TX19ndGtfc3R5bGVfZ2V0X3h0aGlja25lc3NfMD1jYXN0PShHdGtTdHlsZSAqKQotCi1PU19fZ3RrX3N0eWxlX2dldF95dGhpY2tuZXNzPQotT1NfX2d0a19zdHlsZV9nZXRfeXRoaWNrbmVzc18wPWNhc3Q9KEd0a1N0eWxlICopCi0KLU9TX19ndGtfc3R5bGVfcmVuZGVyX2ljb249Ci1PU19fZ3RrX3N0eWxlX3JlbmRlcl9pY29uXzA9Y2FzdD1HdGtTdHlsZSAqCi1PU19fZ3RrX3N0eWxlX3JlbmRlcl9pY29uXzE9Y2FzdD1HdGtJY29uU291cmNlICoKLU9TX19ndGtfc3R5bGVfcmVuZGVyX2ljb25fMj0KLU9TX19ndGtfc3R5bGVfcmVuZGVyX2ljb25fMz0KLU9TX19ndGtfc3R5bGVfcmVuZGVyX2ljb25fND0KLU9TX19ndGtfc3R5bGVfcmVuZGVyX2ljb25fNT1jYXN0PUd0a1dpZGdldCAqCi1PU19fZ3RrX3N0eWxlX3JlbmRlcl9pY29uXzY9Y2FzdD1jb25zdCBnY2hhciAqCi0KLU9TX19ndGtfdGFyZ2V0X2xpc3RfbmV3PQotT1NfX2d0a190YXJnZXRfbGlzdF9uZXdfMD1jYXN0PShjb25zdCBHdGtUYXJnZXRFbnRyeSAqKQotT1NfX2d0a190YXJnZXRfbGlzdF9uZXdfMT1jYXN0PShndWludCkKLQotT1NfX2d0a190YXJnZXRfbGlzdF91bnJlZj0KLU9TX19ndGtfdGFyZ2V0X2xpc3RfdW5yZWZfMD1jYXN0PShHdGtUYXJnZXRMaXN0ICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfY29weV9jbGlwYm9hcmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2NvcHlfY2xpcGJvYXJkXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9jb3B5X2NsaXBib2FyZF8xPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2N1dF9jbGlwYm9hcmRfMT1jYXN0PShHdGtDbGlwYm9hcmQgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfY3V0X2NsaXBib2FyZF8yPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZT0KLU9TX19ndGtfdGV4dF9idWZmZXJfZGVsZXRlXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9kZWxldGVfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9kZWxldGVfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHM9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHNfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9ib3VuZHNfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzXzI9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfY2hhcl9jb3VudD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2NoYXJfY291bnRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXJfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcl8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2luc2VydD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2luc2VydF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9saW5lXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbGluZV8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFyaz0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFya18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfbWFya18xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X21hcmtfMj1jYXN0PShHdGtUZXh0TWFyayAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9pdGVyX2F0X29mZnNldD0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X2l0ZXJfYXRfb2Zmc2V0XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9vZmZzZXRfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfaXRlcl9hdF9vZmZzZXRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9saW5lX2NvdW50PQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfbGluZV9jb3VudF8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kXzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF9zZWxlY3Rpb25fYm91bmRzPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kc18wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3NlbGVjdGlvbl9ib3VuZHNfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfc2VsZWN0aW9uX2JvdW5kc18yPWNhc3Q9KEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHQ9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF90ZXh0XzA9Y2FzdD0oR3RrVGV4dEJ1ZmZlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9nZXRfdGV4dF8xPWNhc3Q9KEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX2dldF90ZXh0XzI9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfZ2V0X3RleHRfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JSV8zQkk9Ci1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lJXzNCSV8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzI9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSUlfM0JJXzM9Y2FzdD0oZ2ludCkKLQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCST0KLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSV8zQl8zQklfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fMWd0a18xdGV4dF8xYnVmZmVyXzFpbnNlcnRfX0lfM0JfM0JJXzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX18xZ3RrXzF0ZXh0XzFidWZmZXJfMWluc2VydF9fSV8zQl8zQklfMj1jYXN0PShjb25zdCBnY2hhciAqKQotT1NfXzFndGtfMXRleHRfMWJ1ZmZlcl8xaW5zZXJ0X19JXzNCXzNCSV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfbW92ZV9tYXJrPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9tb3ZlX21hcmtfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX21vdmVfbWFya18xPWNhc3Q9KEd0a1RleHRNYXJrICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX21vdmVfbWFya18yPWNhc3Q9KGNvbnN0IEd0a1RleHRJdGVyICopCi0KLU9TX19ndGtfdGV4dF9idWZmZXJfcGFzdGVfY2xpcGJvYXJkPQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3Bhc3RlX2NsaXBib2FyZF8xPWNhc3Q9KEd0a0NsaXBib2FyZCAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMj1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wYXN0ZV9jbGlwYm9hcmRfMz1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9wbGFjZV9jdXJzb3I9Ci1PU19fZ3RrX3RleHRfYnVmZmVyX3BsYWNlX2N1cnNvcl8wPWNhc3Q9KEd0a1RleHRCdWZmZXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfcGxhY2VfY3Vyc29yXzE9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2J1ZmZlcl9zZXRfdGV4dD0KLU9TX19ndGtfdGV4dF9idWZmZXJfc2V0X3RleHRfMD1jYXN0PShHdGtUZXh0QnVmZmVyICopCi1PU19fZ3RrX3RleHRfYnVmZmVyX3NldF90ZXh0XzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfdGV4dF9idWZmZXJfc2V0X3RleHRfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RleHRfaXRlcl9nZXRfbGluZT0KLU9TX19ndGtfdGV4dF9pdGVyX2dldF9saW5lXzA9Y2FzdD0oY29uc3QgR3RrVGV4dEl0ZXIgKikKLQotT1NfX2d0a190ZXh0X2l0ZXJfZ2V0X29mZnNldD0KLU9TX19ndGtfdGV4dF9pdGVyX2dldF9vZmZzZXRfMD1jYXN0PShjb25zdCBHdGtUZXh0SXRlciAqKQotCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkcz0KLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzE9Y2FzdD0oR3RrVGV4dFdpbmRvd1R5cGUpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc18yPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc18zPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RleHRfdmlld19idWZmZXJfdG9fd2luZG93X2Nvb3Jkc180PWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdGV4dF92aWV3X2J1ZmZlcl90b193aW5kb3dfY29vcmRzXzU9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyPQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9lZGl0YWJsZT0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9lZGl0YWJsZV8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2F0X2xvY2F0aW9uPQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb25fMD1jYXN0PUd0a1RleHRWaWV3ICoKLU9TX19ndGtfdGV4dF92aWV3X2dldF9pdGVyX2F0X2xvY2F0aW9uXzE9Y2FzdD1HdGtUZXh0SXRlciAqCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9hdF9sb2NhdGlvbl8yPWNhc3Q9Z2ludAotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfYXRfbG9jYXRpb25fMz1jYXN0PWdpbnQKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2l0ZXJfbG9jYXRpb249Ci1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8xPWNhc3Q9KGNvbnN0IEd0a1RleHRJdGVyICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfaXRlcl9sb2NhdGlvbl8yPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95PQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2xpbmVfYXRfeV8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfbGluZV9hdF95XzE9Y2FzdD0oR3RrVGV4dEl0ZXIgKikKLU9TX19ndGtfdGV4dF92aWV3X2dldF9saW5lX2F0X3lfMj1jYXN0PShnaW50KQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X2xpbmVfYXRfeV8zPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3Zpc2libGVfcmVjdD0KLU9TX19ndGtfdGV4dF92aWV3X2dldF92aXNpYmxlX3JlY3RfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3Zpc2libGVfcmVjdF8xPWNhc3Q9KEdka1JlY3RhbmdsZSAqKSxmbGFncz1ub19pbgotCi1PU19fZ3RrX3RleHRfdmlld19nZXRfd2luZG93PQotT1NfX2d0a190ZXh0X3ZpZXdfZ2V0X3dpbmRvd18wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19nZXRfd2luZG93XzE9Y2FzdD0oR3RrVGV4dFdpbmRvd1R5cGUpCi0KLU9TX19ndGtfdGV4dF92aWV3X25ldz0KLQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX21hcmtfb25zY3JlZW49Ci1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfbWFya19vbnNjcmVlbl8wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld19zY3JvbGxfbWFya19vbnNjcmVlbl8xPWNhc3Q9KEd0a1RleHRNYXJrICopCi0KLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyPQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMT1jYXN0PShHdGtUZXh0SXRlciAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMj1jYXN0PShnZG91YmxlKQotT1NfX2d0a190ZXh0X3ZpZXdfc2Nyb2xsX3RvX2l0ZXJfMz1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyXzQ9Y2FzdD0oZ2RvdWJsZSkKLU9TX19ndGtfdGV4dF92aWV3X3Njcm9sbF90b19pdGVyXzU9Y2FzdD0oZ2RvdWJsZSkKLQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2VkaXRhYmxlPQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X2VkaXRhYmxlXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF9lZGl0YWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RleHRfdmlld19zZXRfanVzdGlmaWNhdGlvbj0KLU9TX19ndGtfdGV4dF92aWV3X3NldF9qdXN0aWZpY2F0aW9uXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF9qdXN0aWZpY2F0aW9uXzE9Ci0KLU9TX19ndGtfdGV4dF92aWV3X3NldF90YWJzPQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3RhYnNfMD1jYXN0PShHdGtUZXh0VmlldyAqKQotT1NfX2d0a190ZXh0X3ZpZXdfc2V0X3RhYnNfMT1jYXN0PShQYW5nb1RhYkFycmF5ICopCi0KLU9TX19ndGtfdGV4dF92aWV3X3NldF93cmFwX21vZGU9Ci1PU19fZ3RrX3RleHRfdmlld19zZXRfd3JhcF9tb2RlXzA9Y2FzdD0oR3RrVGV4dFZpZXcgKikKLU9TX19ndGtfdGV4dF92aWV3X3NldF93cmFwX21vZGVfMT0KLQotT1NfX2d0a190ZXh0X3ZpZXdfd2luZG93X3RvX2J1ZmZlcl9jb29yZHM9Ci1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18wPWNhc3Q9KEd0a1RleHRWaWV3ICopCi1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18xPWNhc3Q9R3RrVGV4dFdpbmRvd1R5cGUKLU9TX19ndGtfdGV4dF92aWV3X3dpbmRvd190b19idWZmZXJfY29vcmRzXzI9Y2FzdD1naW50Ci1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc18zPWNhc3Q9Z2ludAotT1NfX2d0a190ZXh0X3ZpZXdfd2luZG93X3RvX2J1ZmZlcl9jb29yZHNfND1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RleHRfdmlld193aW5kb3dfdG9fYnVmZmVyX2Nvb3Jkc181PWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a190aW1lb3V0X2FkZD0KLU9TX19ndGtfdGltZW91dF9hZGRfMD1jYXN0PShndWludDMyKQotT1NfX2d0a190aW1lb3V0X2FkZF8xPWNhc3Q9KEd0a0Z1bmN0aW9uKQotT1NfX2d0a190aW1lb3V0X2FkZF8yPWNhc3Q9KGdwb2ludGVyKQotCi1PU19fZ3RrX3RpbWVvdXRfcmVtb3ZlPQotT1NfX2d0a190aW1lb3V0X3JlbW92ZV8wPWNhc3Q9KGd1aW50KQotCi1PU19fZ3RrX3RvZ2dsZV9idXR0b25fZ2V0X2FjdGl2ZT0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlXzA9Y2FzdD0oR3RrVG9nZ2xlQnV0dG9uICopCi0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9uZXc9Ci0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZlPQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9hY3RpdmVfMD1jYXN0PShHdGtUb2dnbGVCdXR0b24gKikKLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfbW9kZT0KLU9TX19ndGtfdG9nZ2xlX2J1dHRvbl9zZXRfbW9kZV8wPWNhc3Q9KEd0a1RvZ2dsZUJ1dHRvbiAqKQotT1NfX2d0a190b2dnbGVfYnV0dG9uX3NldF9tb2RlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0PQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXRfMD1jYXN0PShHdGtUb29sYmFyICopCi1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a190b29sYmFyX2luc2VydF93aWRnZXRfMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19fZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldF8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX19ndGtfdG9vbGJhcl9pbnNlcnRfd2lkZ2V0XzQ9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190b29sYmFyX25ldz0KLQotT1NfX2d0a190b29sYmFyX3NldF9vcmllbnRhdGlvbj0KLU9TX19ndGtfdG9vbGJhcl9zZXRfb3JpZW50YXRpb25fMD1jYXN0PShHdGtUb29sYmFyICopCi1PU19fZ3RrX3Rvb2xiYXJfc2V0X29yaWVudGF0aW9uXzE9Y2FzdD0oR3RrT3JpZW50YXRpb24pCi0KLU9TX19ndGtfdG9vbHRpcHNfZGF0YV9nZXQ9Ci1PU19fZ3RrX3Rvb2x0aXBzX2RhdGFfZ2V0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfdG9vbHRpcHNfZGlzYWJsZT0KLU9TX19ndGtfdG9vbHRpcHNfZGlzYWJsZV8wPWNhc3Q9KEd0a1Rvb2x0aXBzICopCi0KLU9TX19ndGtfdG9vbHRpcHNfZW5hYmxlPQotT1NfX2d0a190b29sdGlwc19lbmFibGVfMD1jYXN0PShHdGtUb29sdGlwcyAqKQotCi1PU19fZ3RrX3Rvb2x0aXBzX2ZvcmNlX3dpbmRvdz0KLU9TX19ndGtfdG9vbHRpcHNfZm9yY2Vfd2luZG93XzA9Y2FzdD0oR3RrVG9vbHRpcHMgKikKLQotT1NfX2d0a190b29sdGlwc19uZXc9Ci0KLU9TX19ndGtfdG9vbHRpcHNfc2V0X3RpcD0KLU9TX19ndGtfdG9vbHRpcHNfc2V0X3RpcF8wPWNhc3Q9KEd0a1Rvb2x0aXBzICopCi1PU19fZ3RrX3Rvb2x0aXBzX3NldF90aXBfMT1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfdG9vbHRpcHNfc2V0X3RpcF8yPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3Rvb2x0aXBzX3NldF90aXBfMz1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJST0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNJSV8yPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSUlfMz0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0lJXzQ9Ci0KLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSklfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFtb2RlbF8xZ2V0X19JSUlfM0pJXzI9Ci1PU19fMWd0a18xdHJlZV8xbW9kZWxfMWdldF9fSUlJXzNKSV8zPQotT1NfXzFndGtfMXRyZWVfMW1vZGVsXzFnZXRfX0lJSV8zSklfND0KLQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyPQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyXzI9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyX2ZpcnN0PQotT1NfX2d0a190cmVlX21vZGVsX2dldF9pdGVyX2ZpcnN0XzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXJfZmlyc3RfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfZ2V0X25fY29sdW1ucz0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfbl9jb2x1bW5zXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfcGF0aD0KLU9TX19ndGtfdHJlZV9tb2RlbF9nZXRfcGF0aF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotT1NfX2d0a190cmVlX21vZGVsX2dldF9wYXRoXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2dldF90eXBlPQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbj0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbl8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbl8yPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25fY2hpbGRyZW49Ci1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uX2NoaWxkcmVuXzA9Y2FzdD0oR3RrVHJlZU1vZGVsICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9uX2NoaWxkcmVuXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbmV4dD0KLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25leHRfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX25leHRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9udGhfY2hpbGQ9Ci1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9udGhfY2hpbGRfMD1jYXN0PShHdGtUcmVlTW9kZWwgKikKLU9TX19ndGtfdHJlZV9tb2RlbF9pdGVyX250aF9jaGlsZF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfbW9kZWxfaXRlcl9udGhfY2hpbGRfMj1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX21vZGVsX2l0ZXJfbnRoX2NoaWxkXzM9Ci0KLU9TX19ndGtfdHJlZV9wYXRoX2FwcGVuZF9pbmRleD0KLU9TX19ndGtfdHJlZV9wYXRoX2FwcGVuZF9pbmRleF8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi1PU19fZ3RrX3RyZWVfcGF0aF9hcHBlbmRfaW5kZXhfMT0KLQotT1NfX2d0a190cmVlX3BhdGhfY29tcGFyZT0KLU9TX19ndGtfdHJlZV9wYXRoX2NvbXBhcmVfMD1jYXN0PShjb25zdCBHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3BhdGhfY29tcGFyZV8xPWNhc3Q9KGNvbnN0IEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX2Rvd249Ci1PU19fZ3RrX3RyZWVfcGF0aF9kb3duXzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfZnJlZT0KLU9TX19ndGtfdHJlZV9wYXRoX2ZyZWVfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9nZXRfZGVwdGg9Ci1PU19fZ3RrX3RyZWVfcGF0aF9nZXRfZGVwdGhfMD1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9nZXRfaW5kaWNlcz0KLU9TX19ndGtfdHJlZV9wYXRoX2dldF9pbmRpY2VzXzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfbmV3PQotCi1PU19fZ3RrX3RyZWVfcGF0aF9uZXdfZmlyc3Q9Ci0KLU9TX18xZ3RrXzF0cmVlXzFwYXRoXzFuZXdfMWZyb21fMXN0cmluZ19fST0KLU9TX18xZ3RrXzF0cmVlXzFwYXRoXzFuZXdfMWZyb21fMXN0cmluZ19fSV8wPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX18xZ3RrXzF0cmVlXzFwYXRoXzFuZXdfMWZyb21fMXN0cmluZ19fXzNCPQotT1NfXzFndGtfMXRyZWVfMXBhdGhfMW5ld18xZnJvbV8xc3RyaW5nX19fM0JfMD1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fZ3RrX3RyZWVfcGF0aF9uZXh0PQotT1NfX2d0a190cmVlX3BhdGhfbmV4dF8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9wYXRoX3ByZXY9Ci1PU19fZ3RrX3RyZWVfcGF0aF9wcmV2XzA9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3BhdGhfdXA9Ci1PU19fZ3RrX3RyZWVfcGF0aF91cF8wPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fY291bnRfc2VsZWN0ZWRfcm93cz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2NvdW50X3NlbGVjdGVkX3Jvd3NfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF8xPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkXzI9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfcm93cz1mbGFncz1keW5hbWljCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZF9yb3dzXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWRfcm93c18xPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9wYXRoX2lzX3NlbGVjdGVkPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9wYXRoX2lzX3NlbGVjdGVkXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9wYXRoX2lzX3NlbGVjdGVkXzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RfYWxsPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RfYWxsXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdF9pdGVyPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZWxlY3RfaXRlcl8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2VsZWN0X2l0ZXJfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdGVkX2ZvcmVhY2g9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdGVkX2ZvcmVhY2hfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdGVkX2ZvcmVhY2hfMT1jYXN0PShHdGtUcmVlU2VsZWN0aW9uRm9yZWFjaEZ1bmMpCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NlbGVjdGVkX2ZvcmVhY2hfMj1jYXN0PShncG9pbnRlcikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl9zZXRfbW9kZT0KLU9TX19ndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGVfMD1jYXN0PShHdGtUcmVlU2VsZWN0aW9uICopCi1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlXzE9Y2FzdD0oR3RrU2VsZWN0aW9uTW9kZSkKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl91bnNlbGVjdF9hbGw9Ci1PU19fZ3RrX3RyZWVfc2VsZWN0aW9uX3Vuc2VsZWN0X2FsbF8wPWNhc3Q9KEd0a1RyZWVTZWxlY3Rpb24gKikKLQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl91bnNlbGVjdF9pdGVyPQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl91bnNlbGVjdF9pdGVyXzA9Y2FzdD0oR3RrVHJlZVNlbGVjdGlvbiAqKQotT1NfX2d0a190cmVlX3NlbGVjdGlvbl91bnNlbGVjdF9pdGVyXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfX2d0a190cmVlX3N0b3JlX2FwcGVuZD0KLU9TX19ndGtfdHJlZV9zdG9yZV9hcHBlbmRfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9hcHBlbmRfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfX2d0a190cmVlX3N0b3JlX2FwcGVuZF8yPWNhc3Q9KEd0a1RyZWVJdGVyICopCi0KLU9TX19ndGtfdHJlZV9zdG9yZV9jbGVhcj0KLU9TX19ndGtfdHJlZV9zdG9yZV9jbGVhcl8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotCi1PU19fZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0PQotT1NfX2d0a190cmVlX3N0b3JlX2luc2VydF8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfX2d0a190cmVlX3N0b3JlX2luc2VydF8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfaW5zZXJ0XzI9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX19ndGtfdHJlZV9zdG9yZV9pbnNlcnRfMz1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfc3RvcmVfbmV3dj0KLU9TX19ndGtfdHJlZV9zdG9yZV9uZXd2XzA9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfbmV3dl8xPWNhc3Q9KEdUeXBlICopCi0KLU9TX19ndGtfdHJlZV9zdG9yZV9yZW1vdmU9Ci1PU19fZ3RrX3RyZWVfc3RvcmVfcmVtb3ZlXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fZ3RrX3RyZWVfc3RvcmVfcmVtb3ZlXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUlfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUlJXzI9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSUlfMz0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlJSV80PQotCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSkk9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSklfMD1jYXN0PShHdGtUcmVlU3RvcmUgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJSklfMj0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlKSV8zPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUpJXzQ9Ci0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8yST0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8wPWNhc3Q9KEd0a1RyZWVTdG9yZSAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzE9Y2FzdD0oR3RrVHJlZUl0ZXIgKikKLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySV8yPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0NvbG9yXzJJXzM9ZmxhZ3M9bm9fb3V0Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrQ29sb3JfMklfND0KLQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWklfMT1jYXN0PShHdGtUcmVlSXRlciAqKQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSVpJXzI9Ci1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJWklfMz0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlaSV80PQotCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCST0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJXzA9Y2FzdD0oR3RrVHJlZVN0b3JlICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCSV8xPWNhc3Q9KEd0a1RyZWVJdGVyICopCi1PU19fMWd0a18xdHJlZV8xc3RvcmVfMXNldF9fSUlJXzNCSV8yPQotT1NfXzFndGtfMXRyZWVfMXN0b3JlXzFzZXRfX0lJSV8zQklfMz0KLU9TX18xZ3RrXzF0cmVlXzFzdG9yZV8xc2V0X19JSUlfM0JJXzQ9Ci0KLU9TX19ndGtfdHJlZV92aWV3X2NvbGxhcHNlX3Jvdz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbGxhcHNlX3Jvd18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2xsYXBzZV9yb3dfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fYWRkX2F0dHJpYnV0ZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9hZGRfYXR0cmlidXRlXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9hZGRfYXR0cmlidXRlXzE9Y2FzdD0oR3RrQ2VsbFJlbmRlcmVyICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fYWRkX2F0dHJpYnV0ZV8yPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fYWRkX2F0dHJpYnV0ZV8zPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9wb3NpdGlvbj1mbGFncz1keW5hbWljCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfcG9zaXRpb25fMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3Bvc2l0aW9uXzE9Y2FzdD0oR3RrQ2VsbFJlbmRlcmVyICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfcG9zaXRpb25fMj1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfcG9zaXRpb25fMz1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfMT1jYXN0PShHZGtSZWN0YW5nbGUgKiksZmxhZ3M9bm9faW4KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzI9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfZ2V0X3NpemVfMz1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9nZXRfc2l6ZV80PWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX2dldF9zaXplXzU9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fY2VsbF9zZXRfY2VsbF9kYXRhPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YV8wPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NlbGxfc2V0X2NlbGxfZGF0YV8xPWNhc3Q9R3RrVHJlZU1vZGVsICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGFfMj1jYXN0PUd0a1RyZWVJdGVyICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGFfMz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9jZWxsX3NldF9jZWxsX2RhdGFfND0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NsZWFyPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2NsZWFyXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9jZWxsX3JlbmRlcmVycz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfY2VsbF9yZW5kZXJlcnNfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X2ZpeGVkX3dpZHRoPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9maXhlZF93aWR0aF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfcmVvcmRlcmFibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3Jlb3JkZXJhYmxlXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfcmVzaXphYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9yZXNpemFibGVfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3NpemluZz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc2l6aW5nXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X2luZGljYXRvcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc29ydF9pbmRpY2F0b3JfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X29yZGVyPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX2dldF9zb3J0X29yZGVyXzA9Y2FzdD1HdGtUcmVlVmlld0NvbHVtbiAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc3BhY2luZz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfc3BhY2luZ18wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfdmlzaWJsZT0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9nZXRfd2lkdGg9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fZ2V0X3dpZHRoXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX25ldz0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX2VuZF8xPWNhc3Q9KEd0a0NlbGxSZW5kZXJlciAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfZW5kXzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0PQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnRfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnRfMT1jYXN0PShHdGtDZWxsUmVuZGVyZXIgKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0XzI9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYWxpZ25tZW50PQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hbGlnbm1lbnRfMD1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hbGlnbm1lbnRfMT0KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jZWxsX2RhdGFfZnVuYz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMD1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMT1jYXN0PUd0a0NlbGxSZW5kZXJlciAqCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NlbGxfZGF0YV9mdW5jXzI9Y2FzdD0oR3RrVHJlZUNlbGxEYXRhRnVuYykKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfMz1jYXN0PShncG9pbnRlcikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfY2VsbF9kYXRhX2Z1bmNfND1jYXN0PUd0a0Rlc3Ryb3lOb3RpZnkKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9jbGlja2FibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NsaWNrYWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2NsaWNrYWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2ZpeGVkX3dpZHRoPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9maXhlZF93aWR0aF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2ZpeGVkX3dpZHRoXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9taW5fd2lkdGg9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X21pbl93aWR0aF8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X21pbl93aWR0aF8xPWNhc3Q9Z2ludAotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlb3JkZXJhYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZW9yZGVyYWJsZV8wPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZW9yZGVyYWJsZV8xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9yZXNpemFibGU9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlc2l6YWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlc2l6YWJsZV8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NpemluZz0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc2l6aW5nXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc2l6aW5nXzE9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW5TaXppbmcpCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9pbmRpY2F0b3I9Ci1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3NvcnRfaW5kaWNhdG9yXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9pbmRpY2F0b3JfMT1jYXN0PWdib29sZWFuCi0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9vcmRlcj0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfc29ydF9vcmRlcl8wPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF9zb3J0X29yZGVyXzE9Y2FzdD1HdGtTb3J0VHlwZQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3RpdGxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3RpdGxlXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlXzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZV8xPQotCi1PU19fZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3dpZGdldD0KLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfd2lkZ2V0XzA9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfd2lkZ2V0XzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2NyZWF0ZV9yb3dfZHJhZ19pY29uPQotT1NfX2d0a190cmVlX3ZpZXdfY3JlYXRlX3Jvd19kcmFnX2ljb25fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfY3JlYXRlX3Jvd19kcmFnX2ljb25fMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19leHBhbmRfcm93PQotT1NfX2d0a190cmVlX3ZpZXdfZXhwYW5kX3Jvd18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19leHBhbmRfcm93XzE9Y2FzdD0oR3RrVHJlZVBhdGggKikKLU9TX19ndGtfdHJlZV92aWV3X2V4cGFuZF9yb3dfMj1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2JhY2tncm91bmRfYXJlYT0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9iYWNrZ3JvdW5kX2FyZWFfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2JhY2tncm91bmRfYXJlYV8xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfYmFja2dyb3VuZF9hcmVhXzI9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9iYWNrZ3JvdW5kX2FyZWFfMz1jYXN0PShHZGtSZWN0YW5nbGUgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2Jpbl93aW5kb3c9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfYmluX3dpbmRvd18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jZWxsX2FyZWE9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jZWxsX2FyZWFfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2NlbGxfYXJlYV8yPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY2VsbF9hcmVhXzM9Y2FzdD0oR2RrUmVjdGFuZ2xlICopLGZsYWdzPW5vX2luCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW49Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW5fMT1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfY29sdW1ucz0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jb2x1bW5zXzA9Y2FzdD1HdGtUcmVlVmlldyAqCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3I9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3JfMT1jYXN0PShHdGtUcmVlUGF0aCAqKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF9jdXJzb3JfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKikKLQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2V4cGFuZGVyX2NvbHVtbj0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9leHBhbmRlcl9jb2x1bW5fMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfaGVhZGVyc192aXNpYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X2hlYWRlcnNfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcz0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc18wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfMT1jYXN0PShnaW50KQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzI9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvc18zPWNhc3Q9KEd0a1RyZWVQYXRoICoqKQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zXzQ9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKiopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfNT1jYXN0PShnaW50ICopCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3NfNj1jYXN0PShnaW50ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF9ydWxlc19oaW50PQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3J1bGVzX2hpbnRfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uPQotT1NfX2d0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi0KLU9TX19ndGtfdHJlZV92aWV3X2dldF92aXNpYmxlX3JlY3Q9Ci1PU19fZ3RrX3RyZWVfdmlld19nZXRfdmlzaWJsZV9yZWN0XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X2dldF92aXNpYmxlX3JlY3RfMT1mbGFncz1ub19pbgotCi1PU19fZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uXzE9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLU9TX19ndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3RyZWVfdmlld19tb3ZlX2NvbHVtbl9hZnRlcj0KLU9TX19ndGtfdHJlZV92aWV3X21vdmVfY29sdW1uX2FmdGVyXzA9Y2FzdD1HdGtUcmVlVmlldyAqCi1PU19fZ3RrX3RyZWVfdmlld19tb3ZlX2NvbHVtbl9hZnRlcl8xPWNhc3Q9R3RrVHJlZVZpZXdDb2x1bW4gKgotT1NfX2d0a190cmVlX3ZpZXdfbW92ZV9jb2x1bW5fYWZ0ZXJfMj1jYXN0PUd0a1RyZWVWaWV3Q29sdW1uICoKLQotT1NfX2d0a190cmVlX3ZpZXdfbmV3X3dpdGhfbW9kZWw9Ci1PU19fZ3RrX3RyZWVfdmlld19uZXdfd2l0aF9tb2RlbF8wPWNhc3Q9KEd0a1RyZWVNb2RlbCAqKQotCi1PU19fZ3RrX3RyZWVfdmlld19yZW1vdmVfY29sdW1uPQotT1NfX2d0a190cmVlX3ZpZXdfcmVtb3ZlX2NvbHVtbl8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19yZW1vdmVfY29sdW1uXzE9Y2FzdD0oR3RrVHJlZVZpZXdDb2x1bW4gKikKLQotT1NfX2d0a190cmVlX3ZpZXdfcm93X2V4cGFuZGVkPQotT1NfX2d0a190cmVlX3ZpZXdfcm93X2V4cGFuZGVkXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZF8xPWNhc3Q9KEd0a1RyZWVQYXRoICopCi0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsPQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMj1jYXN0PShHdGtUcmVlVmlld0NvbHVtbiAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfMz1jYXN0PShnYm9vbGVhbikKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19jZWxsXzQ9Y2FzdD0oZ2Zsb2F0KQotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX2NlbGxfNT1jYXN0PShnZmxvYXQpCi0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludD0KLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludF8wPWNhc3Q9R3RrVHJlZVZpZXcgKgotT1NfX2d0a190cmVlX3ZpZXdfc2Nyb2xsX3RvX3BvaW50XzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfdHJlZV92aWV3X3Njcm9sbF90b19wb2ludF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9jdXJzb3I9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9jdXJzb3JfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2N1cnNvcl8yPWNhc3Q9KEd0a1RyZWVWaWV3Q29sdW1uICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yXzM9Ci0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9kcmFnX2Rlc3Rfcm93PQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMD1jYXN0PShHdGtUcmVlVmlldyAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMT1jYXN0PShHdGtUcmVlUGF0aCAqKQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2RyYWdfZGVzdF9yb3dfMj0KLQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2VuYWJsZV9zZWFyY2g9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfZW5hYmxlX3NlYXJjaF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfZW5hYmxlX3NlYXJjaF8xPQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlPQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZV8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9tb2RlbD0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9tb2RlbF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfbW9kZWxfMT1jYXN0PShHdGtUcmVlTW9kZWwgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnQ9Ci1PU19fZ3RrX3RyZWVfdmlld19zZXRfcnVsZXNfaGludF8wPWNhc3Q9KEd0a1RyZWVWaWV3ICopCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfcnVsZXNfaGludF8xPQotCi1PU19fZ3RrX3RyZWVfdmlld19zZXRfc2VhcmNoX2NvbHVtbj0KLU9TX19ndGtfdHJlZV92aWV3X3NldF9zZWFyY2hfY29sdW1uXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3NldF9zZWFyY2hfY29sdW1uXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzPQotT1NfX2d0a190cmVlX3ZpZXdfdHJlZV90b193aWRnZXRfY29vcmRzXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkc18xPWNhc3Q9KGdpbnQpCi1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHNfMj1jYXN0PWdpbnQKLU9TX19ndGtfdHJlZV92aWV3X3RyZWVfdG9fd2lkZ2V0X2Nvb3Jkc18zPWNhc3Q9Z2ludCAqCi1PU19fZ3RrX3RyZWVfdmlld190cmVlX3RvX3dpZGdldF9jb29yZHNfND1jYXN0PWdpbnQgKgotCi1PU19fZ3RrX3RyZWVfdmlld191bnNldF9yb3dzX2RyYWdfZGVzdD0KLU9TX19ndGtfdHJlZV92aWV3X3Vuc2V0X3Jvd3NfZHJhZ19kZXN0XzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzPQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzXzA9Y2FzdD0oR3RrVHJlZVZpZXcgKikKLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkc18xPQotT1NfX2d0a190cmVlX3ZpZXdfd2lkZ2V0X3RvX3RyZWVfY29vcmRzXzI9Ci1PU19fZ3RrX3RyZWVfdmlld193aWRnZXRfdG9fdHJlZV9jb29yZHNfMz0KLU9TX19ndGtfdHJlZV92aWV3X3dpZGdldF90b190cmVlX2Nvb3Jkc180PQotCi1PU19fZ3RrX3Zib3hfbmV3PQotT1NfX2d0a192Ym94X25ld18wPWNhc3Q9KGdib29sZWFuKQotT1NfX2d0a192Ym94X25ld18xPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfdnNjYWxlX25ldz0KLU9TX19ndGtfdnNjYWxlX25ld18wPWNhc3Q9KEd0a0FkanVzdG1lbnQgKikKLQotT1NfX2d0a192c2Nyb2xsYmFyX25ldz0KLU9TX19ndGtfdnNjcm9sbGJhcl9uZXdfMD1jYXN0PShHdGtBZGp1c3RtZW50ICopCi0KLU9TX19ndGtfdnNlcGFyYXRvcl9uZXc9Ci0KLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcj0KLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl8yPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLU9TX19ndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcl8zPWNhc3Q9KGd1aW50KQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzQ9Y2FzdD0oR2RrTW9kaWZpZXJUeXBlKQotT1NfX2d0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yXzU9Ci0KLU9TX19ndGtfd2lkZ2V0X2FkZF9ldmVudHM9Ci1PU19fZ3RrX3dpZGdldF9hZGRfZXZlbnRzXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9hZGRfZXZlbnRzXzE9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a193aWRnZXRfY2hpbGRfZm9jdXM9Ci1PU19fZ3RrX3dpZGdldF9jaGlsZF9mb2N1c18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfY2hpbGRfZm9jdXNfMT0KLQotT1NfXzFndGtfMXdpZGdldF8xY3JlYXRlXzFwYW5nb18xbGF5b3V0X19JST0KLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSUlfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSUlfMT1jYXN0PShjb25zdCBnY2hhciAqKQotCi1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lfM0I9Ci1PU19fMWd0a18xd2lkZ2V0XzFjcmVhdGVfMXBhbmdvXzFsYXlvdXRfX0lfM0JfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX18xZ3RrXzF3aWRnZXRfMWNyZWF0ZV8xcGFuZ29fMWxheW91dF9fSV8zQl8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi0KLU9TX19ndGtfd2lkZ2V0X2Rlc3Ryb3k9Ci1PU19fZ3RrX3dpZGdldF9kZXN0cm95XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2V2ZW50PQotT1NfX2d0a193aWRnZXRfZXZlbnRfMD1jYXN0PUd0a1dpZGdldCAqCi1PU19fZ3RrX3dpZGdldF9ldmVudF8xPWNhc3Q9R2RrRXZlbnQgKgotCi1PU19fZ3RrX3dpZGdldF9nZXRfYWNjZXNzaWJsZT0KLU9TX19ndGtfd2lkZ2V0X2dldF9hY2Nlc3NpYmxlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9jaGlsZF92aXNpYmxlPQotT1NfX2d0a193aWRnZXRfZ2V0X2NoaWxkX3Zpc2libGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X2RlZmF1bHRfZGlyZWN0aW9uPQotCi1PU19fZ3RrX3dpZGdldF9nZXRfZGVmYXVsdF9zdHlsZT0KLQotT1NfX2d0a193aWRnZXRfZ2V0X2RpcmVjdGlvbj0KLU9TX19ndGtfd2lkZ2V0X2dldF9kaXJlY3Rpb25fMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X2V2ZW50cz0KLU9TX19ndGtfd2lkZ2V0X2dldF9ldmVudHNfMD1jYXN0PUd0a1dpZGdldCAqCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9tb2RpZmllcl9zdHlsZT0KLU9TX19ndGtfd2lkZ2V0X2dldF9tb2RpZmllcl9zdHlsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9nZXRfcGFuZ29fY29udGV4dD0KLU9TX19ndGtfd2lkZ2V0X2dldF9wYW5nb19jb250ZXh0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9wYXJlbnQ9Ci1PU19fZ3RrX3dpZGdldF9nZXRfcGFyZW50XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF9zaXplX3JlcXVlc3Q9Ci1PU19fZ3RrX3dpZGdldF9nZXRfc2l6ZV9yZXF1ZXN0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9nZXRfc2l6ZV9yZXF1ZXN0XzE9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a193aWRnZXRfZ2V0X3NpemVfcmVxdWVzdF8yPWNhc3Q9KGdpbnQgKikKLQotT1NfX2d0a193aWRnZXRfZ2V0X3N0eWxlPQotT1NfX2d0a193aWRnZXRfZ2V0X3N0eWxlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X2dldF90b3BsZXZlbD0KLU9TX19ndGtfd2lkZ2V0X2dldF90b3BsZXZlbF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9ncmFiX2ZvY3VzPQotT1NfX2d0a193aWRnZXRfZ3JhYl9mb2N1c18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9oaWRlPQotT1NfX2d0a193aWRnZXRfaGlkZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9pc19mb2N1cz0KLU9TX19ndGtfd2lkZ2V0X2lzX2ZvY3VzXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X21hcD0KLU9TX19ndGtfd2lkZ2V0X21hcF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9tbmVtb25pY19hY3RpdmF0ZT0KLU9TX19ndGtfd2lkZ2V0X21uZW1vbmljX2FjdGl2YXRlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tbmVtb25pY19hY3RpdmF0ZV8xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2Jhc2U9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmFzZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X2Jhc2VfMT1jYXN0PShHdGtTdGF0ZVR5cGUpCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmFzZV8yPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmc9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfYmdfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iZ18xPWNhc3Q9KEd0a1N0YXRlVHlwZSkKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9iZ18yPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZmc9Ci1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZmdfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mZ18xPWNhc3Q9KEd0a1N0YXRlVHlwZSkKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mZ18yPWNhc3Q9KEdka0NvbG9yICopLGZsYWdzPW5vX291dAotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZm9udD0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9mb250XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfZm9udF8xPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9zdHlsZT0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV9zdHlsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfbW9kaWZ5X3N0eWxlXzE9Y2FzdD0oR3RrUmNTdHlsZSAqKQotCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfdGV4dD0KLU9TX19ndGtfd2lkZ2V0X21vZGlmeV90ZXh0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9tb2RpZnlfdGV4dF8xPWNhc3Q9KEd0a1N0YXRlVHlwZSkKLU9TX19ndGtfd2lkZ2V0X21vZGlmeV90ZXh0XzI9Y2FzdD0oR2RrQ29sb3IgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX19ndGtfd2lkZ2V0X3F1ZXVlX3Jlc2l6ZT0KLU9TX19ndGtfd2lkZ2V0X3F1ZXVlX3Jlc2l6ZV8wPWNhc3Q9R3RrV2lkZ2V0ICoKLQotT1NfX2d0a193aWRnZXRfcmVhbGl6ZT0KLU9TX19ndGtfd2lkZ2V0X3JlYWxpemVfMD1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yPQotT1NfX2d0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3JfMT1jYXN0PShHdGtBY2NlbEdyb3VwICopCi1PU19fZ3RrX3dpZGdldF9yZW1vdmVfYWNjZWxlcmF0b3JfMj1jYXN0PShndWludCkKLU9TX19ndGtfd2lkZ2V0X3JlbW92ZV9hY2NlbGVyYXRvcl8zPWNhc3Q9KEdka01vZGlmaWVyVHlwZSkKLQotT1NfX2d0a193aWRnZXRfcmVwYXJlbnQ9Ci1PU19fZ3RrX3dpZGdldF9yZXBhcmVudF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfcmVwYXJlbnRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X2FwcF9wYWludGFibGU9Ci1PU19fZ3RrX3dpZGdldF9zZXRfYXBwX3BhaW50YWJsZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X2FwcF9wYWludGFibGVfMT0KLQotT1NfX2d0a193aWRnZXRfc2V0X2RlZmF1bHRfZGlyZWN0aW9uPQotT1NfX2d0a193aWRnZXRfc2V0X2RlZmF1bHRfZGlyZWN0aW9uXzA9Y2FzdD0oR3RrVGV4dERpcmVjdGlvbikKLQotT1NfX2d0a193aWRnZXRfc2V0X2RpcmVjdGlvbj0KLU9TX19ndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb25fMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb25fMT1jYXN0PShHdGtUZXh0RGlyZWN0aW9uKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfZG91YmxlX2J1ZmZlcmVkPQotT1NfX2d0a193aWRnZXRfc2V0X2RvdWJsZV9idWZmZXJlZF8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X2RvdWJsZV9idWZmZXJlZF8xPWNhc3Q9KGdib29sZWFuKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfbmFtZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9uYW1lXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zZXRfbmFtZV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X3BhcmVudF93aW5kb3c9Ci1PU19fZ3RrX3dpZGdldF9zZXRfcGFyZW50X3dpbmRvd18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3BhcmVudF93aW5kb3dfMT1jYXN0PShHZGtXaW5kb3cgKikKLQotT1NfX2d0a193aWRnZXRfc2V0X3JlZHJhd19vbl9hbGxvY2F0ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9yZWRyYXdfb25fYWxsb2NhdGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9yZWRyYXdfb25fYWxsb2NhdGVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aWRnZXRfc2V0X3NlbnNpdGl2ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmVfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdD0KLU9TX19ndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3RfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3RfMT1jYXN0PShnaW50KQotT1NfX2d0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdF8yPWNhc3Q9KGdpbnQpCi0KLU9TX19ndGtfd2lkZ2V0X3NldF9zdGF0ZT0KLU9TX19ndGtfd2lkZ2V0X3NldF9zdGF0ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2V0X3N0YXRlXzE9Y2FzdD0oR3RrU3RhdGVUeXBlKQotCi1PU19fZ3RrX3dpZGdldF9zZXRfc3R5bGU9Ci1PU19fZ3RrX3dpZGdldF9zZXRfc3R5bGVfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3NldF9zdHlsZV8xPWNhc3Q9KEd0a1N0eWxlICopCi0KLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFzaz0KLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFza18wPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfc2hhcGVfY29tYmluZV9tYXNrXzE9Y2FzdD0oR2RrQml0bWFwICopCi1PU19fZ3RrX3dpZGdldF9zaGFwZV9jb21iaW5lX21hc2tfMj1jYXN0PWdpbnQKLU9TX19ndGtfd2lkZ2V0X3NoYXBlX2NvbWJpbmVfbWFza18zPWNhc3Q9Z2ludAotCi1PU19fZ3RrX3dpZGdldF9zaG93PQotT1NfX2d0a193aWRnZXRfc2hvd18wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpZGdldF9zaG93X25vdz0KLU9TX19ndGtfd2lkZ2V0X3Nob3dfbm93XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi0KLU9TX19ndGtfd2lkZ2V0X3NpemVfYWxsb2NhdGU9Ci1PU19fZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlXzE9Y2FzdD0oR3RrQWxsb2NhdGlvbiAqKSxmbGFncz1ub19vdXQKLQotT1NfX2d0a193aWRnZXRfc2l6ZV9yZXF1ZXN0PQotT1NfX2d0a193aWRnZXRfc2l6ZV9yZXF1ZXN0XzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpZGdldF9zaXplX3JlcXVlc3RfMT1jYXN0PShHdGtSZXF1aXNpdGlvbiAqKSxmbGFncz1ub19pbgotCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJST0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0lJXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNJSV8yPQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSUlfMz1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1zZW50aW5lbAotCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNKST0KLU9TX18xZ3RrXzF3aWRnZXRfMXN0eWxlXzFnZXRfX0lfM0JfM0pJXzA9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNKSV8xPWNhc3Q9KGNvbnN0IGdjaGFyICopCi1PU19fMWd0a18xd2lkZ2V0XzFzdHlsZV8xZ2V0X19JXzNCXzNKSV8yPQotT1NfXzFndGtfMXdpZGdldF8xc3R5bGVfMWdldF9fSV8zQl8zSklfMz1jYXN0PShjb25zdCBnY2hhciAqKSxmbGFncz1zZW50aW5lbAotCi1PU19fZ3RrX3dpZGdldF90cmFuc2xhdGVfY29vcmRpbmF0ZXM9Ci1PU19fZ3RrX3dpZGdldF90cmFuc2xhdGVfY29vcmRpbmF0ZXNfMD1jYXN0PShHdGtXaWRnZXQgKikKLU9TX19ndGtfd2lkZ2V0X3RyYW5zbGF0ZV9jb29yZGluYXRlc18xPWNhc3Q9KEd0a1dpZGdldCAqKQotT1NfX2d0a193aWRnZXRfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzXzI9Ci1PU19fZ3RrX3dpZGdldF90cmFuc2xhdGVfY29vcmRpbmF0ZXNfMz0KLU9TX19ndGtfd2lkZ2V0X3RyYW5zbGF0ZV9jb29yZGluYXRlc180PQotT1NfX2d0a193aWRnZXRfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzXzU9Ci0KLU9TX19ndGtfd2lkZ2V0X3VucmVhbGl6ZT0KLU9TX19ndGtfd2lkZ2V0X3VucmVhbGl6ZV8wPWNhc3Q9KEd0a1dpZGdldCAqKQotCi1PU19fZ3RrX3dpbmRvd19hY3RpdmF0ZV9kZWZhdWx0PQotT1NfX2d0a193aW5kb3dfYWN0aXZhdGVfZGVmYXVsdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXA9Ci1PU19fZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXBfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X2FkZF9hY2NlbF9ncm91cF8xPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLQotT1NfX2d0a193aW5kb3dfZGVpY29uaWZ5PQotT1NfX2d0a193aW5kb3dfZGVpY29uaWZ5XzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X2dldF9mb2N1cz0KLU9TX19ndGtfd2luZG93X2dldF9mb2N1c18wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfaWNvbl9saXN0PQotT1NfX2d0a193aW5kb3dfZ2V0X2ljb25fbGlzdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfbW5lbW9uaWNfbW9kaWZpZXI9Ci1PU19fZ3RrX3dpbmRvd19nZXRfbW5lbW9uaWNfbW9kaWZpZXJfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfZ2V0X21vZGFsPQotT1NfX2d0a193aW5kb3dfZ2V0X21vZGFsXzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X2dldF9wb3NpdGlvbj0KLU9TX19ndGtfd2luZG93X2dldF9wb3NpdGlvbl8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uXzE9Y2FzdD0oZ2ludCAqKQotT1NfX2d0a193aW5kb3dfZ2V0X3Bvc2l0aW9uXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3dpbmRvd19nZXRfc2l6ZT0KLU9TX19ndGtfd2luZG93X2dldF9zaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19nZXRfc2l6ZV8xPWNhc3Q9KGdpbnQgKikKLU9TX19ndGtfd2luZG93X2dldF9zaXplXzI9Y2FzdD0oZ2ludCAqKQotCi1PU19fZ3RrX3dpbmRvd19pY29uaWZ5PQotT1NfX2d0a193aW5kb3dfaWNvbmlmeV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19tYXhpbWl6ZT0KLU9TX19ndGtfd2luZG93X21heGltaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi0KLU9TX19ndGtfd2luZG93X21vdmU9Ci1PU19fZ3RrX3dpbmRvd19tb3ZlXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19tb3ZlXzE9Y2FzdD0oZ2ludCkKLU9TX19ndGtfd2luZG93X21vdmVfMj1jYXN0PShnaW50KQotCi1PU19fZ3RrX3dpbmRvd19uZXc9Ci1PU19fZ3RrX3dpbmRvd19uZXdfMD1jYXN0PShHdGtXaW5kb3dUeXBlKQotCi1PU19fZ3RrX3dpbmRvd19wcmVzZW50PQotT1NfX2d0a193aW5kb3dfcHJlc2VudF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotCi1PU19fZ3RrX3dpbmRvd19yZW1vdmVfYWNjZWxfZ3JvdXA9Ci1PU19fZ3RrX3dpbmRvd19yZW1vdmVfYWNjZWxfZ3JvdXBfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3JlbW92ZV9hY2NlbF9ncm91cF8xPWNhc3Q9KEd0a0FjY2VsR3JvdXAgKikKLQotT1NfX2d0a193aW5kb3dfcmVzaXplPQotT1NfX2d0a193aW5kb3dfcmVzaXplXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19yZXNpemVfMT1jYXN0PShnaW50KQotT1NfX2d0a193aW5kb3dfcmVzaXplXzI9Y2FzdD0oZ2ludCkKLQotT1NfX2d0a193aW5kb3dfc2V0X2RlZmF1bHQ9Ci1PU19fZ3RrX3dpbmRvd19zZXRfZGVmYXVsdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2RlZmF1bHRfMT1jYXN0PShHdGtXaWRnZXQgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnQ9Ci1PU19fZ3RrX3dpbmRvd19zZXRfZGVzdHJveV93aXRoX3BhcmVudF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnRfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzPQotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzXzA9Y2FzdD1HdGtXaW5kb3cgKgotT1NfX2d0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzXzE9Y2FzdD0oR3RrV2lkZ2V0ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHNfMj1mbGFncz1ub19vdXQKLU9TX19ndGtfd2luZG93X3NldF9nZW9tZXRyeV9oaW50c18zPQotCi1PU19fZ3RrX3dpbmRvd19zZXRfaWNvbl9saXN0PQotT1NfX2d0a193aW5kb3dfc2V0X2ljb25fbGlzdF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X2ljb25fbGlzdF8xPWNhc3Q9KEdMaXN0ICopCi0KLU9TX19ndGtfd2luZG93X3NldF9tb2RhbD0KLU9TX19ndGtfd2luZG93X3NldF9tb2RhbF8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X21vZGFsXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfd2luZG93X3NldF9yZXNpemFibGU9Ci1PU19fZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlXzA9Y2FzdD0oR3RrV2luZG93ICopCi1PU19fZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlXzE9Y2FzdD0oZ2Jvb2xlYW4pCi0KLU9TX19ndGtfd2luZG93X3NldF90aXRsZT0KLU9TX19ndGtfd2luZG93X3NldF90aXRsZV8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X3RpdGxlXzE9Y2FzdD0oY29uc3QgZ2NoYXIgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3I9Ci1PU19fZ3RrX3dpbmRvd19zZXRfdHJhbnNpZW50X2Zvcl8wPWNhc3Q9KEd0a1dpbmRvdyAqKQotT1NfX2d0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3JfMT1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX2d0a193aW5kb3dfc2V0X3R5cGVfaGludD0KLU9TX19ndGtfd2luZG93X3NldF90eXBlX2hpbnRfMD1jYXN0PShHdGtXaW5kb3cgKikKLU9TX19ndGtfd2luZG93X3NldF90eXBlX2hpbnRfMT0KLQotT1NfX2d0a193aW5kb3dfdW5tYXhpbWl6ZT0KLU9TX19ndGtfd2luZG93X3VubWF4aW1pemVfMD1jYXN0PShHdGtXaW5kb3cgKikKLQotT1NfX3BhbmdvX2F0dHJfYmFja2dyb3VuZF9uZXc9Ci1PU19fcGFuZ29fYXR0cl9iYWNrZ3JvdW5kX25ld18wPQotT1NfX3BhbmdvX2F0dHJfYmFja2dyb3VuZF9uZXdfMT0KLU9TX19wYW5nb19hdHRyX2JhY2tncm91bmRfbmV3XzI9Ci0KLU9TX19wYW5nb19hdHRyX2ZvbnRfZGVzY19uZXc9Ci1PU19fcGFuZ29fYXR0cl9mb250X2Rlc2NfbmV3XzA9Y2FzdD1jb25zdCBQYW5nb0ZvbnREZXNjcmlwdGlvbiAqCi0KLU9TX19wYW5nb19hdHRyX2ZvcmVncm91bmRfbmV3PQotT1NfX3BhbmdvX2F0dHJfZm9yZWdyb3VuZF9uZXdfMD0KLU9TX19wYW5nb19hdHRyX2ZvcmVncm91bmRfbmV3XzE9Ci1PU19fcGFuZ29fYXR0cl9mb3JlZ3JvdW5kX25ld18yPQotCi1PU19fcGFuZ29fYXR0cl9saXN0X2NoYW5nZT0KLU9TX19wYW5nb19hdHRyX2xpc3RfY2hhbmdlXzA9Y2FzdD1QYW5nb0F0dHJMaXN0ICoKLU9TX19wYW5nb19hdHRyX2xpc3RfY2hhbmdlXzE9Y2FzdD1QYW5nb0F0dHJpYnV0ZSAqCi0KLU9TX19wYW5nb19hdHRyX2xpc3RfaW5zZXJ0PQotT1NfX3BhbmdvX2F0dHJfbGlzdF9pbnNlcnRfMD1jYXN0PVBhbmdvQXR0ckxpc3QgKgotT1NfX3BhbmdvX2F0dHJfbGlzdF9pbnNlcnRfMT1jYXN0PVBhbmdvQXR0cmlidXRlICoKLQotT1NfX3BhbmdvX2F0dHJfbGlzdF9uZXc9Ci0KLU9TX19wYW5nb19hdHRyX2xpc3RfdW5yZWY9Ci1PU19fcGFuZ29fYXR0cl9saXN0X3VucmVmXzA9Y2FzdD0oUGFuZ29BdHRyTGlzdCAqKQotCi1PU19fcGFuZ29fYXR0cl9yaXNlX25ldz0KLU9TX19wYW5nb19hdHRyX3Jpc2VfbmV3XzA9Ci0KLU9TX19wYW5nb19hdHRyX3NoYXBlX25ldz0KLU9TX19wYW5nb19hdHRyX3NoYXBlX25ld18wPWZsYWdzPW5vX291dAotT1NfX3BhbmdvX2F0dHJfc2hhcGVfbmV3XzE9ZmxhZ3M9bm9fb3V0Ci0KLU9TX19wYW5nb19hdHRyX3N0cmlrZXRocm91Z2hfbmV3PQotT1NfX3BhbmdvX2F0dHJfc3RyaWtldGhyb3VnaF9uZXdfMD0KLQotT1NfX3BhbmdvX2F0dHJfdW5kZXJsaW5lX25ldz0KLU9TX19wYW5nb19hdHRyX3VuZGVybGluZV9uZXdfMD0KLQotT1NfX3BhbmdvX2F0dHJfd2VpZ2h0X25ldz0KLU9TX19wYW5nb19hdHRyX3dlaWdodF9uZXdfMD0KLQotT1NfX3BhbmdvX2NhaXJvX2NvbnRleHRfZ2V0X2ZvbnRfb3B0aW9ucz1mbGFncz1keW5hbWljCi1PU19fcGFuZ29fY2Fpcm9fY29udGV4dF9nZXRfZm9udF9vcHRpb25zXzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19jYWlyb19jb250ZXh0X3NldF9mb250X29wdGlvbnM9ZmxhZ3M9ZHluYW1pYwotT1NfX3BhbmdvX2NhaXJvX2NvbnRleHRfc2V0X2ZvbnRfb3B0aW9uc18wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NhaXJvX2NvbnRleHRfc2V0X2ZvbnRfb3B0aW9uc18xPQotCi1PU19fcGFuZ29fY2Fpcm9fY3JlYXRlX2xheW91dD1mbGFncz1keW5hbWljCi1PU19fcGFuZ29fY2Fpcm9fY3JlYXRlX2xheW91dF8wPQotCi1PU19fcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQ9ZmxhZ3M9ZHluYW1pYwotT1NfX3BhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0ZV9jb250ZXh0XzA9Ci0KLU9TX19wYW5nb19jYWlyb19mb250X21hcF9nZXRfZGVmYXVsdD1mbGFncz1keW5hbWljCi0KLU9TX19wYW5nb19jYWlyb19mb250X21hcF9uZXc9ZmxhZ3M9ZHluYW1pYwotCi1PU19fcGFuZ29fY2Fpcm9fZm9udF9tYXBfc2V0X3Jlc29sdXRpb249ZmxhZ3M9ZHluYW1pYwotT1NfX3BhbmdvX2NhaXJvX2ZvbnRfbWFwX3NldF9yZXNvbHV0aW9uXzA9Ci1PU19fcGFuZ29fY2Fpcm9fZm9udF9tYXBfc2V0X3Jlc29sdXRpb25fMT0KLQotT1NfX3BhbmdvX2NhaXJvX2xheW91dF9wYXRoPWZsYWdzPWR5bmFtaWMKLU9TX19wYW5nb19jYWlyb19sYXlvdXRfcGF0aF8wPQotT1NfX3BhbmdvX2NhaXJvX2xheW91dF9wYXRoXzE9Ci0KLU9TX19wYW5nb19jYWlyb19zaG93X2xheW91dD1mbGFncz1keW5hbWljCi1PU19fcGFuZ29fY2Fpcm9fc2hvd19sYXlvdXRfMD0KLU9TX19wYW5nb19jYWlyb19zaG93X2xheW91dF8xPQotCi1PU19fcGFuZ29fY29udGV4dF9nZXRfYmFzZV9kaXI9Ci1PU19fcGFuZ29fY29udGV4dF9nZXRfYmFzZV9kaXJfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2xhbmd1YWdlPQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X2xhbmd1YWdlXzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzPQotT1NfX3BhbmdvX2NvbnRleHRfZ2V0X21ldHJpY3NfMD1jYXN0PShQYW5nb0NvbnRleHQgKikKLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzXzE9Y2FzdD0oY29uc3QgUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLU9TX19wYW5nb19jb250ZXh0X2dldF9tZXRyaWNzXzI9Y2FzdD0oUGFuZ29MYW5ndWFnZSAqKQotCi1PU19fcGFuZ29fY29udGV4dF9saXN0X2ZhbWlsaWVzPQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllc18wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfbGlzdF9mYW1pbGllc18xPWNhc3Q9KFBhbmdvRm9udEZhbWlseSAqKiopCi1PU19fcGFuZ29fY29udGV4dF9saXN0X2ZhbWlsaWVzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19wYW5nb19jb250ZXh0X3NldF9iYXNlX2Rpcj0KLU9TX19wYW5nb19jb250ZXh0X3NldF9iYXNlX2Rpcl8wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfc2V0X2Jhc2VfZGlyXzE9Ci0KLU9TX19wYW5nb19jb250ZXh0X3NldF9sYW5ndWFnZT0KLU9TX19wYW5nb19jb250ZXh0X3NldF9sYW5ndWFnZV8wPWNhc3Q9KFBhbmdvQ29udGV4dCAqKQotT1NfX3BhbmdvX2NvbnRleHRfc2V0X2xhbmd1YWdlXzE9Y2FzdD0oUGFuZ29MYW5ndWFnZSAqKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9jb3B5PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fY29weV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlXzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9zdHJpbmc9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcm9tX3N0cmluZ18wPWNhc3Q9KGNvbnN0IGNoYXIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9mYW1pbHk9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfZmFtaWx5XzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZ2V0X3NpemU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zdHlsZT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zdHlsZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF93ZWlnaHQ9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9nZXRfd2VpZ2h0XzA9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fbmV3PQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfZmFtaWx5PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X2ZhbWlseV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfZmFtaWx5XzE9Y2FzdD0oY29uc3QgY2hhciAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3NpemU9Ci1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc2l6ZV8xPWNhc3Q9KGdpbnQpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHJldGNoPQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3N0cmV0Y2hfMD1jYXN0PShQYW5nb0ZvbnREZXNjcmlwdGlvbiAqKQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3N0cmV0Y2hfMT1jYXN0PShQYW5nb1N0cmV0Y2gpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZT0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZV8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGVfMT1jYXN0PShQYW5nb1N0eWxlKQotCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfd2VpZ2h0PQotT1NfX3BhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3dlaWdodF8wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi1PU19fcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfd2VpZ2h0XzE9Y2FzdD0oUGFuZ29XZWlnaHQpCi0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3RvX3N0cmluZz0KLU9TX19wYW5nb19mb250X2Rlc2NyaXB0aW9uX3RvX3N0cmluZ18wPWNhc3Q9KFBhbmdvRm9udERlc2NyaXB0aW9uICopCi0KLU9TX19wYW5nb19mb250X2ZhY2VfZGVzY3JpYmU9Ci1PU19fcGFuZ29fZm9udF9mYWNlX2Rlc2NyaWJlXzA9Y2FzdD0oUGFuZ29Gb250RmFjZSAqKQotCi1PU19fcGFuZ29fZm9udF9mYW1pbHlfZ2V0X25hbWU9Ci1PU19fcGFuZ29fZm9udF9mYW1pbHlfZ2V0X25hbWVfMD1jYXN0PShQYW5nb0ZvbnRGYW1pbHkgKikKLQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2xpc3RfZmFjZXM9Ci1PU19fcGFuZ29fZm9udF9mYW1pbHlfbGlzdF9mYWNlc18wPWNhc3Q9KFBhbmdvRm9udEZhbWlseSAqKQotT1NfX3BhbmdvX2ZvbnRfZmFtaWx5X2xpc3RfZmFjZXNfMT1jYXN0PShQYW5nb0ZvbnRGYWNlICoqKikKLU9TX19wYW5nb19mb250X2ZhbWlseV9saXN0X2ZhY2VzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19wYW5nb19mb250X2dldF9tZXRyaWNzPQotT1NfX3BhbmdvX2ZvbnRfZ2V0X21ldHJpY3NfMD1jYXN0PVBhbmdvRm9udCAqCi1PU19fcGFuZ29fZm9udF9nZXRfbWV0cmljc18xPWNhc3Q9UGFuZ29MYW5ndWFnZSAqCi0KLU9TX19wYW5nb19mb250X21ldHJpY3NfZ2V0X2FwcHJveGltYXRlX2NoYXJfd2lkdGg9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hcHByb3hpbWF0ZV9jaGFyX3dpZHRoXzA9Y2FzdD0oUGFuZ29Gb250TWV0cmljcyAqKQotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hc2NlbnQ9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9hc2NlbnRfMD1jYXN0PShQYW5nb0ZvbnRNZXRyaWNzICopCi0KLU9TX19wYW5nb19mb250X21ldHJpY3NfZ2V0X2Rlc2NlbnQ9Ci1PU19fcGFuZ29fZm9udF9tZXRyaWNzX2dldF9kZXNjZW50XzA9Y2FzdD0oUGFuZ29Gb250TWV0cmljcyAqKQotCi1PU19fcGFuZ29fZm9udF9tZXRyaWNzX3VucmVmPQotT1NfX3BhbmdvX2ZvbnRfbWV0cmljc191bnJlZl8wPWNhc3Q9KFBhbmdvRm9udE1ldHJpY3MgKikKLQotT1NfX3BhbmdvX2xhbmd1YWdlX2Zyb21fc3RyaW5nPQotT1NfX3BhbmdvX2xhbmd1YWdlX2Zyb21fc3RyaW5nXzA9Y2FzdD0oY29uc3QgY2hhciAqKSxmbGFncz1ub19vdXQKLQotT1NfX3BhbmdvX2xheW91dF9jb250ZXh0X2NoYW5nZWQ9Ci1PU19fcGFuZ29fbGF5b3V0X2NvbnRleHRfY2hhbmdlZF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9hbGlnbm1lbnQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9hbGlnbm1lbnRfMD1jYXN0PVBhbmdvTGF5b3V0KgotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9hdHRyaWJ1dGVzPQotT1NfX3BhbmdvX2xheW91dF9nZXRfYXR0cmlidXRlc18wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2NvbnRleHQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9jb250ZXh0XzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfaW5kZW50PQotT1NfX3BhbmdvX2xheW91dF9nZXRfaW5kZW50XzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9pdGVyPQotT1NfX3BhbmdvX2xheW91dF9nZXRfaXRlcl8wPWNhc3Q9KFBhbmdvTGF5b3V0KikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfanVzdGlmeT0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2p1c3RpZnlfMD1jYXN0PShQYW5nb0xheW91dCopCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmU9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lXzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lXzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xpbmVfY291bnQ9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF9saW5lX2NvdW50XzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfbG9nX2F0dHJzPQotT1NfX3BhbmdvX2xheW91dF9nZXRfbG9nX2F0dHJzXzA9Y2FzdD1QYW5nb0xheW91dCoKLU9TX19wYW5nb19sYXlvdXRfZ2V0X2xvZ19hdHRyc18xPWNhc3Q9UGFuZ29Mb2dBdHRyICoqCi1PU19fcGFuZ29fbGF5b3V0X2dldF9sb2dfYXR0cnNfMj1jYXN0PShpbnQgKikKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZT0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3NpemVfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZV8xPWNhc3Q9KGludCAqKQotT1NfX3BhbmdvX2xheW91dF9nZXRfc2l6ZV8yPWNhc3Q9KGludCAqKQotCi1PU19fcGFuZ29fbGF5b3V0X2dldF9zcGFjaW5nPQotT1NfX3BhbmdvX2xheW91dF9nZXRfc3BhY2luZ18wPWNhc3Q9UGFuZ29MYXlvdXQqCi0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3RhYnM9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF90YWJzXzA9Y2FzdD1QYW5nb0xheW91dCoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfdGV4dD0KLU9TX19wYW5nb19sYXlvdXRfZ2V0X3RleHRfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLQotT1NfX3BhbmdvX2xheW91dF9nZXRfd2lkdGg9Ci1PU19fcGFuZ29fbGF5b3V0X2dldF93aWR0aF8wPWNhc3Q9UGFuZ29MYXlvdXQgKgotCi1PU19fcGFuZ29fbGF5b3V0X2luZGV4X3RvX3Bvcz0KLU9TX19wYW5nb19sYXlvdXRfaW5kZXhfdG9fcG9zXzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotT1NfX3BhbmdvX2xheW91dF9pbmRleF90b19wb3NfMT0KLU9TX19wYW5nb19sYXlvdXRfaW5kZXhfdG9fcG9zXzI9ZmxhZ3M9bm9faW4KLQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2ZyZWU9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZnJlZV8wPWNhc3Q9UGFuZ29MYXlvdXRJdGVyKgotCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2luZGV4PQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9pbmRleF8wPWNhc3Q9KFBhbmdvTGF5b3V0SXRlciopCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfbGluZV9leHRlbnRzPQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMD1jYXN0PShQYW5nb0xheW91dEl0ZXIqKQotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMT1mbGFncz1ub19pbgotT1NfX3BhbmdvX2xheW91dF9pdGVyX2dldF9saW5lX2V4dGVudHNfMj1mbGFncz1ub19pbgotCi1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X3J1bj0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9nZXRfcnVuXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X2xpbmU9Ci1PU19fcGFuZ29fbGF5b3V0X2l0ZXJfbmV4dF9saW5lXzA9Y2FzdD1QYW5nb0xheW91dEl0ZXIqCi0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X3J1bj0KLU9TX19wYW5nb19sYXlvdXRfaXRlcl9uZXh0X3J1bl8wPWNhc3Q9UGFuZ29MYXlvdXRJdGVyKgotCi1PU19fcGFuZ29fbGF5b3V0X2xpbmVfZ2V0X2V4dGVudHM9Ci1PU19fcGFuZ29fbGF5b3V0X2xpbmVfZ2V0X2V4dGVudHNfMD1jYXN0PVBhbmdvTGF5b3V0TGluZSoKLU9TX19wYW5nb19sYXlvdXRfbGluZV9nZXRfZXh0ZW50c18xPWNhc3Q9UGFuZ29SZWN0YW5nbGUgKixmbGFncz1ub19pbgotT1NfX3BhbmdvX2xheW91dF9saW5lX2dldF9leHRlbnRzXzI9Y2FzdD1QYW5nb1JlY3RhbmdsZSAqLGZsYWdzPW5vX2luCi0KLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4PQotT1NfX3BhbmdvX2xheW91dF9saW5lX3hfdG9faW5kZXhfMD1jYXN0PVBhbmdvTGF5b3V0TGluZSoKLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4XzE9Ci1PU19fcGFuZ29fbGF5b3V0X2xpbmVfeF90b19pbmRleF8yPWNhc3Q9aW50ICoKLU9TX19wYW5nb19sYXlvdXRfbGluZV94X3RvX2luZGV4XzM9Y2FzdD1pbnQgKgotCi1PU19fcGFuZ29fbGF5b3V0X25ldz0KLU9TX19wYW5nb19sYXlvdXRfbmV3XzA9Y2FzdD0oUGFuZ29Db250ZXh0ICopCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2FsaWdubWVudD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2FsaWdubWVudF8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9hbGlnbm1lbnRfMT0KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlcz0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2F0dHJpYnV0ZXNfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlc18xPWNhc3Q9UGFuZ29BdHRyTGlzdCAqCi0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2F1dG9fZGlyPWZsYWdzPWR5bmFtaWMKLU9TX19wYW5nb19sYXlvdXRfc2V0X2F1dG9fZGlyXzA9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9hdXRvX2Rpcl8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uPQotT1NfX3BhbmdvX2xheW91dF9zZXRfZm9udF9kZXNjcmlwdGlvbl8wPWNhc3Q9KFBhbmdvTGF5b3V0ICopCi1PU19fcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uXzE9Y2FzdD0oUGFuZ29Gb250RGVzY3JpcHRpb24gKikKLQotT1NfX3BhbmdvX2xheW91dF9zZXRfaW5kZW50PQotT1NfX3BhbmdvX2xheW91dF9zZXRfaW5kZW50XzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfaW5kZW50XzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfc2V0X2p1c3RpZnk9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9qdXN0aWZ5XzA9Y2FzdD0oUGFuZ29MYXlvdXQqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfanVzdGlmeV8xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF9zaW5nbGVfcGFyYWdyYXBoX21vZGU9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF9zaW5nbGVfcGFyYWdyYXBoX21vZGVfMD1jYXN0PVBhbmdvTGF5b3V0ICoKLU9TX19wYW5nb19sYXlvdXRfc2V0X3NpbmdsZV9wYXJhZ3JhcGhfbW9kZV8xPWNhc3Q9Z2Jvb2xlYW4KLQotT1NfX3BhbmdvX2xheW91dF9zZXRfc3BhY2luZz0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3NwYWNpbmdfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfc3BhY2luZ18xPQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF90YWJzPQotT1NfX3BhbmdvX2xheW91dF9zZXRfdGFic18wPWNhc3Q9UGFuZ29MYXlvdXQgKgotT1NfX3BhbmdvX2xheW91dF9zZXRfdGFic18xPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLQotT1NfX3BhbmdvX2xheW91dF9zZXRfdGV4dD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3RleHRfMD1jYXN0PShQYW5nb0xheW91dCAqKQotT1NfX3BhbmdvX2xheW91dF9zZXRfdGV4dF8xPWNhc3Q9KGNvbnN0IGNoYXIgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19fcGFuZ29fbGF5b3V0X3NldF90ZXh0XzI9Y2FzdD0oaW50KQotCi1PU19fcGFuZ29fbGF5b3V0X3NldF93aWR0aD0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3dpZHRoXzA9Y2FzdD0oUGFuZ29MYXlvdXQgKikKLU9TX19wYW5nb19sYXlvdXRfc2V0X3dpZHRoXzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfc2V0X3dyYXA9Ci1PU19fcGFuZ29fbGF5b3V0X3NldF93cmFwXzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X3NldF93cmFwXzE9Ci0KLU9TX19wYW5nb19sYXlvdXRfeHlfdG9faW5kZXg9Ci1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4XzA9Y2FzdD1QYW5nb0xheW91dCAqCi1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4XzE9Ci1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4XzI9Ci1PU19fcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4XzM9Y2FzdD1pbnQgKgotT1NfX3BhbmdvX2xheW91dF94eV90b19pbmRleF80PWNhc3Q9aW50ICoKLQotT1NfX3BhbmdvX3RhYl9hcnJheV9mcmVlPQotT1NfX3BhbmdvX3RhYl9hcnJheV9mcmVlXzA9Y2FzdD0oUGFuZ29UYWJBcnJheSAqKQotCi1PU19fcGFuZ29fdGFiX2FycmF5X2dldF9zaXplPQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfc2l6ZV8wPWNhc3Q9KFBhbmdvVGFiQXJyYXkgKikKLQotT1NfX3BhbmdvX3RhYl9hcnJheV9nZXRfdGFicz0KLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3RhYnNfMD1jYXN0PShQYW5nb1RhYkFycmF5ICopCi1PU19fcGFuZ29fdGFiX2FycmF5X2dldF90YWJzXzE9Y2FzdD0oUGFuZ29UYWJBbGlnbiAqKikKLU9TX19wYW5nb190YWJfYXJyYXlfZ2V0X3RhYnNfMj1jYXN0PShpbnQgKiopCi0KLU9TX19wYW5nb190YWJfYXJyYXlfbmV3PQotT1NfX3BhbmdvX3RhYl9hcnJheV9uZXdfMD1jYXN0PShnaW50KQotT1NfX3BhbmdvX3RhYl9hcnJheV9uZXdfMT1jYXN0PShnYm9vbGVhbikKLQotT1NfX3BhbmdvX3RhYl9hcnJheV9zZXRfdGFiPQotT1NfX3BhbmdvX3RhYl9hcnJheV9zZXRfdGFiXzA9Y2FzdD0oUGFuZ29UYWJBcnJheSAqKQotT1NfX3BhbmdvX3RhYl9hcnJheV9zZXRfdGFiXzE9Y2FzdD0oZ2ludCkKLU9TX19wYW5nb190YWJfYXJyYXlfc2V0X3RhYl8yPWNhc3Q9KFBhbmdvVGFiQWxpZ24pCi1PU19fcGFuZ29fdGFiX2FycmF5X3NldF90YWJfMz1jYXN0PShnaW50KQotCi1PU19nX21haW5fY29udGV4dF93YWtldXA9Ci1PU19nX21haW5fY29udGV4dF93YWtldXBfMD1jYXN0PUdNYWluQ29udGV4dCAqCi0KLU9TX2xvY2FsZWNvbnZfZGVjaW1hbF9wb2ludD0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dJbnRlcmZhY2VJbmZvXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HSW50ZXJmYWNlSW5mb18ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dPYmplY3RDbGFzc18yXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlSW5mb18yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm9fMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVJbmZvXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZUluZm9fMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRCdXR0b25fMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzI9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8yXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMl8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDZWxsUmVuZGVyZXJDbGFzc18yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NlbGxSZW5kZXJlckNsYXNzXzJfMD0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDZWxsUmVuZGVyZXJDbGFzc18yXzE9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMl8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRFbnRyeV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0RW50cnlfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1dpZGdldENsYXNzXzJfMD0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18yXzE9ZmxhZ3M9bm9fb3V0Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29BdHRyaWJ1dGVfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENsaWVudE1lc3NhZ2VFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hDbGllbnRNZXNzYWdlRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ3Jvc3NpbmdFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hGb2N1c0NoYW5nZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HT2JqZWN0Q2xhc3NfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnlfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR1R5cGVRdWVyeV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HVHlwZVF1ZXJ5XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dUeXBlUXVlcnlfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtDb2xvcl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0RyYWdDb250ZXh0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0RyYWdDb250ZXh0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0RyYWdDb250ZXh0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0RyYWdDb250ZXh0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnlfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnlfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnlfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRBbnlfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEJ1dHRvbl8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3NpbmdfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRDcm9zc2luZ18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudENyb3NzaW5nXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Q3Jvc3NpbmdfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEV4cG9zZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEV4cG9zZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEV4cG9zZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEV4cG9zZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Rm9jdXNfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRGb2N1c18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEZvY3VzXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50Rm9jdXNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudEtleV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50TW90aW9uXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50TW90aW9uXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50TW90aW9uXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50TW90aW9uXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRTY3JvbGxfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRTY3JvbGxfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRTY3JvbGxfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRTY3JvbGxfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFZpc2liaWxpdHlfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRWaXNpYmlsaXR5XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50VmlzaWJpbGl0eV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFZpc2liaWxpdHlfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFdpbmRvd1N0YXRlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0V2ZW50V2luZG93U3RhdGVfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRXaW5kb3dTdGF0ZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtFdmVudFdpbmRvd1N0YXRlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtJbWFnZV8yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka0ltYWdlXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrSW1hZ2VfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HZGtSZWN0YW5nbGVfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR2RrUmVjdGFuZ2xlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1JlY3RhbmdsZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1Zpc3VhbF8yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1Zpc3VhbF8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0dka1Zpc3VhbF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQWRqdXN0bWVudF8yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0FkanVzdG1lbnRfMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtBZGp1c3RtZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXJfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQm9yZGVyXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0JvcmRlcl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtCb3JkZXJfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDZWxsUmVuZGVyZXJDbGFzc18yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NlbGxSZW5kZXJlckNsYXNzXzJJXzA9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDZWxsUmVuZGVyZXJDbGFzc18ySV8xPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb2xvclNlbGVjdGlvbkRpYWxvZ18yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbG9yU2VsZWN0aW9uRGlhbG9nXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2dfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0NvbWJvXzJJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrQ29tYm9fMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtDb21ib18ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRmlsZVNlbGVjdGlvbl8yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpbGVTZWxlY3Rpb25fMklfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaWxlU2VsZWN0aW9uXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtGaXhlZF8yST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a0ZpeGVkXzJJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrRml4ZWRfMklfMT1jYXN0PShjb25zdCB2b2lkICopCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1NlbGVjdGlvbkRhdGFfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrU2VsZWN0aW9uRGF0YV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtTZWxlY3Rpb25EYXRhXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1NlbGVjdGlvbkRhdGFfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRQYWlyXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX0d0a1RhcmdldFBhaXJfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrVGFyZ2V0UGFpcl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtUYXJnZXRQYWlyXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfR3RrV2lkZ2V0Q2xhc3NfMkk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18ySV8wPWZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19HdGtXaWRnZXRDbGFzc18ySV8xPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvSXRlbV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0l0ZW1fMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29JdGVtXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvSXRlbV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0TGluZV8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dExpbmVfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29MYXlvdXRMaW5lXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0TGluZV8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0UnVuXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0UnVuXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0UnVuXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTGF5b3V0UnVuXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29Mb2dBdHRyXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvTG9nQXR0cl8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xvZ0F0dHJfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29Mb2dBdHRyXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQnV0dG9uRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEJ1dHRvbkV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hFeHBvc2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRXhwb3NlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hWaXNpYmlsaXR5RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWFZpc2liaWxpdHlFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YVmlzaWJpbGl0eUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hWaXNpYmlsaXR5RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19yZWFscGF0aD0KLU9TX3JlYWxwYXRoXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfcmVhbHBhdGhfMT1jYXN0PShjaGFyICopCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0F0dHJpYnV0ZT0KLVBhbmdvQXR0cmlidXRlX2tsYXNzPWNhc3Q9Y29uc3QgUGFuZ29BdHRyQ2xhc3MgKgotUGFuZ29BdHRyaWJ1dGVfc3RhcnRfaW5kZXg9Ci1QYW5nb0F0dHJpYnV0ZV9lbmRfaW5kZXg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29JdGVtPQotUGFuZ29JdGVtX29mZnNldD0KLVBhbmdvSXRlbV9sZW5ndGg9Ci1QYW5nb0l0ZW1fbnVtX2NoYXJzPQotUGFuZ29JdGVtX2FuYWx5c2lzX3NoYXBlX2VuZ2luZT1hY2Nlc3Nvcj1hbmFseXNpcy5zaGFwZV9lbmdpbmUsY2FzdD0oUGFuZ29FbmdpbmVTaGFwZSAqKQotUGFuZ29JdGVtX2FuYWx5c2lzX2xhbmdfZW5naW5lPWFjY2Vzc29yPWFuYWx5c2lzLmxhbmdfZW5naW5lLGNhc3Q9UGFuZ29FbmdpbmVMYW5nICoKLVBhbmdvSXRlbV9hbmFseXNpc19mb250PWFjY2Vzc29yPWFuYWx5c2lzLmZvbnQsY2FzdD1QYW5nb0ZvbnQgKgotUGFuZ29JdGVtX2FuYWx5c2lzX2xldmVsPWFjY2Vzc29yPWFuYWx5c2lzLmxldmVsCi1QYW5nb0l0ZW1fYW5hbHlzaXNfbGFuZ3VhZ2U9YWNjZXNzb3I9YW5hbHlzaXMubGFuZ3VhZ2UsY2FzdD0oUGFuZ29MYW5ndWFnZSAqKQotUGFuZ29JdGVtX2FuYWx5c2lzX2V4dHJhX2F0dHJzPWFjY2Vzc29yPWFuYWx5c2lzLmV4dHJhX2F0dHJzLGNhc3Q9R1NMaXN0ICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dExpbmU9Ci1QYW5nb0xheW91dExpbmVfbGF5b3V0PWNhc3Q9UGFuZ29MYXlvdXQgKgotUGFuZ29MYXlvdXRMaW5lX3N0YXJ0X2luZGV4PQotUGFuZ29MYXlvdXRMaW5lX2xlbmd0aD0KLVBhbmdvTGF5b3V0TGluZV9ydW5zPWNhc3Q9R1NMaXN0ICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19QYW5nb0xheW91dFJ1bj0KLVBhbmdvTGF5b3V0UnVuX2l0ZW09Y2FzdD1QYW5nb0l0ZW0gKgotUGFuZ29MYXlvdXRSdW5fZ2x5cGhzPWNhc3Q9UGFuZ29HbHlwaFN0cmluZyAqCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfUGFuZ29Mb2dBdHRyPQotUGFuZ29Mb2dBdHRyX2lzX2xpbmVfYnJlYWs9Ci1QYW5nb0xvZ0F0dHJfaXNfbWFuZGF0b3J5X2JyZWFrPQotUGFuZ29Mb2dBdHRyX2lzX2NoYXJfYnJlYWs9Ci1QYW5nb0xvZ0F0dHJfaXNfd2hpdGU9Ci1QYW5nb0xvZ0F0dHJfaXNfY3Vyc29yX3Bvc2l0aW9uPQotUGFuZ29Mb2dBdHRyX2lzX3dvcmRfc3RhcnQ9Ci1QYW5nb0xvZ0F0dHJfaXNfd29yZF9lbmQ9Ci1QYW5nb0xvZ0F0dHJfaXNfc2VudGVuY2VfYm91bmRhcnk9Ci1QYW5nb0xvZ0F0dHJfaXNfc2VudGVuY2Vfc3RhcnQ9Ci1QYW5nb0xvZ0F0dHJfaXNfc2VudGVuY2VfZW5kPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1BhbmdvUmVjdGFuZ2xlPQotUGFuZ29SZWN0YW5nbGVfeD0KLVBhbmdvUmVjdGFuZ2xlX3k9Ci1QYW5nb1JlY3RhbmdsZV93aWR0aD0KLVBhbmdvUmVjdGFuZ2xlX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQW55RXZlbnQ9Ci1YQW55RXZlbnRfc2VyaWFsPQotWEFueUV2ZW50X3NlbmRfZXZlbnQ9Ci1YQW55RXZlbnRfZGlzcGxheT1jYXN0PURpc3BsYXkgKgotWEFueUV2ZW50X3dpbmRvdz1jYXN0PVdpbmRvdwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hCdXR0b25FdmVudD0KLVhCdXR0b25FdmVudF9yb290PQotWEJ1dHRvbkV2ZW50X3N1YndpbmRvdz0KLVhCdXR0b25FdmVudF90aW1lPQotWEJ1dHRvbkV2ZW50X3g9Ci1YQnV0dG9uRXZlbnRfeT0KLVhCdXR0b25FdmVudF94X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfeV9yb290PQotWEJ1dHRvbkV2ZW50X3N0YXRlPQotWEJ1dHRvbkV2ZW50X2J1dHRvbj0KLVhCdXR0b25FdmVudF9zYW1lX3NjcmVlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YQ2xpZW50TWVzc2FnZUV2ZW50PQotWENsaWVudE1lc3NhZ2VFdmVudF90eXBlPQotWENsaWVudE1lc3NhZ2VFdmVudF9zZXJpYWw9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X3NlbmRfZXZlbnQ9Ci1YQ2xpZW50TWVzc2FnZUV2ZW50X2Rpc3BsYXk9Y2FzdD0oRGlzcGxheSAqKQotWENsaWVudE1lc3NhZ2VFdmVudF93aW5kb3c9Y2FzdD0oV2luZG93KQotWENsaWVudE1lc3NhZ2VFdmVudF9tZXNzYWdlX3R5cGU9Y2FzdD0oQXRvbSkKLVhDbGllbnRNZXNzYWdlRXZlbnRfZm9ybWF0PQotWENsaWVudE1lc3NhZ2VFdmVudF9kYXRhPWFjY2Vzc29yPWRhdGEubCxjYXN0PShsb25nICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWENyb3NzaW5nRXZlbnQ9Ci1YQ3Jvc3NpbmdFdmVudF9yb290PWNhc3Q9KFdpbmRvdykKLVhDcm9zc2luZ0V2ZW50X3N1YndpbmRvdz1jYXN0PShXaW5kb3cpCi1YQ3Jvc3NpbmdFdmVudF90aW1lPWNhc3Q9VGltZQotWENyb3NzaW5nRXZlbnRfeD0KLVhDcm9zc2luZ0V2ZW50X3k9Ci1YQ3Jvc3NpbmdFdmVudF94X3Jvb3Q9Ci1YQ3Jvc3NpbmdFdmVudF95X3Jvb3Q9Ci1YQ3Jvc3NpbmdFdmVudF9tb2RlPQotWENyb3NzaW5nRXZlbnRfZGV0YWlsPQotWENyb3NzaW5nRXZlbnRfc2FtZV9zY3JlZW49Y2FzdD1Cb29sCi1YQ3Jvc3NpbmdFdmVudF9mb2N1cz1jYXN0PUJvb2wKLVhDcm9zc2luZ0V2ZW50X3N0YXRlPWNhc3Q9dW5zaWduZWQgaW50Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV2ZW50PQotWEV2ZW50X3R5cGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEV4cG9zZUV2ZW50PQotWEV4cG9zZUV2ZW50X3g9Ci1YRXhwb3NlRXZlbnRfeT0KLVhFeHBvc2VFdmVudF93aWR0aD0KLVhFeHBvc2VFdmVudF9oZWlnaHQ9Ci1YRXhwb3NlRXZlbnRfY291bnQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9ndGtfWEZvY3VzQ2hhbmdlRXZlbnQ9Ci1YRm9jdXNDaGFuZ2VFdmVudF9tb2RlPQotWEZvY3VzQ2hhbmdlRXZlbnRfZGV0YWlsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfZ3RrX1hSZW5kZXJQaWN0dXJlQXR0cmlidXRlcz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19yZXBlYXQ9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfYWxwaGFfbWFwPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX3hfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX3lfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfeF9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF95X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX21hc2s9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfZ3JhcGhpY3NfZXhwb3N1cmVzPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3N1YndpbmRvd19tb2RlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3BvbHlfZWRnZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19wb2x5X21vZGU9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfZGl0aGVyPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NvbXBvbmVudF9hbHBoYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YVmlzaWJpbGl0eUV2ZW50PQotWFZpc2liaWxpdHlFdmVudF9zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX2d0a19YV2luZG93Q2hhbmdlcz0KLVhXaW5kb3dDaGFuZ2VzX3g9Ci1YV2luZG93Q2hhbmdlc195PQotWFdpbmRvd0NoYW5nZXNfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19oZWlnaHQ9Ci1YV2luZG93Q2hhbmdlc19ib3JkZXJfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19zaWJsaW5nPQotWFdpbmRvd0NoYW5nZXNfc3RhY2tfbW9kZT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2ZiNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN3dF9jb3B5cmlnaHQ9LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiBcCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiBcCi0qIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtc1xuIFwKLSogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkgVmVyc2lvbiAyLjEgdGhhdFxuIFwKLSogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gKGxncGwtdjIxLnR4dCkuICBUaGUgTEdQTCBpcyBhbHNvXG4gXAotKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbC4gIElmIHRoZSB2ZXJzaW9uXG4gXAotKiBvZiB0aGUgTEdQTCBhdCBodHRwOi8vd3d3LmdudS5vcmcgaXMgZGlmZmVyZW50IHRvIHRoZSB2ZXJzaW9uIG9mXG4gXAotKiB0aGUgTEdQTCBhY2NvbXBhbnlpbmcgdGhpcyBkaXN0cmlidXRpb24gYW5kIHRoZXJlIGlzIGFueSBjb25mbGljdFxuIFwKLSogYmV0d2VlbiB0aGUgdHdvIGxpY2Vuc2UgdmVyc2lvbnMsIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCBhY2NvbXBhbnlpbmdcbiBcCi0qIHRoaXMgZGlzdHJpYnV0aW9uIHNoYWxsIGdvdmVybi5cbiBcCi0qIFxuIFwKLSogQ29udHJpYnV0b3JzOlxuIFwKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuIFwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vdGlmLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vdGlmLk9TLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGM4NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi5PUy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjc1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfT1M9Ci1PU19DT0RFU0VUPWZsYWdzPWNvbnN0Ci0KLU9TX0ZEX0lTU0VUPQotT1NfRkRfSVNTRVRfMD0KLU9TX0ZEX0lTU0VUXzE9Y2FzdD0oZmRfc2V0ICopCi0KLU9TX0ZEX1NFVD0KLU9TX0ZEX1NFVF8wPQotT1NfRkRfU0VUXzE9Y2FzdD0oZmRfc2V0ICopCi0KLU9TX0ZEX1pFUk89Ci1PU19GRF9aRVJPXzA9Y2FzdD0oZmRfc2V0ICopCi0KLU9TX0xDX0NUWVBFPWZsYWdzPWNvbnN0Ci0KLU9TX01CX0NVUl9NQVg9ZmxhZ3M9Y29uc3QKLQotT1NfTW9uaXRvckVudGVyPWZsYWdzPW5vX2dlbgotT1NfTW9uaXRvckVudGVyXzA9Ci0KLU9TX01vbml0b3JFeGl0PWZsYWdzPW5vX2dlbgotT1NfTW9uaXRvckV4aXRfMD0KLQotT1NfWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX3NpemVvZj0KLQotT1NfX0NhbGw9Ci1PU19fQ2FsbF8wPQotT1NfX0NhbGxfMT0KLU9TX19DYWxsXzI9Ci0KLU9TX19Db25uZWN0aW9uTnVtYmVyPQotT1NfX0Nvbm5lY3Rpb25OdW1iZXJfMD0KLQotT1NfX1hBbGxvY0NvbG9yPQotT1NfX1hBbGxvY0NvbG9yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hBbGxvY0NvbG9yXzE9Ci1PU19fWEFsbG9jQ29sb3JfMj0KLQotT1NfX1hCZWxsPQotT1NfX1hCZWxsXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hCZWxsXzE9Ci0KLU9TX19YQmxhY2tQaXhlbD0KLU9TX19YQmxhY2tQaXhlbF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQmxhY2tQaXhlbF8xPQotCi1PU19fWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiPQotT1NfX1hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWJfMT0KLU9TX19YQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWJfMj1jYXN0PShDdXJzb3IpCi1PU19fWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiXzM9Y2FzdD0oVGltZSkKLQotT1NfX1hDaGFuZ2VQcm9wZXJ0eT0KLU9TX19YQ2hhbmdlUHJvcGVydHlfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hDaGFuZ2VQcm9wZXJ0eV8xPWNhc3Q9V2luZG93Ci1PU19fWENoYW5nZVByb3BlcnR5XzI9Y2FzdD1BdG9tCi1PU19fWENoYW5nZVByb3BlcnR5XzM9Y2FzdD1BdG9tCi1PU19fWENoYW5nZVByb3BlcnR5XzQ9Ci1PU19fWENoYW5nZVByb3BlcnR5XzU9Ci1PU19fWENoYW5nZVByb3BlcnR5XzY9Y2FzdD11bnNpZ25lZCBjaGFyICoKLU9TX19YQ2hhbmdlUHJvcGVydHlfNz0KLQotT1NfX1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzPQotT1NfX1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXzE9Ci1PU19fWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNfMj0KLU9TX19YQ2hhbmdlV2luZG93QXR0cmlidXRlc18zPQotCi1PU19fWENoZWNrSWZFdmVudD0KLU9TX19YQ2hlY2tJZkV2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja0lmRXZlbnRfMT1jYXN0PShYRXZlbnQgKikKLU9TX19YQ2hlY2tJZkV2ZW50XzI9Y2FzdD0oQm9vbCAoKikoKSkKLU9TX19YQ2hlY2tJZkV2ZW50XzM9Y2FzdD0oWFBvaW50ZXIpCi0KLU9TX19YQ2hlY2tNYXNrRXZlbnQ9Ci1PU19fWENoZWNrTWFza0V2ZW50XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDaGVja01hc2tFdmVudF8xPQotT1NfX1hDaGVja01hc2tFdmVudF8yPWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWENoZWNrV2luZG93RXZlbnQ9Ci1PU19fWENoZWNrV2luZG93RXZlbnRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENoZWNrV2luZG93RXZlbnRfMT1jYXN0PShXaW5kb3cpCi1PU19fWENoZWNrV2luZG93RXZlbnRfMj0KLU9TX19YQ2hlY2tXaW5kb3dFdmVudF8zPWNhc3Q9KFhFdmVudCAqKQotCi1PU19fWENsZWFyQXJlYT0KLU9TX19YQ2xlYXJBcmVhXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDbGVhckFyZWFfMT0KLU9TX19YQ2xlYXJBcmVhXzI9Ci1PU19fWENsZWFyQXJlYV8zPQotT1NfX1hDbGVhckFyZWFfND0KLU9TX19YQ2xlYXJBcmVhXzU9Ci1PU19fWENsZWFyQXJlYV82PQotCi1PU19fWENsaXBCb3g9Ci1PU19fWENsaXBCb3hfMD1jYXN0PShSZWdpb24pCi1PU19fWENsaXBCb3hfMT1jYXN0PShYUmVjdGFuZ2xlICopCi0KLU9TX19YQ2xvc2VEaXNwbGF5PQotT1NfX1hDbG9zZURpc3BsYXlfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YQ29weUFyZWE9Ci1PU19fWENvcHlBcmVhXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDb3B5QXJlYV8xPQotT1NfX1hDb3B5QXJlYV8yPQotT1NfX1hDb3B5QXJlYV8zPWNhc3Q9KEdDKQotT1NfX1hDb3B5QXJlYV80PQotT1NfX1hDb3B5QXJlYV81PQotT1NfX1hDb3B5QXJlYV82PQotT1NfX1hDb3B5QXJlYV83PQotT1NfX1hDb3B5QXJlYV84PQotT1NfX1hDb3B5QXJlYV85PQotCi1PU19fWENvcHlQbGFuZT0KLU9TX19YQ29weVBsYW5lXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDb3B5UGxhbmVfMT0KLU9TX19YQ29weVBsYW5lXzI9Ci1PU19fWENvcHlQbGFuZV8zPWNhc3Q9KEdDKQotT1NfX1hDb3B5UGxhbmVfND0KLU9TX19YQ29weVBsYW5lXzU9Ci1PU19fWENvcHlQbGFuZV82PQotT1NfX1hDb3B5UGxhbmVfNz0KLU9TX19YQ29weVBsYW5lXzg9Ci1PU19fWENvcHlQbGFuZV85PQotT1NfX1hDb3B5UGxhbmVfMTA9Ci0KLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGE9Ci1PU19fWENyZWF0ZUJpdG1hcEZyb21EYXRhXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YV8xPQotT1NfX1hDcmVhdGVCaXRtYXBGcm9tRGF0YV8yPWNhc3Q9KGNoYXIgKikKLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGFfMz0KLU9TX19YQ3JlYXRlQml0bWFwRnJvbURhdGFfND0KLQotT1NfX1hDcmVhdGVDb2xvcm1hcD0KLU9TX19YQ3JlYXRlQ29sb3JtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZUNvbG9ybWFwXzE9Y2FzdD0oV2luZG93KQotT1NfX1hDcmVhdGVDb2xvcm1hcF8yPWNhc3Q9KFZpc3VhbCAqKQotT1NfX1hDcmVhdGVDb2xvcm1hcF8zPQotCi1PU19fWENyZWF0ZUZvbnRDdXJzb3I9Ci1PU19fWENyZWF0ZUZvbnRDdXJzb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZUZvbnRDdXJzb3JfMT0KLQotT1NfX1hDcmVhdGVHQz0KLU9TX19YQ3JlYXRlR0NfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZUdDXzE9Ci1PU19fWENyZWF0ZUdDXzI9Ci1PU19fWENyZWF0ZUdDXzM9Ci0KLU9TX19YQ3JlYXRlSW1hZ2U9Ci1PU19fWENyZWF0ZUltYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hDcmVhdGVJbWFnZV8xPWNhc3Q9KFZpc3VhbCAqKQotT1NfX1hDcmVhdGVJbWFnZV8yPQotT1NfX1hDcmVhdGVJbWFnZV8zPQotT1NfX1hDcmVhdGVJbWFnZV80PQotT1NfX1hDcmVhdGVJbWFnZV81PWNhc3Q9KGNoYXIgKikKLU9TX19YQ3JlYXRlSW1hZ2VfNj0KLU9TX19YQ3JlYXRlSW1hZ2VfNz0KLU9TX19YQ3JlYXRlSW1hZ2VfOD0KLU9TX19YQ3JlYXRlSW1hZ2VfOT0KLQotT1NfX1hDcmVhdGVQaXhtYXA9Ci1PU19fWENyZWF0ZVBpeG1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YQ3JlYXRlUGl4bWFwXzE9Ci1PU19fWENyZWF0ZVBpeG1hcF8yPQotT1NfX1hDcmVhdGVQaXhtYXBfMz0KLU9TX19YQ3JlYXRlUGl4bWFwXzQ9Ci0KLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yPQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl8xPWNhc3Q9KFBpeG1hcCkKLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzI9Y2FzdD0oUGl4bWFwKQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfMz0KLU9TX19YQ3JlYXRlUGl4bWFwQ3Vyc29yXzQ9Ci1PU19fWENyZWF0ZVBpeG1hcEN1cnNvcl81PQotT1NfX1hDcmVhdGVQaXhtYXBDdXJzb3JfNj0KLQotT1NfX1hDcmVhdGVSZWdpb249Ci0KLU9TX19YQ3JlYXRlV2luZG93PQotT1NfX1hDcmVhdGVXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWENyZWF0ZVdpbmRvd18xPWNhc3Q9KFdpbmRvdykKLU9TX19YQ3JlYXRlV2luZG93XzI9Ci1PU19fWENyZWF0ZVdpbmRvd18zPQotT1NfX1hDcmVhdGVXaW5kb3dfND0KLU9TX19YQ3JlYXRlV2luZG93XzU9Ci1PU19fWENyZWF0ZVdpbmRvd182PQotT1NfX1hDcmVhdGVXaW5kb3dfNz0KLU9TX19YQ3JlYXRlV2luZG93Xzg9Ci1PU19fWENyZWF0ZVdpbmRvd185PWNhc3Q9KFZpc3VhbCAqKQotT1NfX1hDcmVhdGVXaW5kb3dfMTA9Ci1PU19fWENyZWF0ZVdpbmRvd18xMT1jYXN0PShYU2V0V2luZG93QXR0cmlidXRlcyAqKQotCi1PU19fWERlZmF1bHRDb2xvcm1hcD0KLU9TX19YRGVmYXVsdENvbG9ybWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEZWZhdWx0Q29sb3JtYXBfMT0KLQotT1NfX1hEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbj0KLU9TX19YRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW5fMD1jYXN0PShTY3JlZW4gKikKLQotT1NfX1hEZWZhdWx0RGVwdGhPZlNjcmVlbj0KLU9TX19YRGVmYXVsdERlcHRoT2ZTY3JlZW5fMD1jYXN0PShTY3JlZW4gKikKLQotT1NfX1hEZWZhdWx0R0NPZlNjcmVlbj0KLU9TX19YRGVmYXVsdEdDT2ZTY3JlZW5fMD1jYXN0PShTY3JlZW4gKikKLQotT1NfX1hEZWZhdWx0Um9vdFdpbmRvdz0KLU9TX19YRGVmYXVsdFJvb3RXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YRGVmYXVsdFNjcmVlbj0KLU9TX19YRGVmYXVsdFNjcmVlbl8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5PQotT1NfX1hEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWERlZmF1bHRWaXN1YWw9Ci1PU19fWERlZmF1bHRWaXN1YWxfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERlZmF1bHRWaXN1YWxfMT0KLQotT1NfX1hEZWZpbmVDdXJzb3I9Ci1PU19fWERlZmluZUN1cnNvcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGVmaW5lQ3Vyc29yXzE9Ci1PU19fWERlZmluZUN1cnNvcl8yPQotCi1PU19fWERlc3Ryb3lJbWFnZT0KLU9TX19YRGVzdHJveUltYWdlXzA9Y2FzdD0oWEltYWdlICopCi0KLU9TX19YRGVzdHJveVJlZ2lvbj0KLU9TX19YRGVzdHJveVJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLQotT1NfX1hEZXN0cm95V2luZG93PQotT1NfX1hEZXN0cm95V2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEZXN0cm95V2luZG93XzE9Y2FzdD0oV2luZG93KQotCi1PU19fWERpc3BsYXlIZWlnaHQ9Ci1PU19fWERpc3BsYXlIZWlnaHRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERpc3BsYXlIZWlnaHRfMT0KLQotT1NfX1hEaXNwbGF5SGVpZ2h0TU09Ci1PU19fWERpc3BsYXlIZWlnaHRNTV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGlzcGxheUhlaWdodE1NXzE9Ci0KLU9TX19YRGlzcGxheVdpZHRoPQotT1NfX1hEaXNwbGF5V2lkdGhfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERpc3BsYXlXaWR0aF8xPQotCi1PU19fWERpc3BsYXlXaWR0aE1NPQotT1NfX1hEaXNwbGF5V2lkdGhNTV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRGlzcGxheVdpZHRoTU1fMT0KLQotT1NfX1hEcmF3QXJjPQotT1NfX1hEcmF3QXJjXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEcmF3QXJjXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWERyYXdBcmNfMj1jYXN0PShHQykKLU9TX19YRHJhd0FyY18zPQotT1NfX1hEcmF3QXJjXzQ9Ci1PU19fWERyYXdBcmNfNT0KLU9TX19YRHJhd0FyY182PQotT1NfX1hEcmF3QXJjXzc9Ci1PU19fWERyYXdBcmNfOD0KLQotT1NfX1hEcmF3TGluZT0KLU9TX19YRHJhd0xpbmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERyYXdMaW5lXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWERyYXdMaW5lXzI9Y2FzdD0oR0MpCi1PU19fWERyYXdMaW5lXzM9Ci1PU19fWERyYXdMaW5lXzQ9Ci1PU19fWERyYXdMaW5lXzU9Ci1PU19fWERyYXdMaW5lXzY9Ci0KLU9TX19YRHJhd0xpbmVzPQotT1NfX1hEcmF3TGluZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWERyYXdMaW5lc18xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hEcmF3TGluZXNfMj1jYXN0PShHQykKLU9TX19YRHJhd0xpbmVzXzM9Y2FzdD0oWFBvaW50ICopCi1PU19fWERyYXdMaW5lc180PQotT1NfX1hEcmF3TGluZXNfNT0KLQotT1NfX1hEcmF3UG9pbnQ9Ci1PU19fWERyYXdQb2ludF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRHJhd1BvaW50XzE9Y2FzdD1EcmF3YWJsZQotT1NfX1hEcmF3UG9pbnRfMj1jYXN0PUdDCi1PU19fWERyYXdQb2ludF8zPQotT1NfX1hEcmF3UG9pbnRfND0KLQotT1NfX1hEcmF3UmVjdGFuZ2xlPQotT1NfX1hEcmF3UmVjdGFuZ2xlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hEcmF3UmVjdGFuZ2xlXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWERyYXdSZWN0YW5nbGVfMj1jYXN0PShHQykKLU9TX19YRHJhd1JlY3RhbmdsZV8zPQotT1NfX1hEcmF3UmVjdGFuZ2xlXzQ9Ci1PU19fWERyYXdSZWN0YW5nbGVfNT0KLU9TX19YRHJhd1JlY3RhbmdsZV82PQotCi1PU19fWEVtcHR5UmVnaW9uPQotT1NfX1hFbXB0eVJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLQotT1NfX1hFdmVudHNRdWV1ZWQ9Ci1PU19fWEV2ZW50c1F1ZXVlZF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRXZlbnRzUXVldWVkXzE9Ci0KLU9TX19YRmlsbEFyYz0KLU9TX19YRmlsbEFyY18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRmlsbEFyY18xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hGaWxsQXJjXzI9Y2FzdD0oR0MpCi1PU19fWEZpbGxBcmNfMz0KLU9TX19YRmlsbEFyY180PQotT1NfX1hGaWxsQXJjXzU9Ci1PU19fWEZpbGxBcmNfNj0KLU9TX19YRmlsbEFyY183PQotT1NfX1hGaWxsQXJjXzg9Ci0KLU9TX19YRmlsbFBvbHlnb249Ci1PU19fWEZpbGxQb2x5Z29uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGaWxsUG9seWdvbl8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hGaWxsUG9seWdvbl8yPWNhc3Q9KEdDKQotT1NfX1hGaWxsUG9seWdvbl8zPWNhc3Q9KFhQb2ludCAqKQotT1NfX1hGaWxsUG9seWdvbl80PQotT1NfX1hGaWxsUG9seWdvbl81PQotT1NfX1hGaWxsUG9seWdvbl82PQotCi1PU19fWEZpbGxSZWN0YW5nbGU9Ci1PU19fWEZpbGxSZWN0YW5nbGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZpbGxSZWN0YW5nbGVfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YRmlsbFJlY3RhbmdsZV8yPWNhc3Q9KEdDKQotT1NfX1hGaWxsUmVjdGFuZ2xlXzM9Ci1PU19fWEZpbGxSZWN0YW5nbGVfND0KLU9TX19YRmlsbFJlY3RhbmdsZV81PQotT1NfX1hGaWxsUmVjdGFuZ2xlXzY9Ci0KLU9TX19YRmlsdGVyRXZlbnQ9Ci1PU19fWEZpbHRlckV2ZW50XzA9Y2FzdD0oWEV2ZW50ICopCi1PU19fWEZpbHRlckV2ZW50XzE9Y2FzdD0oV2luZG93KQotCi1PU19fWEZsdXNoPQotT1NfX1hGbHVzaF8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hGb250c09mRm9udFNldD0KLU9TX19YRm9udHNPZkZvbnRTZXRfMD1jYXN0PShYRm9udFNldCkKLU9TX19YRm9udHNPZkZvbnRTZXRfMT1jYXN0PShYRm9udFN0cnVjdCAqKiopCi1PU19fWEZvbnRzT2ZGb250U2V0XzI9Y2FzdD0oY2hhciAqKiopCi0KLU9TX19YRnJlZT0KLU9TX19YRnJlZV8wPWNhc3Q9KGNoYXIgKikKLQotT1NfX1hGcmVlQ29sb3JtYXA9Ci1PU19fWEZyZWVDb2xvcm1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZUNvbG9ybWFwXzE9Y2FzdD0oQ29sb3JtYXApCi0KLU9TX19YRnJlZUNvbG9ycz0KLU9TX19YRnJlZUNvbG9yc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZUNvbG9yc18xPQotT1NfX1hGcmVlQ29sb3JzXzI9Y2FzdD0odW5zaWduZWQgbG9uZyAqKQotT1NfX1hGcmVlQ29sb3JzXzM9Ci1PU19fWEZyZWVDb2xvcnNfND0KLQotT1NfX1hGcmVlQ3Vyc29yPQotT1NfX1hGcmVlQ3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hGcmVlQ3Vyc29yXzE9Y2FzdD0oQ3Vyc29yKQotCi1PU19fWEZyZWVGb250PQotT1NfX1hGcmVlRm9udF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZUZvbnRfMT1jYXN0PShYRm9udFN0cnVjdCAqKQotCi1PU19fWEZyZWVGb250TmFtZXM9Ci1PU19fWEZyZWVGb250TmFtZXNfMD1jYXN0PShjaGFyICoqKQotCi1PU19fWEZyZWVGb250UGF0aD0KLU9TX19YRnJlZUZvbnRQYXRoXzA9Y2FzdD1jaGFyICoqCi0KLU9TX19YRnJlZUdDPQotT1NfX1hGcmVlR0NfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEZyZWVHQ18xPWNhc3Q9KEdDKQotCi1PU19fWEZyZWVNb2RpZmllcm1hcD0KLU9TX19YRnJlZU1vZGlmaWVybWFwXzA9Y2FzdD0oWE1vZGlmaWVyS2V5bWFwICopCi0KLU9TX19YRnJlZVBpeG1hcD0KLU9TX19YRnJlZVBpeG1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YRnJlZVBpeG1hcF8xPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1hGcmVlU3RyaW5nTGlzdD0KLU9TX19YRnJlZVN0cmluZ0xpc3RfMD1jYXN0PShjaGFyICoqKQotCi1PU19fWEdldEZvbnRQYXRoPQotT1NfX1hHZXRGb250UGF0aF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEdldEZvbnRQYXRoXzE9Ci0KLU9TX19YR2V0R0NWYWx1ZXM9Ci1PU19fWEdldEdDVmFsdWVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHZXRHQ1ZhbHVlc18xPWNhc3Q9KEdDKQotT1NfX1hHZXRHQ1ZhbHVlc18yPQotT1NfX1hHZXRHQ1ZhbHVlc18zPQotCi1PU19fWEdldEdlb21ldHJ5PQotT1NfX1hHZXRHZW9tZXRyeV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0R2VvbWV0cnlfMT1jYXN0PShEcmF3YWJsZSkKLU9TX19YR2V0R2VvbWV0cnlfMj1jYXN0PShXaW5kb3cgKikKLU9TX19YR2V0R2VvbWV0cnlfMz1jYXN0PShpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfND1jYXN0PShpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNT1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNj1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfNz1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLU9TX19YR2V0R2VvbWV0cnlfOD1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hHZXRJY29uU2l6ZXM9Ci1PU19fWEdldEljb25TaXplc18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWEdldEljb25TaXplc18xPWNhc3Q9V2luZG93Ci1PU19fWEdldEljb25TaXplc18yPWNhc3Q9WEljb25TaXplICoqCi1PU19fWEdldEljb25TaXplc18zPWNhc3Q9aW50ICoKLQotT1NfX1hHZXRJbWFnZT0KLU9TX19YR2V0SW1hZ2VfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEdldEltYWdlXzE9Y2FzdD0oRHJhd2FibGUpCi1PU19fWEdldEltYWdlXzI9Ci1PU19fWEdldEltYWdlXzM9Ci1PU19fWEdldEltYWdlXzQ9Ci1PU19fWEdldEltYWdlXzU9Ci1PU19fWEdldEltYWdlXzY9Ci1PU19fWEdldEltYWdlXzc9Ci0KLU9TX19YR2V0SW5wdXRGb2N1cz0KLU9TX19YR2V0SW5wdXRGb2N1c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0SW5wdXRGb2N1c18xPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hHZXRJbnB1dEZvY3VzXzI9Y2FzdD0oaW50ICopCi0KLU9TX19YR2V0TW9kaWZpZXJNYXBwaW5nPQotT1NfX1hHZXRNb2RpZmllck1hcHBpbmdfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YR2V0V2luZG93QXR0cmlidXRlcz0KLU9TX19YR2V0V2luZG93QXR0cmlidXRlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YR2V0V2luZG93QXR0cmlidXRlc18xPQotT1NfX1hHZXRXaW5kb3dBdHRyaWJ1dGVzXzI9Ci0KLU9TX19YR2V0V2luZG93UHJvcGVydHk9Ci1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YR2V0V2luZG93UHJvcGVydHlfMT1jYXN0PVdpbmRvdwotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8yPWNhc3Q9QXRvbQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV8zPQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV80PQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV81PWNhc3Q9Qm9vbAotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV82PWNhc3Q9QXRvbQotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV83PWNhc3Q9QXRvbSAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5Xzg9Y2FzdD1pbnQgKgotT1NfX1hHZXRXaW5kb3dQcm9wZXJ0eV85PWNhc3Q9dW5zaWduZWQgbG9uZyAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzEwPWNhc3Q9dW5zaWduZWQgbG9uZyAqCi1PU19fWEdldFdpbmRvd1Byb3BlcnR5XzExPWNhc3Q9dW5zaWduZWQgY2hhciAqKgotCi1PU19fWEdyYWJLZXlib2FyZD0KLU9TX19YR3JhYktleWJvYXJkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHcmFiS2V5Ym9hcmRfMT0KLU9TX19YR3JhYktleWJvYXJkXzI9Ci1PU19fWEdyYWJLZXlib2FyZF8zPQotT1NfX1hHcmFiS2V5Ym9hcmRfND0KLU9TX19YR3JhYktleWJvYXJkXzU9Ci0KLU9TX19YR3JhYlBvaW50ZXI9Ci1PU19fWEdyYWJQb2ludGVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hHcmFiUG9pbnRlcl8xPQotT1NfX1hHcmFiUG9pbnRlcl8yPQotT1NfX1hHcmFiUG9pbnRlcl8zPQotT1NfX1hHcmFiUG9pbnRlcl80PQotT1NfX1hHcmFiUG9pbnRlcl81PQotT1NfX1hHcmFiUG9pbnRlcl82PQotT1NfX1hHcmFiUG9pbnRlcl83PQotT1NfX1hHcmFiUG9pbnRlcl84PQotCi1PU19fWEluaXRUaHJlYWRzPQotCi1PU19fWEludGVybkF0b209Ci1PU19fWEludGVybkF0b21fMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEludGVybkF0b21fMT1jYXN0PShjaGFyICopCi1PU19fWEludGVybkF0b21fMj0KLQotT1NfX1hJbnRlcnNlY3RSZWdpb249Ci1PU19fWEludGVyc2VjdFJlZ2lvbl8wPWNhc3Q9KFJlZ2lvbikKLU9TX19YSW50ZXJzZWN0UmVnaW9uXzE9Y2FzdD0oUmVnaW9uKQotT1NfX1hJbnRlcnNlY3RSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YS2V5c3ltVG9LZXljb2RlPQotT1NfX1hLZXlzeW1Ub0tleWNvZGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWEtleXN5bVRvS2V5Y29kZV8xPWNhc3Q9KEtleVN5bSkKLQotT1NfX1hLZXlzeW1Ub1N0cmluZz0KLU9TX19YS2V5c3ltVG9TdHJpbmdfMD0KLQotT1NfX1hMaXN0Rm9udHM9Ci1PU19fWExpc3RGb250c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YTGlzdEZvbnRzXzE9Y2FzdD0oY2hhciAqKQotT1NfX1hMaXN0Rm9udHNfMj0KLU9TX19YTGlzdEZvbnRzXzM9Y2FzdD0oaW50ICopCi0KLU9TX19YTGlzdFByb3BlcnRpZXM9Ci1PU19fWExpc3RQcm9wZXJ0aWVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hMaXN0UHJvcGVydGllc18xPWNhc3Q9KFdpbmRvdykKLU9TX19YTGlzdFByb3BlcnRpZXNfMj1jYXN0PShpbnQgKikKLQotT1NfX1hMb2NhbGVPZkZvbnRTZXQ9Ci1PU19fWExvY2FsZU9mRm9udFNldF8wPWNhc3Q9KFhGb250U2V0KQotCi1PU19fWExvb2t1cFN0cmluZz0KLU9TX19YTG9va3VwU3RyaW5nXzA9Y2FzdD0oWEtleUV2ZW50ICopCi1PU19fWExvb2t1cFN0cmluZ18xPWNhc3Q9KGNoYXIgKikKLU9TX19YTG9va3VwU3RyaW5nXzI9Ci1PU19fWExvb2t1cFN0cmluZ18zPWNhc3Q9KEtleVN5bSAqKQotT1NfX1hMb29rdXBTdHJpbmdfND1jYXN0PShYQ29tcG9zZVN0YXR1cyAqKQotCi1PU19fWExvd2VyV2luZG93PQotT1NfX1hMb3dlcldpbmRvd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YTG93ZXJXaW5kb3dfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YTWFwV2luZG93PQotT1NfX1hNYXBXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hNYXBXaW5kb3dfMT1jYXN0PVdpbmRvdwotCi1PU19fWE1vdmVSZXNpemVXaW5kb3c9Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hNb3ZlUmVzaXplV2luZG93XzE9Y2FzdD1XaW5kb3cKLU9TX19YTW92ZVJlc2l6ZVdpbmRvd18yPQotT1NfX1hNb3ZlUmVzaXplV2luZG93XzM9Ci1PU19fWE1vdmVSZXNpemVXaW5kb3dfND0KLU9TX19YTW92ZVJlc2l6ZVdpbmRvd181PQotCi1PU19fWE9mZnNldFJlZ2lvbj0KLU9TX19YT2Zmc2V0UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hPZmZzZXRSZWdpb25fMT0KLU9TX19YT2Zmc2V0UmVnaW9uXzI9Ci0KLU9TX19YT3BlbkRpc3BsYXk9Ci1PU19fWE9wZW5EaXNwbGF5XzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWFBvaW50SW5SZWdpb249Ci1PU19fWFBvaW50SW5SZWdpb25fMD1jYXN0PShSZWdpb24pCi1PU19fWFBvaW50SW5SZWdpb25fMT0KLU9TX19YUG9pbnRJblJlZ2lvbl8yPQotCi1PU19fWFBvbHlnb25SZWdpb249Ci1PU19fWFBvbHlnb25SZWdpb25fMD1jYXN0PShYUG9pbnQgKikKLU9TX19YUG9seWdvblJlZ2lvbl8xPQotT1NfX1hQb2x5Z29uUmVnaW9uXzI9Ci0KLU9TX19YUHV0SW1hZ2U9Ci1PU19fWFB1dEltYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hQdXRJbWFnZV8xPWNhc3Q9KERyYXdhYmxlKQotT1NfX1hQdXRJbWFnZV8yPWNhc3Q9KEdDKQotT1NfX1hQdXRJbWFnZV8zPWNhc3Q9KFhJbWFnZSAqKQotT1NfX1hQdXRJbWFnZV80PQotT1NfX1hQdXRJbWFnZV81PQotT1NfX1hQdXRJbWFnZV82PQotT1NfX1hQdXRJbWFnZV83PQotT1NfX1hQdXRJbWFnZV84PQotT1NfX1hQdXRJbWFnZV85PQotCi1PU19fWFF1ZXJ5QmVzdEN1cnNvcj0KLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzE9Ci1PU19fWFF1ZXJ5QmVzdEN1cnNvcl8yPQotT1NfX1hRdWVyeUJlc3RDdXJzb3JfMz0KLU9TX19YUXVlcnlCZXN0Q3Vyc29yXzQ9Y2FzdD0odW5zaWduZWQgaW50ICopCi1PU19fWFF1ZXJ5QmVzdEN1cnNvcl81PWNhc3Q9KHVuc2lnbmVkIGludCAqKQotCi1PU19fWFF1ZXJ5Q29sb3I9Ci1PU19fWFF1ZXJ5Q29sb3JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFF1ZXJ5Q29sb3JfMT0KLU9TX19YUXVlcnlDb2xvcl8yPQotCi1PU19fWFF1ZXJ5UG9pbnRlcj0KLU9TX19YUXVlcnlQb2ludGVyXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hRdWVyeVBvaW50ZXJfMT1jYXN0PShXaW5kb3cpCi1PU19fWFF1ZXJ5UG9pbnRlcl8yPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hRdWVyeVBvaW50ZXJfMz1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlQb2ludGVyXzQ9Y2FzdD0oaW50ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl81PWNhc3Q9KGludCAqKQotT1NfX1hRdWVyeVBvaW50ZXJfNj1jYXN0PShpbnQgKikKLU9TX19YUXVlcnlQb2ludGVyXzc9Y2FzdD0oaW50ICopCi1PU19fWFF1ZXJ5UG9pbnRlcl84PWNhc3Q9KHVuc2lnbmVkIGludCAqKQotCi1PU19fWFF1ZXJ5VHJlZT0KLU9TX19YUXVlcnlUcmVlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hRdWVyeVRyZWVfMT1jYXN0PShXaW5kb3cpCi1PU19fWFF1ZXJ5VHJlZV8yPWNhc3Q9KFdpbmRvdyAqKQotT1NfX1hRdWVyeVRyZWVfMz1jYXN0PShXaW5kb3cgKikKLU9TX19YUXVlcnlUcmVlXzQ9Y2FzdD0oV2luZG93ICoqKQotT1NfX1hRdWVyeVRyZWVfNT1jYXN0PSh1bnNpZ25lZCBpbnQgKikKLQotT1NfX1hSYWlzZVdpbmRvdz0KLU9TX19YUmFpc2VXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFJhaXNlV2luZG93XzE9Y2FzdD0oV2luZG93KQotCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3c9Ci1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMT1jYXN0PShXaW5kb3cpCi1PU19fWFJlY29uZmlndXJlV01XaW5kb3dfMj0KLU9TX19YUmVjb25maWd1cmVXTVdpbmRvd18zPQotT1NfX1hSZWNvbmZpZ3VyZVdNV2luZG93XzQ9Ci0KLU9TX19YUmVjdEluUmVnaW9uPQotT1NfX1hSZWN0SW5SZWdpb25fMD1jYXN0PShSZWdpb24pCi1PU19fWFJlY3RJblJlZ2lvbl8xPQotT1NfX1hSZWN0SW5SZWdpb25fMj0KLU9TX19YUmVjdEluUmVnaW9uXzM9Ci1PU19fWFJlY3RJblJlZ2lvbl80PQotCi1PU19fWFJlbmRlckNvbXBvc2l0ZT1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckNvbXBvc2l0ZV8wPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzI9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8zPQotT1NfX1hSZW5kZXJDb21wb3NpdGVfND0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzU9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV82PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfNz0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzg9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV85PQotT1NfX1hSZW5kZXJDb21wb3NpdGVfMTA9Ci1PU19fWFJlbmRlckNvbXBvc2l0ZV8xMT0KLU9TX19YUmVuZGVyQ29tcG9zaXRlXzEyPQotCi1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmU9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzA9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfMT0KLU9TX19YUmVuZGVyQ3JlYXRlUGljdHVyZV8yPQotT1NfX1hSZW5kZXJDcmVhdGVQaWN0dXJlXzM9Ci1PU19fWFJlbmRlckNyZWF0ZVBpY3R1cmVfND0KLQotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXQ9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJGaW5kU3RhbmRhcmRGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFN0YW5kYXJkRm9ybWF0XzE9Ci0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdD1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlckZpbmRWaXN1YWxGb3JtYXRfMD0KLU9TX19YUmVuZGVyRmluZFZpc3VhbEZvcm1hdF8xPQotCi1PU19fWFJlbmRlckZyZWVQaWN0dXJlPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMD0KLU9TX19YUmVuZGVyRnJlZVBpY3R1cmVfMT0KLQotT1NfX1hSZW5kZXJRdWVyeUV4dGVuc2lvbj1mbGFncz1keW5hbWljCi1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzA9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzE9Ci1PU19fWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uXzI9Ci0KLU9TX19YUmVuZGVyUXVlcnlWZXJzaW9uPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyUXVlcnlWZXJzaW9uXzA9Ci1PU19fWFJlbmRlclF1ZXJ5VmVyc2lvbl8xPQotT1NfX1hSZW5kZXJRdWVyeVZlcnNpb25fMj0KLQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXM9ZmxhZ3M9ZHluYW1pYwotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMD0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzE9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc18yPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlQ2xpcFJlY3RhbmdsZXNfMz0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWN0YW5nbGVzXzQ9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVjdGFuZ2xlc181PQotCi1PU19fWFJlbmRlclNldFBpY3R1cmVDbGlwUmVnaW9uPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWdpb25fMD0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWdpb25fMT0KLU9TX19YUmVuZGVyU2V0UGljdHVyZUNsaXBSZWdpb25fMj0KLQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtPWZsYWdzPWR5bmFtaWMKLU9TX19YUmVuZGVyU2V0UGljdHVyZVRyYW5zZm9ybV8wPQotT1NfX1hSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtXzE9Ci1PU19fWFJlbmRlclNldFBpY3R1cmVUcmFuc2Zvcm1fMj0KLQotT1NfX1hSZXBhcmVudFdpbmRvdz0KLU9TX19YUmVwYXJlbnRXaW5kb3dfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFJlcGFyZW50V2luZG93XzE9Y2FzdD0oV2luZG93KQotT1NfX1hSZXBhcmVudFdpbmRvd18yPWNhc3Q9KFdpbmRvdykKLU9TX19YUmVwYXJlbnRXaW5kb3dfMz0KLU9TX19YUmVwYXJlbnRXaW5kb3dfND0KLQotT1NfX1hSZXNpemVXaW5kb3c9Ci1PU19fWFJlc2l6ZVdpbmRvd18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFJlc2l6ZVdpbmRvd18xPWNhc3Q9V2luZG93Ci1PU19fWFJlc2l6ZVdpbmRvd18yPQotT1NfX1hSZXNpemVXaW5kb3dfMz0KLQotT1NfX1hSb290V2luZG93T2ZTY3JlZW49Ci1PU19fWFJvb3RXaW5kb3dPZlNjcmVlbl8wPWNhc3Q9KFNjcmVlbiAqKQotCi1PU19fWFNlbGVjdElucHV0PQotT1NfX1hTZWxlY3RJbnB1dF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFNlbGVjdElucHV0XzE9Y2FzdD1XaW5kb3cKLU9TX19YU2VsZWN0SW5wdXRfMj0KLQotT1NfX1hTZW5kRXZlbnQ9Ci1PU19fWFNlbmRFdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFNlbmRFdmVudF8xPWNhc3Q9V2luZG93Ci1PU19fWFNlbmRFdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hTZW5kRXZlbnRfMz1jYXN0PWxvbmcKLU9TX19YU2VuZEV2ZW50XzQ9Y2FzdD1YRXZlbnQgKgotCi1PU19fWFNldEJhY2tncm91bmQ9Ci1PU19fWFNldEJhY2tncm91bmRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEJhY2tncm91bmRfMT1jYXN0PShHQykKLU9TX19YU2V0QmFja2dyb3VuZF8yPQotCi1PU19fWFNldENsaXBNYXNrPQotT1NfX1hTZXRDbGlwTWFza18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0Q2xpcE1hc2tfMT1jYXN0PShHQykKLU9TX19YU2V0Q2xpcE1hc2tfMj1jYXN0PShQaXhtYXApCi0KLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXM9Ci1PU19fWFNldENsaXBSZWN0YW5nbGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc18xPWNhc3Q9KEdDKQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc18yPQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc18zPQotT1NfX1hTZXRDbGlwUmVjdGFuZ2xlc180PWNhc3Q9KFhSZWN0YW5nbGUgKikKLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfNT0KLU9TX19YU2V0Q2xpcFJlY3RhbmdsZXNfNj0KLQotT1NfX1hTZXREYXNoZXM9Ci1PU19fWFNldERhc2hlc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0RGFzaGVzXzE9Y2FzdD0oR0MpCi1PU19fWFNldERhc2hlc18yPQotT1NfX1hTZXREYXNoZXNfMz1jYXN0PShjaGFyICopCi1PU19fWFNldERhc2hlc180PQotCi1PU19fWFNldEVycm9ySGFuZGxlcj0KLU9TX19YU2V0RXJyb3JIYW5kbGVyXzA9Y2FzdD0oWEVycm9ySGFuZGxlcikKLQotT1NfX1hTZXRGaWxsUnVsZT0KLU9TX19YU2V0RmlsbFJ1bGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEZpbGxSdWxlXzE9Y2FzdD0oR0MpCi1PU19fWFNldEZpbGxSdWxlXzI9Ci0KLU9TX19YU2V0RmlsbFN0eWxlPQotT1NfX1hTZXRGaWxsU3R5bGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEZpbGxTdHlsZV8xPWNhc3Q9KEdDKQotT1NfX1hTZXRGaWxsU3R5bGVfMj0KLQotT1NfX1hTZXRGb250UGF0aD0KLU9TX19YU2V0Rm9udFBhdGhfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZXRGb250UGF0aF8xPWNhc3Q9Y2hhciAqKgotT1NfX1hTZXRGb250UGF0aF8yPQotCi1PU19fWFNldEZvcmVncm91bmQ9Ci1PU19fWFNldEZvcmVncm91bmRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEZvcmVncm91bmRfMT1jYXN0PShHQykKLU9TX19YU2V0Rm9yZWdyb3VuZF8yPQotCi1PU19fWFNldEZ1bmN0aW9uPQotT1NfX1hTZXRGdW5jdGlvbl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0RnVuY3Rpb25fMT1jYXN0PShHQykKLU9TX19YU2V0RnVuY3Rpb25fMj0KLQotT1NfX1hTZXRHcmFwaGljc0V4cG9zdXJlcz0KLU9TX19YU2V0R3JhcGhpY3NFeHBvc3VyZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldEdyYXBoaWNzRXhwb3N1cmVzXzE9Y2FzdD0oR0MpCi1PU19fWFNldEdyYXBoaWNzRXhwb3N1cmVzXzI9Y2FzdD0oQm9vbCkKLQotT1NfX1hTZXRJT0Vycm9ySGFuZGxlcj0KLU9TX19YU2V0SU9FcnJvckhhbmRsZXJfMD1jYXN0PShYSU9FcnJvckhhbmRsZXIpCi0KLU9TX19YU2V0SW5wdXRGb2N1cz0KLU9TX19YU2V0SW5wdXRGb2N1c18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU2V0SW5wdXRGb2N1c18xPWNhc3Q9KFdpbmRvdykKLU9TX19YU2V0SW5wdXRGb2N1c18yPQotT1NfX1hTZXRJbnB1dEZvY3VzXzM9Ci0KLU9TX19YU2V0TGluZUF0dHJpYnV0ZXM9Ci1PU19fWFNldExpbmVBdHRyaWJ1dGVzXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18xPWNhc3Q9KEdDKQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18yPQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc18zPQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc180PQotT1NfX1hTZXRMaW5lQXR0cmlidXRlc181PQotCi1PU19fWFNldFJlZ2lvbj0KLU9TX19YU2V0UmVnaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRSZWdpb25fMT1jYXN0PShHQykKLU9TX19YU2V0UmVnaW9uXzI9Y2FzdD0oUmVnaW9uKQotCi1PU19fWFNldFN0aXBwbGU9Ci1PU19fWFNldFN0aXBwbGVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFNldFN0aXBwbGVfMT1jYXN0PShHQykKLU9TX19YU2V0U3RpcHBsZV8yPWNhc3Q9KFBpeG1hcCkKLQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlPQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRTdWJ3aW5kb3dNb2RlXzE9Y2FzdD0oR0MpCi1PU19fWFNldFN1YndpbmRvd01vZGVfMj0KLQotT1NfX1hTZXRUU09yaWdpbj0KLU9TX19YU2V0VFNPcmlnaW5fMD1jYXN0PURpc3BsYXkgKgotT1NfX1hTZXRUU09yaWdpbl8xPWNhc3Q9R0MKLU9TX19YU2V0VFNPcmlnaW5fMj0KLU9TX19YU2V0VFNPcmlnaW5fMz0KLQotT1NfX1hTZXRUaWxlPQotT1NfX1hTZXRUaWxlXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YU2V0VGlsZV8xPWNhc3Q9R0MKLU9TX19YU2V0VGlsZV8yPWNhc3Q9UGl4bWFwCi0KLU9TX19YU2V0V01Ob3JtYWxIaW50cz0KLU9TX19YU2V0V01Ob3JtYWxIaW50c18wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFNldFdNTm9ybWFsSGludHNfMT1jYXN0PShXaW5kb3cpCi1PU19fWFNldFdNTm9ybWFsSGludHNfMj0KLQotT1NfX1hTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwPQotT1NfX1hTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwXzE9Y2FzdD0oV2luZG93KQotT1NfX1hTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwXzI9Y2FzdD1QaXhtYXAKLQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrPQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzE9Y2FzdD0oV2luZG93KQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzI9Ci1PU19fWFNoYXBlQ29tYmluZU1hc2tfMz0KLU9TX19YU2hhcGVDb21iaW5lTWFza180PQotT1NfX1hTaGFwZUNvbWJpbmVNYXNrXzU9Y2FzdD1QaXhtYXAKLU9TX19YU2hhcGVDb21iaW5lTWFza182PQotCi1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbj0KLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fMT1jYXN0PShXaW5kb3cpCi1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl8yPQotT1NfX1hTaGFwZUNvbWJpbmVSZWdpb25fMz0KLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzQ9Ci1PU19fWFNoYXBlQ29tYmluZVJlZ2lvbl81PWNhc3Q9KFJlZ2lvbikKLU9TX19YU2hhcGVDb21iaW5lUmVnaW9uXzY9Ci0KLU9TX19YU3VidHJhY3RSZWdpb249Ci1PU19fWFN1YnRyYWN0UmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hTdWJ0cmFjdFJlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLU9TX19YU3VidHJhY3RSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YU3luYz0KLU9TX19YU3luY18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YU3luY18xPWNhc3Q9KEJvb2wpCi0KLU9TX19YU3luY2hyb25pemU9Ci1PU19fWFN5bmNocm9uaXplXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hTeW5jaHJvbml6ZV8xPWNhc3Q9KEJvb2wpCi0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudD0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlQnV0dG9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VCdXR0b25FdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUJ1dHRvbkV2ZW50XzM9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVGVzdEZha2VLZXlFdmVudD0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlS2V5RXZlbnRfMT0KLU9TX19YVGVzdEZha2VLZXlFdmVudF8yPWNhc3Q9Qm9vbAotT1NfX1hUZXN0RmFrZUtleUV2ZW50XzM9Y2FzdD11bnNpZ25lZCBsb25nCi0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudD0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfMT0KLU9TX19YVGVzdEZha2VNb3Rpb25FdmVudF8yPQotT1NfX1hUZXN0RmFrZU1vdGlvbkV2ZW50XzM9Ci1PU19fWFRlc3RGYWtlTW90aW9uRXZlbnRfND1jYXN0PXVuc2lnbmVkIGxvbmcKLQotT1NfX1hUcmFuc2xhdGVDb29yZGluYXRlcz0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfMD1jYXN0PURpc3BsYXkgKgotT1NfX1hUcmFuc2xhdGVDb29yZGluYXRlc18xPWNhc3Q9V2luZG93Ci1PU19fWFRyYW5zbGF0ZUNvb3JkaW5hdGVzXzI9Y2FzdD1XaW5kb3cKLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfMz0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfND0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNT0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNj0KLU9TX19YVHJhbnNsYXRlQ29vcmRpbmF0ZXNfNz1jYXN0PVdpbmRvdyAqCi0KLU9TX19YVW5kZWZpbmVDdXJzb3I9Ci1PU19fWFVuZGVmaW5lQ3Vyc29yXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hVbmRlZmluZUN1cnNvcl8xPWNhc3Q9KFdpbmRvdykKLQotT1NfX1hVbmdyYWJLZXlib2FyZD0KLU9TX19YVW5ncmFiS2V5Ym9hcmRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWFVuZ3JhYktleWJvYXJkXzE9Ci0KLU9TX19YVW5ncmFiUG9pbnRlcj0KLU9TX19YVW5ncmFiUG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YVW5ncmFiUG9pbnRlcl8xPQotCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb249Ci1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMD1jYXN0PShYUmVjdGFuZ2xlICopCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMT1jYXN0PShSZWdpb24pCi1PU19fWFVuaW9uUmVjdFdpdGhSZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YVW5pb25SZWdpb249Ci1PU19fWFVuaW9uUmVnaW9uXzA9Y2FzdD0oUmVnaW9uKQotT1NfX1hVbmlvblJlZ2lvbl8xPWNhc3Q9KFJlZ2lvbikKLU9TX19YVW5pb25SZWdpb25fMj1jYXN0PShSZWdpb24pCi0KLU9TX19YVW5tYXBXaW5kb3c9Ci1PU19fWFVubWFwV2luZG93XzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YVW5tYXBXaW5kb3dfMT1jYXN0PVdpbmRvdwotCi1PU19fWFdhcnBQb2ludGVyPQotT1NfX1hXYXJwUG9pbnRlcl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YV2FycFBvaW50ZXJfMT0KLU9TX19YV2FycFBvaW50ZXJfMj0KLU9TX19YV2FycFBvaW50ZXJfMz0KLU9TX19YV2FycFBvaW50ZXJfND0KLU9TX19YV2FycFBvaW50ZXJfNT0KLU9TX19YV2FycFBvaW50ZXJfNj0KLU9TX19YV2FycFBvaW50ZXJfNz0KLU9TX19YV2FycFBvaW50ZXJfOD0KLQotT1NfX1hXaGl0ZVBpeGVsPQotT1NfX1hXaGl0ZVBpeGVsXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hXaGl0ZVBpeGVsXzE9Ci0KLU9TX19YV2l0aGRyYXdXaW5kb3c9Ci1PU19fWFdpdGhkcmF3V2luZG93XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hXaXRoZHJhd1dpbmRvd18xPWNhc3Q9KFdpbmRvdykKLU9TX19YV2l0aGRyYXdXaW5kb3dfMj0KLQotT1NfX1hpbmVyYW1hSXNBY3RpdmU9Ci1PU19fWGluZXJhbWFJc0FjdGl2ZV8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zPQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hpbmVyYW1hUXVlcnlTY3JlZW5zXzE9Ci0KLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFjaz0KLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18xPWNhc3Q9KEF0b20pCi1PU19fWG1BZGRXTVByb3RvY29sQ2FsbGJhY2tfMj1jYXN0PShYdENhbGxiYWNrUHJvYykKLU9TX19YbUFkZFdNUHJvdG9jb2xDYWxsYmFja18zPWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1htQ2hhbmdlQ29sb3I9Ci1PU19fWG1DaGFuZ2VDb2xvcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNoYW5nZUNvbG9yXzE9Ci0KLU9TX19YbUNsaXBib2FyZENvcHk9Ci1PU19fWG1DbGlwYm9hcmRDb3B5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkQ29weV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZENvcHlfMj0KLU9TX19YbUNsaXBib2FyZENvcHlfMz1jYXN0PShjaGFyICopCi1PU19fWG1DbGlwYm9hcmRDb3B5XzQ9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkQ29weV81PQotT1NfX1htQ2xpcGJvYXJkQ29weV82PQotT1NfX1htQ2xpcGJvYXJkQ29weV83PWNhc3Q9KHZvaWQgKikKLQotT1NfX1htQ2xpcGJvYXJkRW5kQ29weT0KLU9TX19YbUNsaXBib2FyZEVuZENvcHlfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRFbmRDb3B5XzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkRW5kQ29weV8yPQotCi1PU19fWG1DbGlwYm9hcmRFbmRSZXRyaWV2ZT0KLU9TX19YbUNsaXBib2FyZEVuZFJldHJpZXZlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkRW5kUmV0cmlldmVfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudD0KLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZElucXVpcmVDb3VudF8yPWNhc3Q9KGludCAqKQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUNvdW50XzM9Y2FzdD0odW5zaWduZWQgbG9uZyAqKQotCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0PQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVGb3JtYXRfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0XzI9Ci1PU19fWG1DbGlwYm9hcmRJbnF1aXJlRm9ybWF0XzM9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF80PQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUZvcm1hdF81PWNhc3Q9KHVuc2lnbmVkIGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUxlbmd0aD0KLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGhfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRJbnF1aXJlTGVuZ3RoXzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkSW5xdWlyZUxlbmd0aF8yPWNhc3Q9KGNoYXIgKikKLU9TX19YbUNsaXBib2FyZElucXVpcmVMZW5ndGhfMz1jYXN0PSh1bnNpZ25lZCBsb25nICopCi0KLU9TX19YbUNsaXBib2FyZFJldHJpZXZlPQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbUNsaXBib2FyZFJldHJpZXZlXzI9Y2FzdD0oY2hhciAqKQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfMz1jYXN0PShjaGFyICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV80PQotT1NfX1htQ2xpcGJvYXJkUmV0cmlldmVfNT1jYXN0PSh1bnNpZ25lZCBsb25nICopCi1PU19fWG1DbGlwYm9hcmRSZXRyaWV2ZV82PWNhc3Q9KGxvbmcgKikKLQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5PQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzE9Y2FzdD0oV2luZG93KQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzI9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1DbGlwYm9hcmRTdGFydENvcHlfMz0KLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV80PWNhc3Q9KFdpZGdldCkKLU9TX19YbUNsaXBib2FyZFN0YXJ0Q29weV81PWNhc3Q9KFhtQ3V0UGFzdGVQcm9jKQotT1NfX1htQ2xpcGJvYXJkU3RhcnRDb3B5XzY9Y2FzdD0obG9uZyAqKQotCi1PU19fWG1DbGlwYm9hcmRTdGFydFJldHJpZXZlPQotT1NfX1htQ2xpcGJvYXJkU3RhcnRSZXRyaWV2ZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUNsaXBib2FyZFN0YXJ0UmV0cmlldmVfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1DbGlwYm9hcmRTdGFydFJldHJpZXZlXzI9Ci0KLU9TX19YbUNvbWJvQm94QWRkSXRlbT0KLU9TX19YbUNvbWJvQm94QWRkSXRlbV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94QWRkSXRlbV8xPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htQ29tYm9Cb3hBZGRJdGVtXzI9Ci1PU19fWG1Db21ib0JveEFkZEl0ZW1fMz0KLQotT1NfX1htQ29tYm9Cb3hEZWxldGVQb3M9Ci1PU19fWG1Db21ib0JveERlbGV0ZVBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94RGVsZXRlUG9zXzE9Ci0KLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbT0KLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNvbWJvQm94U2VsZWN0SXRlbV8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbj0KLU9TX19YbUNyZWF0ZUFycm93QnV0dG9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlQXJyb3dCdXR0b25fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVBcnJvd0J1dHRvbl8zPQotCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlQ2FzY2FkZUJ1dHRvbkdhZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUNhc2NhZGVCdXR0b25HYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVDYXNjYWRlQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUNhc2NhZGVCdXR0b25HYWRnZXRfMz0KLQotT1NfX1htQ3JlYXRlQ29tYm9Cb3g9Ci1PU19fWG1DcmVhdGVDb21ib0JveF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUNvbWJvQm94XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlQ29tYm9Cb3hfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlQ29tYm9Cb3hfMz0KLQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGw9Ci1PU19fWG1DcmVhdGVEaWFsb2dTaGVsbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURpYWxvZ1NoZWxsXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGxfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRGlhbG9nU2hlbGxfMz0KLQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWE9Ci1PU19fWG1DcmVhdGVEcmF3aW5nQXJlYV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURyYXdpbmdBcmVhXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWFfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRHJhd2luZ0FyZWFfMz0KLQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b249Ci1PU19fWG1DcmVhdGVEcmF3bkJ1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZURyYXduQnV0dG9uXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRHJhd25CdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2c9Ci1PU19fWG1DcmVhdGVFcnJvckRpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUVycm9yRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRXJyb3JEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZz0KLU9TX19YbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVGaWxlU2VsZWN0aW9uRGlhbG9nXzM9Ci0KLU9TX19YbUNyZWF0ZUZvcm09Ci1PU19fWG1DcmVhdGVGb3JtXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlRm9ybV8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZUZvcm1fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlRm9ybV8zPQotCi1PU19fWG1DcmVhdGVGcmFtZT0KLU9TX19YbUNyZWF0ZUZyYW1lXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlRnJhbWVfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVGcmFtZV8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVGcmFtZV8zPQotCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZz0KLU9TX19YbUNyZWF0ZUluZm9ybWF0aW9uRGlhbG9nXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlSW5mb3JtYXRpb25EaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZ18zPQotCi1PU19fWG1DcmVhdGVMYWJlbD0KLU9TX19YbUNyZWF0ZUxhYmVsXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlTGFiZWxfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVMYWJlbF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVMYWJlbF8zPQotCi1PU19fWG1DcmVhdGVMaXN0PQotT1NfX1htQ3JlYXRlTGlzdF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZUxpc3RfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVMaXN0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZUxpc3RfMz0KLQotT1NfX1htQ3JlYXRlTWFpbldpbmRvdz0KLU9TX19YbUNyZWF0ZU1haW5XaW5kb3dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVNYWluV2luZG93XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlTWFpbldpbmRvd18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVNYWluV2luZG93XzM9Ci0KLU9TX19YbUNyZWF0ZU1lbnVCYXI9Ci1PU19fWG1DcmVhdGVNZW51QmFyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlTWVudUJhcl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZU1lbnVCYXJfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlTWVudUJhcl8zPQotCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nPQotT1NfX1htQ3JlYXRlTWVzc2FnZURpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZU1lc3NhZ2VEaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVNZXNzYWdlRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZU1lc3NhZ2VEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlUG9wdXBNZW51PQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUG9wdXBNZW51XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVBvcHVwTWVudV8zPQotCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnU9Ci1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVQdWxsZG93bk1lbnVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUHVsbGRvd25NZW51XzM9Ci0KLU9TX19YbUNyZWF0ZVB1c2hCdXR0b249Ci1PU19fWG1DcmVhdGVQdXNoQnV0dG9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25fMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbl8zPQotCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlUHVzaEJ1dHRvbkdhZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25HYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVB1c2hCdXR0b25HYWRnZXRfMz0KLQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2c9Ci1PU19fWG1DcmVhdGVRdWVzdGlvbkRpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2dfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlUXVlc3Rpb25EaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlU2NhbGU9Ci1PU19fWG1DcmVhdGVTY2FsZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNjYWxlXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2NhbGVfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2NhbGVfMz0KLQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyPQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2Nyb2xsQmFyXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNjcm9sbEJhcl8zPQotCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3Q9Ci1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVTY3JvbGxlZExpc3RfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2Nyb2xsZWRMaXN0XzM9Ci0KLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dD0KLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVNjcm9sbGVkVGV4dF8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVTY3JvbGxlZFRleHRfMz0KLQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yPQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVNlcGFyYXRvcl8zPQotCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXQ9Ci1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0XzM9Ci0KLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3g9Ci1PU19fWG1DcmVhdGVTaW1wbGVTcGluQm94XzA9Y2FzdD1XaWRnZXQKLU9TX19YbUNyZWF0ZVNpbXBsZVNwaW5Cb3hfMT1jYXN0PVN0cmluZwotT1NfX1htQ3JlYXRlU2ltcGxlU3BpbkJveF8yPWNhc3Q9QXJnTGlzdAotT1NfX1htQ3JlYXRlU2ltcGxlU3BpbkJveF8zPQotCi1PU19fWG1DcmVhdGVUZXh0RmllbGQ9Ci1PU19fWG1DcmVhdGVUZXh0RmllbGRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVUZXh0RmllbGRfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVUZXh0RmllbGRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htQ3JlYXRlVGV4dEZpZWxkXzM9Ci0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbj0KLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8xPWNhc3Q9KFN0cmluZykKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbl8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVUb2dnbGVCdXR0b25fMz0KLQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0PQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlVG9nZ2xlQnV0dG9uR2FkZ2V0XzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVRvZ2dsZUJ1dHRvbkdhZGdldF8zPQotCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nPQotT1NfX1htQ3JlYXRlV2FybmluZ0RpYWxvZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUNyZWF0ZVdhcm5pbmdEaWFsb2dfMT1jYXN0PShTdHJpbmcpCi1PU19fWG1DcmVhdGVXYXJuaW5nRGlhbG9nXzI9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUNyZWF0ZVdhcm5pbmdEaWFsb2dfMz0KLQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZz0KLU9TX19YbUNyZWF0ZVdvcmtpbmdEaWFsb2dfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1DcmVhdGVXb3JraW5nRGlhbG9nXzE9Y2FzdD0oU3RyaW5nKQotT1NfX1htQ3JlYXRlV29ya2luZ0RpYWxvZ18yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1DcmVhdGVXb3JraW5nRGlhbG9nXzM9Ci0KLU9TX19YbURlc3Ryb3lQaXhtYXA9Ci1PU19fWG1EZXN0cm95UGl4bWFwXzA9Y2FzdD0oU2NyZWVuICopCi1PU19fWG1EZXN0cm95UGl4bWFwXzE9Y2FzdD0oUGl4bWFwKQotCi1PU19fWG1EcmFnQ2FuY2VsPQotT1NfX1htRHJhZ0NhbmNlbF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htRHJhZ1N0YXJ0PQotT1NfX1htRHJhZ1N0YXJ0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJhZ1N0YXJ0XzE9Y2FzdD0oWEV2ZW50ICopCi1PU19fWG1EcmFnU3RhcnRfMj1jYXN0PShBcmdMaXN0KQotT1NfX1htRHJhZ1N0YXJ0XzM9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BTaXRlUmVnaXN0ZXI9Ci1PU19fWG1Ecm9wU2l0ZVJlZ2lzdGVyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJvcFNpdGVSZWdpc3Rlcl8xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1Ecm9wU2l0ZVJlZ2lzdGVyXzI9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BTaXRlVW5yZWdpc3Rlcj0KLU9TX19YbURyb3BTaXRlVW5yZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htRHJvcFNpdGVVcGRhdGU9Ci1PU19fWG1Ecm9wU2l0ZVVwZGF0ZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BTaXRlVXBkYXRlXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbURyb3BTaXRlVXBkYXRlXzI9Y2FzdD0oQ2FyZGluYWwpCi0KLU9TX19YbURyb3BUcmFuc2ZlckFkZD0KLU9TX19YbURyb3BUcmFuc2ZlckFkZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbURyb3BUcmFuc2ZlckFkZF8xPWNhc3Q9KFhtRHJvcFRyYW5zZmVyRW50cnlSZWMgKikKLU9TX19YbURyb3BUcmFuc2ZlckFkZF8yPWNhc3Q9KENhcmRpbmFsKQotCi1PU19fWG1Ecm9wVHJhbnNmZXJTdGFydD0KLU9TX19YbURyb3BUcmFuc2ZlclN0YXJ0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRHJvcFRyYW5zZmVyU3RhcnRfMT1jYXN0PShBcmdMaXN0KQotT1NfX1htRHJvcFRyYW5zZmVyU3RhcnRfMj1jYXN0PShDYXJkaW5hbCkKLQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkPQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htRmlsZVNlbGVjdGlvbkJveEdldENoaWxkXzE9Ci0KLU9TX19YbUZvbnRMaXN0QXBwZW5kRW50cnk9Ci1PU19fWG1Gb250TGlzdEFwcGVuZEVudHJ5XzA9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbUZvbnRMaXN0QXBwZW5kRW50cnlfMT1jYXN0PShYbUZvbnRMaXN0RW50cnkpCi0KLU9TX19YbUZvbnRMaXN0Q29weT0KLU9TX19YbUZvbnRMaXN0Q29weV8wPWNhc3Q9KFhtRm9udExpc3QpCi0KLU9TX19YbUZvbnRMaXN0RW50cnlGcmVlPQotT1NfX1htRm9udExpc3RFbnRyeUZyZWVfMD1jYXN0PShYbUZvbnRMaXN0RW50cnkgKikKLQotT1NfX1htRm9udExpc3RFbnRyeUdldEZvbnQ9Ci1PU19fWG1Gb250TGlzdEVudHJ5R2V0Rm9udF8wPWNhc3Q9KFhtRm9udExpc3RFbnRyeSkKLU9TX19YbUZvbnRMaXN0RW50cnlHZXRGb250XzE9Y2FzdD0oWG1Gb250VHlwZSAqKQotCi1PU19fWG1Gb250TGlzdEVudHJ5TG9hZD0KLU9TX19YbUZvbnRMaXN0RW50cnlMb2FkXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htRm9udExpc3RFbnRyeUxvYWRfMT1jYXN0PShjaGFyICopCi1PU19fWG1Gb250TGlzdEVudHJ5TG9hZF8yPQotT1NfX1htRm9udExpc3RFbnRyeUxvYWRfMz1jYXN0PShjaGFyICopCi0KLU9TX19YbUZvbnRMaXN0RnJlZT0KLU9TX19YbUZvbnRMaXN0RnJlZV8wPWNhc3Q9KFhtRm9udExpc3QpCi0KLU9TX19YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0PQotT1NfX1htRm9udExpc3RGcmVlRm9udENvbnRleHRfMD1jYXN0PShYbUZvbnRDb250ZXh0KQotCi1PU19fWG1Gb250TGlzdEluaXRGb250Q29udGV4dD0KLU9TX19YbUZvbnRMaXN0SW5pdEZvbnRDb250ZXh0XzA9Y2FzdD0oWG1Gb250Q29udGV4dCAqKQotT1NfX1htRm9udExpc3RJbml0Rm9udENvbnRleHRfMT1jYXN0PShYbUZvbnRMaXN0KQotCi1PU19fWG1Gb250TGlzdE5leHRFbnRyeT0KLU9TX19YbUZvbnRMaXN0TmV4dEVudHJ5XzA9Y2FzdD0oWG1Gb250Q29udGV4dCkKLQotT1NfX1htR2V0QXRvbU5hbWU9Ci1PU19fWG1HZXRBdG9tTmFtZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUdldEF0b21OYW1lXzE9Y2FzdD0oQXRvbSkKLQotT1NfX1htR2V0RHJhZ0NvbnRleHQ9Ci1PU19fWG1HZXREcmFnQ29udGV4dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUdldERyYWdDb250ZXh0XzE9Y2FzdD0oVGltZSkKLQotT1NfX1htR2V0Rm9jdXNXaWRnZXQ9Ci1PU19fWG1HZXRGb2N1c1dpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htR2V0UGl4bWFwPQotT1NfX1htR2V0UGl4bWFwXzA9Y2FzdD0oU2NyZWVuICopCi1PU19fWG1HZXRQaXhtYXBfMT1jYXN0PShjaGFyICopCi1PU19fWG1HZXRQaXhtYXBfMj1jYXN0PShQaXhlbCkKLU9TX19YbUdldFBpeG1hcF8zPWNhc3Q9KFBpeGVsKQotCi1PU19fWG1HZXRQaXhtYXBCeURlcHRoPQotT1NfX1htR2V0UGl4bWFwQnlEZXB0aF8wPWNhc3Q9KFNjcmVlbiAqKQotT1NfX1htR2V0UGl4bWFwQnlEZXB0aF8xPWNhc3Q9KGNoYXIgKikKLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMj0KLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfMz0KLU9TX19YbUdldFBpeG1hcEJ5RGVwdGhfND0KLQotT1NfX1htR2V0WG1EaXNwbGF5PQotT1NfX1htR2V0WG1EaXNwbGF5XzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWG1JbU1iTG9va3VwU3RyaW5nPQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltTWJMb29rdXBTdHJpbmdfMT1jYXN0PShYS2V5UHJlc3NlZEV2ZW50ICopCi1PU19fWG1JbU1iTG9va3VwU3RyaW5nXzI9Y2FzdD0oY2hhciAqKQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ18zPQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ180PWNhc3Q9KEtleVN5bSAqKQotT1NfX1htSW1NYkxvb2t1cFN0cmluZ181PWNhc3Q9KGludCAqKQotCi1PU19fWG1JbVJlZ2lzdGVyPQotT1NfX1htSW1SZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltUmVnaXN0ZXJfMT0KLQotT1NfX1htSW1TZXRGb2N1c1ZhbHVlcz0KLU9TX19YbUltU2V0Rm9jdXNWYWx1ZXNfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1JbVNldEZvY3VzVmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUltU2V0Rm9jdXNWYWx1ZXNfMj0KLQotT1NfX1htSW1TZXRWYWx1ZXM9Ci1PU19fWG1JbVNldFZhbHVlc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUltU2V0VmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbUltU2V0VmFsdWVzXzI9Ci0KLU9TX19YbUltVW5yZWdpc3Rlcj0KLU9TX19YbUltVW5yZWdpc3Rlcl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htSW1VbnNldEZvY3VzPQotT1NfX1htSW1VbnNldEZvY3VzXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1JbnRlcm5BdG9tPQotT1NfX1htSW50ZXJuQXRvbV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbUludGVybkF0b21fMT1jYXN0PShTdHJpbmcpCi1PU19fWG1JbnRlcm5BdG9tXzI9Ci0KLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZD0KLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RBZGRJdGVtVW5zZWxlY3RlZF8xPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htTGlzdEFkZEl0ZW1VbnNlbGVjdGVkXzI9Ci0KLU9TX19YbUxpc3REZWxldGVBbGxJdGVtcz0KLU9TX19YbUxpc3REZWxldGVBbGxJdGVtc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zPQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlbGV0ZUl0ZW1zUG9zXzE9Ci1PU19fWG1MaXN0RGVsZXRlSXRlbXNQb3NfMj0KLQotT1NfX1htTGlzdERlbGV0ZVBvcz0KLU9TX19YbUxpc3REZWxldGVQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0RGVsZXRlUG9zXzE9Ci0KLU9TX19YbUxpc3REZWxldGVQb3NpdGlvbnM9Ci1PU19fWG1MaXN0RGVsZXRlUG9zaXRpb25zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdERlbGV0ZVBvc2l0aW9uc18xPWNhc3Q9KGludCAqKQotT1NfX1htTGlzdERlbGV0ZVBvc2l0aW9uc18yPQotCi1PU19fWG1MaXN0RGVzZWxlY3RBbGxJdGVtcz0KLU9TX19YbUxpc3REZXNlbGVjdEFsbEl0ZW1zXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1MaXN0RGVzZWxlY3RQb3M9Ci1PU19fWG1MaXN0RGVzZWxlY3RQb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0RGVzZWxlY3RQb3NfMT0KLQotT1NfX1htTGlzdEdldEtiZEl0ZW1Qb3M9Ci1PU19fWG1MaXN0R2V0S2JkSXRlbVBvc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zPQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzE9Y2FzdD0oaW50ICoqKQotT1NfX1htTGlzdEdldFNlbGVjdGVkUG9zXzI9Y2FzdD0oaW50ICopCi0KLU9TX19YbUxpc3RJdGVtUG9zPQotT1NfX1htTGlzdEl0ZW1Qb3NfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0SXRlbVBvc18xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1MaXN0UG9zU2VsZWN0ZWQ9Ci1PU19fWG1MaXN0UG9zU2VsZWN0ZWRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1MaXN0UG9zU2VsZWN0ZWRfMT0KLQotT1NfX1htTGlzdFJlcGxhY2VJdGVtc1Bvc1Vuc2VsZWN0ZWQ9Ci1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RSZXBsYWNlSXRlbXNQb3NVbnNlbGVjdGVkXzE9Y2FzdD0oWG1TdHJpbmcgKikKLU9TX19YbUxpc3RSZXBsYWNlSXRlbXNQb3NVbnNlbGVjdGVkXzI9Ci1PU19fWG1MaXN0UmVwbGFjZUl0ZW1zUG9zVW5zZWxlY3RlZF8zPQotCi1PU19fWG1MaXN0U2VsZWN0UG9zPQotT1NfX1htTGlzdFNlbGVjdFBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RTZWxlY3RQb3NfMT0KLU9TX19YbUxpc3RTZWxlY3RQb3NfMj0KLQotT1NfX1htTGlzdFNldEtiZEl0ZW1Qb3M9Ci1PU19fWG1MaXN0U2V0S2JkSXRlbVBvc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbUxpc3RTZXRLYmRJdGVtUG9zXzE9Ci0KLU9TX19YbUxpc3RTZXRQb3M9Ci1PU19fWG1MaXN0U2V0UG9zXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTGlzdFNldFBvc18xPQotCi1PU19fWG1MaXN0VXBkYXRlU2VsZWN0ZWRMaXN0PQotT1NfX1htTGlzdFVwZGF0ZVNlbGVjdGVkTGlzdF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzPQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzE9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzI9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzM9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzQ9Y2FzdD0oV2lkZ2V0KQotT1NfX1htTWFpbldpbmRvd1NldEFyZWFzXzU9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGQ9Ci1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1NZXNzYWdlQm94R2V0Q2hpbGRfMT0KLQotT1NfX1htUGFyc2VNYXBwaW5nQ3JlYXRlPQotT1NfX1htUGFyc2VNYXBwaW5nQ3JlYXRlXzA9Y2FzdD0oQXJnTGlzdCkKLU9TX19YbVBhcnNlTWFwcGluZ0NyZWF0ZV8xPQotCi1PU19fWG1QYXJzZU1hcHBpbmdGcmVlPQotT1NfX1htUGFyc2VNYXBwaW5nRnJlZV8wPWNhc3Q9KFhtUGFyc2VNYXBwaW5nKQotCi1PU19fWG1Qcm9jZXNzVHJhdmVyc2FsPQotT1NfX1htUHJvY2Vzc1RyYXZlcnNhbF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVByb2Nlc3NUcmF2ZXJzYWxfMT0KLQotT1NfX1htUmVuZGVyVGFibGVBZGRSZW5kaXRpb25zPQotT1NfX1htUmVuZGVyVGFibGVBZGRSZW5kaXRpb25zXzA9Y2FzdD0oWG1SZW5kZXJUYWJsZSkKLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9uc18xPWNhc3Q9KFhtUmVuZGl0aW9uICopCi1PU19fWG1SZW5kZXJUYWJsZUFkZFJlbmRpdGlvbnNfMj0KLU9TX19YbVJlbmRlclRhYmxlQWRkUmVuZGl0aW9uc18zPQotCi1PU19fWG1SZW5kZXJUYWJsZUZyZWU9Ci1PU19fWG1SZW5kZXJUYWJsZUZyZWVfMD1jYXN0PShYbVJlbmRlclRhYmxlKQotCi1PU19fWG1SZW5kaXRpb25DcmVhdGU9Ci1PU19fWG1SZW5kaXRpb25DcmVhdGVfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1SZW5kaXRpb25DcmVhdGVfMT1jYXN0PShYbVN0cmluZ1RhZykKLU9TX19YbVJlbmRpdGlvbkNyZWF0ZV8yPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWG1SZW5kaXRpb25DcmVhdGVfMz0KLQotT1NfX1htUmVuZGl0aW9uRnJlZT0KLU9TX19YbVJlbmRpdGlvbkZyZWVfMD1jYXN0PShYbVJlbmRpdGlvbikKLQotT1NfX1htU3RyaW5nQmFzZWxpbmU9Ci1PU19fWG1TdHJpbmdCYXNlbGluZV8wPWNhc3Q9WG1SZW5kZXJUYWJsZQotT1NfX1htU3RyaW5nQmFzZWxpbmVfMT1jYXN0PVhtU3RyaW5nCi0KLU9TX19YbVN0cmluZ0NvbXBhcmU9Ci1PU19fWG1TdHJpbmdDb21wYXJlXzA9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdDb21wYXJlXzE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0NvbXBvbmVudENyZWF0ZT0KLU9TX19YbVN0cmluZ0NvbXBvbmVudENyZWF0ZV8wPQotT1NfX1htU3RyaW5nQ29tcG9uZW50Q3JlYXRlXzE9Ci1PU19fWG1TdHJpbmdDb21wb25lbnRDcmVhdGVfMj1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YbVN0cmluZ0NvbmNhdD0KLU9TX19YbVN0cmluZ0NvbmNhdF8wPWNhc3Q9KFhtU3RyaW5nKQotT1NfX1htU3RyaW5nQ29uY2F0XzE9Y2FzdD0oWG1TdHJpbmcpCi0KLU9TX19YbVN0cmluZ0NyZWF0ZT0KLU9TX19YbVN0cmluZ0NyZWF0ZV8wPWNhc3Q9KGNoYXIgKikKLU9TX19YbVN0cmluZ0NyZWF0ZV8xPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htU3RyaW5nQ3JlYXRlTG9jYWxpemVkPQotT1NfX1htU3RyaW5nQ3JlYXRlTG9jYWxpemVkXzA9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1TdHJpbmdEcmF3PQotT1NfX1htU3RyaW5nRHJhd18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbVN0cmluZ0RyYXdfMT1jYXN0PShXaW5kb3cpCi1PU19fWG1TdHJpbmdEcmF3XzI9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbVN0cmluZ0RyYXdfMz1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ0RyYXdfND1jYXN0PShHQykKLU9TX19YbVN0cmluZ0RyYXdfNT0KLU9TX19YbVN0cmluZ0RyYXdfNj0KLU9TX19YbVN0cmluZ0RyYXdfNz0KLU9TX19YbVN0cmluZ0RyYXdfOD0KLU9TX19YbVN0cmluZ0RyYXdfOT0KLU9TX19YbVN0cmluZ0RyYXdfMTA9Ci0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZT0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8xPWNhc3Q9KFdpbmRvdykKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8yPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfMz1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ0RyYXdJbWFnZV80PWNhc3Q9KEdDKQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzU9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfNj0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV83PQotT1NfX1htU3RyaW5nRHJhd0ltYWdlXzg9Ci1PU19fWG1TdHJpbmdEcmF3SW1hZ2VfOT0KLU9TX19YbVN0cmluZ0RyYXdJbWFnZV8xMD0KLQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZT0KLU9TX19YbVN0cmluZ0RyYXdVbmRlcmxpbmVfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzE9Y2FzdD0oV2luZG93KQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8yPWNhc3Q9KFhtRm9udExpc3QpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzM9Y2FzdD0oWG1TdHJpbmcpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzQ9Y2FzdD0oR0MpCi1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzU9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzY9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzc9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzg9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzk9Ci1PU19fWG1TdHJpbmdEcmF3VW5kZXJsaW5lXzEwPQotT1NfX1htU3RyaW5nRHJhd1VuZGVybGluZV8xMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nRW1wdHk9Ci1PU19fWG1TdHJpbmdFbXB0eV8wPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdFeHRlbnQ9Ci1PU19fWG1TdHJpbmdFeHRlbnRfMD1jYXN0PVhtUmVuZGVyVGFibGUKLU9TX19YbVN0cmluZ0V4dGVudF8xPWNhc3Q9WG1TdHJpbmcKLU9TX19YbVN0cmluZ0V4dGVudF8yPWNhc3Q9RGltZW5zaW9uICoKLU9TX19YbVN0cmluZ0V4dGVudF8zPWNhc3Q9RGltZW5zaW9uICoKLQotT1NfX1htU3RyaW5nRnJlZT0KLU9TX19YbVN0cmluZ0ZyZWVfMD1jYXN0PShYbVN0cmluZykKLQotT1NfX1htU3RyaW5nR2VuZXJhdGU9Ci1PU19fWG1TdHJpbmdHZW5lcmF0ZV8wPWNhc3Q9KFh0UG9pbnRlcikKLU9TX19YbVN0cmluZ0dlbmVyYXRlXzE9Y2FzdD0oWG1TdHJpbmdUYWcpCi1PU19fWG1TdHJpbmdHZW5lcmF0ZV8yPQotT1NfX1htU3RyaW5nR2VuZXJhdGVfMz1jYXN0PShYbVN0cmluZ1RhZykKLQotT1NfX1htU3RyaW5nSGVpZ2h0PQotT1NfX1htU3RyaW5nSGVpZ2h0XzA9Y2FzdD0oWG1Gb250TGlzdCkKLU9TX19YbVN0cmluZ0hlaWdodF8xPWNhc3Q9KFhtU3RyaW5nKQotCi1PU19fWG1TdHJpbmdQYXJzZVRleHQ9Ci1PU19fWG1TdHJpbmdQYXJzZVRleHRfMD1jYXN0PShYdFBvaW50ZXIpCi1PU19fWG1TdHJpbmdQYXJzZVRleHRfMT1jYXN0PShYdFBvaW50ZXIgKikKLU9TX19YbVN0cmluZ1BhcnNlVGV4dF8yPWNhc3Q9KFhtU3RyaW5nVGFnKQotT1NfX1htU3RyaW5nUGFyc2VUZXh0XzM9Ci1PU19fWG1TdHJpbmdQYXJzZVRleHRfND1jYXN0PShYbVBhcnNlVGFibGUpCi1PU19fWG1TdHJpbmdQYXJzZVRleHRfNT0KLU9TX19YbVN0cmluZ1BhcnNlVGV4dF82PWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1htU3RyaW5nVW5wYXJzZT0KLU9TX19YbVN0cmluZ1VucGFyc2VfMD1jYXN0PShYbVN0cmluZykKLU9TX19YbVN0cmluZ1VucGFyc2VfMT1jYXN0PShYbVN0cmluZ1RhZykKLU9TX19YbVN0cmluZ1VucGFyc2VfMj0KLU9TX19YbVN0cmluZ1VucGFyc2VfMz0KLU9TX19YbVN0cmluZ1VucGFyc2VfND1jYXN0PShYbVBhcnNlVGFibGUpCi1PU19fWG1TdHJpbmdVbnBhcnNlXzU9Ci1PU19fWG1TdHJpbmdVbnBhcnNlXzY9Ci0KLU9TX19YbVN0cmluZ1dpZHRoPQotT1NfX1htU3RyaW5nV2lkdGhfMD1jYXN0PShYbUZvbnRMaXN0KQotT1NfX1htU3RyaW5nV2lkdGhfMT1jYXN0PShYbVN0cmluZykKLQotT1NfX1htVGFiQ3JlYXRlPQotT1NfX1htVGFiQ3JlYXRlXzA9Ci1PU19fWG1UYWJDcmVhdGVfMT0KLU9TX19YbVRhYkNyZWF0ZV8yPQotT1NfX1htVGFiQ3JlYXRlXzM9Ci1PU19fWG1UYWJDcmVhdGVfND1jYXN0PShjaGFyICopCi0KLU9TX19YbVRhYkZyZWU9Ci1PU19fWG1UYWJGcmVlXzA9Y2FzdD0oWG1UYWIpCi0KLU9TX19YbVRhYkxpc3RGcmVlPQotT1NfX1htVGFiTGlzdEZyZWVfMD1jYXN0PShYbVRhYkxpc3QpCi0KLU9TX19YbVRhYkxpc3RJbnNlcnRUYWJzPQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMD1jYXN0PShYbVRhYkxpc3QpCi1PU19fWG1UYWJMaXN0SW5zZXJ0VGFic18xPWNhc3Q9KFhtVGFiICopCi1PU19fWG1UYWJMaXN0SW5zZXJ0VGFic18yPQotT1NfX1htVGFiTGlzdEluc2VydFRhYnNfMz0KLQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uPQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dENsZWFyU2VsZWN0aW9uXzE9Ci0KLU9TX19YbVRleHRDb3B5PQotT1NfX1htVGV4dENvcHlfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0Q29weV8xPQotCi1PU19fWG1UZXh0Q3V0PQotT1NfX1htVGV4dEN1dF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRDdXRfMT0KLQotT1NfX1htVGV4dERpc2FibGVSZWRpc3BsYXk9Ci1PU19fWG1UZXh0RGlzYWJsZVJlZGlzcGxheV8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEVuYWJsZVJlZGlzcGxheT0KLU9TX19YbVRleHRFbmFibGVSZWRpc3BsYXlfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRGaWVsZFBhc3RlPQotT1NfX1htVGV4dEZpZWxkUGFzdGVfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRJbnNlcnRpb25Qb3NpdGlvbj0KLU9TX19YbVRleHRHZXRJbnNlcnRpb25Qb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldExhc3RQb3NpdGlvbj0KLU9TX19YbVRleHRHZXRMYXN0UG9zaXRpb25fMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRHZXRNYXhMZW5ndGg9Ci1PU19fWG1UZXh0R2V0TWF4TGVuZ3RoXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0U2VsZWN0aW9uPQotT1NfX1htVGV4dEdldFNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uPQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dEdldFNlbGVjdGlvblBvc2l0aW9uXzE9Y2FzdD0oWG1UZXh0UG9zaXRpb24gKikKLU9TX19YbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbl8yPWNhc3Q9KFhtVGV4dFBvc2l0aW9uICopCi0KLU9TX19YbVRleHRHZXRTdHJpbmc9Ci1PU19fWG1UZXh0R2V0U3RyaW5nXzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWG1UZXh0R2V0U3Vic3RyaW5nPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ18wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMT0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMj0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfMz0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdfND1jYXN0PShjaGFyICopCi0KLU9TX19YbVRleHRHZXRTdWJzdHJpbmdXY3M9Ci1PU19fWG1UZXh0R2V0U3Vic3RyaW5nV2NzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18xPWNhc3Q9KFhtVGV4dFBvc2l0aW9uKQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18yPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc18zPQotT1NfX1htVGV4dEdldFN1YnN0cmluZ1djc180PWNhc3Q9KHdjaGFyX3QgKikKLQotT1NfX1htVGV4dEluc2VydD0KLU9TX19YbVRleHRJbnNlcnRfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0SW5zZXJ0XzE9Ci1PU19fWG1UZXh0SW5zZXJ0XzI9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UZXh0UGFzdGU9Ci1PU19fWG1UZXh0UGFzdGVfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YbVRleHRQb3NUb1hZPQotT1NfX1htVGV4dFBvc1RvWFlfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0UG9zVG9YWV8xPWNhc3Q9KFhtVGV4dFBvc2l0aW9uKQotT1NfX1htVGV4dFBvc1RvWFlfMj1jYXN0PShQb3NpdGlvbiAqKQotT1NfX1htVGV4dFBvc1RvWFlfMz1jYXN0PShQb3NpdGlvbiAqKQotCi1PU19fWG1UZXh0UmVwbGFjZT0KLU9TX19YbVRleHRSZXBsYWNlXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFJlcGxhY2VfMT0KLU9TX19YbVRleHRSZXBsYWNlXzI9Ci1PU19fWG1UZXh0UmVwbGFjZV8zPWNhc3Q9KGNoYXIgKikKLQotT1NfX1htVGV4dFNjcm9sbD0KLU9TX19YbVRleHRTY3JvbGxfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2Nyb2xsXzE9Ci0KLU9TX19YbVRleHRTZXRFZGl0YWJsZT0KLU9TX19YbVRleHRTZXRFZGl0YWJsZV8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRFZGl0YWJsZV8xPQotCi1PU19fWG1UZXh0U2V0SGlnaGxpZ2h0PQotT1NfX1htVGV4dFNldEhpZ2hsaWdodF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMT0KLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMj0KLU9TX19YbVRleHRTZXRIaWdobGlnaHRfMz0KLQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uPQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNldEluc2VydGlvblBvc2l0aW9uXzE9Ci0KLU9TX19YbVRleHRTZXRNYXhMZW5ndGg9Ci1PU19fWG1UZXh0U2V0TWF4TGVuZ3RoXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1htVGV4dFNldE1heExlbmd0aF8xPQotCi1PU19fWG1UZXh0U2V0U2VsZWN0aW9uPQotT1NfX1htVGV4dFNldFNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMT0KLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMj0KLU9TX19YbVRleHRTZXRTZWxlY3Rpb25fMz0KLQotT1NfX1htVGV4dFNldFN0cmluZz0KLU9TX19YbVRleHRTZXRTdHJpbmdfMD1jYXN0PShXaWRnZXQpCi1PU19fWG1UZXh0U2V0U3RyaW5nXzE9Y2FzdD0oY2hhciAqKQotCi1PU19fWG1UZXh0U2hvd1Bvc2l0aW9uPQotT1NfX1htVGV4dFNob3dQb3NpdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVRleHRTaG93UG9zaXRpb25fMT0KLQotT1NfX1htVGV4dFhZVG9Qb3M9Ci1PU19fWG1UZXh0WFlUb1Bvc18wPWNhc3Q9V2lkZ2V0Ci1PU19fWG1UZXh0WFlUb1Bvc18xPWNhc3Q9UG9zaXRpb24KLU9TX19YbVRleHRYWVRvUG9zXzI9Y2FzdD1Qb3NpdGlvbgotCi1PU19fWG1VcGRhdGVEaXNwbGF5PQotT1NfX1htVXBkYXRlRGlzcGxheV8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1htV2lkZ2V0R2V0RGlzcGxheVJlY3Q9Ci1PU19fWG1XaWRnZXRHZXREaXNwbGF5UmVjdF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YbVdpZGdldEdldERpc3BsYXlSZWN0XzE9Y2FzdD0oWFJlY3RhbmdsZSAqKQotCi1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eT0KLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHlfMT1jYXN0PShjaGFyICoqKQotT1NfX1htYlRleHRMaXN0VG9UZXh0UHJvcGVydHlfMj0KLU9TX19YbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5XzM9Y2FzdD0oWElDQ0VuY29kaW5nU3R5bGUpCi1PU19fWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eV80PQotCi1PU19fWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdD0KLU9TX19YbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1htYlRleHRQcm9wZXJ0eVRvVGV4dExpc3RfMT0KLU9TX19YbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0XzI9Y2FzdD0oY2hhciAqKiopCi1PU19fWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdF8zPWNhc3Q9KGludCAqKQotCi1PU19fWHBDYW5jZWxKb2I9Ci1PU19fWHBDYW5jZWxKb2JfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBDYW5jZWxKb2JfMT0KLQotT1NfX1hwQ3JlYXRlQ29udGV4dD0KLU9TX19YcENyZWF0ZUNvbnRleHRfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBDcmVhdGVDb250ZXh0XzE9Y2FzdD0oY2hhciAqKQotCi1PU19fWHBEZXN0cm95Q29udGV4dD0KLU9TX19YcERlc3Ryb3lDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwRGVzdHJveUNvbnRleHRfMT1jYXN0PShYUENvbnRleHQpCi0KLU9TX19YcEVuZEpvYj0KLU9TX19YcEVuZEpvYl8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1hwRW5kUGFnZT0KLU9TX19YcEVuZFBhZ2VfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YcEZyZWVQcmludGVyTGlzdD0KLU9TX19YcEZyZWVQcmludGVyTGlzdF8wPWNhc3Q9KFhQUHJpbnRlckxpc3QpCi0KLU9TX19YcEdldE9uZUF0dHJpYnV0ZT0KLU9TX19YcEdldE9uZUF0dHJpYnV0ZV8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcEdldE9uZUF0dHJpYnV0ZV8xPWNhc3Q9KFhQQ29udGV4dCkKLU9TX19YcEdldE9uZUF0dHJpYnV0ZV8yPWNhc3Q9KFhQQXR0cmlidXRlcykKLU9TX19YcEdldE9uZUF0dHJpYnV0ZV8zPWNhc3Q9KGNoYXIgKikKLQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnM9Ci1PU19fWHBHZXRQYWdlRGltZW5zaW9uc18wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcEdldFBhZ2VEaW1lbnNpb25zXzE9Y2FzdD0oWFBDb250ZXh0KQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnNfMj1jYXN0PSh1bnNpZ25lZCBzaG9ydCAqKQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnNfMz1jYXN0PSh1bnNpZ25lZCBzaG9ydCAqKQotT1NfX1hwR2V0UGFnZURpbWVuc2lvbnNfND1jYXN0PShYUmVjdGFuZ2xlICopCi0KLU9TX19YcEdldFByaW50ZXJMaXN0PQotT1NfX1hwR2V0UHJpbnRlckxpc3RfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBHZXRQcmludGVyTGlzdF8xPWNhc3Q9KGNoYXIgKikKLU9TX19YcEdldFByaW50ZXJMaXN0XzI9Y2FzdD0oaW50ICopCi0KLU9TX19YcEdldFNjcmVlbk9mQ29udGV4dD0KLU9TX19YcEdldFNjcmVlbk9mQ29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcEdldFNjcmVlbk9mQ29udGV4dF8xPWNhc3Q9KFhQQ29udGV4dCkKLQotT1NfX1hwU2V0QXR0cmlidXRlcz0KLU9TX19YcFNldEF0dHJpYnV0ZXNfMD1jYXN0PShEaXNwbGF5ICopCi1PU19fWHBTZXRBdHRyaWJ1dGVzXzE9Y2FzdD0oWFBDb250ZXh0KQotT1NfX1hwU2V0QXR0cmlidXRlc18yPWNhc3Q9KFhQQXR0cmlidXRlcykKLU9TX19YcFNldEF0dHJpYnV0ZXNfMz1jYXN0PShjaGFyICopCi1PU19fWHBTZXRBdHRyaWJ1dGVzXzQ9Y2FzdD0oWFBBdHRyUmVwbGFjZW1lbnQpCi0KLU9TX19YcFNldENvbnRleHQ9Ci1PU19fWHBTZXRDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwU2V0Q29udGV4dF8xPWNhc3Q9KFhQQ29udGV4dCkKLQotT1NfX1hwU3RhcnRKb2I9Ci1PU19fWHBTdGFydEpvYl8wPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YcFN0YXJ0Sm9iXzE9Y2FzdD0oWFBTYXZlRGF0YSkKLQotT1NfX1hwU3RhcnRQYWdlPQotT1NfX1hwU3RhcnRQYWdlXzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1hwU3RhcnRQYWdlXzE9Y2FzdD0oV2luZG93KQotCi1PU19fWHRBZGRDYWxsYmFjaz0KLU9TX19YdEFkZENhbGxiYWNrXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0QWRkQ2FsbGJhY2tfMT1jYXN0PShTdHJpbmcpCi1PU19fWHRBZGRDYWxsYmFja18yPWNhc3Q9KFh0Q2FsbGJhY2tQcm9jKQotT1NfX1h0QWRkQ2FsbGJhY2tfMz1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YdEFkZEV2ZW50SGFuZGxlcj0KLU9TX19YdEFkZEV2ZW50SGFuZGxlcl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdEFkZEV2ZW50SGFuZGxlcl8xPQotT1NfX1h0QWRkRXZlbnRIYW5kbGVyXzI9Ci1PU19fWHRBZGRFdmVudEhhbmRsZXJfMz1jYXN0PShYdEV2ZW50SGFuZGxlcikKLU9TX19YdEFkZEV2ZW50SGFuZGxlcl80PWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1h0QWRkRXhwb3N1cmVUb1JlZ2lvbj0KLU9TX19YdEFkZEV4cG9zdXJlVG9SZWdpb25fMD1jYXN0PShYRXZlbnQgKikKLU9TX19YdEFkZEV4cG9zdXJlVG9SZWdpb25fMT1jYXN0PShSZWdpb24pCi0KLU9TX19YdEFwcEFkZElucHV0PQotT1NfX1h0QXBwQWRkSW5wdXRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBBZGRJbnB1dF8xPQotT1NfX1h0QXBwQWRkSW5wdXRfMj1jYXN0PShYdFBvaW50ZXIpCi1PU19fWHRBcHBBZGRJbnB1dF8zPWNhc3Q9KFh0SW5wdXRDYWxsYmFja1Byb2MpCi1PU19fWHRBcHBBZGRJbnB1dF80PWNhc3Q9KFh0UG9pbnRlcikKLQotT1NfX1h0QXBwQWRkVGltZU91dD0KLU9TX19YdEFwcEFkZFRpbWVPdXRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBBZGRUaW1lT3V0XzE9Ci1PU19fWHRBcHBBZGRUaW1lT3V0XzI9Y2FzdD0oWHRUaW1lckNhbGxiYWNrUHJvYykKLU9TX19YdEFwcEFkZFRpbWVPdXRfMz1jYXN0PShYdFBvaW50ZXIpCi0KLU9TX19YdEFwcENyZWF0ZVNoZWxsPQotT1NfX1h0QXBwQ3JlYXRlU2hlbGxfMD1jYXN0PShTdHJpbmcpCi1PU19fWHRBcHBDcmVhdGVTaGVsbF8xPWNhc3Q9KFN0cmluZykKLU9TX19YdEFwcENyZWF0ZVNoZWxsXzI9Y2FzdD0oV2lkZ2V0Q2xhc3MpCi1PU19fWHRBcHBDcmVhdGVTaGVsbF8zPWNhc3Q9KERpc3BsYXkgKikKLU9TX19YdEFwcENyZWF0ZVNoZWxsXzQ9Y2FzdD0oQXJnTGlzdCkKLU9TX19YdEFwcENyZWF0ZVNoZWxsXzU9Ci0KLU9TX19YdEFwcEdldFNlbGVjdGlvblRpbWVvdXQ9Ci1PU19fWHRBcHBHZXRTZWxlY3Rpb25UaW1lb3V0XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotCi1PU19fWHRBcHBOZXh0RXZlbnQ9Ci1PU19fWHRBcHBOZXh0RXZlbnRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBOZXh0RXZlbnRfMT1jYXN0PShYRXZlbnQgKikKLQotT1NfX1h0QXBwUGVla0V2ZW50PQotT1NfX1h0QXBwUGVla0V2ZW50XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwUGVla0V2ZW50XzE9Y2FzdD0oWEV2ZW50ICopCi0KLU9TX19YdEFwcFBlbmRpbmc9Ci1PU19fWHRBcHBQZW5kaW5nXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotCi1PU19fWHRBcHBQcm9jZXNzRXZlbnQ9Ci1PU19fWHRBcHBQcm9jZXNzRXZlbnRfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBQcm9jZXNzRXZlbnRfMT0KLQotT1NfX1h0QXBwU2V0RXJyb3JIYW5kbGVyPQotT1NfX1h0QXBwU2V0RXJyb3JIYW5kbGVyXzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0QXBwU2V0RXJyb3JIYW5kbGVyXzE9Y2FzdD0oWHRFcnJvckhhbmRsZXIpCi0KLU9TX19YdEFwcFNldEZhbGxiYWNrUmVzb3VyY2VzPQotT1NfX1h0QXBwU2V0RmFsbGJhY2tSZXNvdXJjZXNfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRBcHBTZXRGYWxsYmFja1Jlc291cmNlc18xPWNhc3Q9KFN0cmluZyAqKQotCi1PU19fWHRBcHBTZXRTZWxlY3Rpb25UaW1lb3V0PQotT1NfX1h0QXBwU2V0U2VsZWN0aW9uVGltZW91dF8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFNldFNlbGVjdGlvblRpbWVvdXRfMT0KLQotT1NfX1h0QXBwU2V0V2FybmluZ0hhbmRsZXI9Ci1PU19fWHRBcHBTZXRXYXJuaW5nSGFuZGxlcl8wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdEFwcFNldFdhcm5pbmdIYW5kbGVyXzE9Y2FzdD0oWHRFcnJvckhhbmRsZXIpCi0KLU9TX19YdEJ1aWxkRXZlbnRNYXNrPQotT1NfX1h0QnVpbGRFdmVudE1hc2tfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdENhbGxBY3Rpb25Qcm9jPQotT1NfX1h0Q2FsbEFjdGlvblByb2NfMD1jYXN0PShXaWRnZXQpCi1PU19fWHRDYWxsQWN0aW9uUHJvY18xPWNhc3Q9KFN0cmluZykKLU9TX19YdENhbGxBY3Rpb25Qcm9jXzI9Y2FzdD0oWEV2ZW50ICopCi1PU19fWHRDYWxsQWN0aW9uUHJvY18zPWNhc3Q9KFN0cmluZyAqKQotT1NfX1h0Q2FsbEFjdGlvblByb2NfND0KLQotT1NfX1h0Q2xhc3M9Ci1PU19fWHRDbGFzc18wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0PQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzE9Ci1PU19fWHRDb25maWd1cmVXaWRnZXRfMj0KLU9TX19YdENvbmZpZ3VyZVdpZGdldF8zPQotT1NfX1h0Q29uZmlndXJlV2lkZ2V0XzQ9Ci1PU19fWHRDb25maWd1cmVXaWRnZXRfNT0KLQotT1NfX1h0Q3JlYXRlQXBwbGljYXRpb25Db250ZXh0PQotCi1PU19fWHRDcmVhdGVQb3B1cFNoZWxsPQotT1NfX1h0Q3JlYXRlUG9wdXBTaGVsbF8wPWNhc3Q9KFN0cmluZykKLU9TX19YdENyZWF0ZVBvcHVwU2hlbGxfMT1jYXN0PShXaWRnZXRDbGFzcykKLU9TX19YdENyZWF0ZVBvcHVwU2hlbGxfMj1jYXN0PShXaWRnZXQpCi1PU19fWHRDcmVhdGVQb3B1cFNoZWxsXzM9Y2FzdD0oQXJnTGlzdCkKLU9TX19YdENyZWF0ZVBvcHVwU2hlbGxfND0KLQotT1NfX1h0RGVzdHJveUFwcGxpY2F0aW9uQ29udGV4dD0KLU9TX19YdERlc3Ryb3lBcHBsaWNhdGlvbkNvbnRleHRfMD1jYXN0PShYdEFwcENvbnRleHQpCi0KLU9TX19YdERlc3Ryb3lXaWRnZXQ9Ci1PU19fWHREZXN0cm95V2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHREaXNvd25TZWxlY3Rpb249Ci1PU19fWHREaXNvd25TZWxlY3Rpb25fMD1jYXN0PVdpZGdldAotT1NfX1h0RGlzb3duU2VsZWN0aW9uXzE9Y2FzdD1BdG9tCi1PU19fWHREaXNvd25TZWxlY3Rpb25fMj1jYXN0PVRpbWUKLQotT1NfX1h0RGlzcGF0Y2hFdmVudD0KLU9TX19YdERpc3BhdGNoRXZlbnRfMD1jYXN0PShYRXZlbnQgKikKLQotT1NfX1h0RGlzcGxheT0KLU9TX19YdERpc3BsYXlfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdERpc3BsYXlUb0FwcGxpY2F0aW9uQ29udGV4dD0KLU9TX19YdERpc3BsYXlUb0FwcGxpY2F0aW9uQ29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLQotT1NfX1h0RnJlZT0KLU9TX19YdEZyZWVfMD1jYXN0PShjaGFyICopCi0KLU9TX19YdEdldERpc3BsYXlzPQotT1NfX1h0R2V0RGlzcGxheXNfMD1jYXN0PShYdEFwcENvbnRleHQpCi1PU19fWHRHZXREaXNwbGF5c18xPWNhc3Q9RGlzcGxheSAqKioKLU9TX19YdEdldERpc3BsYXlzXzI9Y2FzdD1DYXJkaW5hbCAqCi0KLU9TX19YdEdldE11bHRpQ2xpY2tUaW1lPQotT1NfX1h0R2V0TXVsdGlDbGlja1RpbWVfMD1jYXN0PShEaXNwbGF5ICopCi0KLU9TX19YdEdldFNlbGVjdGlvblZhbHVlPQotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfMD1jYXN0PVdpZGdldAotT1NfX1h0R2V0U2VsZWN0aW9uVmFsdWVfMT1jYXN0PUF0b20KLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzI9Y2FzdD1BdG9tCi1PU19fWHRHZXRTZWxlY3Rpb25WYWx1ZV8zPWNhc3Q9WHRTZWxlY3Rpb25DYWxsYmFja1Byb2MKLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzQ9Y2FzdD1YdFBvaW50ZXIKLU9TX19YdEdldFNlbGVjdGlvblZhbHVlXzU9Y2FzdD1UaW1lCi0KLU9TX19YdEdldFZhbHVlcz1mbGFncz1ub19nZW4KLU9TX19YdEdldFZhbHVlc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdEdldFZhbHVlc18xPWNhc3Q9KEFyZ0xpc3QpCi1PU19fWHRHZXRWYWx1ZXNfMj0KLQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyPQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzE9Y2FzdD0oRXZlbnRNYXNrKQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzI9Y2FzdD0oQm9vbGVhbikKLU9TX19YdEluc2VydEV2ZW50SGFuZGxlcl8zPWNhc3Q9KFh0RXZlbnRIYW5kbGVyKQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzQ9Y2FzdD0oWHRQb2ludGVyKQotT1NfX1h0SW5zZXJ0RXZlbnRIYW5kbGVyXzU9Y2FzdD0oWHRMaXN0UG9zaXRpb24pCi0KLU9TX19YdElzTWFuYWdlZD0KLU9TX19YdElzTWFuYWdlZF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0SXNSZWFsaXplZD0KLU9TX19YdElzUmVhbGl6ZWRfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdElzU3ViY2xhc3M9Ci1PU19fWHRJc1N1YmNsYXNzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0SXNTdWJjbGFzc18xPWNhc3Q9KFdpZGdldENsYXNzKQotCi1PU19fWHRJc1RvcExldmVsU2hlbGw9Ci1PU19fWHRJc1RvcExldmVsU2hlbGxfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdExhc3RUaW1lc3RhbXBQcm9jZXNzZWQ9Ci1PU19fWHRMYXN0VGltZXN0YW1wUHJvY2Vzc2VkXzA9Y2FzdD0oRGlzcGxheSAqKQotCi1PU19fWHRNYWxsb2M9Ci1PU19fWHRNYWxsb2NfMD0KLQotT1NfX1h0TWFuYWdlQ2hpbGQ9Ci1PU19fWHRNYW5hZ2VDaGlsZF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0TWFwV2lkZ2V0PQotT1NfX1h0TWFwV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRNb3ZlV2lkZ2V0PQotT1NfX1h0TW92ZVdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdE1vdmVXaWRnZXRfMT0KLU9TX19YdE1vdmVXaWRnZXRfMj0KLQotT1NfX1h0TmFtZVRvV2lkZ2V0PQotT1NfX1h0TmFtZVRvV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0TmFtZVRvV2lkZ2V0XzE9Y2FzdD0oU3RyaW5nKQotCi1PU19fWHRPcGVuRGlzcGxheT0KLU9TX19YdE9wZW5EaXNwbGF5XzA9Y2FzdD0oWHRBcHBDb250ZXh0KQotT1NfX1h0T3BlbkRpc3BsYXlfMT1jYXN0PShTdHJpbmcpCi1PU19fWHRPcGVuRGlzcGxheV8yPWNhc3Q9KFN0cmluZykKLU9TX19YdE9wZW5EaXNwbGF5XzM9Y2FzdD0oU3RyaW5nKQotT1NfX1h0T3BlbkRpc3BsYXlfND1jYXN0PShYcm1PcHRpb25EZXNjUmVjICopCi1PU19fWHRPcGVuRGlzcGxheV81PQotT1NfX1h0T3BlbkRpc3BsYXlfNj1jYXN0PShpbnQgKikKLU9TX19YdE9wZW5EaXNwbGF5Xzc9Y2FzdD0oY2hhciAqKikKLQotT1NfX1h0T3ZlcnJpZGVUcmFuc2xhdGlvbnM9Ci1PU19fWHRPdmVycmlkZVRyYW5zbGF0aW9uc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdE92ZXJyaWRlVHJhbnNsYXRpb25zXzE9Y2FzdD0oWHRUcmFuc2xhdGlvbnMpCi0KLU9TX19YdE93blNlbGVjdGlvbj0KLU9TX19YdE93blNlbGVjdGlvbl8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdE93blNlbGVjdGlvbl8xPWNhc3Q9KEF0b20pCi1PU19fWHRPd25TZWxlY3Rpb25fMj1jYXN0PVRpbWUKLU9TX19YdE93blNlbGVjdGlvbl8zPWNhc3Q9WHRDb252ZXJ0U2VsZWN0aW9uUHJvYwotT1NfX1h0T3duU2VsZWN0aW9uXzQ9Y2FzdD0oWHRMb3NlU2VsZWN0aW9uUHJvYykKLU9TX19YdE93blNlbGVjdGlvbl81PWNhc3Q9KFh0U2VsZWN0aW9uRG9uZVByb2MpCi0KLU9TX19YdFBhcmVudD0KLU9TX19YdFBhcmVudF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0UGFyc2VUcmFuc2xhdGlvblRhYmxlPQotT1NfX1h0UGFyc2VUcmFuc2xhdGlvblRhYmxlXzA9Y2FzdD0oU3RyaW5nKQotCi1PU19fWHRQb3Bkb3duPQotT1NfX1h0UG9wZG93bl8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0UG9wdXA9Ci1PU19fWHRQb3B1cF8wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFBvcHVwXzE9Ci0KLU9TX19YdFF1ZXJ5R2VvbWV0cnk9Ci1PU19fWHRRdWVyeUdlb21ldHJ5XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0UXVlcnlHZW9tZXRyeV8xPWNhc3Q9KFh0V2lkZ2V0R2VvbWV0cnkgKikKLU9TX19YdFF1ZXJ5R2VvbWV0cnlfMj1jYXN0PShYdFdpZGdldEdlb21ldHJ5ICopCi0KLU9TX19YdFJlYWxpemVXaWRnZXQ9Ci1PU19fWHRSZWFsaXplV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRSZWdpc3RlckRyYXdhYmxlPQotT1NfX1h0UmVnaXN0ZXJEcmF3YWJsZV8wPWNhc3Q9RGlzcGxheSAqCi1PU19fWHRSZWdpc3RlckRyYXdhYmxlXzE9Y2FzdD1EcmF3YWJsZQotT1NfX1h0UmVnaXN0ZXJEcmF3YWJsZV8yPWNhc3Q9V2lkZ2V0Ci0KLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcj0KLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcl8wPWNhc3Q9V2lkZ2V0Ci1PU19fWHRSZW1vdmVFdmVudEhhbmRsZXJfMT0KLU9TX19YdFJlbW92ZUV2ZW50SGFuZGxlcl8yPQotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyXzM9Y2FzdD1YdEV2ZW50SGFuZGxlcgotT1NfX1h0UmVtb3ZlRXZlbnRIYW5kbGVyXzQ9Y2FzdD1YdFBvaW50ZXIKLQotT1NfX1h0UmVtb3ZlSW5wdXQ9Ci1PU19fWHRSZW1vdmVJbnB1dF8wPWNhc3Q9KFh0SW5wdXRJZCkKLQotT1NfX1h0UmVtb3ZlVGltZU91dD0KLU9TX19YdFJlbW92ZVRpbWVPdXRfMD0KLQotT1NfX1h0UmVzaXplV2lkZ2V0PQotT1NfX1h0UmVzaXplV2lkZ2V0XzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0UmVzaXplV2lkZ2V0XzE9Ci1PU19fWHRSZXNpemVXaWRnZXRfMj0KLU9TX19YdFJlc2l6ZVdpZGdldF8zPQotCi1PU19fWHRSZXNpemVXaW5kb3c9Ci1PU19fWHRSZXNpemVXaW5kb3dfMD1jYXN0PShXaWRnZXQpCi0KLU9TX19YdFNldExhbmd1YWdlUHJvYz0KLU9TX19YdFNldExhbmd1YWdlUHJvY18wPWNhc3Q9KFh0QXBwQ29udGV4dCkKLU9TX19YdFNldExhbmd1YWdlUHJvY18xPWNhc3Q9KFh0TGFuZ3VhZ2VQcm9jKQotT1NfX1h0U2V0TGFuZ3VhZ2VQcm9jXzI9Y2FzdD0oWHRQb2ludGVyKQotCi1PU19fWHRTZXRNYXBwZWRXaGVuTWFuYWdlZD0KLU9TX19YdFNldE1hcHBlZFdoZW5NYW5hZ2VkXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0U2V0TWFwcGVkV2hlbk1hbmFnZWRfMT0KLQotT1NfX1h0U2V0VmFsdWVzPQotT1NfX1h0U2V0VmFsdWVzXzA9Y2FzdD0oV2lkZ2V0KQotT1NfX1h0U2V0VmFsdWVzXzE9Y2FzdD0oQXJnTGlzdCkKLU9TX19YdFNldFZhbHVlc18yPQotCi1PU19fWHRUb29sa2l0SW5pdGlhbGl6ZT0KLQotT1NfX1h0VG9vbGtpdFRocmVhZEluaXRpYWxpemU9Ci0KLU9TX19YdFRyYW5zbGF0ZUNvb3Jkcz0KLU9TX19YdFRyYW5zbGF0ZUNvb3Jkc18wPWNhc3Q9KFdpZGdldCkKLU9TX19YdFRyYW5zbGF0ZUNvb3Jkc18xPQotT1NfX1h0VHJhbnNsYXRlQ29vcmRzXzI9Ci1PU19fWHRUcmFuc2xhdGVDb29yZHNfMz0KLU9TX19YdFRyYW5zbGF0ZUNvb3Jkc180PQotCi1PU19fWHRVbm1hbmFnZUNoaWxkPQotT1NfX1h0VW5tYW5hZ2VDaGlsZF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0VW5tYXBXaWRnZXQ9Ci1PU19fWHRVbm1hcFdpZGdldF8wPWNhc3Q9KFdpZGdldCkKLQotT1NfX1h0VW5yZWdpc3RlckRyYXdhYmxlPQotT1NfX1h0VW5yZWdpc3RlckRyYXdhYmxlXzA9Y2FzdD1EaXNwbGF5ICoKLU9TX19YdFVucmVnaXN0ZXJEcmF3YWJsZV8xPWNhc3Q9RHJhd2FibGUKLQotT1NfX1h0V2luZG93PQotT1NfX1h0V2luZG93XzA9Y2FzdD0oV2lkZ2V0KQotCi1PU19fWHRXaW5kb3dUb1dpZGdldD0KLU9TX19YdFdpbmRvd1RvV2lkZ2V0XzA9Y2FzdD0oRGlzcGxheSAqKQotT1NfX1h0V2luZG93VG9XaWRnZXRfMT1jYXN0PShXaW5kb3cpCi0KLU9TX19fWG1TZXRNZW51VHJhdmVyc2FsPQotT1NfX19YbVNldE1lbnVUcmF2ZXJzYWxfMD1jYXN0PShXaWRnZXQpCi1PU19fX1htU2V0TWVudVRyYXZlcnNhbF8xPQotCi1PU19fX1h0RGVmYXVsdEFwcENvbnRleHQ9Ci0KLU9TX19hcHBsaWNhdGlvblNoZWxsV2lkZ2V0Q2xhc3M9ZmxhZ3M9Y29uc3QKLQotT1NfX2RsY2xvc2U9Ci1PU19fZGxjbG9zZV8wPWNhc3Q9KHZvaWQgKikKLQotT1NfX2Rsb3Blbj0KLU9TX19kbG9wZW5fMD1jYXN0PShjb25zdCBjaGFyICopCi1PU19fZGxvcGVuXzE9Ci0KLU9TX19kbHN5bT0KLU9TX19kbHN5bV8wPWNhc3Q9KHZvaWQgKikKLU9TX19kbHN5bV8xPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotT1NfX292ZXJyaWRlU2hlbGxXaWRnZXRDbGFzcz1mbGFncz1jb25zdAotCi1PU19fc2hlbGxXaWRnZXRDbGFzcz1mbGFncz1jb25zdAotCi1PU19fdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX190cmFuc2llbnRTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX194bU1lbnVTaGVsbFdpZGdldENsYXNzPWZsYWdzPWNvbnN0Ci0KLU9TX2Nsb3NlPQotT1NfY2xvc2VfMD0KLQotT1NfZmRfc2V0X3NpemVvZj0KLQotT1NfaWNvbnY9Ci1PU19pY29udl8wPWNhc3Q9KGljb252X3QpCi1PU19pY29udl8xPWNhc3Q9KHZvaWQgKikKLU9TX2ljb252XzI9Y2FzdD0oc2l6ZV90ICopCi1PU19pY29udl8zPWNhc3Q9KGNoYXIgKiopCi1PU19pY29udl80PWNhc3Q9KHNpemVfdCAqKQotCi1PU19pY29udl9jbG9zZT0KLU9TX2ljb252X2Nsb3NlXzA9Y2FzdD0oaWNvbnZfdCkKLQotT1NfaWNvbnZfb3Blbj0KLU9TX2ljb252X29wZW5fMD1jYXN0PShjb25zdCBjaGFyICopCi1PU19pY29udl9vcGVuXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19sb2NhbGVjb252X2RlY2ltYWxfcG9pbnQ9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQnV0dG9uRXZlbnRfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnRfMklfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb25maWd1cmVFdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV4cG9zZUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV4cG9zZUV2ZW50XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV4cG9zZUV2ZW50XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hJbWFnZV8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hLZXlFdmVudF8ySV8xPWNhc3Q9Y29uc3Qgdm9pZCAqLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEtleUV2ZW50XzJJXzI9Y2FzdD1zaXplX3QKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWxfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hBbnlFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEJ1dHRvbkV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2hhclN0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDaGFyU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENoYXJTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2hhclN0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDbGllbnRNZXNzYWdlRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENsaWVudE1lc3NhZ2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENvbmZpZ3VyZUV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3JlYXRlV2luZG93RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWENyb3NzaW5nRXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ3Jvc3NpbmdFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWERlc3Ryb3lXaW5kb3dFdmVudF8ySUlfMD1jYXN0PXZvaWQgKixmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hEZXN0cm95V2luZG93RXZlbnRfMklJXzI9Y2FzdD1zaXplX3QKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnRfMklJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEV2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFdmVudF8ySUlfMj1jYXN0PXNpemVfdAotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9jdXNDaGFuZ2VFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb2N1c0NoYW5nZUV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb250U3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvbnRTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRm9udFN0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hGb250U3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemVfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemVfMklJXzA9Y2FzdD12b2lkICosZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEljb25TaXplXzJJSV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEltYWdlXzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hNb2RpZmllcktleW1hcF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUHJvcGVydHlFdmVudF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8wPWNhc3Q9dm9pZCAqLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50XzJJSV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlcGFyZW50RXZlbnRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVwYXJlbnRFdmVudF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZXBhcmVudEV2ZW50XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFJlcGFyZW50RXZlbnRfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mb18ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbUFueUNhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1BbnlDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BGaW5pc2hDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF8ySUlfMj1jYXN0PShzaXplX3QpCi0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRCbG9ja1JlY18ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dEJsb2NrUmVjXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWNfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0XzJJSV8yPWNhc3Q9KHNpemVfdCkKLQotT1NfbmxfbGFuZ2luZm89Ci1PU19ubF9sYW5naW5mb18wPQotCi1PU19waXBlPQotT1NfcGlwZV8wPWNhc3Q9KGludCAqKQotCi1PU19yZWFkPQotT1NfcmVhZF8wPQotT1NfcmVhZF8xPWNhc3Q9KGNoYXIgKikKLU9TX3JlYWRfMj0KLQotT1Nfc2VsZWN0PQotT1Nfc2VsZWN0XzA9Ci1PU19zZWxlY3RfMT1jYXN0PShmZF9zZXQgKikKLU9TX3NlbGVjdF8yPWNhc3Q9KGZkX3NldCAqKQotT1Nfc2VsZWN0XzM9Y2FzdD0oZmRfc2V0ICopCi1PU19zZWxlY3RfND1jYXN0PShzdHJ1Y3QgdGltZXZhbCAqKQotCi1PU19zZXRSZXNvdXJjZU1lbT1mbGFncz1ub19nZW4KLU9TX3NldFJlc291cmNlTWVtXzA9Ci1PU19zZXRSZXNvdXJjZU1lbV8xPQotCi1PU19zZXRsb2NhbGU9Ci1PU19zZXRsb2NhbGVfMD0KLU9TX3NldGxvY2FsZV8xPWNhc3Q9KGNoYXIgKikKLQotT1Nfd3JpdGU9Ci1PU193cml0ZV8wPQotT1Nfd3JpdGVfMT1jYXN0PShjaGFyICopCi1PU193cml0ZV8yPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9WaXN1YWw9Ci1WaXN1YWxfZXh0X2RhdGE9Y2FzdD0oWEV4dERhdGEgKikKLVZpc3VhbF92aXN1YWxpZD0KLVZpc3VhbF9jX2NsYXNzPWFjY2Vzc29yPWNsYXNzCi1WaXN1YWxfcmVkX21hc2s9Ci1WaXN1YWxfZ3JlZW5fbWFzaz0KLVZpc3VhbF9ibHVlX21hc2s9Ci1WaXN1YWxfYml0c19wZXJfcmdiPQotVmlzdWFsX21hcF9lbnRyaWVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEFueUV2ZW50PQotWEFueUV2ZW50X3NlcmlhbD0KLVhBbnlFdmVudF9zZW5kX2V2ZW50PQotWEFueUV2ZW50X2Rpc3BsYXk9Y2FzdD0oRGlzcGxheSAqKQotWEFueUV2ZW50X3dpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hCdXR0b25FdmVudD0KLVhCdXR0b25FdmVudF9yb290PQotWEJ1dHRvbkV2ZW50X3N1YndpbmRvdz0KLVhCdXR0b25FdmVudF90aW1lPQotWEJ1dHRvbkV2ZW50X3g9Ci1YQnV0dG9uRXZlbnRfeT0KLVhCdXR0b25FdmVudF94X3Jvb3Q9Ci1YQnV0dG9uRXZlbnRfeV9yb290PQotWEJ1dHRvbkV2ZW50X3N0YXRlPQotWEJ1dHRvbkV2ZW50X2J1dHRvbj0KLVhCdXR0b25FdmVudF9zYW1lX3NjcmVlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDaGFyU3RydWN0PQotWENoYXJTdHJ1Y3RfbGJlYXJpbmc9Ci1YQ2hhclN0cnVjdF9yYmVhcmluZz0KLVhDaGFyU3RydWN0X3dpZHRoPQotWENoYXJTdHJ1Y3RfYXNjZW50PQotWENoYXJTdHJ1Y3RfZGVzY2VudD0KLVhDaGFyU3RydWN0X2F0dHJpYnV0ZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ2xpZW50TWVzc2FnZUV2ZW50PQotWENsaWVudE1lc3NhZ2VFdmVudF9tZXNzYWdlX3R5cGU9Y2FzdD1BdG9tCi1YQ2xpZW50TWVzc2FnZUV2ZW50X2Zvcm1hdD0KLVhDbGllbnRNZXNzYWdlRXZlbnRfZGF0YT1hY2Nlc3Nvcj1kYXRhLmwsY2FzdD1sb25nICoKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDb2xvcj0KLVhDb2xvcl9waXhlbD0KLVhDb2xvcl9yZWQ9Ci1YQ29sb3JfZ3JlZW49Ci1YQ29sb3JfYmx1ZT0KLVhDb2xvcl9mbGFncz0KLVhDb2xvcl9wYWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YQ29uZmlndXJlRXZlbnQ9Ci1YQ29uZmlndXJlRXZlbnRfc2VyaWFsPQotWENvbmZpZ3VyZUV2ZW50X3NlbmRfZXZlbnQ9Ci1YQ29uZmlndXJlRXZlbnRfZGlzcGxheT1jYXN0PURpc3BsYXkgKgotWENvbmZpZ3VyZUV2ZW50X2V2ZW50PWNhc3Q9V2luZG93Ci1YQ29uZmlndXJlRXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci1YQ29uZmlndXJlRXZlbnRfeD0KLVhDb25maWd1cmVFdmVudF95PQotWENvbmZpZ3VyZUV2ZW50X3dpZHRoPQotWENvbmZpZ3VyZUV2ZW50X2hlaWdodD0KLVhDb25maWd1cmVFdmVudF9ib3JkZXJfd2lkdGg9Ci1YQ29uZmlndXJlRXZlbnRfYWJvdmU9Y2FzdD1XaW5kb3cKLVhDb25maWd1cmVFdmVudF9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcmVhdGVXaW5kb3dFdmVudD0KLVhDcmVhdGVXaW5kb3dFdmVudF9zZXJpYWw9Ci1YQ3JlYXRlV2luZG93RXZlbnRfc2VuZF9ldmVudD0KLVhDcmVhdGVXaW5kb3dFdmVudF9kaXNwbGF5PWNhc3Q9KERpc3BsYXkgKikKLVhDcmVhdGVXaW5kb3dFdmVudF9wYXJlbnQ9Y2FzdD1XaW5kb3cKLVhDcmVhdGVXaW5kb3dFdmVudF93aW5kb3c9Y2FzdD1XaW5kb3cKLVhDcmVhdGVXaW5kb3dFdmVudF94PQotWENyZWF0ZVdpbmRvd0V2ZW50X3k9Ci1YQ3JlYXRlV2luZG93RXZlbnRfd2lkdGg9Ci1YQ3JlYXRlV2luZG93RXZlbnRfaGVpZ2h0PQotWENyZWF0ZVdpbmRvd0V2ZW50X2JvcmRlcl93aWR0aD0KLVhDcmVhdGVXaW5kb3dFdmVudF9vdmVycmlkZV9yZWRpcmVjdD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hDcm9zc2luZ0V2ZW50PQotWENyb3NzaW5nRXZlbnRfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X3N1YndpbmRvdz0KLVhDcm9zc2luZ0V2ZW50X3RpbWU9Ci1YQ3Jvc3NpbmdFdmVudF94PQotWENyb3NzaW5nRXZlbnRfeT0KLVhDcm9zc2luZ0V2ZW50X3hfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X3lfcm9vdD0KLVhDcm9zc2luZ0V2ZW50X21vZGU9Ci1YQ3Jvc3NpbmdFdmVudF9kZXRhaWw9Ci1YQ3Jvc3NpbmdFdmVudF9zYW1lX3NjcmVlbj0KLVhDcm9zc2luZ0V2ZW50X2ZvY3VzPQotWENyb3NzaW5nRXZlbnRfc3RhdGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRGVzdHJveVdpbmRvd0V2ZW50PQotWERlc3Ryb3lXaW5kb3dFdmVudF9zZXJpYWw9Ci1YRGVzdHJveVdpbmRvd0V2ZW50X3NlbmRfZXZlbnQ9Ci1YRGVzdHJveVdpbmRvd0V2ZW50X2Rpc3BsYXk9Y2FzdD1EaXNwbGF5ICoKLVhEZXN0cm95V2luZG93RXZlbnRfZXZlbnQ9Y2FzdD1XaW5kb3cKLVhEZXN0cm95V2luZG93RXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YRXZlbnQ9Ci1YRXZlbnRfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hFeHBvc2VFdmVudD0KLVhFeHBvc2VFdmVudF94PQotWEV4cG9zZUV2ZW50X3k9Ci1YRXhwb3NlRXZlbnRfd2lkdGg9Ci1YRXhwb3NlRXZlbnRfaGVpZ2h0PQotWEV4cG9zZUV2ZW50X2NvdW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvY3VzQ2hhbmdlRXZlbnQ9Ci1YRm9jdXNDaGFuZ2VFdmVudF9tb2RlPQotWEZvY3VzQ2hhbmdlRXZlbnRfZGV0YWlsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEZvbnRTdHJ1Y3Q9Ci1YRm9udFN0cnVjdF9leHRfZGF0YT1jYXN0PShYRXh0RGF0YSAqKQotWEZvbnRTdHJ1Y3RfZmlkPQotWEZvbnRTdHJ1Y3RfZGlyZWN0aW9uPQotWEZvbnRTdHJ1Y3RfbWluX2NoYXJfb3JfYnl0ZTI9Ci1YRm9udFN0cnVjdF9tYXhfY2hhcl9vcl9ieXRlMj0KLVhGb250U3RydWN0X21pbl9ieXRlMT0KLVhGb250U3RydWN0X21heF9ieXRlMT0KLVhGb250U3RydWN0X2FsbF9jaGFyc19leGlzdD0KLVhGb250U3RydWN0X2RlZmF1bHRfY2hhcj0KLVhGb250U3RydWN0X25fcHJvcGVydGllcz0KLVhGb250U3RydWN0X3Byb3BlcnRpZXM9Y2FzdD0oWEZvbnRQcm9wICopCi1YRm9udFN0cnVjdF9taW5fYm91bmRzX2xiZWFyaW5nPWFjY2Vzc29yPW1pbl9ib3VuZHMubGJlYXJpbmcKLVhGb250U3RydWN0X21pbl9ib3VuZHNfcmJlYXJpbmc9YWNjZXNzb3I9bWluX2JvdW5kcy5yYmVhcmluZwotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc193aWR0aD1hY2Nlc3Nvcj1taW5fYm91bmRzLndpZHRoCi1YRm9udFN0cnVjdF9taW5fYm91bmRzX2FzY2VudD1hY2Nlc3Nvcj1taW5fYm91bmRzLmFzY2VudAotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc19kZXNjZW50PWFjY2Vzc29yPW1pbl9ib3VuZHMuZGVzY2VudAotWEZvbnRTdHJ1Y3RfbWluX2JvdW5kc19hdHRyaWJ1dGVzPWFjY2Vzc29yPW1pbl9ib3VuZHMuYXR0cmlidXRlcwotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19sYmVhcmluZz1hY2Nlc3Nvcj1tYXhfYm91bmRzLmxiZWFyaW5nCi1YRm9udFN0cnVjdF9tYXhfYm91bmRzX3JiZWFyaW5nPWFjY2Vzc29yPW1heF9ib3VuZHMucmJlYXJpbmcKLVhGb250U3RydWN0X21heF9ib3VuZHNfd2lkdGg9YWNjZXNzb3I9bWF4X2JvdW5kcy53aWR0aAotWEZvbnRTdHJ1Y3RfbWF4X2JvdW5kc19hc2NlbnQ9YWNjZXNzb3I9bWF4X2JvdW5kcy5hc2NlbnQKLVhGb250U3RydWN0X21heF9ib3VuZHNfZGVzY2VudD1hY2Nlc3Nvcj1tYXhfYm91bmRzLmRlc2NlbnQKLVhGb250U3RydWN0X21heF9ib3VuZHNfYXR0cmlidXRlcz1hY2Nlc3Nvcj1tYXhfYm91bmRzLmF0dHJpYnV0ZXMKLVhGb250U3RydWN0X3Blcl9jaGFyPWNhc3Q9KFhDaGFyU3RydWN0ICopCi1YRm9udFN0cnVjdF9hc2NlbnQ9Ci1YRm9udFN0cnVjdF9kZXNjZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWEdDVmFsdWVzPQotWEdDVmFsdWVzX2Z1bmN0aW9uPQotWEdDVmFsdWVzX3BsYW5lX21hc2s9Ci1YR0NWYWx1ZXNfZm9yZWdyb3VuZD0KLVhHQ1ZhbHVlc19iYWNrZ3JvdW5kPQotWEdDVmFsdWVzX2xpbmVfd2lkdGg9Ci1YR0NWYWx1ZXNfbGluZV9zdHlsZT0KLVhHQ1ZhbHVlc19jYXBfc3R5bGU9Ci1YR0NWYWx1ZXNfam9pbl9zdHlsZT0KLVhHQ1ZhbHVlc19maWxsX3N0eWxlPQotWEdDVmFsdWVzX2ZpbGxfcnVsZT0KLVhHQ1ZhbHVlc19hcmNfbW9kZT0KLVhHQ1ZhbHVlc190aWxlPQotWEdDVmFsdWVzX3N0aXBwbGU9Ci1YR0NWYWx1ZXNfdHNfeF9vcmlnaW49Ci1YR0NWYWx1ZXNfdHNfeV9vcmlnaW49Ci1YR0NWYWx1ZXNfZm9udD0KLVhHQ1ZhbHVlc19zdWJ3aW5kb3dfbW9kZT0KLVhHQ1ZhbHVlc19ncmFwaGljc19leHBvc3VyZXM9Ci1YR0NWYWx1ZXNfY2xpcF94X29yaWdpbj0KLVhHQ1ZhbHVlc19jbGlwX3lfb3JpZ2luPQotWEdDVmFsdWVzX2NsaXBfbWFzaz0KLVhHQ1ZhbHVlc19kYXNoX29mZnNldD0KLVhHQ1ZhbHVlc19kYXNoZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSWNvblNpemU9Ci1YSWNvblNpemVfbWluX3dpZHRoPQotWEljb25TaXplX21pbl9oZWlnaHQ9Ci1YSWNvblNpemVfbWF4X3dpZHRoPQotWEljb25TaXplX21heF9oZWlnaHQ9Ci1YSWNvblNpemVfd2lkdGhfaW5jPQotWEljb25TaXplX2hlaWdodF9pbmM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YSW1hZ2U9Ci1YSW1hZ2Vfd2lkdGg9Ci1YSW1hZ2VfaGVpZ2h0PQotWEltYWdlX3hvZmZzZXQ9Ci1YSW1hZ2VfZm9ybWF0PQotWEltYWdlX2RhdGE9Y2FzdD0oY2hhciAqKQotWEltYWdlX2J5dGVfb3JkZXI9Ci1YSW1hZ2VfYml0bWFwX3VuaXQ9Ci1YSW1hZ2VfYml0bWFwX2JpdF9vcmRlcj0KLVhJbWFnZV9iaXRtYXBfcGFkPQotWEltYWdlX2RlcHRoPQotWEltYWdlX2J5dGVzX3Blcl9saW5lPQotWEltYWdlX2JpdHNfcGVyX3BpeGVsPQotWEltYWdlX3JlZF9tYXNrPQotWEltYWdlX2dyZWVuX21hc2s9Ci1YSW1hZ2VfYmx1ZV9tYXNrPQotWEltYWdlX29iZGF0YT1jYXN0PShYUG9pbnRlcikKLVhJbWFnZV9jcmVhdGVfaW1hZ2U9YWNjZXNzb3I9Zi5jcmVhdGVfaW1hZ2UsY2FzdD0oWEltYWdlICooKikoKSkKLVhJbWFnZV9kZXN0cm95X2ltYWdlPWFjY2Vzc29yPWYuZGVzdHJveV9pbWFnZSxjYXN0PShpbnQoKikoKSkKLVhJbWFnZV9nZXRfcGl4ZWw9YWNjZXNzb3I9Zi5nZXRfcGl4ZWwsY2FzdD0odW5zaWduZWQgbG9uZygqKSgpKQotWEltYWdlX3B1dF9waXhlbD1hY2Nlc3Nvcj1mLnB1dF9waXhlbCxjYXN0PShpbnQoKikoKSkKLVhJbWFnZV9zdWJfaW1hZ2U9YWNjZXNzb3I9Zi5zdWJfaW1hZ2UsY2FzdD0oWEltYWdlICooKikoKSkKLVhJbWFnZV9hZGRfcGl4ZWw9YWNjZXNzb3I9Zi5hZGRfcGl4ZWwsY2FzdD0oaW50KCopKCkpCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YS2V5RXZlbnQ9Ci1YS2V5RXZlbnRfcm9vdD0KLVhLZXlFdmVudF9zdWJ3aW5kb3c9Ci1YS2V5RXZlbnRfdGltZT0KLVhLZXlFdmVudF94PQotWEtleUV2ZW50X3k9Ci1YS2V5RXZlbnRfeF9yb290PQotWEtleUV2ZW50X3lfcm9vdD0KLVhLZXlFdmVudF9zdGF0ZT0KLVhLZXlFdmVudF9rZXljb2RlPQotWEtleUV2ZW50X3NhbWVfc2NyZWVuPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vZGlmaWVyS2V5bWFwPQotWE1vZGlmaWVyS2V5bWFwX21heF9rZXlwZXJtb2Q9Ci1YTW9kaWZpZXJLZXltYXBfbW9kaWZpZXJtYXA9Y2FzdD0oS2V5Q29kZSAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWE1vdGlvbkV2ZW50PQotWE1vdGlvbkV2ZW50X3Jvb3Q9Ci1YTW90aW9uRXZlbnRfc3Vid2luZG93PQotWE1vdGlvbkV2ZW50X3RpbWU9Ci1YTW90aW9uRXZlbnRfeD0KLVhNb3Rpb25FdmVudF95PQotWE1vdGlvbkV2ZW50X3hfcm9vdD0KLVhNb3Rpb25FdmVudF95X3Jvb3Q9Ci1YTW90aW9uRXZlbnRfc3RhdGU9Ci1YTW90aW9uRXZlbnRfaXNfaGludD0KLVhNb3Rpb25FdmVudF9zYW1lX3NjcmVlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hQcm9wZXJ0eUV2ZW50PQotWFByb3BlcnR5RXZlbnRfYXRvbT0KLVhQcm9wZXJ0eUV2ZW50X3RpbWU9Ci1YUHJvcGVydHlFdmVudF9zdGF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hSZWN0YW5nbGU9Ci1YUmVjdGFuZ2xlX3g9Ci1YUmVjdGFuZ2xlX3k9Ci1YUmVjdGFuZ2xlX3dpZHRoPQotWFJlY3RhbmdsZV9oZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXM9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcmVwZWF0PQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2FscGhhX21hcD0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV94X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19hbHBoYV95X29yaWdpbj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jbGlwX3hfb3JpZ2luPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2NsaXBfeV9vcmlnaW49Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfY2xpcF9tYXNrPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2dyYXBoaWNzX2V4cG9zdXJlcz0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19zdWJ3aW5kb3dfbW9kZT0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19wb2x5X2VkZ2U9Ci1YUmVuZGVyUGljdHVyZUF0dHJpYnV0ZXNfcG9seV9tb2RlPQotWFJlbmRlclBpY3R1cmVBdHRyaWJ1dGVzX2RpdGhlcj0KLVhSZW5kZXJQaWN0dXJlQXR0cmlidXRlc19jb21wb25lbnRfYWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YUmVwYXJlbnRFdmVudD0KLVhSZXBhcmVudEV2ZW50X3NlcmlhbD0KLVhSZXBhcmVudEV2ZW50X3NlbmRfZXZlbnQ9Ci1YUmVwYXJlbnRFdmVudF9kaXNwbGF5PWNhc3Q9RGlzcGxheSAqCi1YUmVwYXJlbnRFdmVudF9ldmVudD1jYXN0PVdpbmRvdwotWFJlcGFyZW50RXZlbnRfd2luZG93PWNhc3Q9V2luZG93Ci1YUmVwYXJlbnRFdmVudF9wYXJlbnQ9Y2FzdD1XaW5kb3cKLVhSZXBhcmVudEV2ZW50X3g9Ci1YUmVwYXJlbnRFdmVudF95PQotWFJlcGFyZW50RXZlbnRfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YU2V0V2luZG93QXR0cmlidXRlcz0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JhY2tncm91bmRfcGl4bWFwPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2dyb3VuZF9waXhlbD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JvcmRlcl9waXhtYXA9Ci1YU2V0V2luZG93QXR0cmlidXRlc19ib3JkZXJfcGl4ZWw9Ci1YU2V0V2luZG93QXR0cmlidXRlc19iaXRfZ3Jhdml0eT0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX3dpbl9ncmF2aXR5PQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19zdG9yZT0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfcGxhbmVzPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfYmFja2luZ19waXhlbD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX3NhdmVfdW5kZXI9Ci1YU2V0V2luZG93QXR0cmlidXRlc19ldmVudF9tYXNrPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfZG9fbm90X3Byb3BhZ2F0ZV9tYXNrPQotWFNldFdpbmRvd0F0dHJpYnV0ZXNfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci1YU2V0V2luZG93QXR0cmlidXRlc19jb2xvcm1hcD0KLVhTZXRXaW5kb3dBdHRyaWJ1dGVzX2N1cnNvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hTaXplSGludHM9Ci1YU2l6ZUhpbnRzX2ZsYWdzPQotWFNpemVIaW50c194PQotWFNpemVIaW50c195PQotWFNpemVIaW50c193aWR0aD0KLVhTaXplSGludHNfaGVpZ2h0PQotWFNpemVIaW50c19taW5fd2lkdGg9Ci1YU2l6ZUhpbnRzX21pbl9oZWlnaHQ9Ci1YU2l6ZUhpbnRzX21heF93aWR0aD0KLVhTaXplSGludHNfbWF4X2hlaWdodD0KLVhTaXplSGludHNfd2lkdGhfaW5jPQotWFNpemVIaW50c19oZWlnaHRfaW5jPQotWFNpemVIaW50c19hc3BlY3RfeD1hY2Nlc3Nvcj1taW5fYXNwZWN0LngKLVhTaXplSGludHNfYXNwZWN0X3k9YWNjZXNzb3I9bWluX2FzcGVjdC55Ci1YU2l6ZUhpbnRzX2Jhc2Vfd2lkdGg9Ci1YU2l6ZUhpbnRzX2Jhc2VfaGVpZ2h0PQotWFNpemVIaW50c193aW5fZ3Jhdml0eT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hUZXh0UHJvcGVydHk9Ci1YVGV4dFByb3BlcnR5X3ZhbHVlPWNhc3Q9KHVuc2lnbmVkIGNoYXIgKikKLVhUZXh0UHJvcGVydHlfZW5jb2Rpbmc9Ci1YVGV4dFByb3BlcnR5X2Zvcm1hdD0KLVhUZXh0UHJvcGVydHlfbml0ZW1zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWFdpbmRvd0F0dHJpYnV0ZXM9Ci1YV2luZG93QXR0cmlidXRlc194PQotWFdpbmRvd0F0dHJpYnV0ZXNfeT0KLVhXaW5kb3dBdHRyaWJ1dGVzX3dpZHRoPQotWFdpbmRvd0F0dHJpYnV0ZXNfaGVpZ2h0PQotWFdpbmRvd0F0dHJpYnV0ZXNfYm9yZGVyX3dpZHRoPQotWFdpbmRvd0F0dHJpYnV0ZXNfZGVwdGg9Ci1YV2luZG93QXR0cmlidXRlc192aXN1YWw9Y2FzdD0oVmlzdWFsICopCi1YV2luZG93QXR0cmlidXRlc19yb290PQotWFdpbmRvd0F0dHJpYnV0ZXNfY19jbGFzcz1hY2Nlc3Nvcj1jbGFzcwotWFdpbmRvd0F0dHJpYnV0ZXNfYml0X2dyYXZpdHk9Ci1YV2luZG93QXR0cmlidXRlc193aW5fZ3Jhdml0eT0KLVhXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfc3RvcmU9Ci1YV2luZG93QXR0cmlidXRlc19iYWNraW5nX3BsYW5lcz0KLVhXaW5kb3dBdHRyaWJ1dGVzX2JhY2tpbmdfcGl4ZWw9Ci1YV2luZG93QXR0cmlidXRlc19zYXZlX3VuZGVyPQotWFdpbmRvd0F0dHJpYnV0ZXNfY29sb3JtYXA9Ci1YV2luZG93QXR0cmlidXRlc19tYXBfaW5zdGFsbGVkPQotWFdpbmRvd0F0dHJpYnV0ZXNfbWFwX3N0YXRlPQotWFdpbmRvd0F0dHJpYnV0ZXNfYWxsX2V2ZW50X21hc2tzPQotWFdpbmRvd0F0dHJpYnV0ZXNfeW91cl9ldmVudF9tYXNrPQotWFdpbmRvd0F0dHJpYnV0ZXNfZG9fbm90X3Byb3BhZ2F0ZV9tYXNrPQotWFdpbmRvd0F0dHJpYnV0ZXNfb3ZlcnJpZGVfcmVkaXJlY3Q9Ci1YV2luZG93QXR0cmlidXRlc19zY3JlZW49Y2FzdD0oU2NyZWVuICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YV2luZG93Q2hhbmdlcz0KLVhXaW5kb3dDaGFuZ2VzX3g9Ci1YV2luZG93Q2hhbmdlc195PQotWFdpbmRvd0NoYW5nZXNfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19oZWlnaHQ9Ci1YV2luZG93Q2hhbmdlc19ib3JkZXJfd2lkdGg9Ci1YV2luZG93Q2hhbmdlc19zaWJsaW5nPQotWFdpbmRvd0NoYW5nZXNfc3RhY2tfbW9kZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1hpbmVyYW1hU2NyZWVuSW5mbz0KLVhpbmVyYW1hU2NyZWVuSW5mb19zY3JlZW5fbnVtYmVyPQotWGluZXJhbWFTY3JlZW5JbmZvX3hfb3JnPQotWGluZXJhbWFTY3JlZW5JbmZvX3lfb3JnPQotWGluZXJhbWFTY3JlZW5JbmZvX3dpZHRoPQotWGluZXJhbWFTY3JlZW5JbmZvX2hlaWdodD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htQW55Q2FsbGJhY2tTdHJ1Y3Q9Ci1YbUFueUNhbGxiYWNrU3RydWN0X3JlYXNvbj0KLVhtQW55Q2FsbGJhY2tTdHJ1Y3RfZXZlbnQ9Y2FzdD0oWEV2ZW50ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3Q9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X2RyYWdDb250ZXh0PWNhc3Q9KFdpZGdldCkKLVhtRHJhZ1Byb2NDYWxsYmFja1N0cnVjdF94PQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X3k9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcFNpdGVTdGF0dXM9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1EcmFnUHJvY0NhbGxiYWNrU3RydWN0X29wZXJhdGlvbnM9Ci1YbURyYWdQcm9jQ2FsbGJhY2tTdHJ1Y3RfYW5pbWF0ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0PQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9ucz0KLVhtRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0X2Ryb3BTaXRlU3RhdHVzPQotWG1Ecm9wRmluaXNoQ2FsbGJhY2tTdHJ1Y3RfZHJvcEFjdGlvbj0KLVhtRHJvcEZpbmlzaENhbGxiYWNrU3RydWN0X2NvbXBsZXRpb25TdGF0dXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3Q9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfdGltZVN0YW1wPQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X2RyYWdDb250ZXh0PWNhc3Q9KFdpZGdldCkKLVhtRHJvcFByb2NDYWxsYmFja1N0cnVjdF94PQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X3k9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcFNpdGVTdGF0dXM9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3Rfb3BlcmF0aW9uPQotWG1Ecm9wUHJvY0NhbGxiYWNrU3RydWN0X29wZXJhdGlvbnM9Ci1YbURyb3BQcm9jQ2FsbGJhY2tTdHJ1Y3RfZHJvcEFjdGlvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htU3BpbkJveENhbGxiYWNrU3RydWN0PQotWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3Rfd2lkZ2V0PWNhc3Q9V2lkZ2V0Ci1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF9kb2l0PWNhc3Q9Qm9vbGVhbgotWG1TcGluQm94Q2FsbGJhY2tTdHJ1Y3RfcG9zaXRpb249Ci1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF92YWx1ZT1jYXN0PVhtU3RyaW5nCi1YbVNwaW5Cb3hDYWxsYmFja1N0cnVjdF9jcm9zc2VkX2JvdW5kYXJ5PWNhc3Q9Qm9vbGVhbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW90aWZfWG1UZXh0QmxvY2tSZWM9Ci1YbVRleHRCbG9ja1JlY19wdHI9Y2FzdD0oY2hhciAqKQotWG1UZXh0QmxvY2tSZWNfbGVuZ3RoPQotWG1UZXh0QmxvY2tSZWNfZm9ybWF0PWNhc3Q9KFhtVGV4dEZvcm1hdCkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vdGlmX1htVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0PQotWG1UZXh0VmVyaWZ5Q2FsbGJhY2tTdHJ1Y3RfZG9pdD0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X2N1cnJJbnNlcnQ9Ci1YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF9uZXdJbnNlcnQ9Ci1YbVRleHRWZXJpZnlDYWxsYmFja1N0cnVjdF9zdGFydFBvcz0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X2VuZFBvcz0KLVhtVGV4dFZlcmlmeUNhbGxiYWNrU3RydWN0X3RleHQ9Y2FzdD0oWG1UZXh0QmxvY2spCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3RpZl9YdFdpZGdldEdlb21ldHJ5PQotWHRXaWRnZXRHZW9tZXRyeV9yZXF1ZXN0X21vZGU9Ci1YdFdpZGdldEdlb21ldHJ5X3g9Ci1YdFdpZGdldEdlb21ldHJ5X3k9Ci1YdFdpZGdldEdlb21ldHJ5X3dpZHRoPQotWHRXaWRnZXRHZW9tZXRyeV9oZWlnaHQ9Ci1YdFdpZGdldEdlb21ldHJ5X2JvcmRlcl93aWR0aD0KLVh0V2lkZ2V0R2VvbWV0cnlfc2libGluZz1jYXN0PShXaWRnZXQpCi1YdFdpZGdldEdlb21ldHJ5X3N0YWNrX21vZGU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5YUENPTS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODFhYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3ppbGxhLlhQQ09NLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX0dSRVZlcnNpb25SYW5nZT1mbGFncz1ub19nZW4KLUdSRVZlcnNpb25SYW5nZV9sb3dlcj0KLUdSRVZlcnNpb25SYW5nZV9sb3dlckluY2x1c2l2ZT0KLUdSRVZlcnNpb25SYW5nZV91cHBlcj0KLUdSRVZlcnNpb25SYW5nZV91cHBlckluY2x1c2l2ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfWFBDT009ZmxhZ3M9Y3BwCi1YUENPTV9DYWxsPQotWFBDT01fQ2FsbF8wPWNhc3Q9KG5zV3JpdGVTZWdtZW50RnVuKQotWFBDT01fQ2FsbF8xPWNhc3Q9KG5zSUlucHV0U3RyZWFtICopCi1YUENPTV9DYWxsXzI9Y2FzdD0odm9pZCAqKQotWFBDT01fQ2FsbF8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLVhQQ09NX0NhbGxfND0KLVhQQ09NX0NhbGxfNT0KLVhQQ09NX0NhbGxfNj1jYXN0PShQUlVpbnQzMiAqKQotCi1YUENPTV9OU19HZXRDb21wb25lbnRNYW5hZ2VyPQotWFBDT01fTlNfR2V0Q29tcG9uZW50TWFuYWdlcl8wPWNhc3Q9KG5zSUNvbXBvbmVudE1hbmFnZXIqKikKLQotWFBDT01fTlNfR2V0U2VydmljZU1hbmFnZXI9Ci1YUENPTV9OU19HZXRTZXJ2aWNlTWFuYWdlcl8wPWNhc3Q9KG5zSVNlcnZpY2VNYW5hZ2VyKiopCi0KLVhQQ09NX05TX0luaXRYUENPTTI9Ci1YUENPTV9OU19Jbml0WFBDT00yXzA9Y2FzdD0obnNJU2VydmljZU1hbmFnZXIgKiopCi1YUENPTV9OU19Jbml0WFBDT00yXzE9Y2FzdD0obnNJRmlsZSAqKQotWFBDT01fTlNfSW5pdFhQQ09NMl8yPWNhc3Q9KG5zSURpcmVjdG9yeVNlcnZpY2VQcm92aWRlciAqKQotCi1YUENPTV9OU19OZXdMb2NhbEZpbGU9Ci1YUENPTV9OU19OZXdMb2NhbEZpbGVfMD1jYXN0PShuc0FTdHJpbmcgKiksZmxhZ3M9c3RydWN0Ci1YUENPTV9OU19OZXdMb2NhbEZpbGVfMT0KLVhQQ09NX05TX05ld0xvY2FsRmlsZV8yPWNhc3Q9KG5zSUxvY2FsRmlsZSoqKQotCi1YUENPTV9WdGJsQ2FsbF9fSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8xPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlGPQotWFBDT01fVnRibENhbGxfX0lJRl8wPQotWFBDT01fVnRibENhbGxfX0lJRl8xPQotWFBDT01fVnRibENhbGxfX0lJRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJPQotWFBDT01fVnRibENhbGxfX0lJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSUpJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfOD0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzNaXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSUlJSV8zWl8zSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl80PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV83PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfOT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMz0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ181PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpKSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpKSkpfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl82PQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8zPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8yPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl8xPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV80PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8wPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8zPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV82PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfOD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV85PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEwPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzExPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEyPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEzPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE0PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE1PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE2PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQlpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQlpfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV85PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMTA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8xMT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzg9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzg9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzk9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJPQotWFBDT01fVnRibENhbGxfX0lJSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSV8yPQotWFBDT01fVnRibENhbGxfX0lJSklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSko9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSkpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKSkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV8xPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl8xPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl80PQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKWl8wPQotWFBDT01fVnRibENhbGxfX0lJSkpaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSlpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKWl8zPQotWFBDT01fVnRibENhbGxfX0lJSkpaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV80PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfNT0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0I9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl82PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfNz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMj0KLQotWFBDT01fVnRibENhbGxfX0lJWkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8wPQotWFBDT01fVnRibENhbGxfX0lJWklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0I9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfM0NaPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNGPQotWFBDT01fVnRibENhbGxfX0lJXzNGXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0ZfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNKXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zUz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zU18wPQotWFBDT01fVnRibENhbGxfX0lJXzNTXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1NfMj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zWl8yPQotCi1YUENPTV9YUENPTUdsdWVTaHV0ZG93bj0KLQotWFBDT01fWFBDT01HbHVlU3RhcnR1cD0KLVhQQ09NX1hQQ09NR2x1ZVN0YXJ0dXBfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLVhQQ09NX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yST0KLVhQQ09NX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8wPWNhc3Q9KHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLVhQQ09NX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8yPWNhc3Q9KHNpemVfdCkKLQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJPQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzA9Y2FzdD0odm9pZCAqKQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzI9Y2FzdD0oc2l6ZV90KQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19MZW5ndGg9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19MZW5ndGhfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGU9ZmxhZ3M9ZGVsZXRlCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGVfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19nZXQ9ZmxhZ3M9Y3BwCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19nZXRfMD1jYXN0PShuc0VtYmVkQ1N0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ18xbmV3X189ZmxhZ3M9bmV3Ci0KLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfX18zQkk9ZmxhZ3M9bmV3Ci1YUENPTV9uc0VtYmVkQ1N0cmluZ18xbmV3X19fM0JJXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotWFBDT01fbnNFbWJlZENTdHJpbmdfMW5ld19fXzNCSV8xPQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX0xlbmd0aD1mbGFncz1jcHAKLVhQQ09NX25zRW1iZWRTdHJpbmdfTGVuZ3RoXzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX2RlbGV0ZT1mbGFncz1kZWxldGUKLVhQQ09NX25zRW1iZWRTdHJpbmdfZGVsZXRlXzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX2dldD1mbGFncz1jcHAKLVhQQ09NX25zRW1iZWRTdHJpbmdfZ2V0XzA9Y2FzdD0obnNFbWJlZFN0cmluZyAqKQotCi1YUENPTV9uc0VtYmVkU3RyaW5nXzFuZXdfXz1mbGFncz1uZXcKLQotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X19fM0M9ZmxhZ3M9bmV3Ci1YUENPTV9uc0VtYmVkU3RyaW5nXzFuZXdfX18zQ18wPQotCi1YUENPTV9uc0lEX0VxdWFscz1mbGFncz1jcHAKLVhQQ09NX25zSURfRXF1YWxzXzA9Y2FzdD0obnNJRCAqKQotWFBDT01fbnNJRF9FcXVhbHNfMT1jYXN0PShuc0lEICopLGZsYWdzPXN0cnVjdAotCi1YUENPTV9uc0lEX2RlbGV0ZT1mbGFncz1kZWxldGUKLVhQQ09NX25zSURfZGVsZXRlXzA9Y2FzdD0obnNJRCAqKQotCi1YUENPTV9uc0lEX25ldz1mbGFncz1uZXcKLQotWFBDT01fc3RybGVuX1BSVW5pY2hhcj1mbGFncz1ub19nZW4KLVhQQ09NX3N0cmxlbl9QUlVuaWNoYXJfMD0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9YUENPTUluaXQ9ZmxhZ3M9bm9fZ2VuCi1YUENPTUluaXRfR1JFVmVyc2lvblJhbmdlX3NpemVvZj0KLQotWFBDT01Jbml0X0dSRV9HZXRHUkVQYXRoV2l0aFByb3BlcnRpZXM9Ci1YUENPTUluaXRfR1JFX0dldEdSRVBhdGhXaXRoUHJvcGVydGllc18wPQotWFBDT01Jbml0X0dSRV9HZXRHUkVQYXRoV2l0aFByb3BlcnRpZXNfMT0KLVhQQ09NSW5pdF9HUkVfR2V0R1JFUGF0aFdpdGhQcm9wZXJ0aWVzXzI9Ci1YUENPTUluaXRfR1JFX0dldEdSRVBhdGhXaXRoUHJvcGVydGllc18zPQotWFBDT01Jbml0X0dSRV9HZXRHUkVQYXRoV2l0aFByb3BlcnRpZXNfND0KLVhQQ09NSW5pdF9HUkVfR2V0R1JFUGF0aFdpdGhQcm9wZXJ0aWVzXzU9Ci0KLVhQQ09NSW5pdF9YUENPTUdsdWVTaHV0ZG93bj0KLQotWFBDT01Jbml0X1hQQ09NR2x1ZVN0YXJ0dXA9Ci1YUENPTUluaXRfWFBDT01HbHVlU3RhcnR1cF8wPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX1hQQ09NT2JqZWN0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0VtYmVkU3RyaW5nPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lBcHBTaGVsbD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQmFzZVdpbmRvdz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ2FuY2VsYWJsZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ2F0ZWdvcnlNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb21wb25lbnRNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb21wb25lbnRSZWdpc3RyYXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvbnRleHRNZW51TGlzdGVuZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvb2tpZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29va2llTWFuYWdlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRD1mbGFncz1jcHAKLW5zSURfbTA9Ci1uc0lEX20xPQotbnNJRF9tMj0KLW5zSURfbTM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURPTUV2ZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01FdmVudFRhcmdldD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NTW91c2VFdmVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NVUlFdmVudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NV2luZG93PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01XaW5kb3dDb2xsZWN0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEaXJlY3RvcnlTZXJ2aWNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEaXJlY3RvcnlTZXJ2aWNlUHJvdmlkZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURpcmVjdG9yeVNlcnZpY2VQcm92aWRlcjI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURvY1NoZWxsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEb3dubG9hZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRG93bmxvYWRfMTFfMTg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUVtYmVkZGluZ1NpdGVXaW5kb3c9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZhY3Rvcnk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZpbGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZpbGVQaWNrZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZpbGVQaWNrZXJfMTFfMTg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUhlbHBlckFwcExhdW5jaGVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lIZWxwZXJBcHBMYXVuY2hlckRpYWxvZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSGVscGVyQXBwTGF1bmNoZXJfMTFfMTg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUlPU2VydmljZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSW5wdXRTdHJlYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUludGVyZmFjZVJlcXVlc3Rvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSlNDb250ZXh0U3RhY2s9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUxvY2FsRmlsZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJTWVtb3J5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lPYnNlcnZlclNlcnZpY2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZCcmFuY2g9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZMb2NhbGl6ZWRTdHJpbmc9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZTZXJ2aWNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lQcm9ncmVzc0RpYWxvZz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJUHJvZ3Jlc3NEaWFsb2dfMTFfMTg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb21wdFNlcnZpY2U9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb3BlcnRpZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVJlcXVlc3Q9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVNlcnZpY2VNYW5hZ2VyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTaW1wbGVFbnVtZXJhdG9yPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTdXBwb3J0cz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJU3VwcG9ydHNXZWFrUmVmZXJlbmNlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lUb29sdGlwTGlzdGVuZXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVRyYW5zZmVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lVUkk9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVVSSUNvbnRlbnRMaXN0ZW5lcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2Vha1JlZmVyZW5jZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3Nlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZUZvY3VzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJCcm93c2VyRm9jdXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXJTdHJlYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYk5hdmlnYXRpb249Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYlByb2dyZXNzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzc0xpc3RlbmVyPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzc0xpc3RlbmVyMj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93Q3JlYXRvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93Q3JlYXRvcjI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdpbmRvd1dhdGNoZXI9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5YUENPTUluaXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5YUENPTUluaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1NTA1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEuWFBDT01Jbml0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX0dSRVZlcnNpb25SYW5nZT1mbGFncz1jcHAKLUdSRVZlcnNpb25SYW5nZV9sb3dlcj1jYXN0PShjb25zdCBjaGFyICopCi1HUkVWZXJzaW9uUmFuZ2VfbG93ZXJJbmNsdXNpdmU9Ci1HUkVWZXJzaW9uUmFuZ2VfdXBwZXI9Y2FzdD0oY29uc3QgY2hhciAqKQotR1JFVmVyc2lvblJhbmdlX3VwcGVySW5jbHVzaXZlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9YUENPTT1mbGFncz1ub19nZW4KLVhQQ09NX0NhbGw9Ci1YUENPTV9DYWxsXzA9Ci1YUENPTV9DYWxsXzE9Ci1YUENPTV9DYWxsXzI9Ci1YUENPTV9DYWxsXzM9Ci1YUENPTV9DYWxsXzQ9Ci1YUENPTV9DYWxsXzU9Ci1YUENPTV9DYWxsXzY9Ci0KLVhQQ09NX05TX0dldENvbXBvbmVudE1hbmFnZXI9Ci1YUENPTV9OU19HZXRDb21wb25lbnRNYW5hZ2VyXzA9Ci0KLVhQQ09NX05TX0dldFNlcnZpY2VNYW5hZ2VyPQotWFBDT01fTlNfR2V0U2VydmljZU1hbmFnZXJfMD0KLQotWFBDT01fTlNfSW5pdFhQQ09NMj0KLVhQQ09NX05TX0luaXRYUENPTTJfMD0KLVhQQ09NX05TX0luaXRYUENPTTJfMT0KLVhQQ09NX05TX0luaXRYUENPTTJfMj0KLQotWFBDT01fTlNfTmV3TG9jYWxGaWxlPQotWFBDT01fTlNfTmV3TG9jYWxGaWxlXzA9Ci1YUENPTV9OU19OZXdMb2NhbEZpbGVfMT0KLVhQQ09NX05TX05ld0xvY2FsRmlsZV8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8xPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlGPQotWFBDT01fVnRibENhbGxfX0lJRl8wPQotWFBDT01fVnRibENhbGxfX0lJRl8xPQotWFBDT01fVnRibENhbGxfX0lJRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJPQotWFBDT01fVnRibENhbGxfX0lJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlfNj0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlJSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlJSUlJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSUpJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlKSUlfOD0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJSVpfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSUlaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlJWl82PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl80PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV83PQotWFBDT01fVnRibENhbGxfX0lJSUlJWl8zQ0lJSUlaXzNJXzNJXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlaXzNDSUlJSVpfM0lfM0lfOT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSVpfM0NJSUlJWl8zSV8zSV8xMz0KLQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNDXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0NfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zQ181PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUlfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSUlJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpKSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpKSkpfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSkpKSl82PQotWFBDT01fVnRibENhbGxfX0lJSUlKSkpKXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJSlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSUpaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSVpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJWl8zPQotWFBDT01fVnRibENhbGxfX0lJSUlaXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ18yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zQ0lKSV81PQotWFBDT01fVnRibENhbGxfX0lJSUlfM0NJSklfNj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNDSUpJXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSV8zSl8yPQotWFBDT01fVnRibENhbGxfX0lJSUlfM0pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlKSl8zPQotWFBDT01fVnRibENhbGxfX0lJSUpKXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8yPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJSVo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8wPQotWFBDT01fVnRibENhbGxfX0lJSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl8xPQotWFBDT01fVnRibENhbGxfX0lJSVpaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV8xPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSV80PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8wPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV8zPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV82PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWlpJSUlJSUlaWlpaU0lfOD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaWklJSUlJSVpaWlpTSV85PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEwPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzExPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEyPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzEzPQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE0PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE1PQotWFBDT01fVnRibENhbGxfX0lJSVpaSUlJSUlJWlpaWlNJXzE2PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJSVpfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJWl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8yPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJSV8zQklfM0lfNT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQlo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQlpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQlpfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0JfM0JJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNCXzNCXzNCSV8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQl8zQklfM0lfNz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM0NfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0JfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfND0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNDXzNDXzNDXzNDXzNaXzNJXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV85PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0NfM0NfM0NfM0NfM1pfM0lfMTA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zQ18zQ18zQ18zQ18zWl8zSV8xMT0KLQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDSV8zSV8zSV8zWl82PQotWFBDT01fVnRibENhbGxfX0lJSV8zQ18zQ0lfM0lfM0lfM1pfNz0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NJXzNJXzNJXzNaXzg9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNDXzNaXzNaXzc9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNDXzNaXzNaXzg9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM0lfM0lfM0NfM1pfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzc9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzg9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNJXzNJXzNDXzNaXzNaXzk9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0NfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNDXzNDXzNaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUlfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlJXzNaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUo9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJPQotWFBDT01fVnRibENhbGxfX0lJSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSV8yPQotWFBDT01fVnRibENhbGxfX0lJSklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJSko9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8wPQotWFBDT01fVnRibENhbGxfX0lJSkpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKSkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV8xPQotWFBDT01fVnRibENhbGxfX0lJSkpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSklfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl8xPQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlKSkpKSl80PQotWFBDT01fVnRibENhbGxfX0lJSkpKSkpfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSUpKSkpKXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8xPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV80PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfNT0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0I9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl8zPQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfND0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0JfM0JJXzNCXzNCXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNCXzNCSV8zQl8zQl82PQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zQl8zQklfM0JfM0JfNz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJWj0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSVpfMj0KLQotWFBDT01fVnRibENhbGxfX0lJWkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8wPQotWFBDT01fVnRibENhbGxfX0lJWklfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSVpJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlaSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlaXzNaPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJWl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0I9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JKPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8yXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMl8zWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaSV8zSV8zWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNCWklfM0lfM1pfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpJXzNJXzNaXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQlpfM0lfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JaXzNJXzNaXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCWl80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNCWlpfM0lfNT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zQlpaXzNJXzY9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0JaWl8zSV83PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0JfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zQl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM0lfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zSV8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM0lfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSV8zWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNJXzNaXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0lfM1pfND0KLQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM0pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zSl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNKXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNCXzNaXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0JfM1pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQl8zWl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0M9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUk9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzQ9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzU9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzY9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzM9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NJXzNJXzQ9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NaXzM9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zQ18zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfM0NaPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8yPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl8zPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl80PQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNDXzNDWl81PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zQ18zWl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNDXzNaXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0NfM1pfMz0KLQotWFBDT01fVnRibENhbGxfX0lJXzNGPQotWFBDT01fVnRibENhbGxfX0lJXzNGXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0ZfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zRl8yPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zST0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0lfM0lfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSV8zSV8zSV80PQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNJXzNJXzNJXzU9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8wPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfMj0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zPQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0k9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV8xPQotWFBDT01fVnRibENhbGxfX0lJXzNJXzNKXzNJXzI9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0lfM0pfM0lfMz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSV8zSl8zSV80PQotCi1YUENPTV9WdGJsQ2FsbF9fSUlfM0o9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM0pfMD0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zSl8xPQotWFBDT01fVnRibENhbGxfX0lJXzNKXzI9Ci0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zUz0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zU18wPQotWFBDT01fVnRibENhbGxfX0lJXzNTXzE9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1NfMj0KLQotWFBDT01fVnRibENhbGxfX0lJXzNaPQotWFBDT01fVnRibENhbGxfX0lJXzNaXzA9Ci1YUENPTV9WdGJsQ2FsbF9fSUlfM1pfMT0KLVhQQ09NX1Z0YmxDYWxsX19JSV8zWl8yPQotCi1YUENPTV9YUENPTUdsdWVTaHV0ZG93bj0KLQotWFBDT01fWFBDT01HbHVlU3RhcnR1cD0KLVhQQ09NX1hQQ09NR2x1ZVN0YXJ0dXBfMD0KLQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJPQotWFBDT01fbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJXzA9Ci1YUENPTV9tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklfMT0KLVhQQ09NX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySV8yPQotCi1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUk9Ci1YUENPTV9tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRF8ySUlfMD0KLVhQQ09NX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEXzJJSV8xPQotWFBDT01fbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURfMklJXzI9Ci0KLVhQQ09NX25zRW1iZWRDU3RyaW5nX0xlbmd0aD0KLVhQQ09NX25zRW1iZWRDU3RyaW5nX0xlbmd0aF8wPQotCi1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGU9Ci1YUENPTV9uc0VtYmVkQ1N0cmluZ19kZWxldGVfMD0KLQotWFBDT01fbnNFbWJlZENTdHJpbmdfZ2V0PQotWFBDT01fbnNFbWJlZENTdHJpbmdfZ2V0XzA9Ci0KLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfXz0KLQotWFBDT01fbnNFbWJlZENTdHJpbmdfMW5ld19fXzNCST0KLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfX18zQklfMD0KLVhQQ09NX25zRW1iZWRDU3RyaW5nXzFuZXdfX18zQklfMT0KLQotWFBDT01fbnNFbWJlZFN0cmluZ19MZW5ndGg9Ci1YUENPTV9uc0VtYmVkU3RyaW5nX0xlbmd0aF8wPQotCi1YUENPTV9uc0VtYmVkU3RyaW5nX2RlbGV0ZT0KLVhQQ09NX25zRW1iZWRTdHJpbmdfZGVsZXRlXzA9Ci0KLVhQQ09NX25zRW1iZWRTdHJpbmdfZ2V0PQotWFBDT01fbnNFbWJlZFN0cmluZ19nZXRfMD0KLQotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X189Ci0KLVhQQ09NX25zRW1iZWRTdHJpbmdfMW5ld19fXzNDPQotWFBDT01fbnNFbWJlZFN0cmluZ18xbmV3X19fM0NfMD0KLQotWFBDT01fbnNJRF9FcXVhbHM9Ci1YUENPTV9uc0lEX0VxdWFsc18wPQotWFBDT01fbnNJRF9FcXVhbHNfMT0KLQotWFBDT01fbnNJRF9kZWxldGU9Ci1YUENPTV9uc0lEX2RlbGV0ZV8wPQotCi1YUENPTV9uc0lEX25ldz0KLQotWFBDT01fc3RybGVuX1BSVW5pY2hhcj0KLVhQQ09NX3N0cmxlbl9QUlVuaWNoYXJfMD0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9YUENPTUluaXQ9ZmxhZ3M9Y3BwCi1YUENPTUluaXRfR1JFVmVyc2lvblJhbmdlX3NpemVvZj0KLQotWFBDT01Jbml0X0dSRV9HZXRHUkVQYXRoV2l0aFByb3BlcnRpZXM9Ci1YUENPTUluaXRfR1JFX0dldEdSRVBhdGhXaXRoUHJvcGVydGllc18wPWNhc3Q9KGNvbnN0IEdSRVZlcnNpb25SYW5nZSAqKQotWFBDT01Jbml0X0dSRV9HZXRHUkVQYXRoV2l0aFByb3BlcnRpZXNfMT0KLVhQQ09NSW5pdF9HUkVfR2V0R1JFUGF0aFdpdGhQcm9wZXJ0aWVzXzI9Y2FzdD0oY29uc3QgR1JFUHJvcGVydHkgKikKLVhQQ09NSW5pdF9HUkVfR2V0R1JFUGF0aFdpdGhQcm9wZXJ0aWVzXzM9Ci1YUENPTUluaXRfR1JFX0dldEdSRVBhdGhXaXRoUHJvcGVydGllc180PWNhc3Q9KGNoYXIgKikKLVhQQ09NSW5pdF9HUkVfR2V0R1JFUGF0aFdpdGhQcm9wZXJ0aWVzXzU9Ci0KLVhQQ09NSW5pdF9YUENPTUdsdWVTaHV0ZG93bj0KLQotWFBDT01Jbml0X1hQQ09NR2x1ZVN0YXJ0dXA9Ci1YUENPTUluaXRfWFBDT01HbHVlU3RhcnR1cF8wPWNhc3Q9KGNvbnN0IGNoYXIgKikKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9YUENPTU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNFbWJlZFN0cmluZz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQXBwU2hlbGw9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUJhc2VXaW5kb3c9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNhbmNlbGFibGU9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNhdGVnb3J5TWFuYWdlcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29tcG9uZW50TWFuYWdlcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJQ29tcG9uZW50UmVnaXN0cmFyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb250ZXh0TWVudUxpc3RlbmVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lDb29raWU9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUNvb2tpZU1hbmFnZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUQ9ZmxhZ3M9bm9fZ2VuCi1uc0lEX20wPQotbnNJRF9tMT0KLW5zSURfbTI9Ci1uc0lEX20zPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lET01FdmVudD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NTW91c2VFdmVudD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NVUlFdmVudD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRE9NV2luZG93PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEaXJlY3RvcnlTZXJ2aWNlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEaXJlY3RvcnlTZXJ2aWNlUHJvdmlkZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURpcmVjdG9yeVNlcnZpY2VQcm92aWRlcjI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSURvY1NoZWxsPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lEb3dubG9hZD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJRG93bmxvYWRfMTFfMTg9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUVtYmVkZGluZ1NpdGVXaW5kb3c9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZhY3Rvcnk9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZpbGU9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUZpbGVQaWNrZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUhlbHBlckFwcExhdW5jaGVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lIZWxwZXJBcHBMYXVuY2hlckRpYWxvZz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSGVscGVyQXBwTGF1bmNoZXJfMTFfMTg9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUlPU2VydmljZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSW5wdXRTdHJlYW09ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUludGVyZmFjZVJlcXVlc3Rvcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJSlNDb250ZXh0U3RhY2s9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSUxvY2FsRmlsZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJTWVtb3J5PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lPYnNlcnZlclNlcnZpY2U9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZCcmFuY2g9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZMb2NhbGl6ZWRTdHJpbmc9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByZWZTZXJ2aWNlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lQcm9ncmVzc0RpYWxvZz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJUHJvZ3Jlc3NEaWFsb2dfMTFfMTg9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb21wdFNlcnZpY2U9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVByb3BlcnRpZXM9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVJlcXVlc3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVNlcnZpY2VNYW5hZ2VyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTaW1wbGVFbnVtZXJhdG9yPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lTdXBwb3J0cz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJU3VwcG9ydHNXZWFrUmVmZXJlbmNlPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lUb29sdGlwTGlzdGVuZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVRyYW5zZmVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lVUkk9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVVSSUNvbnRlbnRMaXN0ZW5lcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2Vha1JlZmVyZW5jZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3Nlcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2ViQnJvd3NlckNocm9tZUZvY3VzPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJCcm93c2VyRm9jdXM9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYkJyb3dzZXJTdHJlYW09ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYk5hdmlnYXRpb249ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9tb3ppbGxhX25zSVdlYlByb2dyZXNzPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzc0xpc3RlbmVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfbW96aWxsYV9uc0lXZWJQcm9ncmVzc0xpc3RlbmVyMj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93Q3JlYXRvcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX21vemlsbGFfbnNJV2luZG93V2F0Y2hlcj1mbGFncz1ub19nZW4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT00ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzYzFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT00ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSUQ9Ci1DQVVVSURfY0VsZW1zPQotQ0FVVUlEX3BFbGVtcz1jYXN0PShHVUlEIEZBUiAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTT0KLUNPTV9DQVVVSURfc2l6ZW9mPQotCi1DT01fQ0xTSURGcm9tUHJvZ0lEPQotQ09NX0NMU0lERnJvbVByb2dJRF8wPWNhc3Q9TFBDT0xFU1RSCi1DT01fQ0xTSURGcm9tUHJvZ0lEXzE9Ci0KLUNPTV9DTFNJREZyb21TdHJpbmc9Ci1DT01fQ0xTSURGcm9tU3RyaW5nXzA9Y2FzdD1MUE9MRVNUUgotQ09NX0NMU0lERnJvbVN0cmluZ18xPQotCi1DT01fQ09OVFJPTElORk9fc2l6ZW9mPQotCi1DT01fQ09TRVJWRVJJTkZPX3NpemVvZj0KLQotQ09NX0NvQ3JlYXRlSW5zdGFuY2U9Ci1DT01fQ29DcmVhdGVJbnN0YW5jZV8wPQotQ09NX0NvQ3JlYXRlSW5zdGFuY2VfMT1jYXN0PUxQVU5LTk9XTgotQ09NX0NvQ3JlYXRlSW5zdGFuY2VfMj0KLUNPTV9Db0NyZWF0ZUluc3RhbmNlXzM9Ci1DT01fQ29DcmVhdGVJbnN0YW5jZV80PWNhc3Q9TFBWT0lEICoKLQotQ09NX0NvRnJlZVVudXNlZExpYnJhcmllcz0KLQotQ09NX0NvR2V0Q2xhc3NPYmplY3Q9Ci1DT01fQ29HZXRDbGFzc09iamVjdF8wPQotQ09NX0NvR2V0Q2xhc3NPYmplY3RfMT0KLUNPTV9Db0dldENsYXNzT2JqZWN0XzI9Y2FzdD0oQ09TRVJWRVJJTkZPICoKLUNPTV9Db0dldENsYXNzT2JqZWN0XzM9Ci1DT01fQ29HZXRDbGFzc09iamVjdF80PWNhc3Q9TFBWT0lEICoKLQotQ09NX0NvTG9ja09iamVjdEV4dGVybmFsPQotQ09NX0NvTG9ja09iamVjdEV4dGVybmFsXzA9Y2FzdD0oSVVua25vd24gKikKLUNPTV9Db0xvY2tPYmplY3RFeHRlcm5hbF8xPWNhc3Q9KEJPT0wpCi1DT01fQ29Mb2NrT2JqZWN0RXh0ZXJuYWxfMj1jYXN0PShCT09MKQotCi1DT01fQ29UYXNrTWVtQWxsb2M9Ci1DT01fQ29UYXNrTWVtQWxsb2NfMD1jYXN0PShVTE9ORykKLQotQ09NX0NvVGFza01lbUZyZWU9Ci1DT01fQ29UYXNrTWVtRnJlZV8wPWNhc3Q9KExQVk9JRCkKLQotQ09NX0NyZWF0ZVN0ZEFjY2Vzc2libGVPYmplY3Q9ZmxhZ3M9ZHluYW1pYwotQ09NX0NyZWF0ZVN0ZEFjY2Vzc2libGVPYmplY3RfMD1jYXN0PShIV05EKQotQ09NX0NyZWF0ZVN0ZEFjY2Vzc2libGVPYmplY3RfMT0KLUNPTV9DcmVhdGVTdGRBY2Nlc3NpYmxlT2JqZWN0XzI9Ci1DT01fQ3JlYXRlU3RkQWNjZXNzaWJsZU9iamVjdF8zPWNhc3Q9KExQVk9JRCAqKQotCi1DT01fRElTUFBBUkFNU19zaXplb2Y9Ci0KLUNPTV9EVlRBUkdFVERFVklDRV9zaXplb2Y9Ci0KLUNPTV9Eb0RyYWdEcm9wPQotQ09NX0RvRHJhZ0Ryb3BfMD1jYXN0PShJRGF0YU9iamVjdCAqKQotQ09NX0RvRHJhZ0Ryb3BfMT1jYXN0PUlEcm9wU291cmNlICoKLUNPTV9Eb0RyYWdEcm9wXzI9Ci1DT01fRG9EcmFnRHJvcF8zPQotCi1DT01fRVhDRVBJTkZPX3NpemVvZj0KLQotQ09NX0ZPUk1BVEVUQ19zaXplb2Y9Ci0KLUNPTV9GVU5DREVTQ19zaXplb2Y9Ci0KLUNPTV9HVUlEX3NpemVvZj0KLQotQ09NX0dldENsYXNzRmlsZT0KLUNPTV9HZXRDbGFzc0ZpbGVfMD1jYXN0PUxQQ1dTVFIKLUNPTV9HZXRDbGFzc0ZpbGVfMT0KLQotQ09NX0lJREZyb21TdHJpbmc9Ci1DT01fSUlERnJvbVN0cmluZ18wPWNhc3Q9TFBPTEVTVFIKLUNPTV9JSURGcm9tU3RyaW5nXzE9Ci0KLUNPTV9Jc0VxdWFsR1VJRD0KLUNPTV9Jc0VxdWFsR1VJRF8wPQotQ09NX0lzRXF1YWxHVUlEXzE9Ci0KLUNPTV9MSUNJTkZPX3NpemVvZj0KLQotQ09NX0xyZXN1bHRGcm9tT2JqZWN0PWZsYWdzPWR5bmFtaWMKLUNPTV9McmVzdWx0RnJvbU9iamVjdF8wPQotQ09NX0xyZXN1bHRGcm9tT2JqZWN0XzE9Ci1DT01fTHJlc3VsdEZyb21PYmplY3RfMj1jYXN0PShMUFVOS05PV04pCi0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yST0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8wPWNhc3Q9KFBWT0lEKQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8yPQotCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMkk9Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GT18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUlOUExBQ0VGUkFNRUlORk9fMklfMj0KLQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJXzA9Y2FzdD0oUFZPSUQpCi1DT01fTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJPQotQ09NX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklfMD1jYXN0PShQVk9JRCkKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLUNPTV9Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9ESVNQUEFSQU1TXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZVTkNERVNDXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQ18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQ18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRlVOQ0RFU0NfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8ySUlfMj0KLQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1RZUEVBVFRSXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1DT01fTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVFlQRUFUVFJfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJERVNDXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJERVNDXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0NfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJJQU5UXzJJST0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9WQVJJQU5UXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUklBTlRfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUklBTlRfMklJXzI9Ci0KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklJPQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLUNPTV9Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotQ09NX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySUlfMj0KLQotQ09NX09MRUNNRF9zaXplb2Y9Ci0KLUNPTV9PTEVJTlBMQUNFRlJBTUVJTkZPX3NpemVvZj0KLQotQ09NX09sZUNyZWF0ZT0KLUNPTV9PbGVDcmVhdGVfMD0KLUNPTV9PbGVDcmVhdGVfMT0KLUNPTV9PbGVDcmVhdGVfMj0KLUNPTV9PbGVDcmVhdGVfMz0KLUNPTV9PbGVDcmVhdGVfND1jYXN0PUlPbGVDbGllbnRTaXRlICoKLUNPTV9PbGVDcmVhdGVfNT1jYXN0PUlTdG9yYWdlICoKLUNPTV9PbGVDcmVhdGVfNj1jYXN0PXZvaWQgKioKLQotQ09NX09sZUNyZWF0ZUZyb21GaWxlPQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzA9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMT1jYXN0PUxQQ09MRVNUUgotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzI9Ci1DT01fT2xlQ3JlYXRlRnJvbUZpbGVfMz0KLUNPTV9PbGVDcmVhdGVGcm9tRmlsZV80PQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzU9Y2FzdD0oTFBPTEVDTElFTlRTSVRFKQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzY9Y2FzdD0oTFBTVE9SQUdFKQotQ09NX09sZUNyZWF0ZUZyb21GaWxlXzc9Y2FzdD1MUFZPSUQgKgotCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZT0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzA9Y2FzdD0oSFdORCkKLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzE9Ci1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV8yPQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfMz1jYXN0PUxQQ09MRVNUUgotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfND0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzU9Y2FzdD0oTFBVTktOT1dOIEZBUiopCi1DT01fT2xlQ3JlYXRlUHJvcGVydHlGcmFtZV82PQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfNz1jYXN0PShMUENMU0lEKQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfOD1jYXN0PShMQ0lEKQotQ09NX09sZUNyZWF0ZVByb3BlcnR5RnJhbWVfOT0KLUNPTV9PbGVDcmVhdGVQcm9wZXJ0eUZyYW1lXzEwPWNhc3Q9KExQVk9JRCkKLQotQ09NX09sZURyYXc9Ci1DT01fT2xlRHJhd18wPWNhc3Q9KExQVU5LTk9XTikKLUNPTV9PbGVEcmF3XzE9Y2FzdD0oRFdPUkQpCi1DT01fT2xlRHJhd18yPWNhc3Q9KEhEQykKLUNPTV9PbGVEcmF3XzM9Y2FzdD0oTFBSRUNUKQotCi1DT01fT2xlRmx1c2hDbGlwYm9hcmQ9Ci0KLUNPTV9PbGVHZXRDbGlwYm9hcmQ9Ci1DT01fT2xlR2V0Q2xpcGJvYXJkXzA9Y2FzdD0oSURhdGFPYmplY3QgKiopCi0KLUNPTV9PbGVJc0N1cnJlbnRDbGlwYm9hcmQ9Ci1DT01fT2xlSXNDdXJyZW50Q2xpcGJvYXJkXzA9Y2FzdD0oSURhdGFPYmplY3QgKikKLQotQ09NX09sZUlzUnVubmluZz0KLUNPTV9PbGVJc1J1bm5pbmdfMD1jYXN0PShMUE9MRU9CSkVDVCkKLQotQ09NX09sZUxvYWQ9Ci1DT01fT2xlTG9hZF8wPWNhc3Q9KElTdG9yYWdlICopCi1DT01fT2xlTG9hZF8xPQotQ09NX09sZUxvYWRfMj1jYXN0PShJT2xlQ2xpZW50U2l0ZSAqKQotQ09NX09sZUxvYWRfMz1jYXN0PUxQVk9JRCAqCi0KLUNPTV9PbGVSdW49Ci1DT01fT2xlUnVuXzA9Y2FzdD0oTFBVTktOT1dOKQotCi1DT01fT2xlU2F2ZT0KLUNPTV9PbGVTYXZlXzA9Y2FzdD0oSVBlcnNpc3RTdG9yYWdlICopCi1DT01fT2xlU2F2ZV8xPWNhc3Q9KElTdG9yYWdlICopCi1DT01fT2xlU2F2ZV8yPQotCi1DT01fT2xlU2V0Q2xpcGJvYXJkPQotQ09NX09sZVNldENsaXBib2FyZF8wPWNhc3Q9KElEYXRhT2JqZWN0ICopCi0KLUNPTV9PbGVTZXRDb250YWluZWRPYmplY3Q9Ci1DT01fT2xlU2V0Q29udGFpbmVkT2JqZWN0XzA9Y2FzdD0oTFBVTktOT1dOKQotQ09NX09sZVNldENvbnRhaW5lZE9iamVjdF8xPQotCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3I9Ci1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfMD1jYXN0PShIT0xFTUVOVSkKLUNPTV9PbGVTZXRNZW51RGVzY3JpcHRvcl8xPWNhc3Q9KEhXTkQpCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfMj1jYXN0PShIV05EKQotQ09NX09sZVNldE1lbnVEZXNjcmlwdG9yXzM9Y2FzdD0oTFBPTEVJTlBMQUNFRlJBTUUpCi1DT01fT2xlU2V0TWVudURlc2NyaXB0b3JfND1jYXN0PShMUE9MRUlOUExBQ0VBQ1RJVkVPQkpFQ1QpCi0KLUNPTV9PbGVUcmFuc2xhdGVDb2xvcj0KLUNPTV9PbGVUcmFuc2xhdGVDb2xvcl8wPWNhc3Q9KE9MRV9DT0xPUikKLUNPTV9PbGVUcmFuc2xhdGVDb2xvcl8xPWNhc3Q9KEhQQUxFVFRFKQotQ09NX09sZVRyYW5zbGF0ZUNvbG9yXzI9Y2FzdD0oQ09MT1JSRUYgKikKLQotQ09NX1Byb2dJREZyb21DTFNJRD0KLUNPTV9Qcm9nSURGcm9tQ0xTSURfMD0KLUNPTV9Qcm9nSURGcm9tQ0xTSURfMT1jYXN0PUxQT0xFU1RSICoKLQotQ09NX1JlZ2lzdGVyRHJhZ0Ryb3A9Ci1DT01fUmVnaXN0ZXJEcmFnRHJvcF8wPWNhc3Q9KEhXTkQpCi1DT01fUmVnaXN0ZXJEcmFnRHJvcF8xPWNhc3Q9KElEcm9wVGFyZ2V0ICopCi0KLUNPTV9SZWxlYXNlU3RnTWVkaXVtPQotQ09NX1JlbGVhc2VTdGdNZWRpdW1fMD1jYXN0PShTVEdNRURJVU0gKikKLQotQ09NX1Jldm9rZURyYWdEcm9wPQotQ09NX1Jldm9rZURyYWdEcm9wXzA9Y2FzdD0oSFdORCkKLQotQ09NX1NUQVRTVEdfc2l6ZW9mPQotCi1DT01fU1RHTUVESVVNX3NpemVvZj0KLQotQ09NX1N0Z0NyZWF0ZURvY2ZpbGU9Ci1DT01fU3RnQ3JlYXRlRG9jZmlsZV8wPQotQ09NX1N0Z0NyZWF0ZURvY2ZpbGVfMT0KLUNPTV9TdGdDcmVhdGVEb2NmaWxlXzI9Ci1DT01fU3RnQ3JlYXRlRG9jZmlsZV8zPWNhc3Q9SVN0b3JhZ2UgKioKLQotQ09NX1N0Z0lzU3RvcmFnZUZpbGU9Ci1DT01fU3RnSXNTdG9yYWdlRmlsZV8wPWNhc3Q9KGNvbnN0IFdDSEFSICopCi0KLUNPTV9TdGdPcGVuU3RvcmFnZT0KLUNPTV9TdGdPcGVuU3RvcmFnZV8wPWNhc3Q9Y29uc3QgV0NIQVIgKgotQ09NX1N0Z09wZW5TdG9yYWdlXzE9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9TdGdPcGVuU3RvcmFnZV8yPQotQ09NX1N0Z09wZW5TdG9yYWdlXzM9Y2FzdD0oU05CKQotQ09NX1N0Z09wZW5TdG9yYWdlXzQ9Ci1DT01fU3RnT3BlblN0b3JhZ2VfNT1jYXN0PUlTdG9yYWdlICoqCi0KLUNPTV9TdHJpbmdGcm9tQ0xTSUQ9Ci1DT01fU3RyaW5nRnJvbUNMU0lEXzA9Ci1DT01fU3RyaW5nRnJvbUNMU0lEXzE9Y2FzdD1MUE9MRVNUUiAqCi0KLUNPTV9TeXNBbGxvY1N0cmluZz0KLUNPTV9TeXNBbGxvY1N0cmluZ18wPWNhc3Q9KE9MRUNIQVIgKikKLQotQ09NX1N5c0ZyZWVTdHJpbmc9Ci1DT01fU3lzRnJlZVN0cmluZ18wPWNhc3Q9KEJTVFIpCi0KLUNPTV9TeXNTdHJpbmdCeXRlTGVuPQotQ09NX1N5c1N0cmluZ0J5dGVMZW5fMD1jYXN0PShCU1RSKQotCi1DT01fVFlQRUFUVFJfc2l6ZW9mPQotCi1DT01fVkFSREVTQ19zaXplb2Y9Ci0KLUNPTV9WQVJJQU5UX3NpemVvZj0KLQotQ09NX1ZhcmlhbnRDaGFuZ2VUeXBlPQotQ09NX1ZhcmlhbnRDaGFuZ2VUeXBlXzA9Y2FzdD0oVkFSSUFOVEFSRyBGQVIqICkKLUNPTV9WYXJpYW50Q2hhbmdlVHlwZV8xPWNhc3Q9KFZBUklBTlRBUkcgRkFSKiApCi1DT01fVmFyaWFudENoYW5nZVR5cGVfMj0KLUNPTV9WYXJpYW50Q2hhbmdlVHlwZV8zPWNhc3Q9KFZBUlRZUEUpCi0KLUNPTV9WYXJpYW50Q2xlYXI9Ci1DT01fVmFyaWFudENsZWFyXzA9Y2FzdD0oVkFSSUFOVEFSRyBGQVIqICkKLQotQ09NX1ZhcmlhbnRJbml0PQotQ09NX1ZhcmlhbnRJbml0XzA9Y2FzdD0oVkFSSUFOVEFSRyBGQVIqICkKLQotQ09NX1Z0YmxDYWxsX19JSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlJXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lJSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlJSV81PQotCi1DT01fVnRibENhbGxfX0lJSUlJSUk9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJXzU9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlfNj0KLQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlfNz0KLQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV81PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzY9Ci1DT01fVnRibENhbGxfX0lJSUlJSUlJSUlfNz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUlJSUlJSV84PQotQ09NX1Z0YmxDYWxsX19JSUlJSUlJSUlJXzk9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzE9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RWVEFSR0VUREVWSUNFXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0VfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yXzQ9Ci1DT01fVnRibENhbGxfX0lJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9EVlRBUkdFVERFVklDRV8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfNT0KLQotQ09NX1Z0YmxDYWxsX19JSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklfM0lfNj0KLQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUlfM0lfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlJXzNKPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzA9Ci1DT01fVnRibENhbGxfX0lJSUlfM0pfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSV8zSl8yPQotQ09NX1Z0YmxDYWxsX19JSUlJXzNKXzM9Ci1DT01fVnRibENhbGxfX0lJSUlfM0pfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlKXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlKXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUpfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJSl8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlKXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUpfM0lfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfM0lfND0KLQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzI9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8zPQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV80PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSV81PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNU18ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GT18yXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV80PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV81PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV82PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV83PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV84PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0RJU1BQQVJBTVNfMklMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9FWENFUElORk9fMl8zSV85PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zST0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEFUU1RHXzJfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RBVFNUR18yXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEdfMl8zSV80PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzA9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMj0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzM9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl80PQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfNT0KLUNPTV9WdGJsQ2FsbF9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzY9Ci1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl83PQotCi1DT01fVnRibENhbGxfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0laRV8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPQotCi1DT01fVnRibENhbGxfX0lJSVo9Ci1DT01fVnRibENhbGxfX0lJSVpfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJWl8xPQotQ09NX1Z0YmxDYWxsX19JSUlaXzI9Ci1DT01fVnRibENhbGxfX0lJSVpfMz0KLQotQ09NX1Z0YmxDYWxsX19JSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zPQotCi1DT01fVnRibENhbGxfX0lJSV8zSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSV8zSUlfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJSV8zSV80PQotQ09NX1Z0YmxDYWxsX19JSUlfM0lJXzNJXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV8yPQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNJXzNJXzNJXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJSV8zSV8zSV8zSV8zSV81PQotQ09NX1Z0YmxDYWxsX19JSUlfM0lfM0lfM0lfM0lfNj0KLQotQ09NX1Z0YmxDYWxsX19JSUlfM0o9Ci1DT01fVnRibENhbGxfX0lJSV8zSl8wPQotQ09NX1Z0YmxDYWxsX19JSUlfM0pfMT0KLUNPTV9WdGJsQ2FsbF9fSUlJXzNKXzI9Ci1DT01fVnRibENhbGxfX0lJSV8zSl8zPQotCi1DT01fVnRibENhbGxfX0lJSklfM0k9Ci1DT01fVnRibENhbGxfX0lJSklfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlKSV8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUpJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJSklfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlKSV8zSV80PQotCi1DT01fVnRibENhbGxfX0lJSl8zST0KLUNPTV9WdGJsQ2FsbF9fSUlKXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJSl8zSV8xPQotQ09NX1Z0YmxDYWxsX19JSUpfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlKXzNJXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSURfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DQVVVSURfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NBVVVJRF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ0FVVUlEXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09OVFJPTElORk9fMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT05UUk9MSU5GT18yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJfMj0KLQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJfMT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMl8zPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlo9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yWl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQ18yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfU1RHTUVESVVNXzJaXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRk9STUFURVRDXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU1fMlpfMz0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GT1JNQVRFVENfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUR01FRElVTV8yWl80PQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8wPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJST0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfMj0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJSV80PQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURfMklJSUlfNT0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzQ9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUlJXzNJXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9PTEVDTURURVhUXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzQ9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8ySUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX09MRUNNRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVF8yXzU9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzM9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEXzJfM0k9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRF8yXzNJXzM9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9MSUNJTkZPXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzA9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GT18yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMl8yPQotCi1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzI9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8xPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySVpfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJWl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySVpfMz0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklaXzQ9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMD0KLUNPTV9WdGJsQ2FsbF9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1DT01fVnRibENhbGxfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8yPQotQ09NX1Z0YmxDYWxsX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfMz0KLQotQ09NX1Z0YmxDYWxsX19JSVo9Ci1DT01fVnRibENhbGxfX0lJWl8wPQotQ09NX1Z0YmxDYWxsX19JSVpfMT0KLUNPTV9WdGJsQ2FsbF9fSUlaXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlfM0M9Ci1DT01fVnRibENhbGxfX0lJXzNDXzA9Ci1DT01fVnRibENhbGxfX0lJXzNDXzE9Ci1DT01fVnRibENhbGxfX0lJXzNDXzI9Ci0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJXzE9Ci1DT01fVnRibENhbGxfX0lJXzNDSV8yPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lfMz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0k9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV8wPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzI9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV8zPQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlJXzNJXzU9Ci1DT01fVnRibENhbGxfX0lJXzNDSUlJSV8zSV82PQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSUlfM0lfNz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfMz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfNT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0lfNj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0lJSV8zSj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfMz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfNT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NJSUlfM0pfNj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ0pJSV8zSj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfMz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfND0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfNT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NKSUlfM0pfNj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zQ18zQz0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0NfM0NfMz0KLQotQ09NX1Z0YmxDYWxsX19JSV8zST0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0lfMj0KLQotQ09NX1Z0YmxDYWxsX19JSV8zSj0KLUNPTV9WdGJsQ2FsbF9fSUlfM0pfMD0KLUNPTV9WdGJsQ2FsbF9fSUlfM0pfMT0KLUNPTV9WdGJsQ2FsbF9fSUlfM0pfMj0KLQotQ09NX1Z0YmxDYWxsX19JSklJSUlKPQotQ09NX1Z0YmxDYWxsX19JSklJSUlKXzA9Ci1DT01fVnRibENhbGxfX0lKSUlJSUpfMT0KLUNPTV9WdGJsQ2FsbF9fSUpJSUlJSl8yPQotQ09NX1Z0YmxDYWxsX19JSklJSUlKXzM9Ci1DT01fVnRibENhbGxfX0lKSUlJSUpfND0KLUNPTV9WdGJsQ2FsbF9fSUpJSUlJSl81PQotQ09NX1Z0YmxDYWxsX19JSklJSUlKXzY9Ci0KLUNPTV9WdGJsQ2FsbF9fSUpKSUlJSUk9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzA9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzE9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzI9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzM9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzQ9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzU9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzY9Ci1DT01fVnRibENhbGxfX0lKSklJSUlJXzc9Ci0KLUNPTV9WdGJsQ2FsbF9JVkFSSUFOVD1mbGFncz1ub19nZW4KLUNPTV9WdGJsQ2FsbF9JVkFSSUFOVF8wPQotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UXzE9Ci1DT01fVnRibENhbGxfSVZBUklBTlRfMj0KLUNPTV9WdGJsQ2FsbF9JVkFSSUFOVF8zPQotCi1DT01fVnRibENhbGxfSVZBUklBTlRQPWZsYWdzPW5vX2dlbgotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UUF8wPQotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UUF8xPQotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UUF8yPQotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UUF8zPQotQ09NX1Z0YmxDYWxsX0lWQVJJQU5UUF80PQotCi1DT01fVnRibENhbGxfUFBQUFZBUklBTlQ9ZmxhZ3M9bm9fZ2VuCi1DT01fVnRibENhbGxfUFBQUFZBUklBTlRfMD0KLUNPTV9WdGJsQ2FsbF9QUFBQVkFSSUFOVF8xPQotQ09NX1Z0YmxDYWxsX1BQUFBWQVJJQU5UXzI9Ci1DT01fVnRibENhbGxfUFBQUFZBUklBTlRfMz0KLUNPTV9WdGJsQ2FsbF9QUFBQVkFSSUFOVF80PQotQ09NX1Z0YmxDYWxsX1BQUFBWQVJJQU5UXzU9Ci1DT01fVnRibENhbGxfUFBQUFZBUklBTlRfNj0KLQotQ09NX1Z0YmxDYWxsX1BWQVJJQU5UUD1mbGFncz1ub19nZW4KLUNPTV9WdGJsQ2FsbF9QVkFSSUFOVFBfMD0KLUNPTV9WdGJsQ2FsbF9QVkFSSUFOVFBfMT0KLUNPTV9WdGJsQ2FsbF9QVkFSSUFOVFBfMj0KLUNPTV9WdGJsQ2FsbF9QVkFSSUFOVFBfMz0KLUNPTV9WdGJsQ2FsbF9QVkFSSUFOVFBfND0KLQotQ09NX1Z0YmxDYWxsX1ZBUklBTlQ9ZmxhZ3M9bm9fZ2VuCi1DT01fVnRibENhbGxfVkFSSUFOVF8wPQotQ09NX1Z0YmxDYWxsX1ZBUklBTlRfMT0KLUNPTV9WdGJsQ2FsbF9WQVJJQU5UXzI9Ci0KLUNPTV9WdGJsQ2FsbF9WQVJJQU5UUD1mbGFncz1ub19nZW4KLUNPTV9WdGJsQ2FsbF9WQVJJQU5UUF8wPQotQ09NX1Z0YmxDYWxsX1ZBUklBTlRQXzE9Ci1DT01fVnRibENhbGxfVkFSSUFOVFBfMj0KLUNPTV9WdGJsQ2FsbF9WQVJJQU5UUF8zPQotCi1DT01fV3JpdGVDbGFzc1N0Zz0KLUNPTV9Xcml0ZUNsYXNzU3RnXzA9Y2FzdD0oSVN0b3JhZ2UgKikKLUNPTV9Xcml0ZUNsYXNzU3RnXzE9Ci0KLUNPTV9hY2NEb0RlZmF1bHRBY3Rpb25fQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fYWNjRG9EZWZhdWx0QWN0aW9uX0NBTExCQUNLXzA9Ci0KLUNPTV9hY2NMb2NhdGlvbl9DQUxMQkFDSz1mbGFncz1ub19nZW4KLUNPTV9hY2NMb2NhdGlvbl9DQUxMQkFDS18wPQotCi1DT01fYWNjTmF2aWdhdGVfQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fYWNjTmF2aWdhdGVfQ0FMTEJBQ0tfMD0KLQotQ09NX2FjY1NlbGVjdF9DQUxMQkFDSz1mbGFncz1ub19nZW4KLUNPTV9hY2NTZWxlY3RfQ0FMTEJBQ0tfMD0KLQotQ09NX2dldF9hY2NDaGlsZF9DQUxMQkFDSz1mbGFncz1ub19nZW4KLUNPTV9nZXRfYWNjQ2hpbGRfQ0FMTEJBQ0tfMD0KLQotQ09NX2dldF9hY2NEZWZhdWx0QWN0aW9uX0NBTExCQUNLPWZsYWdzPW5vX2dlbgotQ09NX2dldF9hY2NEZWZhdWx0QWN0aW9uX0NBTExCQUNLXzA9Ci0KLUNPTV9nZXRfYWNjRGVzY3JpcHRpb25fQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fZ2V0X2FjY0Rlc2NyaXB0aW9uX0NBTExCQUNLXzA9Ci0KLUNPTV9nZXRfYWNjSGVscFRvcGljX0NBTExCQUNLPWZsYWdzPW5vX2dlbgotQ09NX2dldF9hY2NIZWxwVG9waWNfQ0FMTEJBQ0tfMD0KLQotQ09NX2dldF9hY2NIZWxwX0NBTExCQUNLPWZsYWdzPW5vX2dlbgotQ09NX2dldF9hY2NIZWxwX0NBTExCQUNLXzA9Ci0KLUNPTV9nZXRfYWNjS2V5Ym9hcmRTaG9ydGN1dF9DQUxMQkFDSz1mbGFncz1ub19nZW4KLUNPTV9nZXRfYWNjS2V5Ym9hcmRTaG9ydGN1dF9DQUxMQkFDS18wPQotCi1DT01fZ2V0X2FjY05hbWVfQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fZ2V0X2FjY05hbWVfQ0FMTEJBQ0tfMD0KLQotQ09NX2dldF9hY2NSb2xlX0NBTExCQUNLPWZsYWdzPW5vX2dlbgotQ09NX2dldF9hY2NSb2xlX0NBTExCQUNLXzA9Ci0KLUNPTV9nZXRfYWNjU3RhdGVfQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fZ2V0X2FjY1N0YXRlX0NBTExCQUNLXzA9Ci0KLUNPTV9nZXRfYWNjVmFsdWVfQ0FMTEJBQ0s9ZmxhZ3M9bm9fZ2VuCi1DT01fZ2V0X2FjY1ZhbHVlX0NBTExCQUNLXzA9Ci0KLUNPTV9wdXRfYWNjTmFtZV9DQUxMQkFDSz1mbGFncz1ub19nZW4KLUNPTV9wdXRfYWNjTmFtZV9DQUxMQkFDS18wPQotCi1DT01fcHV0X2FjY1ZhbHVlX0NBTExCQUNLPWZsYWdzPW5vX2dlbgotQ09NX3B1dF9hY2NWYWx1ZV9DQUxMQkFDS18wPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfQ09NT2JqZWN0PWZsYWdzPW5vX2dlbgotQ09NT2JqZWN0X3BwVnRhYmxlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0NPTlRST0xJTkZPPQotQ09OVFJPTElORk9fY2I9Ci1DT05UUk9MSU5GT19oQWNjZWw9Y2FzdD0oSEFDQ0VMKQotQ09OVFJPTElORk9fY0FjY2VsPQotQ09OVFJPTElORk9fZHdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9DT1NFUlZFUklORk89Ci1DT1NFUlZFUklORk9fZHdSZXNlcnZlZDE9Ci1DT1NFUlZFUklORk9fcHdzek5hbWU9Y2FzdD0oTFBXU1RSKQotQ09TRVJWRVJJTkZPX3BBdXRoSW5mbz1jYXN0PShDT0FVVEhJTkZPICopCi1DT1NFUlZFUklORk9fZHdSZXNlcnZlZDI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRElTUFBBUkFNUz0KLURJU1BQQVJBTVNfcmd2YXJnPWNhc3Q9KFZBUklBTlRBUkcgRkFSICopCi1ESVNQUEFSQU1TX3JnZGlzcGlkTmFtZWRBcmdzPWNhc3Q9KERJU1BJRCBGQVIgKikKLURJU1BQQVJBTVNfY0FyZ3M9Ci1ESVNQUEFSQU1TX2NOYW1lZEFyZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfRFZUQVJHRVRERVZJQ0U9Ci1EVlRBUkdFVERFVklDRV90ZFNpemU9Ci1EVlRBUkdFVERFVklDRV90ZERyaXZlck5hbWVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZERldmljZU5hbWVPZmZzZXQ9Ci1EVlRBUkdFVERFVklDRV90ZFBvcnROYW1lT2Zmc2V0PQotRFZUQVJHRVRERVZJQ0VfdGRFeHREZXZtb2RlT2Zmc2V0PQotRFZUQVJHRVRERVZJQ0VfdGREYXRhPWFjY2Vzc29yPXRkRGF0YVswXQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0VYQ0VQSU5GTz0KLUVYQ0VQSU5GT193Q29kZT0KLUVYQ0VQSU5GT193UmVzZXJ2ZWQ9Ci1FWENFUElORk9fYnN0clNvdXJjZT1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2JzdHJEZXNjcmlwdGlvbj1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2JzdHJIZWxwRmlsZT1jYXN0PShCU1RSKQotRVhDRVBJTkZPX2R3SGVscENvbnRleHQ9Ci1FWENFUElORk9fcHZSZXNlcnZlZD1jYXN0PSh2b2lkIEZBUiAqKQotRVhDRVBJTkZPX3BmbkRlZmVycmVkRmlsbEluPWNhc3Q9KEhSRVNVTFQgKFNUREFQSUNBTExUWVBFIEZBUiogKShzdHJ1Y3QgdGFnRVhDRVBJTkZPIEZBUiopKQotRVhDRVBJTkZPX3Njb2RlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0ZPUk1BVEVUQz0KLUZPUk1BVEVUQ19jZkZvcm1hdD1jYXN0PShDTElQRk9STUFUKQotRk9STUFURVRDX3B0ZD1jYXN0PShEVlRBUkdFVERFVklDRSAqKQotRk9STUFURVRDX2R3QXNwZWN0PQotRk9STUFURVRDX2xpbmRleD0KLUZPUk1BVEVUQ190eW1lZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9GVU5DREVTQz0KLUZVTkNERVNDX21lbWlkPWNhc3Q9TUVNQkVSSUQKLUZVTkNERVNDX2xwcmdzY29kZT1jYXN0PVNDT0RFIEZBUiAqCi1GVU5DREVTQ19scHJnZWxlbWRlc2NQYXJhbT1jYXN0PUVMRU1ERVNDIEZBUiAqCi1GVU5DREVTQ19mdW5ja2luZD1jYXN0PUZVTkNLSU5ECi1GVU5DREVTQ19pbnZraW5kPWNhc3Q9SU5WT0tFS0lORAotRlVOQ0RFU0NfY2FsbGNvbnY9Y2FzdD1DQUxMQ09OVgotRlVOQ0RFU0NfY1BhcmFtcz0KLUZVTkNERVNDX2NQYXJhbXNPcHQ9Ci1GVU5DREVTQ19vVmZ0PQotRlVOQ0RFU0NfY1Njb2Rlcz0KLUZVTkNERVNDX2VsZW1kZXNjRnVuY190ZGVzY191bmlvbj1hY2Nlc3Nvcj1lbGVtZGVzY0Z1bmMudGRlc2MubHB0ZGVzYyxjYXN0PShzdHJ1Y3QgRkFSU1RSVUNUIHRhZ1RZUEVERVNDIEZBUiogKQotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3RkZXNjX3Z0PWFjY2Vzc29yPWVsZW1kZXNjRnVuYy50ZGVzYy52dAotRlVOQ0RFU0NfZWxlbWRlc2NGdW5jX3BhcmFtZGVzY19wcGFyYW1kZXNjZXg9YWNjZXNzb3I9ZWxlbWRlc2NGdW5jLnBhcmFtZGVzYy5wcGFyYW1kZXNjZXgsY2FzdD0oTFBQQVJBTURFU0NFWCkKLUZVTkNERVNDX2VsZW1kZXNjRnVuY19wYXJhbWRlc2Nfd1BhcmFtRmxhZ3M9YWNjZXNzb3I9ZWxlbWRlc2NGdW5jLnBhcmFtZGVzYy53UGFyYW1GbGFncwotRlVOQ0RFU0Nfd0Z1bmNGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlEPQotR1VJRF9EYXRhMT0KLUdVSURfRGF0YTI9Ci1HVUlEX0RhdGEzPQotR1VJRF9EYXRhND0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQWNjZXNzaWJsZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQ2xhc3NGYWN0b3J5Mj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JQ29ubmVjdGlvblBvaW50PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lDb25uZWN0aW9uUG9pbnRDb250YWluZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURhdGFPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtRk9STUFURVRDPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lFbnVtU1RBVFNURz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRW51bVZBUklBTlQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSUZvbnQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU1vbmlrZXI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUNvbW1hbmRUYXJnZXQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUNvbnRyb2w9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZURvY3VtZW50PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lPbGVEb2N1bWVudFZpZXc9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUluUGxhY2VBY3RpdmVPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUluUGxhY2VPYmplY3Q9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZUxpbms9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSU9sZU9iamVjdD1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JT2xlV2luZG93PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lQZXJzaXN0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lQZXJzaXN0U3RvcmFnZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JUGVyc2lzdFN0cmVhbUluaXQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVByb3ZpZGVDbGFzc0luZm89ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVByb3ZpZGVDbGFzc0luZm8yPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lTcGVjaWZ5UHJvcGVydHlQYWdlcz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JU3RvcmFnZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JU3RyZWFtPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lUeXBlSW5mbz1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93bj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVmlld09iamVjdDI9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfTElDSU5GTz0KLUxJQ0lORk9fY2JMaWNJbmZvPQotTElDSU5GT19mUnVudGltZUtleUF2YWlsPQotTElDSU5GT19mTGljVmVyaWZpZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EPQotT0xFQ01EX2NtZElEPQotT0xFQ01EX2NtZGY9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFQ01EVEVYVD0KLU9MRUNNRFRFWFRfY21kdGV4dGY9Ci1PTEVDTURURVhUX2N3QWN0dWFsPQotT0xFQ01EVEVYVF9jd0J1Zj0KLU9MRUNNRFRFWFRfcmd3ej1hY2Nlc3Nvcj1yZ3d6WzBdCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfT0xFSU5QTEFDRUZSQU1FSU5GTz0KLU9MRUlOUExBQ0VGUkFNRUlORk9fY2I9Ci1PTEVJTlBMQUNFRlJBTUVJTkZPX2ZNRElBcHA9Ci1PTEVJTlBMQUNFRlJBTUVJTkZPX2h3bmRGcmFtZT1jYXN0PShIV05EKQotT0xFSU5QTEFDRUZSQU1FSU5GT19oYWNjZWw9Y2FzdD0oSEFDQ0VMKQotT0xFSU5QTEFDRUZSQU1FSU5GT19jQWNjZWxFbnRyaWVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1NUQVRTVEc9Ci1TVEFUU1RHX3B3Y3NOYW1lPWNhc3Q9KExQV1NUUikKLVNUQVRTVEdfdHlwZT0KLVNUQVRTVEdfY2JTaXplPWFjY2Vzc29yPWNiU2l6ZS5RdWFkUGFydAotU1RBVFNUR19tdGltZV9kd0xvd0RhdGVUaW1lPWFjY2Vzc29yPW10aW1lLmR3TG93RGF0ZVRpbWUKLVNUQVRTVEdfbXRpbWVfZHdIaWdoRGF0ZVRpbWU9YWNjZXNzb3I9bXRpbWUuZHdIaWdoRGF0ZVRpbWUKLVNUQVRTVEdfY3RpbWVfZHdMb3dEYXRlVGltZT1hY2Nlc3Nvcj1jdGltZS5kd0xvd0RhdGVUaW1lCi1TVEFUU1RHX2N0aW1lX2R3SGlnaERhdGVUaW1lPWFjY2Vzc29yPWN0aW1lLmR3SGlnaERhdGVUaW1lCi1TVEFUU1RHX2F0aW1lX2R3TG93RGF0ZVRpbWU9YWNjZXNzb3I9YXRpbWUuZHdMb3dEYXRlVGltZQotU1RBVFNUR19hdGltZV9kd0hpZ2hEYXRlVGltZT1hY2Nlc3Nvcj1hdGltZS5kd0hpZ2hEYXRlVGltZQotU1RBVFNUR19ncmZNb2RlPQotU1RBVFNUR19ncmZMb2Nrc1N1cHBvcnRlZD0KLVNUQVRTVEdfY2xzaWRfRGF0YTE9YWNjZXNzb3I9Y2xzaWQuRGF0YTEKLVNUQVRTVEdfY2xzaWRfRGF0YTI9YWNjZXNzb3I9Y2xzaWQuRGF0YTIKLVNUQVRTVEdfY2xzaWRfRGF0YTM9YWNjZXNzb3I9Y2xzaWQuRGF0YTMKLVNUQVRTVEdfY2xzaWRfRGF0YTQ9YWNjZXNzb3I9Y2xzaWQuRGF0YTQKLVNUQVRTVEdfZ3JmU3RhdGVCaXRzPQotU1RBVFNUR19yZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9TVEdNRURJVU09Ci1TVEdNRURJVU1fdHltZWQ9Ci1TVEdNRURJVU1fdW5pb25GaWVsZD1hY2Nlc3Nvcj1oR2xvYmFsLGNhc3Q9KEhHTE9CQUwpCi1TVEdNRURJVU1fcFVua0ZvclJlbGVhc2U9Y2FzdD0oSVVua25vd24gKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9UWVBFQVRUUj0KLVRZUEVBVFRSX2d1aWRfRGF0YTE9YWNjZXNzb3I9Z3VpZC5EYXRhMQotVFlQRUFUVFJfZ3VpZF9EYXRhMj1hY2Nlc3Nvcj1ndWlkLkRhdGEyCi1UWVBFQVRUUl9ndWlkX0RhdGEzPWFjY2Vzc29yPWd1aWQuRGF0YTMKLVRZUEVBVFRSX2d1aWRfRGF0YTQ9YWNjZXNzb3I9Z3VpZC5EYXRhNAotVFlQRUFUVFJfbGNpZD0KLVRZUEVBVFRSX2R3UmVzZXJ2ZWQ9Ci1UWVBFQVRUUl9tZW1pZENvbnN0cnVjdG9yPQotVFlQRUFUVFJfbWVtaWREZXN0cnVjdG9yPQotVFlQRUFUVFJfbHBzdHJTY2hlbWE9Y2FzdD0oT0xFQ0hBUiBGQVIgKikKLVRZUEVBVFRSX2NiU2l6ZUluc3RhbmNlPQotVFlQRUFUVFJfdHlwZWtpbmQ9Ci1UWVBFQVRUUl9jRnVuY3M9Ci1UWVBFQVRUUl9jVmFycz0KLVRZUEVBVFRSX2NJbXBsVHlwZXM9Ci1UWVBFQVRUUl9jYlNpemVWZnQ9Ci1UWVBFQVRUUl9jYkFsaWdubWVudD0KLVRZUEVBVFRSX3dUeXBlRmxhZ3M9Ci1UWVBFQVRUUl93TWFqb3JWZXJOdW09Ci1UWVBFQVRUUl93TWlub3JWZXJOdW09Ci1UWVBFQVRUUl90ZGVzY0FsaWFzX3VuaW9uRmllbGQ9YWNjZXNzb3I9dGRlc2NBbGlhcy5scHRkZXNjLGNhc3Q9KHN0cnVjdCBGQVJTVFJVQ1QgdGFnVFlQRURFU0MgRkFSICopCi1UWVBFQVRUUl90ZGVzY0FsaWFzX3Z0PWFjY2Vzc29yPXRkZXNjQWxpYXMudnQKLVRZUEVBVFRSX2lkbGRlc2NUeXBlX2R3UmVzZXJ2ZWQ9YWNjZXNzb3I9aWRsZGVzY1R5cGUuZHdSZXNlcnZlZAotVFlQRUFUVFJfaWRsZGVzY1R5cGVfd0lETEZsYWdzPWFjY2Vzc29yPWlkbGRlc2NUeXBlLndJRExGbGFncwotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX1ZBUkRFU0M9Ci1WQVJERVNDX21lbWlkPQotVkFSREVTQ19scHN0clNjaGVtYT1jYXN0PShPTEVDSEFSIEZBUiAqKQotVkFSREVTQ19vSW5zdD0KLVZBUkRFU0NfZWxlbWRlc2NWYXJfdGRlc2NfdW5pb249YWNjZXNzb3I9ZWxlbWRlc2NWYXIudGRlc2MubHB0ZGVzYyxjYXN0PShzdHJ1Y3QgRkFSU1RSVUNUIHRhZ1RZUEVERVNDIEZBUiAqKQotVkFSREVTQ19lbGVtZGVzY1Zhcl90ZGVzY192dD1hY2Nlc3Nvcj1lbGVtZGVzY1Zhci50ZGVzYy52dAotVkFSREVTQ19lbGVtZGVzY1Zhcl9wYXJhbWRlc2NfcHBhcmFtZGVzY2V4PWFjY2Vzc29yPWVsZW1kZXNjVmFyLnBhcmFtZGVzYy5wcGFyYW1kZXNjZXgsY2FzdD0oTFBQQVJBTURFU0NFWCkKLVZBUkRFU0NfZWxlbWRlc2NWYXJfcGFyYW1kZXNjX3dQYXJhbUZsYWdzPWFjY2Vzc29yPWVsZW1kZXNjVmFyLnBhcmFtZGVzYy53UGFyYW1GbGFncwotVkFSREVTQ193VmFyRmxhZ3M9Ci1WQVJERVNDX3ZhcmtpbmQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfVkFSSUFOVD0KLVZBUklBTlRfdnQ9Ci1WQVJJQU5UX3dSZXNlcnZlZDE9Ci1WQVJJQU5UX3dSZXNlcnZlZDI9Ci1WQVJJQU5UX3dSZXNlcnZlZDM9Ci1WQVJJQU5UX2xWYWw9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmNhcmJvbi5BR0wucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmNhcmJvbi5BR0wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyOWRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib24uQUdMLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2NhcmJvbl9BR0w9Ci1BR0xfYWdsQ2hvb3NlUGl4ZWxGb3JtYXQ9Ci1BR0xfYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfMD1jYXN0PWNvbnN0IEFHTERldmljZSAqCi1BR0xfYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfMT0KLUFHTF9hZ2xDaG9vc2VQaXhlbEZvcm1hdF8yPWNhc3Q9Y29uc3QgR0xpbnQgKgotCi1BR0xfYWdsQ3JlYXRlQ29udGV4dD0KLUFHTF9hZ2xDcmVhdGVDb250ZXh0XzA9Y2FzdD1BR0xQaXhlbEZvcm1hdAotQUdMX2FnbENyZWF0ZUNvbnRleHRfMT1jYXN0PUFHTENvbnRleHQKLQotQUdMX2FnbERlc2NyaWJlUGl4ZWxGb3JtYXQ9Ci1BR0xfYWdsRGVzY3JpYmVQaXhlbEZvcm1hdF8wPWNhc3Q9QUdMUGl4ZWxGb3JtYXQKLUFHTF9hZ2xEZXNjcmliZVBpeGVsRm9ybWF0XzE9Y2FzdD1HTGludAotQUdMX2FnbERlc2NyaWJlUGl4ZWxGb3JtYXRfMj1jYXN0PUdMaW50ICoKLQotQUdMX2FnbERlc3Ryb3lDb250ZXh0PQotQUdMX2FnbERlc3Ryb3lDb250ZXh0XzA9Y2FzdD1BR0xDb250ZXh0Ci0KLUFHTF9hZ2xEZXN0cm95UGl4ZWxGb3JtYXQ9Ci1BR0xfYWdsRGVzdHJveVBpeGVsRm9ybWF0XzA9Y2FzdD1BR0xQaXhlbEZvcm1hdAotCi1BR0xfYWdsRW5hYmxlPQotQUdMX2FnbEVuYWJsZV8wPWNhc3Q9QUdMQ29udGV4dAotQUdMX2FnbEVuYWJsZV8xPWNhc3Q9R0xlbnVtCi0KLUFHTF9hZ2xHZXRDdXJyZW50Q29udGV4dD0KLQotQUdMX2FnbEdldERyYXdhYmxlPQotQUdMX2FnbEdldERyYXdhYmxlXzA9Y2FzdD1BR0xDb250ZXh0Ci0KLUFHTF9hZ2xTZXRDdXJyZW50Q29udGV4dD0KLUFHTF9hZ2xTZXRDdXJyZW50Q29udGV4dF8wPWNhc3Q9QUdMQ29udGV4dAotCi1BR0xfYWdsU2V0RHJhd2FibGU9Ci1BR0xfYWdsU2V0RHJhd2FibGVfMD1jYXN0PUFHTENvbnRleHQKLUFHTF9hZ2xTZXREcmF3YWJsZV8xPWNhc3Q9QUdMRHJhd2FibGUKLQotQUdMX2FnbFNldEludGVnZXJfX0lJST0KLUFHTF9hZ2xTZXRJbnRlZ2VyX19JSUlfMD1jYXN0PShBR0xDb250ZXh0KQotQUdMX2FnbFNldEludGVnZXJfX0lJSV8xPWNhc3Q9R0xlbnVtCi1BR0xfYWdsU2V0SW50ZWdlcl9fSUlJXzI9Y2FzdD1jb25zdCBHTGludCAqCi0KLUFHTF9hZ2xTZXRJbnRlZ2VyX19JSV8zST0KLUFHTF9hZ2xTZXRJbnRlZ2VyX19JSV8zSV8wPWNhc3Q9KEFHTENvbnRleHQpCi1BR0xfYWdsU2V0SW50ZWdlcl9fSUlfM0lfMT1jYXN0PUdMZW51bQotQUdMX2FnbFNldEludGVnZXJfX0lJXzNJXzI9Y2FzdD1jb25zdCBHTGludCAqCi0KLUFHTF9hZ2xTd2FwQnVmZmVycz0KLUFHTF9hZ2xTd2FwQnVmZmVyc18wPWNhc3Q9QUdMQ29udGV4dAotCi1BR0xfYWdsVXBkYXRlQ29udGV4dD0KLUFHTF9hZ2xVcGRhdGVDb250ZXh0XzA9Y2FzdD1BR0xDb250ZXh0Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ2x4LkdMWC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ2x4LkdMWC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNmNTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2dseF9HTFg9Ci1HTFhfWFZpc3VhbEluZm9fc2l6ZW9mPQotCi1HTFhfZ2xHZXRJbnRlZ2Vydj0KLUdMWF9nbEdldEludGVnZXJ2XzA9Y2FzdD0oR0xlbnVtKQotR0xYX2dsR2V0SW50ZWdlcnZfMT1jYXN0PShHTGludCAqKSxmbGFncz1ub19pbgotCi1HTFhfZ2xWaWV3cG9ydD0KLUdMWF9nbFZpZXdwb3J0XzA9Y2FzdD0oR0xpbnQpCi1HTFhfZ2xWaWV3cG9ydF8xPWNhc3Q9KEdMaW50KQotR0xYX2dsVmlld3BvcnRfMj1jYXN0PShHTHNpemVpKQotR0xYX2dsVmlld3BvcnRfMz1jYXN0PShHTHNpemVpKQotCi1HTFhfZ2xYQ2hvb3NlVmlzdWFsPQotR0xYX2dsWENob29zZVZpc3VhbF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDaG9vc2VWaXN1YWxfMT0KLUdMWF9nbFhDaG9vc2VWaXN1YWxfMj0KLQotR0xYX2dsWENvcHlDb250ZXh0PQotR0xYX2dsWENvcHlDb250ZXh0XzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWENvcHlDb250ZXh0XzE9Y2FzdD0oR0xYQ29udGV4dCkKLUdMWF9nbFhDb3B5Q29udGV4dF8yPWNhc3Q9KEdMWENvbnRleHQpCi1HTFhfZ2xYQ29weUNvbnRleHRfMz0KLQotR0xYX2dsWENyZWF0ZUNvbnRleHQ9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDcmVhdGVDb250ZXh0XzE9Ci1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8yPWNhc3Q9KEdMWENvbnRleHQpCi1HTFhfZ2xYQ3JlYXRlQ29udGV4dF8zPQotCi1HTFhfZ2xYQ3JlYXRlR0xYUGl4bWFwPQotR0xYX2dsWENyZWF0ZUdMWFBpeG1hcF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMT0KLUdMWF9nbFhDcmVhdGVHTFhQaXhtYXBfMj1jYXN0PShQaXhtYXApCi0KLUdMWF9nbFhEZXN0cm95Q29udGV4dD0KLUdMWF9nbFhEZXN0cm95Q29udGV4dF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhEZXN0cm95Q29udGV4dF8xPWNhc3Q9KEdMWENvbnRleHQpCi0KLUdMWF9nbFhEZXN0cm95R0xYUGl4bWFwPQotR0xYX2dsWERlc3Ryb3lHTFhQaXhtYXBfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYRGVzdHJveUdMWFBpeG1hcF8xPWNhc3Q9KEdMWFBpeG1hcCkKLQotR0xYX2dsWEdldENsaWVudFN0cmluZz0KLUdMWF9nbFhHZXRDbGllbnRTdHJpbmdfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYR2V0Q2xpZW50U3RyaW5nXzE9Ci0KLUdMWF9nbFhHZXRDb25maWc9Ci1HTFhfZ2xYR2V0Q29uZmlnXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWEdldENvbmZpZ18xPQotR0xYX2dsWEdldENvbmZpZ18yPQotR0xYX2dsWEdldENvbmZpZ18zPQotCi1HTFhfZ2xYR2V0Q3VycmVudENvbnRleHQ9Ci0KLUdMWF9nbFhHZXRDdXJyZW50RHJhd2FibGU9Ci0KLUdMWF9nbFhJc0RpcmVjdD0KLUdMWF9nbFhJc0RpcmVjdF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhJc0RpcmVjdF8xPWNhc3Q9KEdMWENvbnRleHQpCi0KLUdMWF9nbFhNYWtlQ3VycmVudD0KLUdMWF9nbFhNYWtlQ3VycmVudF8wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhNYWtlQ3VycmVudF8xPWNhc3Q9KEdMWERyYXdhYmxlKQotR0xYX2dsWE1ha2VDdXJyZW50XzI9Y2FzdD0oR0xYQ29udGV4dCkKLQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uPQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uXzE9Ci1HTFhfZ2xYUXVlcnlFeHRlbnNpb25fMj0KLQotR0xYX2dsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZz0KLUdMWF9nbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfMD1jYXN0PShEaXNwbGF5ICopCi1HTFhfZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nXzE9Ci0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZz0KLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18wPWNhc3Q9KERpc3BsYXkgKikKLUdMWF9nbFhRdWVyeVNlcnZlclN0cmluZ18xPQotR0xYX2dsWFF1ZXJ5U2VydmVyU3RyaW5nXzI9Ci0KLUdMWF9nbFhRdWVyeVZlcnNpb249Ci1HTFhfZ2xYUXVlcnlWZXJzaW9uXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFF1ZXJ5VmVyc2lvbl8xPWZsYWdzPW5vX2luCi1HTFhfZ2xYUXVlcnlWZXJzaW9uXzI9ZmxhZ3M9bm9faW4KLQotR0xYX2dsWFN3YXBCdWZmZXJzPQotR0xYX2dsWFN3YXBCdWZmZXJzXzA9Y2FzdD0oRGlzcGxheSAqKQotR0xYX2dsWFN3YXBCdWZmZXJzXzE9Y2FzdD0oR0xYRHJhd2FibGUpCi0KLUdMWF9nbFhXYWl0R0w9Ci0KLUdMWF9nbFhXYWl0WD0KLQotR0xYX21lbW1vdmU9Ci1HTFhfbWVtbW92ZV8wPQotR0xYX21lbW1vdmVfMT1jYXN0PShjb25zdCB2b2lkICopCi1HTFhfbWVtbW92ZV8yPWNhc3Q9KHNpemVfdCkKLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX2dseF9YVmlzdWFsSW5mbz0KLVhWaXN1YWxJbmZvX3Zpc3VhbD1jYXN0PShWaXN1YWwgKikKLVhWaXN1YWxJbmZvX3Zpc3VhbGlkPQotWFZpc3VhbEluZm9fc2NyZWVuPQotWFZpc3VhbEluZm9fZGVwdGg9Ci1YVmlzdWFsSW5mb19jY2xhc3M9YWNjZXNzb3I9Y2xhc3MKLVhWaXN1YWxJbmZvX3JlZF9tYXNrPQotWFZpc3VhbEluZm9fZ3JlZW5fbWFzaz0KLVhWaXN1YWxJbmZvX2JsdWVfbWFzaz0KLVhWaXN1YWxJbmZvX2NvbG9ybWFwX3NpemU9Ci1YVmlzdWFsSW5mb19iaXRzX3Blcl9yZ2I9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLndpbjMyLldHTC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wud2luMzIuV0dMLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjBjMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wud2luMzIuV0dMLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF93aW4zMl9MQVlFUlBMQU5FREVTQ1JJUFRPUj0KLUxBWUVSUExBTkVERVNDUklQVE9SX25TaXplPQotTEFZRVJQTEFORURFU0NSSVBUT1JfblZlcnNpb249Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9kd0ZsYWdzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfaVBpeGVsVHlwZT0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NDb2xvckJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jUmVkQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NSZWRTaGlmdD0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NHcmVlbkJpdHM9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jR3JlZW5TaGlmdD0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NCbHVlQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NCbHVlU2hpZnQ9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWxwaGFCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FscGhhU2hpZnQ9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jQWNjdW1CaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FjY3VtUmVkQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBY2N1bUdyZWVuQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBY2N1bUJsdWVCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0FjY3VtQWxwaGFCaXRzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfY0RlcHRoQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NTdGVuY2lsQml0cz0KLUxBWUVSUExBTkVERVNDUklQVE9SX2NBdXhCdWZmZXJzPQotTEFZRVJQTEFORURFU0NSSVBUT1JfaUxheWVyUGxhbmU9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9iUmVzZXJ2ZWQ9Ci1MQVlFUlBMQU5FREVTQ1JJUFRPUl9jclRyYW5zcGFyZW50PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX3dpbjMyX1BJWEVMRk9STUFUREVTQ1JJUFRPUj0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9uU2l6ZT0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9uVmVyc2lvbj0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9kd0ZsYWdzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2lQaXhlbFR5cGU9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0NvbG9yQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jUmVkQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jUmVkU2hpZnQ9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0dyZWVuQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jR3JlZW5TaGlmdD0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQmx1ZUJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0JsdWVTaGlmdD0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWxwaGFCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBbHBoYVNoaWZ0PQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBY2N1bUJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FjY3VtUmVkQml0cz0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9jQWNjdW1HcmVlbkJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FjY3VtQmx1ZUJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY0FjY3VtQWxwaGFCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NEZXB0aEJpdHM9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfY1N0ZW5jaWxCaXRzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2NBdXhCdWZmZXJzPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2lMYXllclR5cGU9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfYlJlc2VydmVkPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2R3TGF5ZXJNYXNrPQotUElYRUxGT1JNQVRERVNDUklQVE9SX2R3VmlzaWJsZU1hc2s9Ci1QSVhFTEZPUk1BVERFU0NSSVBUT1JfZHdEYW1hZ2VNYXNrPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb3BlbmdsX3dpbjMyX1dHTD0KLVdHTF9DaG9vc2VQaXhlbEZvcm1hdD0KLVdHTF9DaG9vc2VQaXhlbEZvcm1hdF8wPWNhc3Q9KEhEQykKLVdHTF9DaG9vc2VQaXhlbEZvcm1hdF8xPQotCi1XR0xfRGVzY3JpYmVQaXhlbEZvcm1hdD0KLVdHTF9EZXNjcmliZVBpeGVsRm9ybWF0XzA9Y2FzdD0oSERDKQotV0dMX0Rlc2NyaWJlUGl4ZWxGb3JtYXRfMT0KLVdHTF9EZXNjcmliZVBpeGVsRm9ybWF0XzI9Ci1XR0xfRGVzY3JpYmVQaXhlbEZvcm1hdF8zPQotCi1XR0xfR2V0UGl4ZWxGb3JtYXQ9Ci1XR0xfR2V0UGl4ZWxGb3JtYXRfMD1jYXN0PShIREMpCi0KLVdHTF9TZXRQaXhlbEZvcm1hdD0KLVdHTF9TZXRQaXhlbEZvcm1hdF8wPWNhc3Q9KEhEQykKLVdHTF9TZXRQaXhlbEZvcm1hdF8xPQotV0dMX1NldFBpeGVsRm9ybWF0XzI9Ci0KLVdHTF9Td2FwQnVmZmVycz0KLVdHTF9Td2FwQnVmZmVyc18wPWNhc3Q9KEhEQykKLQotV0dMX3dnbENvcHlDb250ZXh0PQotV0dMX3dnbENvcHlDb250ZXh0XzA9Y2FzdD0oSEdMUkMpCi1XR0xfd2dsQ29weUNvbnRleHRfMT1jYXN0PShIR0xSQykKLVdHTF93Z2xDb3B5Q29udGV4dF8yPQotCi1XR0xfd2dsQ3JlYXRlQ29udGV4dD0KLVdHTF93Z2xDcmVhdGVDb250ZXh0XzA9Y2FzdD0oSERDKQotCi1XR0xfd2dsQ3JlYXRlTGF5ZXJDb250ZXh0PQotV0dMX3dnbENyZWF0ZUxheWVyQ29udGV4dF8wPWNhc3Q9KEhEQykKLVdHTF93Z2xDcmVhdGVMYXllckNvbnRleHRfMT0KLQotV0dMX3dnbERlbGV0ZUNvbnRleHQ9Ci1XR0xfd2dsRGVsZXRlQ29udGV4dF8wPWNhc3Q9KEhHTFJDKQotCi1XR0xfd2dsRGVzY3JpYmVMYXllclBsYW5lPQotV0dMX3dnbERlc2NyaWJlTGF5ZXJQbGFuZV8wPWNhc3Q9KEhEQykKLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmVfMT0KLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmVfMj0KLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmVfMz0KLVdHTF93Z2xEZXNjcmliZUxheWVyUGxhbmVfND0KLQotV0dMX3dnbEdldEN1cnJlbnRDb250ZXh0PQotCi1XR0xfd2dsR2V0Q3VycmVudERDPQotCi1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcz0KLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXzA9Y2FzdD0oSERDKQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXNfMT0KLVdHTF93Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXzI9Ci1XR0xfd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllc18zPQotV0dMX3dnbEdldExheWVyUGFsZXR0ZUVudHJpZXNfND0KLQotV0dMX3dnbEdldFByb2NBZGRyZXNzPQotV0dMX3dnbEdldFByb2NBZGRyZXNzXzA9Ci0KLVdHTF93Z2xNYWtlQ3VycmVudD0KLVdHTF93Z2xNYWtlQ3VycmVudF8wPWNhc3Q9KEhEQykKLVdHTF93Z2xNYWtlQ3VycmVudF8xPWNhc3Q9KEhHTFJDKQotCi1XR0xfd2dsUmVhbGl6ZUxheWVyUGFsZXR0ZT0KLVdHTF93Z2xSZWFsaXplTGF5ZXJQYWxldHRlXzA9Y2FzdD0oSERDKQotV0dMX3dnbFJlYWxpemVMYXllclBhbGV0dGVfMT0KLVdHTF93Z2xSZWFsaXplTGF5ZXJQYWxldHRlXzI9Ci0KLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzPQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXNfMD1jYXN0PShIREMpCi1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllc18xPQotV0dMX3dnbFNldExheWVyUGFsZXR0ZUVudHJpZXNfMj0KLVdHTF93Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzXzM9Ci1XR0xfd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllc180PQotCi1XR0xfd2dsU2hhcmVMaXN0cz0KLVdHTF93Z2xTaGFyZUxpc3RzXzA9Y2FzdD0oSEdMUkMpCi1XR0xfd2dsU2hhcmVMaXN0c18xPWNhc3Q9KEhHTFJDKQotCi1XR0xfd2dsU3dhcExheWVyQnVmZmVycz0KLVdHTF93Z2xTd2FwTGF5ZXJCdWZmZXJzXzA9Y2FzdD0oSERDKQotV0dMX3dnbFN3YXBMYXllckJ1ZmZlcnNfMT0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnBob3Rvbi5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5waG90b24uT1MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5ODkxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnBob3Rvbi5PUy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzPQotRm9udERldGFpbHNfZGVzYz1jYXN0PShGb250RGVzY3JpcHRpb24pCi1Gb250RGV0YWlsc19zdGVtPWNhc3Q9KEZvbnROYW1lKQotRm9udERldGFpbHNfbG9zaXplPQotRm9udERldGFpbHNfaGlzaXplPQotRm9udERldGFpbHNfZmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fRm9udFF1ZXJ5SW5mbz0KLUZvbnRRdWVyeUluZm9fZm9udD1jYXN0PShGb250TmFtZSkKLUZvbnRRdWVyeUluZm9fZGVzYz1jYXN0PShGb250RGVzY3JpcHRpb24pCi1Gb250UXVlcnlJbmZvX3NpemU9Ci1Gb250UXVlcnlJbmZvX3N0eWxlPQotRm9udFF1ZXJ5SW5mb19hc2NlbmRlcj0KLUZvbnRRdWVyeUluZm9fZGVzY2VuZGVyPQotRm9udFF1ZXJ5SW5mb193aWR0aD0KLUZvbnRRdWVyeUluZm9fbG9jaGFyPQotRm9udFF1ZXJ5SW5mb19oaWNoYXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fT1M9Ci1PU19QZkRlY29tcG9zZVN0ZW1Ub0lEPQotT1NfUGZEZWNvbXBvc2VTdGVtVG9JRF8wPQotCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJSV8wPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJSV8xPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklJSV8yPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJSUlfMz1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8ySUlJXzQ9Ci0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJPQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQklfMD0KLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJXzE9Ci1PU19QZkV4dGVudFRleHRfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yXzNCXzNCSV8yPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1BmRXh0ZW50VGV4dF9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJfM0JfM0JJXzM9Y2FzdD0oY29uc3QgY2hhciAqKQotT1NfUGZFeHRlbnRUZXh0X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMl8zQl8zQklfND0KLQotT1NfUGZFeHRlbnRXaWRlVGV4dD0KLU9TX1BmRXh0ZW50V2lkZVRleHRfMD0KLU9TX1BmRXh0ZW50V2lkZVRleHRfMT0KLU9TX1BmRXh0ZW50V2lkZVRleHRfMj1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZkV4dGVudFdpZGVUZXh0XzM9Y2FzdD0oY29uc3QgdWludDE2X3QgKikKLU9TX1BmRXh0ZW50V2lkZVRleHRfND0KLQotT1NfUGZGb250RGVzY3JpcHRpb249Ci1PU19QZkZvbnREZXNjcmlwdGlvbl8wPWNhc3Q9KEZvbnRJRCAqKQotCi1PU19QZkZvbnRGbGFncz0KLU9TX1BmRm9udEZsYWdzXzA9Y2FzdD0oRm9udElEICopCi0KLU9TX1BmRm9udFNpemU9Ci1PU19QZkZvbnRTaXplXzA9Y2FzdD0oRm9udElEICopCi0KLU9TX1BmRnJlZUZvbnQ9Ci1PU19QZkZyZWVGb250XzA9Y2FzdD0oRm9udElEICopCi0KLU9TX1BmR2VuZXJhdGVGb250TmFtZT0KLU9TX1BmR2VuZXJhdGVGb250TmFtZV8wPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1BmR2VuZXJhdGVGb250TmFtZV8xPQotT1NfUGZHZW5lcmF0ZUZvbnROYW1lXzI9Ci1PU19QZkdlbmVyYXRlRm9udE5hbWVfMz1jYXN0PShjaGFyICopCi0KLU9TX1BmTG9hZE1ldHJpY3M9Ci1PU19QZkxvYWRNZXRyaWNzXzA9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19QZlF1ZXJ5Rm9udEluZm89Ci1PU19QZlF1ZXJ5Rm9udEluZm9fMD1jYXN0PShjb25zdCBjaGFyICopCi1PU19QZlF1ZXJ5Rm9udEluZm9fMT1jYXN0PShGb250UXVlcnlJbmZvICopCi0KLU9TX1BmUXVlcnlGb250cz0KLU9TX1BmUXVlcnlGb250c18wPQotT1NfUGZRdWVyeUZvbnRzXzE9Ci1PU19QZlF1ZXJ5Rm9udHNfMj1jYXN0PShGb250RGV0YWlscyAqKQotT1NfUGZRdWVyeUZvbnRzXzM9Ci0KLU9TX1BnQWxwaGFPZmY9Ci0KLU9TX1BnQWxwaGFPbj0KLQotT1NfUGdDcmVhdGVHQz0KLU9TX1BnQ3JlYXRlR0NfMD0KLQotT1NfUGdEZXN0cm95R0M9Ci1PU19QZ0Rlc3Ryb3lHQ18wPWNhc3Q9KFBoR0NfdCAqKQotCi1PU19QZ0RyYXdBcmM9Ci1PU19QZ0RyYXdBcmNfMD0KLU9TX1BnRHJhd0FyY18xPQotT1NfUGdEcmF3QXJjXzI9Ci1PU19QZ0RyYXdBcmNfMz0KLU9TX1BnRHJhd0FyY180PQotCi1PU19QZ0RyYXdBcnJvdz0KLU9TX1BnRHJhd0Fycm93XzA9Ci1PU19QZ0RyYXdBcnJvd18xPQotT1NfUGdEcmF3QXJyb3dfMj1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ0RyYXdBcnJvd18zPQotCi1PU19QZ0RyYXdCaXRtYXA9Ci1PU19QZ0RyYXdCaXRtYXBfMD1jYXN0PSh2b2lkIGNvbnN0ICopCi1PU19QZ0RyYXdCaXRtYXBfMT1jYXN0PShpbnQpCi1PU19QZ0RyYXdCaXRtYXBfMj1jYXN0PShQaFBvaW50X3QgKikKLU9TX1BnRHJhd0JpdG1hcF8zPWNhc3Q9KFBoUG9pbnRfdCAqKQotT1NfUGdEcmF3Qml0bWFwXzQ9Y2FzdD0oaW50KQotT1NfUGdEcmF3Qml0bWFwXzU9Y2FzdD0obG9uZykKLQotT1NfUGdEcmF3RWxsaXBzZT0KLU9TX1BnRHJhd0VsbGlwc2VfMD0KLU9TX1BnRHJhd0VsbGlwc2VfMT0KLU9TX1BnRHJhd0VsbGlwc2VfMj0KLQotT1NfUGdEcmF3R3JhZGllbnQ9Ci1PU19QZ0RyYXdHcmFkaWVudF8wPQotT1NfUGdEcmF3R3JhZGllbnRfMT0KLU9TX1BnRHJhd0dyYWRpZW50XzI9Ci1PU19QZ0RyYXdHcmFkaWVudF8zPQotT1NfUGdEcmF3R3JhZGllbnRfND0KLU9TX1BnRHJhd0dyYWRpZW50XzU9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdEcmF3R3JhZGllbnRfNj1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ0RyYXdHcmFkaWVudF83PWNhc3Q9KFBnQ29sb3JfdCkKLU9TX1BnRHJhd0dyYWRpZW50Xzg9Y2FzdD0oUGdDb2xvcl90KQotT1NfUGdEcmF3R3JhZGllbnRfOT0KLU9TX1BnRHJhd0dyYWRpZW50XzEwPWNhc3Q9KHVuc2lnbmVkIGNoYXIgKikKLQotT1NfUGdEcmF3SUxpbmU9Ci1PU19QZ0RyYXdJTGluZV8wPQotT1NfUGdEcmF3SUxpbmVfMT0KLU9TX1BnRHJhd0lMaW5lXzI9Ci1PU19QZ0RyYXdJTGluZV8zPQotCi1PU19QZ0RyYXdJUGl4ZWw9Ci1PU19QZ0RyYXdJUGl4ZWxfMD0KLU9TX1BnRHJhd0lQaXhlbF8xPQotCi1PU19QZ0RyYXdJUmVjdD0KLU9TX1BnRHJhd0lSZWN0XzA9Ci1PU19QZ0RyYXdJUmVjdF8xPQotT1NfUGdEcmF3SVJlY3RfMj0KLU9TX1BnRHJhd0lSZWN0XzM9Ci1PU19QZ0RyYXdJUmVjdF80PQotCi1PU19QZ0RyYXdJbWFnZT0KLU9TX1BnRHJhd0ltYWdlXzA9Y2FzdD0odm9pZCBjb25zdCAqKQotT1NfUGdEcmF3SW1hZ2VfMT0KLU9TX1BnRHJhd0ltYWdlXzI9Ci1PU19QZ0RyYXdJbWFnZV8zPQotT1NfUGdEcmF3SW1hZ2VfND0KLU9TX1BnRHJhd0ltYWdlXzU9Ci0KLU9TX1BnRHJhd011bHRpVGV4dEFyZWE9Ci1PU19QZ0RyYXdNdWx0aVRleHRBcmVhXzA9Y2FzdD0oY2hhciAqKQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV8xPQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV8yPQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV8zPQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV80PQotT1NfUGdEcmF3TXVsdGlUZXh0QXJlYV81PQotCi1PU19QZ0RyYXdQaEltYWdlUmVjdG14PQotT1NfUGdEcmF3UGhJbWFnZVJlY3RteF8wPQotT1NfUGdEcmF3UGhJbWFnZVJlY3RteF8xPWNhc3Q9KFBoSW1hZ2VfdCBjb25zdCAqKQotT1NfUGdEcmF3UGhJbWFnZVJlY3RteF8yPQotT1NfUGdEcmF3UGhJbWFnZVJlY3RteF8zPQotCi1PU19QZ0RyYXdQb2x5Z29uPQotT1NfUGdEcmF3UG9seWdvbl8wPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUGdEcmF3UG9seWdvbl8xPQotT1NfUGdEcmF3UG9seWdvbl8yPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUGdEcmF3UG9seWdvbl8zPQotCi1PU19QZ0RyYXdSb3VuZFJlY3Q9Ci1PU19QZ0RyYXdSb3VuZFJlY3RfMD1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotT1NfUGdEcmF3Um91bmRSZWN0XzE9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi1PU19QZ0RyYXdSb3VuZFJlY3RfMj0KLQotT1NfUGdEcmF3VEltYWdlPQotT1NfUGdEcmF3VEltYWdlXzA9Y2FzdD0odm9pZCBjb25zdCAqKQotT1NfUGdEcmF3VEltYWdlXzE9Ci1PU19QZ0RyYXdUSW1hZ2VfMj1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1BnRHJhd1RJbWFnZV8zPWNhc3Q9KFBoRGltX3QgY29uc3QgKikKLU9TX1BnRHJhd1RJbWFnZV80PQotT1NfUGdEcmF3VEltYWdlXzU9Ci1PU19QZ0RyYXdUSW1hZ2VfNj1jYXN0PSh2b2lkIGNvbnN0ICopCi1PU19QZ0RyYXdUSW1hZ2VfNz0KLQotT1NfUGdEcmF3VGV4dD0KLU9TX1BnRHJhd1RleHRfMD1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QZ0RyYXdUZXh0XzE9Ci1PU19QZ0RyYXdUZXh0XzI9Y2FzdD0oUGhQb2ludF90ICopCi1PU19QZ0RyYXdUZXh0XzM9Ci0KLU9TX1BnRXh0ZW50TXVsdGlUZXh0PQotT1NfUGdFeHRlbnRNdWx0aVRleHRfMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGdFeHRlbnRNdWx0aVRleHRfMT1jYXN0PShQaFBvaW50X3QgKikKLU9TX1BnRXh0ZW50TXVsdGlUZXh0XzI9Y2FzdD0oY2hhciAqKQotT1NfUGdFeHRlbnRNdWx0aVRleHRfMz1jYXN0PShjaGFyICopCi1PU19QZ0V4dGVudE11bHRpVGV4dF80PQotT1NfUGdFeHRlbnRNdWx0aVRleHRfNT0KLQotT1NfUGdGbHVzaD0KLQotT1NfUGdHZXRWaWRlb01vZGU9Ci1PU19QZ0dldFZpZGVvTW9kZV8wPWNhc3Q9KFBnRGlzcGxheVNldHRpbmdzX3QgKiksZmxhZ3M9aW5pdAotCi1PU19QZ0dldFZpZGVvTW9kZUluZm89Ci1PU19QZ0dldFZpZGVvTW9kZUluZm9fMD0KLU9TX1BnR2V0VmlkZW9Nb2RlSW5mb18xPWNhc3Q9KFBnVmlkZW9Nb2RlSW5mb190ICopCi0KLU9TX1BnUmVhZFNjcmVlbj0KLU9TX1BnUmVhZFNjcmVlbl8wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QZ1JlYWRTY3JlZW5fMT1jYXN0PSh2b2lkICopCi0KLU9TX1BnUmVhZFNjcmVlblNpemU9Ci1PU19QZ1JlYWRTY3JlZW5TaXplXzA9Y2FzdD0oUGhSZWN0X3QgKikKLQotT1NfUGdTZXRBbHBoYT0KLU9TX1BnU2V0QWxwaGFfMD0KLU9TX1BnU2V0QWxwaGFfMT1jYXN0PShQZ01hcF90IGNvbnN0ICopCi1PU19QZ1NldEFscGhhXzI9Y2FzdD0oUGdHcmFkaWVudF90IGNvbnN0ICopCi1PU19QZ1NldEFscGhhXzM9Ci1PU19QZ1NldEFscGhhXzQ9Ci0KLU9TX1BnU2V0Q2xpcHBpbmc9Ci1PU19QZ1NldENsaXBwaW5nXzA9Ci1PU19QZ1NldENsaXBwaW5nXzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGdTZXREcmF3QnVmZmVyU2l6ZT0KLU9TX1BnU2V0RHJhd0J1ZmZlclNpemVfMD0KLQotT1NfUGdTZXREcmF3TW9kZT0KLU9TX1BnU2V0RHJhd01vZGVfMD0KLQotT1NfUGdTZXRGaWxsQ29sb3I9Ci1PU19QZ1NldEZpbGxDb2xvcl8wPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUGdTZXRGaWxsVHJhbnNQYXQ9Ci1PU19QZ1NldEZpbGxUcmFuc1BhdF8wPWNhc3Q9KFBnUGF0dGVybl90KQotCi1PU19QZ1NldEZvbnQ9Ci1PU19QZ1NldEZvbnRfMD1jYXN0PShjaGFyIGNvbnN0ICopCi0KLU9TX1BnU2V0R0M9Ci1PU19QZ1NldEdDXzA9Y2FzdD0oUGhHQ190ICopCi0KLU9TX1BnU2V0TXVsdGlDbGlwPQotT1NfUGdTZXRNdWx0aUNsaXBfMD0KLU9TX1BnU2V0TXVsdGlDbGlwXzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGdTZXRQYWxldHRlPQotT1NfUGdTZXRQYWxldHRlXzA9Y2FzdD0oUGdDb2xvcl90IGNvbnN0ICopCi1PU19QZ1NldFBhbGV0dGVfMT0KLU9TX1BnU2V0UGFsZXR0ZV8yPQotT1NfUGdTZXRQYWxldHRlXzM9Ci1PU19QZ1NldFBhbGV0dGVfND0KLU9TX1BnU2V0UGFsZXR0ZV81PQotCi1PU19QZ1NldFJlZ2lvbj0KLU9TX1BnU2V0UmVnaW9uXzA9Y2FzdD0oUGhSaWRfdCkKLQotT1NfUGdTZXRTdHJva2VDYXA9Ci1PU19QZ1NldFN0cm9rZUNhcF8wPQotCi1PU19QZ1NldFN0cm9rZUNvbG9yPQotT1NfUGdTZXRTdHJva2VDb2xvcl8wPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUGdTZXRTdHJva2VEYXNoPQotT1NfUGdTZXRTdHJva2VEYXNoXzA9Y2FzdD0odW5zaWduZWQgY2hhciBjb25zdCAqKQotT1NfUGdTZXRTdHJva2VEYXNoXzE9Ci1PU19QZ1NldFN0cm9rZURhc2hfMj0KLQotT1NfUGdTZXRTdHJva2VKb2luPQotT1NfUGdTZXRTdHJva2VKb2luXzA9Ci0KLU9TX1BnU2V0U3Ryb2tlV2lkdGg9Ci1PU19QZ1NldFN0cm9rZVdpZHRoXzA9Ci0KLU9TX1BnU2V0VGV4dENvbG9yPQotT1NfUGdTZXRUZXh0Q29sb3JfMD1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1BnU2V0VGV4dFhPUkNvbG9yPQotT1NfUGdTZXRUZXh0WE9SQ29sb3JfMD1jYXN0PShQZ0NvbG9yX3QpCi1PU19QZ1NldFRleHRYT1JDb2xvcl8xPWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUGdTZXRVc2VyQ2xpcD0KLU9TX1BnU2V0VXNlckNsaXBfMD1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QZ1NobWVtQ3JlYXRlPQotT1NfUGdTaG1lbUNyZWF0ZV8wPQotT1NfUGdTaG1lbUNyZWF0ZV8xPWNhc3Q9KGNoYXIgY29uc3QgKikKLQotT1NfUGdTaG1lbURlc3Ryb3k9Ci1PU19QZ1NobWVtRGVzdHJveV8wPWNhc3Q9KHZvaWQgKikKLQotT1NfUGhBZGRNZXJnZVRpbGVzPQotT1NfUGhBZGRNZXJnZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoQWRkTWVyZ2VUaWxlc18xPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaEFkZE1lcmdlVGlsZXNfMj1jYXN0PShpbnQgKikKLQotT1NfUGhBcmVhVG9SZWN0PQotT1NfUGhBcmVhVG9SZWN0XzA9Y2FzdD0oUGhBcmVhX3QgY29uc3QgKikKLU9TX1BoQXJlYVRvUmVjdF8xPWNhc3Q9KFBoUmVjdF90ICopCi0KLU9TX1BoQmxpdD0KLU9TX1BoQmxpdF8wPWNhc3Q9KFBoUmlkX3QpCi1PU19QaEJsaXRfMT1jYXN0PShjb25zdCBQaFJlY3RfdCAqKQotT1NfUGhCbGl0XzI9Y2FzdD0oY29uc3QgUGhQb2ludF90ICopCi0KLU9TX1BoQ2xpcFRpbGluZ3M9Ci1PU19QaENsaXBUaWxpbmdzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLU9TX1BoQ2xpcFRpbGluZ3NfMT1jYXN0PShQaFRpbGVfdCAqKQotT1NfUGhDbGlwVGlsaW5nc18yPWNhc3Q9KFBoVGlsZV90ICoqKQotCi1PU19QaENsaXBib2FyZENvcHk9Ci1PU19QaENsaXBib2FyZENvcHlfMD0KLU9TX1BoQ2xpcGJvYXJkQ29weV8xPQotT1NfUGhDbGlwYm9hcmRDb3B5XzI9Y2FzdD0oUGhDbGlwSGVhZGVyIGNvbnN0ICopCi0KLU9TX1BoQ2xpcGJvYXJkQ29weVN0cmluZz0KLU9TX1BoQ2xpcGJvYXJkQ29weVN0cmluZ18wPQotT1NfUGhDbGlwYm9hcmRDb3B5U3RyaW5nXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19QaENsaXBib2FyZFBhc3RlRmluaXNoPQotT1NfUGhDbGlwYm9hcmRQYXN0ZUZpbmlzaF8wPWNhc3Q9KHZvaWQgKikKLQotT1NfUGhDbGlwYm9hcmRQYXN0ZVN0YXJ0PQotT1NfUGhDbGlwYm9hcmRQYXN0ZVN0YXJ0XzA9Ci0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVTdHJpbmc9Ci1PU19QaENsaXBib2FyZFBhc3RlU3RyaW5nXzA9Ci0KLU9TX1BoQ2xpcGJvYXJkUGFzdGVUeXBlPQotT1NfUGhDbGlwYm9hcmRQYXN0ZVR5cGVfMD1jYXN0PSh2b2lkICopCi1PU19QaENsaXBib2FyZFBhc3RlVHlwZV8xPQotCi1PU19QaENsaXBib2FyZFBhc3RlVHlwZU49Ci1PU19QaENsaXBib2FyZFBhc3RlVHlwZU5fMD1jYXN0PSh2b2lkICopCi1PU19QaENsaXBib2FyZFBhc3RlVHlwZU5fMT0KLQotT1NfUGhDb2FsZXNjZVRpbGVzPQotT1NfUGhDb2FsZXNjZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLQotT1NfUGhDb3B5VGlsZXM9Ci1PU19QaENvcHlUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi0KLU9TX1BoQ3JlYXRlSW1hZ2U9Ci1PU19QaENyZWF0ZUltYWdlXzA9Y2FzdD0oUGhJbWFnZV90ICopCi1PU19QaENyZWF0ZUltYWdlXzE9Ci1PU19QaENyZWF0ZUltYWdlXzI9Ci1PU19QaENyZWF0ZUltYWdlXzM9Ci1PU19QaENyZWF0ZUltYWdlXzQ9Y2FzdD0oUGdDb2xvcl90IGNvbnN0ICopCi1PU19QaENyZWF0ZUltYWdlXzU9Ci1PU19QaENyZWF0ZUltYWdlXzY9Ci0KLU9TX1BoRENTZXRDdXJyZW50PQotT1NfUGhEQ1NldEN1cnJlbnRfMD1jYXN0PSh2b2lkICopCi0KLU9TX1BoRGVUcmFuc2xhdGVUaWxlcz0KLU9TX1BoRGVUcmFuc2xhdGVUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaERlVHJhbnNsYXRlVGlsZXNfMT1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLQotT1NfUGhFdmVudE5leHQ9Ci1PU19QaEV2ZW50TmV4dF8wPWNhc3Q9KHZvaWQgKikKLU9TX1BoRXZlbnROZXh0XzE9Ci0KLU9TX1BoRXZlbnRQZWVrPQotT1NfUGhFdmVudFBlZWtfMD1jYXN0PSh2b2lkICopCi1PU19QaEV2ZW50UGVla18xPQotCi1PU19QaEZyZWVUaWxlcz0KLU9TX1BoRnJlZVRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLQotT1NfUGhHZXREYXRhPQotT1NfUGhHZXREYXRhXzA9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1BoR2V0TXNnU2l6ZT0KLU9TX1BoR2V0TXNnU2l6ZV8wPWNhc3Q9KFBoRXZlbnRfdCBjb25zdCAqKQotCi1PU19QaEdldFJlY3RzPQotT1NfUGhHZXRSZWN0c18wPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QaEdldFRpbGU9ZmxhZ3M9bm9fZ2VuCi0KLU9TX1BoSW5pdERyYWc9Ci1PU19QaEluaXREcmFnXzA9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoSW5pdERyYWdfMT0KLU9TX1BoSW5pdERyYWdfMj1jYXN0PShjb25zdCBQaFJlY3RfdCAqKQotT1NfUGhJbml0RHJhZ18zPWNhc3Q9KGNvbnN0IFBoUmVjdF90ICopCi1PU19QaEluaXREcmFnXzQ9Ci1PU19QaEluaXREcmFnXzU9Y2FzdD0oUGhEaW1fdCAqKQotT1NfUGhJbml0RHJhZ182PWNhc3Q9KFBoRGltX3QgKikKLU9TX1BoSW5pdERyYWdfNz1jYXN0PShQaERpbV90ICopCi1PU19QaEluaXREcmFnXzg9Y2FzdD0oUGhQb2ludF90ICopCi1PU19QaEluaXREcmFnXzk9Y2FzdD0oUGhDdXJzb3JEZXNjcmlwdGlvbl90ICopCi0KLU9TX1BoSW5wdXRHcm91cD0KLU9TX1BoSW5wdXRHcm91cF8wPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QaEludGVyc2VjdFRpbGluZ3M9Ci1PU19QaEludGVyc2VjdFRpbGluZ3NfMD1jYXN0PShQaFRpbGVfdCBjb25zdCAqKQotT1NfUGhJbnRlcnNlY3RUaWxpbmdzXzE9Y2FzdD0oUGhUaWxlX3QgY29uc3QgKikKLU9TX1BoSW50ZXJzZWN0VGlsaW5nc18yPQotCi1PU19QaEtleVRvTWI9Ci1PU19QaEtleVRvTWJfMD1jYXN0PWNoYXIgKgotT1NfUGhLZXlUb01iXzE9Ci0KLU9TX1BoTWFrZUdob3N0Qml0bWFwPQotT1NfUGhNYWtlR2hvc3RCaXRtYXBfMD1jYXN0PShQaEltYWdlX3QgKikKLQotT1NfUGhNYWtlVHJhbnNCaXRtYXA9Ci1PU19QaE1ha2VUcmFuc0JpdG1hcF8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotT1NfUGhNYWtlVHJhbnNCaXRtYXBfMT1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1BoTWVyZ2VUaWxlcz0KLU9TX1BoTWVyZ2VUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi0KLU9TX1BoTW92ZUN1cnNvckFicz0KLU9TX1BoTW92ZUN1cnNvckFic18wPQotT1NfUGhNb3ZlQ3Vyc29yQWJzXzE9Ci1PU19QaE1vdmVDdXJzb3JBYnNfMj0KLQotT1NfUGhRdWVyeUN1cnNvcj0KLU9TX1BoUXVlcnlDdXJzb3JfMD0KLU9TX1BoUXVlcnlDdXJzb3JfMT1jYXN0PShQaEN1cnNvckluZm9fdCAqKQotCi1PU19QaFF1ZXJ5Umlkcz0KLU9TX1BoUXVlcnlSaWRzXzA9Ci1PU19QaFF1ZXJ5Umlkc18xPWNhc3Q9KFBoUmlkX3QpCi1PU19QaFF1ZXJ5Umlkc18yPQotT1NfUGhRdWVyeVJpZHNfMz0KLU9TX1BoUXVlcnlSaWRzXzQ9Ci1PU19QaFF1ZXJ5Umlkc181PWNhc3Q9KFBoUmlkX3QpCi1PU19QaFF1ZXJ5Umlkc182PWNhc3Q9KGNvbnN0IFBoUmVjdF90ICopCi1PU19QaFF1ZXJ5Umlkc183PWNhc3Q9KFBoUmlkX3QgKikKLU9TX1BoUXVlcnlSaWRzXzg9Ci0KLU9TX1BoUmVjdEludGVyc2VjdD0KLU9TX1BoUmVjdEludGVyc2VjdF8wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QaFJlY3RJbnRlcnNlY3RfMT1jYXN0PShQaFJlY3RfdCBjb25zdCAqKQotCi1PU19QaFJlY3RVbmlvbl9fSUk9Ci1PU19QaFJlY3RVbmlvbl9fSUlfMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGhSZWN0VW5pb25fX0lJXzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLQotT1NfUGhSZWN0VW5pb25fX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzI9Ci1PU19QaFJlY3RVbmlvbl9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8wPWNhc3Q9KFBoUmVjdF90ICopCi1PU19QaFJlY3RVbmlvbl9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1BoUmVjdHNUb1RpbGVzPQotT1NfUGhSZWN0c1RvVGlsZXNfMD1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGhSZWN0c1RvVGlsZXNfMT0KLQotT1NfUGhSZWdpb25RdWVyeT0KLU9TX1BoUmVnaW9uUXVlcnlfMD1jYXN0PShQaFJpZF90KQotT1NfUGhSZWdpb25RdWVyeV8xPWNhc3Q9KFBoUmVnaW9uX3QgKikKLU9TX1BoUmVnaW9uUXVlcnlfMj1jYXN0PShQaFJlY3RfdCAqKQotT1NfUGhSZWdpb25RdWVyeV8zPWNhc3Q9KHZvaWQgKikKLU9TX1BoUmVnaW9uUXVlcnlfND0KLQotT1NfUGhSZWxlYXNlSW1hZ2U9Ci1PU19QaFJlbGVhc2VJbWFnZV8wPWNhc3Q9KFBoSW1hZ2VfdCAqKQotCi1PU19QaFNvcnRUaWxlcz0KLU9TX1BoU29ydFRpbGVzXzA9Y2FzdD0oUGhUaWxlX3QgKikKLQotT1NfUGhUaWxlc1RvUmVjdHM9Ci1PU19QaFRpbGVzVG9SZWN0c18wPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaFRpbGVzVG9SZWN0c18xPWNhc3Q9KGludCAqKQotCi1PU19QaFRyYW5zbGF0ZVRpbGVzPQotT1NfUGhUcmFuc2xhdGVUaWxlc18wPWNhc3Q9KFBoVGlsZV90ICopCi1PU19QaFRyYW5zbGF0ZVRpbGVzXzE9Y2FzdD0oUGhQb2ludF90IGNvbnN0ICopCi0KLU9TX1BoV2luZG93UXVlcnlWaXNpYmxlPQotT1NfUGhXaW5kb3dRdWVyeVZpc2libGVfMD0KLU9TX1BoV2luZG93UXVlcnlWaXNpYmxlXzE9Y2FzdD0oUGhSaWRfdCkKLU9TX1BoV2luZG93UXVlcnlWaXNpYmxlXzI9Ci1PU19QaFdpbmRvd1F1ZXJ5VmlzaWJsZV8zPWNhc3Q9KFBoUmVjdF90ICopCi0KLU9TX1BpQ3JvcEltYWdlPQotT1NfUGlDcm9wSW1hZ2VfMD1jYXN0PShQaEltYWdlX3QgKikKLU9TX1BpQ3JvcEltYWdlXzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLU9TX1BpQ3JvcEltYWdlXzI9Ci0KLU9TX1BpRHVwbGljYXRlSW1hZ2U9Ci1PU19QaUR1cGxpY2F0ZUltYWdlXzA9Y2FzdD0oUGhJbWFnZV90ICopCi1PU19QaUR1cGxpY2F0ZUltYWdlXzE9Ci0KLU9TX1BtTWVtQ3JlYXRlTUM9Ci1PU19QbU1lbUNyZWF0ZU1DXzA9Y2FzdD0oUGhJbWFnZV90ICopCi1PU19QbU1lbUNyZWF0ZU1DXzE9Y2FzdD0oUGhEaW1fdCAqKQotT1NfUG1NZW1DcmVhdGVNQ18yPWNhc3Q9KFBoUG9pbnRfdCAqKQotCi1PU19QbU1lbUZsdXNoPQotT1NfUG1NZW1GbHVzaF8wPWNhc3Q9KFBtTWVtb3J5Q29udGV4dF90ICopCi1PU19QbU1lbUZsdXNoXzE9Y2FzdD0oUGhJbWFnZV90ICopCi0KLU9TX1BtTWVtUmVsZWFzZU1DPQotT1NfUG1NZW1SZWxlYXNlTUNfMD1jYXN0PShQbU1lbW9yeUNvbnRleHRfdCAqKQotCi1PU19QbU1lbVN0YXJ0PQotT1NfUG1NZW1TdGFydF8wPWNhc3Q9KFBtTWVtb3J5Q29udGV4dF90ICopCi0KLU9TX1BtTWVtU3RvcD0KLU9TX1BtTWVtU3RvcF8wPWNhc3Q9KFBtTWVtb3J5Q29udGV4dF90ICopCi0KLU9TX1B0QWRkQ2FsbGJhY2s9Ci1PU19QdEFkZENhbGxiYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRBZGRDYWxsYmFja18xPQotT1NfUHRBZGRDYWxsYmFja18yPWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLU9TX1B0QWRkQ2FsbGJhY2tfMz1jYXN0PSh2b2lkICopCi0KLU9TX1B0QWRkRXZlbnRIYW5kbGVyPQotT1NfUHRBZGRFdmVudEhhbmRsZXJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEFkZEV2ZW50SGFuZGxlcl8xPQotT1NfUHRBZGRFdmVudEhhbmRsZXJfMj1jYXN0PShQdENhbGxiYWNrRl90ICopCi1PU19QdEFkZEV2ZW50SGFuZGxlcl8zPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRBZGRGaWx0ZXJDYWxsYmFjaz0KLU9TX1B0QWRkRmlsdGVyQ2FsbGJhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEFkZEZpbHRlckNhbGxiYWNrXzE9Ci1PU19QdEFkZEZpbHRlckNhbGxiYWNrXzI9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotT1NfUHRBZGRGaWx0ZXJDYWxsYmFja18zPWNhc3Q9KHZvaWQgKikKLQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyPQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzE9Ci1PU19QdEFkZEhvdGtleUhhbmRsZXJfMj0KLU9TX1B0QWRkSG90a2V5SGFuZGxlcl8zPQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzQ9Y2FzdD0odm9pZCAqKQotT1NfUHRBZGRIb3RrZXlIYW5kbGVyXzU9Y2FzdD0oUHRDYWxsYmFja0ZfdCAqKQotCi1PU19QdEFsZXJ0PQotT1NfUHRBbGVydF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QWxlcnRfMT1jYXN0PShQaFBvaW50X3QgY29uc3QgKikKLU9TX1B0QWxlcnRfMj1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEFsZXJ0XzM9Y2FzdD0oUGhJbWFnZV90IGNvbnN0ICopCi1PU19QdEFsZXJ0XzQ9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRBbGVydF81PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0QWxlcnRfNj0KLU9TX1B0QWxlcnRfNz1jYXN0PShjaGFyIGNvbnN0ICoqKQotT1NfUHRBbGVydF84PWNhc3Q9KGNoYXIgY29uc3QgKiopCi1PU19QdEFsZXJ0Xzk9Ci1PU19QdEFsZXJ0XzEwPQotT1NfUHRBbGVydF8xMT0KLQotT1NfUHRBcHBBZGRJbnB1dD0KLU9TX1B0QXBwQWRkSW5wdXRfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwQWRkSW5wdXRfMT1jYXN0PShwaWRfdCkKLU9TX1B0QXBwQWRkSW5wdXRfMj1jYXN0PShQdElucHV0Q2FsbGJhY2tQcm9jX3QpCi1PU19QdEFwcEFkZElucHV0XzM9Y2FzdD0odm9pZCAqKQotCi1PU19QdEFwcEFkZFdvcmtQcm9jPQotT1NfUHRBcHBBZGRXb3JrUHJvY18wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBBZGRXb3JrUHJvY18xPWNhc3Q9KFB0V29ya1Byb2NfdCkKLU9TX1B0QXBwQWRkV29ya1Byb2NfMj1jYXN0PSh2b2lkICopCi0KLU9TX1B0QXBwQ3JlYXRlUHVsc2U9Ci1PU19QdEFwcENyZWF0ZVB1bHNlXzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcENyZWF0ZVB1bHNlXzE9Ci0KLU9TX1B0QXBwRGVsZXRlUHVsc2U9Ci1PU19QdEFwcERlbGV0ZVB1bHNlXzA9Y2FzdD0oUHRBcHBDb250ZXh0X3QpCi1PU19QdEFwcERlbGV0ZVB1bHNlXzE9Y2FzdD0ocGlkX3QpCi0KLU9TX1B0QXBwUHJvY2Vzc0V2ZW50PQotT1NfUHRBcHBQcm9jZXNzRXZlbnRfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLQotT1NfUHRBcHBQdWxzZVRyaWdnZXI9Ci1PU19QdEFwcFB1bHNlVHJpZ2dlcl8wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBQdWxzZVRyaWdnZXJfMT1jYXN0PShwaWRfdCkKLQotT1NfUHRBcHBSZW1vdmVJbnB1dD0KLU9TX1B0QXBwUmVtb3ZlSW5wdXRfMD1jYXN0PShQdEFwcENvbnRleHRfdCkKLU9TX1B0QXBwUmVtb3ZlSW5wdXRfMT1jYXN0PShQdElucHV0SWRfdCAqKQotCi1PU19QdEFwcFJlbW92ZVdvcmtQcm9jPQotT1NfUHRBcHBSZW1vdmVXb3JrUHJvY18wPWNhc3Q9KFB0QXBwQ29udGV4dF90KQotT1NfUHRBcHBSZW1vdmVXb3JrUHJvY18xPWNhc3Q9KFB0V29ya1Byb2NJZF90ICopCi0KLU9TX1B0QmVlcD0KLQotT1NfUHRCbGl0PQotT1NfUHRCbGl0XzA9Y2FzdD0oUHRXaWRnZXRfdCBjb25zdCAqKQotT1NfUHRCbGl0XzE9Y2FzdD0oUGhSZWN0X3QgY29uc3QgKikKLU9TX1B0QmxpdF8yPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotCi1PU19QdEJsb2NrQWxsV2luZG93cz0KLU9TX1B0QmxvY2tBbGxXaW5kb3dzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRCbG9ja0FsbFdpbmRvd3NfMT0KLU9TX1B0QmxvY2tBbGxXaW5kb3dzXzI9Y2FzdD0oUGdDb2xvcl90KQotCi1PU19QdEJsb2NrV2luZG93PQotT1NfUHRCbG9ja1dpbmRvd18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0QmxvY2tXaW5kb3dfMT0KLU9TX1B0QmxvY2tXaW5kb3dfMj1jYXN0PShQZ0NvbG9yX3QpCi0KLU9TX1B0QnV0dG9uPWZsYWdzPWNvbnN0Ci0KLU9TX1B0Q2FsY0JvcmRlcj0KLU9TX1B0Q2FsY0JvcmRlcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q2FsY0JvcmRlcl8xPQotCi1PU19QdENhbGNDYW52YXM9Ci1PU19QdENhbGNDYW52YXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENhbGNDYW52YXNfMT1jYXN0PShQaFJlY3RfdCAqKQotCi1PU19QdENsaXBwZWRCbGl0PQotT1NfUHRDbGlwcGVkQmxpdF8wPWNhc3Q9KFB0V2lkZ2V0X3QgY29uc3QgKikKLU9TX1B0Q2xpcHBlZEJsaXRfMT1jYXN0PShQaFRpbGVfdCBjb25zdCAqKQotT1NfUHRDbGlwcGVkQmxpdF8yPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUHRDbGlwcGVkQmxpdF8zPWNhc3Q9KFBoVGlsZV90IGNvbnN0ICopCi0KLU9TX1B0Q29sb3JTZWxlY3Q9Ci1PU19QdENvbG9yU2VsZWN0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDb2xvclNlbGVjdF8xPWNhc3Q9KGNoYXIgKikKLU9TX1B0Q29sb3JTZWxlY3RfMj0KLQotT1NfUHRDb21ib0JveD1mbGFncz1jb25zdAotCi1PU19QdENvbnRhaW5lcj1mbGFncz1jb25zdAotCi1PU19QdENvbnRhaW5lckZpbmRGb2N1cz0KLU9TX1B0Q29udGFpbmVyRmluZEZvY3VzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdENvbnRhaW5lckZvY3VzTmV4dD0KLU9TX1B0Q29udGFpbmVyRm9jdXNOZXh0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRDb250YWluZXJGb2N1c05leHRfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRDb250YWluZXJGb2N1c1ByZXY9Ci1PU19QdENvbnRhaW5lckZvY3VzUHJldl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q29udGFpbmVyRm9jdXNQcmV2XzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0Q29udGFpbmVyR2l2ZUZvY3VzPQotT1NfUHRDb250YWluZXJHaXZlRm9jdXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdENvbnRhaW5lckdpdmVGb2N1c18xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdENvbnRhaW5lckhvbGQ9Ci1PU19QdENvbnRhaW5lckhvbGRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0Q29udGFpbmVyUmVsZWFzZT0KLU9TX1B0Q29udGFpbmVyUmVsZWFzZV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRDcmVhdGVBcHBDb250ZXh0PQotCi1PU19QdENyZWF0ZVdpZGdldD0KLU9TX1B0Q3JlYXRlV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRDbGFzc1JlZl90ICopCi1PU19QdENyZWF0ZVdpZGdldF8xPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0Q3JlYXRlV2lkZ2V0XzI9Ci1PU19QdENyZWF0ZVdpZGdldF8zPWNhc3Q9KFB0QXJnX3QgY29uc3QgKikKLQotT1NfUHRDcmVhdGVXaWRnZXRDbGFzcz0KLU9TX1B0Q3JlYXRlV2lkZ2V0Q2xhc3NfMD1jYXN0PShQdFdpZGdldENsYXNzUmVmX3QgKikKLU9TX1B0Q3JlYXRlV2lkZ2V0Q2xhc3NfMT0KLU9TX1B0Q3JlYXRlV2lkZ2V0Q2xhc3NfMj0KLU9TX1B0Q3JlYXRlV2lkZ2V0Q2xhc3NfMz1jYXN0PShQdEFyZ190IGNvbnN0ICopCi0KLU9TX1B0RGFtYWdlRXh0ZW50PQotT1NfUHREYW1hZ2VFeHRlbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdERhbWFnZUV4dGVudF8xPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1B0RGFtYWdlV2lkZ2V0PQotT1NfUHREYW1hZ2VXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0RGVzdHJveVdpZGdldD0KLU9TX1B0RGVzdHJveVdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHREaXNqb2ludD1mbGFncz1jb25zdAotCi1PU19QdEVudGVyPQotT1NfUHRFbnRlcl8wPQotCi1PU19QdEV2ZW50SGFuZGxlcj0KLU9TX1B0RXZlbnRIYW5kbGVyXzA9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0RXh0ZW50V2lkZ2V0PQotT1NfUHRFeHRlbnRXaWRnZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0RXh0ZW50V2lkZ2V0RmFtaWx5PQotT1NfUHRFeHRlbnRXaWRnZXRGYW1pbHlfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0RmlsZVNlbGVjdGlvbj0KLU9TX1B0RmlsZVNlbGVjdGlvbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0RmlsZVNlbGVjdGlvbl8xPWNhc3Q9KFBoUG9pbnRfdCBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzI9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzM9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzQ9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzU9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzY9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzc9Y2FzdD0oY2hhciBjb25zdCAqKQotT1NfUHRGaWxlU2VsZWN0aW9uXzg9Y2FzdD0oUHRGaWxlU2VsZWN0aW9uSW5mb190ICopLGZsYWdzPWluaXQKLU9TX1B0RmlsZVNlbGVjdGlvbl85PQotCi1PU19QdEZpbmREaXNqb2ludD0KLU9TX1B0RmluZERpc2pvaW50XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdEZsdXNoPQotCi1PU19QdEZvbnRTZWxlY3Rpb249Ci1PU19QdEZvbnRTZWxlY3Rpb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEZvbnRTZWxlY3Rpb25fMT1jYXN0PShjb25zdCBQaFBvaW50X3QgKikKLU9TX1B0Rm9udFNlbGVjdGlvbl8yPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1B0Rm9udFNlbGVjdGlvbl8zPWNhc3Q9KGNvbnN0IGNoYXIgKikKLU9TX1B0Rm9udFNlbGVjdGlvbl80PQotT1NfUHRGb250U2VsZWN0aW9uXzU9Ci1PU19QdEZvbnRTZWxlY3Rpb25fNj1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX1B0Rm9yd2FyZFdpbmRvd0V2ZW50PQotT1NfUHRGb3J3YXJkV2luZG93RXZlbnRfMD1jYXN0PShQaFdpbmRvd0V2ZW50X3QgY29uc3QgKikKLQotT1NfUHRGcmFtZVNpemU9Ci1PU19QdEZyYW1lU2l6ZV8wPQotT1NfUHRGcmFtZVNpemVfMT0KLU9TX1B0RnJhbWVTaXplXzI9Ci1PU19QdEZyYW1lU2l6ZV8zPQotT1NfUHRGcmFtZVNpemVfND0KLU9TX1B0RnJhbWVTaXplXzU9Ci0KLU9TX1B0R2V0QWJzUG9zaXRpb249Ci1PU19QdEdldEFic1Bvc2l0aW9uXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHZXRBYnNQb3NpdGlvbl8xPQotT1NfUHRHZXRBYnNQb3NpdGlvbl8yPQotCi1PU19QdEdldFJlc291cmNlcz0KLU9TX1B0R2V0UmVzb3VyY2VzXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHZXRSZXNvdXJjZXNfMT0KLU9TX1B0R2V0UmVzb3VyY2VzXzI9Y2FzdD0oUHRBcmdfdCAqKQotCi1PU19QdEdsb2JhbEZvY3VzTmV4dD0KLU9TX1B0R2xvYmFsRm9jdXNOZXh0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHbG9iYWxGb2N1c05leHRfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRHbG9iYWxGb2N1c05leHRDb250YWluZXI9Ci1PU19QdEdsb2JhbEZvY3VzTmV4dENvbnRhaW5lcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0R2xvYmFsRm9jdXNOZXh0Q29udGFpbmVyXzE9Y2FzdD0oUGhFdmVudF90ICopCi0KLU9TX1B0R2xvYmFsRm9jdXNQcmV2PQotT1NfUHRHbG9iYWxGb2N1c1ByZXZfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEdsb2JhbEZvY3VzUHJldl8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdEdsb2JhbEZvY3VzUHJldkNvbnRhaW5lcj0KLU9TX1B0R2xvYmFsRm9jdXNQcmV2Q29udGFpbmVyXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRHbG9iYWxGb2N1c1ByZXZDb250YWluZXJfMT1jYXN0PShQaEV2ZW50X3QgKikKLQotT1NfUHRHcm91cD1mbGFncz1jb25zdAotCi1PU19QdEhpdD0KLU9TX1B0SGl0XzA9Y2FzdD0oIFB0V2lkZ2V0X3QgKikKLU9TX1B0SGl0XzE9Ci1PU19QdEhpdF8yPWNhc3Q9KFBoUmVjdF90IGNvbnN0ICopCi0KLU9TX1B0SG9sZD0KLQotT1NfUHRJbmZsYXRlQmFsbG9vbj0KLU9TX1B0SW5mbGF0ZUJhbGxvb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdEluZmxhdGVCYWxsb29uXzE9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRJbmZsYXRlQmFsbG9vbl8yPQotT1NfUHRJbmZsYXRlQmFsbG9vbl8zPWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0SW5mbGF0ZUJhbGxvb25fND1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdEluZmxhdGVCYWxsb29uXzU9Y2FzdD0oUGdDb2xvcl90KQotT1NfUHRJbmZsYXRlQmFsbG9vbl82PWNhc3Q9KFBnQ29sb3JfdCkKLQotT1NfUHRJbml0PQotT1NfUHRJbml0XzA9Y2FzdD0oY2hhciBjb25zdCAqKQotCi1PU19QdElzRm9jdXNlZD0KLU9TX1B0SXNGb2N1c2VkXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdExhYmVsPWZsYWdzPWNvbnN0Ci0KLU9TX1B0TGVhdmU9Ci1PU19QdExlYXZlXzA9Ci0KLU9TX1B0TGlzdD1mbGFncz1jb25zdAotCi1PU19QdExpc3RBZGRJdGVtcz0KLU9TX1B0TGlzdEFkZEl0ZW1zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0QWRkSXRlbXNfMT1jYXN0PShjb25zdCBjaGFyICoqKQotT1NfUHRMaXN0QWRkSXRlbXNfMj0KLU9TX1B0TGlzdEFkZEl0ZW1zXzM9Ci0KLU9TX1B0TGlzdERlbGV0ZUFsbEl0ZW1zPQotT1NfUHRMaXN0RGVsZXRlQWxsSXRlbXNfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0TGlzdERlbGV0ZUl0ZW1Qb3M9Ci1PU19QdExpc3REZWxldGVJdGVtUG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0RGVsZXRlSXRlbVBvc18xPQotT1NfUHRMaXN0RGVsZXRlSXRlbVBvc18yPQotCi1PU19QdExpc3RHb3RvUG9zPQotT1NfUHRMaXN0R290b1Bvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdEdvdG9Qb3NfMT0KLQotT1NfUHRMaXN0SXRlbVBvcz0KLU9TX1B0TGlzdEl0ZW1Qb3NfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdExpc3RJdGVtUG9zXzE9Y2FzdD0oY29uc3QgY2hhciAqKQotCi1PU19QdExpc3RSZXBsYWNlSXRlbVBvcz0KLU9TX1B0TGlzdFJlcGxhY2VJdGVtUG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0UmVwbGFjZUl0ZW1Qb3NfMT1jYXN0PShjb25zdCBjaGFyICoqKQotT1NfUHRMaXN0UmVwbGFjZUl0ZW1Qb3NfMj0KLU9TX1B0TGlzdFJlcGxhY2VJdGVtUG9zXzM9Ci0KLU9TX1B0TGlzdFNlbGVjdFBvcz0KLU9TX1B0TGlzdFNlbGVjdFBvc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0TGlzdFNlbGVjdFBvc18xPQotCi1PU19QdExpc3RVbnNlbGVjdFBvcz0KLU9TX1B0TGlzdFVuc2VsZWN0UG9zXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRMaXN0VW5zZWxlY3RQb3NfMT0KLQotT1NfUHRNYWluTG9vcD0KLQotT1NfUHRNZW51PWZsYWdzPWNvbnN0Ci0KLU9TX1B0TWVudUJhcj1mbGFncz1jb25zdAotCi1PU19QdE1lbnVCdXR0b249ZmxhZ3M9Y29uc3QKLQotT1NfUHRNdWx0aVRleHQ9ZmxhZ3M9Y29uc3QKLQotT1NfUHROZXh0VG9wTGV2ZWxXaWRnZXQ9Ci1PU19QdE5leHRUb3BMZXZlbFdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHROdW1lcmljSW50ZWdlcj1mbGFncz1jb25zdAotCi1PU19QdFBhbmU9ZmxhZ3M9Y29uc3QKLQotT1NfUHRQYW5lbEdyb3VwPWZsYWdzPWNvbnN0Ci0KLU9TX1B0UG9zaXRpb25NZW51PQotT1NfUHRQb3NpdGlvbk1lbnVfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFBvc2l0aW9uTWVudV8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdFByb2dyZXNzPWZsYWdzPWNvbnN0Ci0KLU9TX1B0UmVQYXJlbnRXaWRnZXQ9Ci1PU19QdFJlUGFyZW50V2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRSZVBhcmVudFdpZGdldF8xPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRSZWFsaXplV2lkZ2V0PQotT1NfUHRSZWFsaXplV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFJlZ2lvbj1mbGFncz1jb25zdAotCi1PU19QdFJlbGVhc2U9Ci0KLU9TX1B0UmVtb3ZlQ2FsbGJhY2s9Ci1PU19QdFJlbW92ZUNhbGxiYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRSZW1vdmVDYWxsYmFja18xPQotT1NfUHRSZW1vdmVDYWxsYmFja18yPWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLU9TX1B0UmVtb3ZlQ2FsbGJhY2tfMz1jYXN0PSh2b2lkICopCi0KLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcj0KLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl8xPQotT1NfUHRSZW1vdmVIb3RrZXlIYW5kbGVyXzI9Ci1PU19QdFJlbW92ZUhvdGtleUhhbmRsZXJfMz0KLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl80PWNhc3Q9KHZvaWQgKikKLU9TX1B0UmVtb3ZlSG90a2V5SGFuZGxlcl81PWNhc3Q9KFB0Q2FsbGJhY2tGX3QgKikKLQotT1NfUHRTY3JvbGxBcmVhPWZsYWdzPWNvbnN0Ci0KLU9TX1B0U2Nyb2xsQ29udGFpbmVyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0U2Nyb2xsYmFyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0U2VuZEV2ZW50VG9XaWRnZXQ9Ci1PU19QdFNlbmRFdmVudFRvV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRTZW5kRXZlbnRUb1dpZGdldF8xPWNhc3Q9KFBoRXZlbnRfdCAqKQotCi1PU19QdFNlcGFyYXRvcj1mbGFncz1jb25zdAotCi1PU19QdFNldEFyZWFGcm9tV2lkZ2V0Q2FudmFzPQotT1NfUHRTZXRBcmVhRnJvbVdpZGdldENhbnZhc18wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0U2V0QXJlYUZyb21XaWRnZXRDYW52YXNfMT0KLU9TX1B0U2V0QXJlYUZyb21XaWRnZXRDYW52YXNfMj0KLQotT1NfUHRTZXRQYXJlbnRXaWRnZXQ9Ci1PU19QdFNldFBhcmVudFdpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRTZXRSZXNvdXJjZT0KLU9TX1B0U2V0UmVzb3VyY2VfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFNldFJlc291cmNlXzE9Ci1PU19QdFNldFJlc291cmNlXzI9Ci1PU19QdFNldFJlc291cmNlXzM9Ci0KLU9TX1B0U2V0UmVzb3VyY2VzPQotT1NfUHRTZXRSZXNvdXJjZXNfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFNldFJlc291cmNlc18xPQotT1NfUHRTZXRSZXNvdXJjZXNfMj1jYXN0PShQdEFyZ190ICopCi0KLU9TX1B0U2xpZGVyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0U3VwZXJDbGFzc0RyYXc9Ci1PU19QdFN1cGVyQ2xhc3NEcmF3XzA9Y2FzdD0oUHRXaWRnZXRDbGFzc1JlZl90ICopCi1PU19QdFN1cGVyQ2xhc3NEcmF3XzE9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRTdXBlckNsYXNzRHJhd18yPWNhc3Q9KFBoVGlsZV90IGNvbnN0ICopCi0KLU9TX1B0U3luY1dpZGdldD0KLU9TX1B0U3luY1dpZGdldF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRUZXh0PWZsYWdzPWNvbnN0Ci0KLU9TX1B0VGV4dEdldFNlbGVjdGlvbj0KLU9TX1B0VGV4dEdldFNlbGVjdGlvbl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0VGV4dEdldFNlbGVjdGlvbl8xPQotT1NfUHRUZXh0R2V0U2VsZWN0aW9uXzI9Ci0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJST0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV8xPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSUlJXzI9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJSUlfMz0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV80PWNhc3Q9KGNoYXIgY29uc3QgKikKLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlJSV81PQotCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCST0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfMT0KLU9TX1B0VGV4dE1vZGlmeVRleHRfX0lJSUlfM0JJXzI9Ci1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV8zPQotT1NfUHRUZXh0TW9kaWZ5VGV4dF9fSUlJSV8zQklfND1jYXN0PShjaGFyIGNvbnN0ICopCi1PU19QdFRleHRNb2RpZnlUZXh0X19JSUlJXzNCSV81PQotCi1PU19QdFRleHRTZXRTZWxlY3Rpb249Ci1PU19QdFRleHRTZXRTZWxlY3Rpb25fMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFRleHRTZXRTZWxlY3Rpb25fMT0KLU9TX1B0VGV4dFNldFNlbGVjdGlvbl8yPQotCi1PU19QdFRpbWVyPWZsYWdzPWNvbnN0Ci0KLU9TX1B0VG9nZ2xlQnV0dG9uPWZsYWdzPWNvbnN0Ci0KLU9TX1B0VG9vbGJhcj1mbGFncz1jb25zdAotCi1PU19QdFVuYmxvY2tXaW5kb3dzPQotT1NfUHRVbmJsb2NrV2luZG93c18wPWNhc3Q9KFB0QmxvY2tlZExpc3RfdCAqKQotCi1PU19QdFVucmVhbGl6ZVdpZGdldD0KLU9TX1B0VW5yZWFsaXplV2lkZ2V0XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFZhbGlkUGFyZW50PQotT1NfUHRWYWxpZFBhcmVudF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0VmFsaWRQYXJlbnRfMT1jYXN0PShQdFdpZGdldENsYXNzUmVmX3QgKikKLQotT1NfUHRXZWJDbGllbnQ9ZmxhZ3M9Y29uc3QKLQotT1NfUHRXaWRnZXRBcmVhPQotT1NfUHRXaWRnZXRBcmVhXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRBcmVhXzE9Y2FzdD0oUGhBcmVhX3QgKikKLQotT1NfUHRXaWRnZXRCcm90aGVyQmVoaW5kPQotT1NfUHRXaWRnZXRCcm90aGVyQmVoaW5kXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldEJyb3RoZXJJbkZyb250PQotT1NfUHRXaWRnZXRCcm90aGVySW5Gcm9udF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRDYW52YXNfX0lJPQotT1NfUHRXaWRnZXRDYW52YXNfX0lJXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotT1NfUHRXaWRnZXRDYW52YXNfX0lJXzE9Y2FzdD0oUGhSZWN0X3QgKikKLQotT1NfUHRXaWRnZXRDYW52YXNfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMj0KLU9TX1B0V2lkZ2V0Q2FudmFzX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldENhbnZhc19fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yXzE9Ci0KLU9TX1B0V2lkZ2V0Q2hpbGRCYWNrPQotT1NfUHRXaWRnZXRDaGlsZEJhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0Q2hpbGRGcm9udD0KLU9TX1B0V2lkZ2V0Q2hpbGRGcm9udF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaWRnZXRDbGFzcz0KLU9TX1B0V2lkZ2V0Q2xhc3NfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0RXh0ZW50X19JST0KLU9TX1B0V2lkZ2V0RXh0ZW50X19JSV8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0RXh0ZW50X19JSV8xPQotCi1PU19QdFdpZGdldEV4dGVudF9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8yPQotT1NfUHRXaWRnZXRFeHRlbnRfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0RXh0ZW50X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJfMT0KLQotT1NfUHRXaWRnZXRGbGFncz0KLU9TX1B0V2lkZ2V0RmxhZ3NfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0SW5zZXJ0PQotT1NfUHRXaWRnZXRJbnNlcnRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldEluc2VydF8xPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0SW5zZXJ0XzI9Ci0KLU9TX1B0V2lkZ2V0SXNDbGFzc01lbWJlcj0KLU9TX1B0V2lkZ2V0SXNDbGFzc01lbWJlcl8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLU9TX1B0V2lkZ2V0SXNDbGFzc01lbWJlcl8xPWNhc3Q9KFB0V2lkZ2V0Q2xhc3NSZWZfdCAqKQotCi1PU19QdFdpZGdldElzUmVhbGl6ZWQ9Ci1PU19QdFdpZGdldElzUmVhbGl6ZWRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0T2Zmc2V0PQotT1NfUHRXaWRnZXRPZmZzZXRfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldE9mZnNldF8xPWNhc3Q9KFBoUG9pbnRfdCAqKQotCi1PU19QdFdpZGdldFBhcmVudD0KLU9TX1B0V2lkZ2V0UGFyZW50XzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpZGdldFByZWZlcnJlZFNpemU9Ci1PU19QdFdpZGdldFByZWZlcnJlZFNpemVfMD1jYXN0PShQdFdpZGdldF90ICopCi1PU19QdFdpZGdldFByZWZlcnJlZFNpemVfMT1jYXN0PShQaERpbV90ICopCi0KLU9TX1B0V2lkZ2V0UmlkPQotT1NfUHRXaWRnZXRSaWRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0VG9CYWNrPQotT1NfUHRXaWRnZXRUb0JhY2tfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2lkZ2V0VG9Gcm9udD0KLU9TX1B0V2lkZ2V0VG9Gcm9udF8wPWNhc3Q9KFB0V2lkZ2V0X3QgKikKLQotT1NfUHRXaW5kb3c9ZmxhZ3M9Y29uc3QKLQotT1NfUHRXaW5kb3dGb2N1cz0KLU9TX1B0V2luZG93Rm9jdXNfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX1B0V2luZG93R2V0U3RhdGU9Ci1PU19QdFdpbmRvd0dldFN0YXRlXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpbmRvd1RvQmFjaz0KLU9TX1B0V2luZG93VG9CYWNrXzA9Y2FzdD0oUHRXaWRnZXRfdCAqKQotCi1PU19QdFdpbmRvd1RvRnJvbnQ9Ci1PU19QdFdpbmRvd1RvRnJvbnRfMD1jYXN0PShQdFdpZGdldF90ICopCi0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdBbHBoYV8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0IGluaXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhBcmVhXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQXJlYV8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhBcmVhXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckRlZl8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckRlZl8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckRlZl8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKiksZmxhZ3M9bm9fb3V0Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhQb2ludF8xdF8yST0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50XzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXRfMklfMj0KLQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKSxmbGFncz1ub19vdXQKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFBvaW50ZXJFdmVudF8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJPQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySV8wPWNhc3Q9KHZvaWQgKikKLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySV8yPQotCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRUZXh0Q2FsbGJhY2tfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRUZXh0Q2FsbGJhY2tfMXRfMklfMD1jYXN0PSh2b2lkICopCi1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRUZXh0Q2FsbGJhY2tfMXRfMklfMT1jYXN0PShjb25zdCB2b2lkICopLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJXzI9Ci0KLU9TX21lbW1vdmVfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkNsaWVudERhdGFfMXRfMkk9Ci1PU19tZW1tb3ZlX19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJDbGllbnREYXRhXzF0XzJJXzA9Y2FzdD0odm9pZCAqKQotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdF8ySV8xPWNhc3Q9Y29uc3Qgdm9pZCAqLGZsYWdzPW5vX291dAotT1NfbWVtbW92ZV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdF8ySV8yPWNhc3Q9c2l6ZV90Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX0ZvbnREZXRhaWxzXzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbiBpbml0Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnQWxwaGFfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BnTWFwXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDbGlwSGVhZGVyXzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXJfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoRXZlbnRfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhJbWFnZV8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoSW1hZ2VfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhLZXlFdmVudF8xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEtleUV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUmVjdF8xdF8ySUlfMT1jYXN0PShjb25zdCB2b2lkICopCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFJlY3RfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFRpbGVfMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhUaWxlXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFdpbmRvd0V2ZW50XzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoV2luZG93RXZlbnRfMXRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhXaW5kb3dFdmVudF8xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzA9Y2FzdD0odm9pZCAqKSxmbGFncz1ub19pbgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzE9Y2FzdD0oY29uc3Qgdm9pZCAqKQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRDYWxsYmFja0luZm9fMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRTY3JvbGxiYXJDYWxsYmFja18xdF8ySUlfMD1jYXN0PSh2b2lkICopLGZsYWdzPW5vX2luCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFNjcm9sbGJhckNhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkRhdGFSZXFDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYkRhdGFSZXFDYWxsYmFja18xdF8ySUlfMD1jYXN0PXZvaWQgKgotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViRGF0YVJlcUNhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXRfMklJPQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJNZXRhRGF0YUNhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViTWV0YURhdGFDYWxsYmFja18xdF8ySUlfMj0KLQotT1NfbWVtbW92ZV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJTdGF0dXNDYWxsYmFja18xdF8ySUk9Ci1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8wPWNhc3Q9dm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8xPWNhc3Q9Y29uc3Qgdm9pZCAqCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0XzJJSV8yPQotCi1PU19tZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYldpbmRvd0NhbGxiYWNrXzF0XzJJST0KLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzA9Y2FzdD12b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzE9Y2FzdD1jb25zdCB2b2lkICoKLU9TX21lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViV2luZG93Q2FsbGJhY2tfMXRfMklJXzI9Ci0KLU9TX21lbW1vdmVfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8yST0KLU9TX21lbW1vdmVfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySV8wPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9faW4KLU9TX21lbW1vdmVfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySV8xPWNhc3Q9KGNvbnN0IHZvaWQgKikKLU9TX21lbW1vdmVfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoQ2xpcEhlYWRlcl8ySV8yPQotCi1PU19zdHJkdXA9Ci1PU19zdHJkdXBfMD1jYXN0PShjb25zdCBjaGFyICopCi0KLU9TX3VuYW1lPQotT1NfdW5hbWVfMD1jYXN0PSh1dHNuYW1lICopCi0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0FscGhhXzF0PQotUGdBbHBoYV90X2FscGhhX29wPQotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfZGltX3c9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5kaW0udwotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfZGltX2g9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5kaW0uaAotUGdBbHBoYV90X3NyY19hbHBoYV9tYXBfYnBsPWFjY2Vzc29yPXNyY19hbHBoYV9tYXAuYnBsCi1QZ0FscGhhX3Rfc3JjX2FscGhhX21hcF9icHA9YWNjZXNzb3I9c3JjX2FscGhhX21hcC5icHAKLVBnQWxwaGFfdF9zcmNfYWxwaGFfbWFwX21hcD1hY2Nlc3Nvcj1zcmNfYWxwaGFfbWFwLm1hcCxjYXN0PShjaGFyICopCi1QZ0FscGhhX3Rfc3JjX2dsb2JhbF9hbHBoYT0KLVBnQWxwaGFfdF9kZXN0X2dsb2JhbF9hbHBoYT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ0Rpc3BsYXlTZXR0aW5nc18xdD0KLVBnRGlzcGxheVNldHRpbmdzX3RfbW9kZT0KLVBnRGlzcGxheVNldHRpbmdzX3RfeHJlcz0KLVBnRGlzcGxheVNldHRpbmdzX3RfeXJlcz0KLVBnRGlzcGxheVNldHRpbmdzX3RfcmVmcmVzaD0KLVBnRGlzcGxheVNldHRpbmdzX3RfZmxhZ3M9Ci1QZ0Rpc3BsYXlTZXR0aW5nc190X3Jlc2VydmVkPWNhc3Q9KGxvbmcgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QZ01hcF8xdD0KLVBnTWFwX3RfZGltX3c9YWNjZXNzb3I9ZGltLncKLVBnTWFwX3RfZGltX2g9YWNjZXNzb3I9ZGltLmgKLVBnTWFwX3RfYnBsPQotUGdNYXBfdF9icHA9Ci1QZ01hcF90X21hcD1jYXN0PShjaGFyICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGdWaWRlb01vZGVJbmZvXzF0PQotUGdWaWRlb01vZGVJbmZvX3Rfd2lkdGg9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9oZWlnaHQ9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9iaXRzX3Blcl9waXhlbD0KLVBnVmlkZW9Nb2RlSW5mb190X2J5dGVzX3Blcl9zY2FubGluZT0KLVBnVmlkZW9Nb2RlSW5mb190X3R5cGU9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczE9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczI9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczM9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczQ9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczU9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9tb2RlX2NhcGFiaWxpdGllczY9Ci1QZ1ZpZGVvTW9kZUluZm9fdF9yZWZyZXNoX3JhdGVzPWNhc3Q9KGNoYXIgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEFyZWFfMXQ9Ci1QaEFyZWFfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhBcmVhX3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoQXJlYV90X3NpemVfdz1hY2Nlc3Nvcj1zaXplLncKLVBoQXJlYV90X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaENsaXBIZWFkZXI9Ci1QaENsaXBIZWFkZXJfdHlwZT1jYXN0PShQaENsaXBIZWFkZXIpCi1QaENsaXBIZWFkZXJfbGVuZ3RoPQotUGhDbGlwSGVhZGVyX3plcm89Ci1QaENsaXBIZWFkZXJfZGF0YT1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhDdXJzb3JEZWZfMXQ9Ci1QaEN1cnNvckRlZl90X2hkcl9sZW49YWNjZXNzb3I9aGRyLmxlbgotUGhDdXJzb3JEZWZfdF9oZHJfdHlwZT1hY2Nlc3Nvcj1oZHIudHlwZQotUGhDdXJzb3JEZWZfdF9zaXplMV94PWFjY2Vzc29yPXNpemUxLngKLVBoQ3Vyc29yRGVmX3Rfc2l6ZTFfeT1hY2Nlc3Nvcj1zaXplMS55Ci1QaEN1cnNvckRlZl90X29mZnNldDFfeD1hY2Nlc3Nvcj1vZmZzZXQxLngKLVBoQ3Vyc29yRGVmX3Rfb2Zmc2V0MV95PWFjY2Vzc29yPW9mZnNldDEueQotUGhDdXJzb3JEZWZfdF9jb2xvcjE9Ci1QaEN1cnNvckRlZl90X2J5dGVzcGVybGluZTE9Ci1QaEN1cnNvckRlZl90X3NpemUyX3g9YWNjZXNzb3I9c2l6ZTIueAotUGhDdXJzb3JEZWZfdF9zaXplMl95PWFjY2Vzc29yPXNpemUyLnkKLVBoQ3Vyc29yRGVmX3Rfb2Zmc2V0Ml94PWFjY2Vzc29yPW9mZnNldDIueAotUGhDdXJzb3JEZWZfdF9vZmZzZXQyX3k9YWNjZXNzb3I9b2Zmc2V0Mi55Ci1QaEN1cnNvckRlZl90X2NvbG9yMj0KLVBoQ3Vyc29yRGVmX3RfYnl0ZXNwZXJsaW5lMj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEN1cnNvckluZm9fMXQ9Ci1QaEN1cnNvckluZm9fdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhDdXJzb3JJbmZvX3RfcG9zX3k9YWNjZXNzb3I9cG9zLnkKLVBoQ3Vyc29ySW5mb190X3JlZ2lvbj0KLVBoQ3Vyc29ySW5mb190X2lnX3JlZ2lvbj0KLVBoQ3Vyc29ySW5mb190X2NvbG9yPQotUGhDdXJzb3JJbmZvX3RfbGFzdF9wcmVzc194PWFjY2Vzc29yPWxhc3RfcHJlc3MueAotUGhDdXJzb3JJbmZvX3RfbGFzdF9wcmVzc195PWFjY2Vzc29yPWxhc3RfcHJlc3MueQotUGhDdXJzb3JJbmZvX3RfbXNlYz0KLVBoQ3Vyc29ySW5mb190X3N0ZWFkeV94PWFjY2Vzc29yPXN0ZWFkeS54Ci1QaEN1cnNvckluZm9fdF9zdGVhZHlfeT1hY2Nlc3Nvcj1zdGVhZHkueQotUGhDdXJzb3JJbmZvX3RfZHJhZ2dlcj0KLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfdWxfeD1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LnVsLngKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfdWxfeT1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LnVsLnkKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfbHJfeD1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LmxyLngKLVBoQ3Vyc29ySW5mb190X2RyYWdfYm91bmRhcnlfbHJfeT1hY2Nlc3Nvcj1kcmFnX2JvdW5kYXJ5LmxyLnkKLVBoQ3Vyc29ySW5mb190X3BoYW50b21fcmlkPQotUGhDdXJzb3JJbmZvX3RfdHlwZT0KLVBoQ3Vyc29ySW5mb190X2lnPQotUGhDdXJzb3JJbmZvX3RfYnV0dG9uX3N0YXRlPQotUGhDdXJzb3JJbmZvX3RfY2xpY2tfY291bnQ9Ci1QaEN1cnNvckluZm9fdF96ZXJvMT0KLVBoQ3Vyc29ySW5mb190X2tleV9tb2RzPQotUGhDdXJzb3JJbmZvX3RfemVybzI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhEaW1fMXQ9Ci1QaERpbV90X3c9Ci1QaERpbV90X2g9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhFdmVudF8xdD0KLVBoRXZlbnRfdF90eXBlPQotUGhFdmVudF90X3N1YnR5cGU9Ci1QaEV2ZW50X3RfcHJvY2Vzc2luZ19mbGFncz0KLVBoRXZlbnRfdF9lbWl0dGVyX3JpZD1hY2Nlc3Nvcj1lbWl0dGVyLnJpZAotUGhFdmVudF90X2VtaXR0ZXJfaGFuZGxlPWFjY2Vzc29yPWVtaXR0ZXIuaGFuZGxlCi1QaEV2ZW50X3RfY29sbGVjdG9yX3JpZD1hY2Nlc3Nvcj1jb2xsZWN0b3IucmlkCi1QaEV2ZW50X3RfY29sbGVjdG9yX2hhbmRsZT1hY2Nlc3Nvcj1jb2xsZWN0b3IuaGFuZGxlCi1QaEV2ZW50X3RfaW5wdXRfZ3JvdXA9Ci1QaEV2ZW50X3RfZmxhZ3M9Ci1QaEV2ZW50X3RfdGltZXN0YW1wPQotUGhFdmVudF90X3RyYW5zbGF0aW9uX3g9YWNjZXNzb3I9dHJhbnNsYXRpb24ueAotUGhFdmVudF90X3RyYW5zbGF0aW9uX3k9YWNjZXNzb3I9dHJhbnNsYXRpb24ueQotUGhFdmVudF90X251bV9yZWN0cz0KLVBoRXZlbnRfdF9kYXRhX2xlbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaEltYWdlXzF0PQotUGhJbWFnZV90X3R5cGU9Ci1QaEltYWdlX3RfaW1hZ2VfdGFnPQotUGhJbWFnZV90X2JwbD0KLVBoSW1hZ2VfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QaEltYWdlX3Rfc2l6ZV9oPWFjY2Vzc29yPXNpemUuaAotUGhJbWFnZV90X3BhbGV0dGVfdGFnPQotUGhJbWFnZV90X2NvbG9ycz0KLVBoSW1hZ2VfdF9hbHBoYT1jYXN0PShQZ0FscGhhX3QgKikKLVBoSW1hZ2VfdF90cmFuc3BhcmVudD0KLVBoSW1hZ2VfdF9mb3JtYXQ9Ci1QaEltYWdlX3RfZmxhZ3M9Ci1QaEltYWdlX3RfZ2hvc3RfYnBsPQotUGhJbWFnZV90X3NwYXJlMT0KLVBoSW1hZ2VfdF9naG9zdF9iaXRtYXA9Y2FzdD0oY2hhciAqKQotUGhJbWFnZV90X21hc2tfYnBsPQotUGhJbWFnZV90X21hc2tfYm09Y2FzdD0oY2hhciAqKQotUGhJbWFnZV90X3BhbGV0dGU9Y2FzdD0oUGdDb2xvcl90ICopCi1QaEltYWdlX3RfaW1hZ2U9Y2FzdD0oY2hhciAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoS2V5RXZlbnRfMXQ9Ci1QaEtleUV2ZW50X3Rfa2V5X21vZHM9Ci1QaEtleUV2ZW50X3Rfa2V5X2ZsYWdzPQotUGhLZXlFdmVudF90X2tleV9jYXA9Ci1QaEtleUV2ZW50X3Rfa2V5X3N5bT0KLVBoS2V5RXZlbnRfdF9rZXlfc2Nhbj0KLVBoS2V5RXZlbnRfdF9rZXlfemVybz0KLVBoS2V5RXZlbnRfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhLZXlFdmVudF90X3Bvc195PWFjY2Vzc29yPXBvcy55Ci1QaEtleUV2ZW50X3RfYnV0dG9uX3N0YXRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRfMXQ9Ci1QaFBvaW50X3RfeD0KLVBoUG9pbnRfdF95PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoUG9pbnRlckV2ZW50XzF0PQotUGhQb2ludGVyRXZlbnRfdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUGhQb2ludGVyRXZlbnRfdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUGhQb2ludGVyRXZlbnRfdF9idXR0b25zPQotUGhQb2ludGVyRXZlbnRfdF9idXR0b25fc3RhdGU9Ci1QaFBvaW50ZXJFdmVudF90X2NsaWNrX2NvdW50PQotUGhQb2ludGVyRXZlbnRfdF9mbGFncz0KLVBoUG9pbnRlckV2ZW50X3Rfej0KLVBoUG9pbnRlckV2ZW50X3Rfa2V5X21vZHM9Ci1QaFBvaW50ZXJFdmVudF90X3plcm89Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWN0XzF0PQotUGhSZWN0X3RfdWxfeD1hY2Nlc3Nvcj11bC54Ci1QaFJlY3RfdF91bF95PWFjY2Vzc29yPXVsLnkKLVBoUmVjdF90X2xyX3g9YWNjZXNzb3I9bHIueAotUGhSZWN0X3RfbHJfeT1hY2Nlc3Nvcj1sci55Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUGhSZWdpb25fMXQ9Ci1QaFJlZ2lvbl90X3JpZD0KLVBoUmVnaW9uX3RfaGFuZGxlPQotUGhSZWdpb25fdF9vd25lcj0KLVBoUmVnaW9uX3RfZmxhZ3M9Ci1QaFJlZ2lvbl90X3N0YXRlPQotUGhSZWdpb25fdF9ldmVudHNfc2Vuc2U9Ci1QaFJlZ2lvbl90X2V2ZW50c19vcGFxdWU9Ci1QaFJlZ2lvbl90X29yaWdpbl94PWFjY2Vzc29yPW9yaWdpbi54Ci1QaFJlZ2lvbl90X29yaWdpbl95PWFjY2Vzc29yPW9yaWdpbi55Ci1QaFJlZ2lvbl90X3BhcmVudD0KLVBoUmVnaW9uX3RfY2hpbGQ9Ci1QaFJlZ2lvbl90X2Jyb19pbl9mcm9udD0KLVBoUmVnaW9uX3RfYnJvX2JlaGluZD0KLVBoUmVnaW9uX3RfY3Vyc29yX2NvbG9yPQotUGhSZWdpb25fdF9pbnB1dF9ncm91cD0KLVBoUmVnaW9uX3RfZGF0YV9sZW49Ci1QaFJlZ2lvbl90X2N1cnNvcl90eXBlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1BoVGlsZV8xdD0KLVBoVGlsZV90X3JlY3RfdWxfeD1hY2Nlc3Nvcj1yZWN0LnVsLngKLVBoVGlsZV90X3JlY3RfdWxfeT1hY2Nlc3Nvcj1yZWN0LnVsLnkKLVBoVGlsZV90X3JlY3RfbHJfeD1hY2Nlc3Nvcj1yZWN0LmxyLngKLVBoVGlsZV90X3JlY3RfbHJfeT1hY2Nlc3Nvcj1yZWN0LmxyLnkKLVBoVGlsZV90X25leHQ9Y2FzdD0oUGhUaWxlX3QgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QaFdpbmRvd0V2ZW50XzF0PQotUGhXaW5kb3dFdmVudF90X2V2ZW50X2Y9Ci1QaFdpbmRvd0V2ZW50X3Rfc3RhdGVfZj0KLVBoV2luZG93RXZlbnRfdF9yaWQ9Ci1QaFdpbmRvd0V2ZW50X3RfcG9zX3g9YWNjZXNzb3I9cG9zLngKLVBoV2luZG93RXZlbnRfdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUGhXaW5kb3dFdmVudF90X3NpemVfdz1hY2Nlc3Nvcj1zaXplLncKLVBoV2luZG93RXZlbnRfdF9zaXplX2g9YWNjZXNzb3I9c2l6ZS5oCi1QaFdpbmRvd0V2ZW50X3RfZXZlbnRfc3RhdGU9Ci1QaFdpbmRvd0V2ZW50X3RfaW5wdXRfZ3JvdXA9Ci1QaFdpbmRvd0V2ZW50X3RfcnN2ZDA9YWNjZXNzb3I9cnN2ZFswXQotUGhXaW5kb3dFdmVudF90X3JzdmQxPWFjY2Vzc29yPXJzdmRbMV0KLVBoV2luZG93RXZlbnRfdF9yc3ZkMj1hY2Nlc3Nvcj1yc3ZkWzJdCi1QaFdpbmRvd0V2ZW50X3RfcnN2ZDM9YWNjZXNzb3I9cnN2ZFszXQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0Q2FsbGJhY2tJbmZvXzF0PQotUHRDYWxsYmFja0luZm9fdF9yZWFzb249Ci1QdENhbGxiYWNrSW5mb190X3JlYXNvbl9zdWJ0eXBlPQotUHRDYWxsYmFja0luZm9fdF9ldmVudD1jYXN0PShQaEV2ZW50X3QgKikKLVB0Q2FsbGJhY2tJbmZvX3RfY2JkYXRhPWNhc3Q9KHZvaWQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdENvbG9yU2VsZWN0SW5mb18xdD0KLVB0Q29sb3JTZWxlY3RJbmZvX3RfZmxhZ3M9Ci1QdENvbG9yU2VsZWN0SW5mb190X25zZWxlY3RvcnM9Ci1QdENvbG9yU2VsZWN0SW5mb190X25jb2xvcl9tb2RlbHM9Ci1QdENvbG9yU2VsZWN0SW5mb190X2NvbG9yX21vZGVscz1jYXN0PShQZ0NvbG9yTW9kZWxfdCAqKikKLVB0Q29sb3JTZWxlY3RJbmZvX3Rfc2VsZWN0b3JzPWNhc3Q9KFB0Q29sb3JTZWxlY3RvclNwZWNfdCAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9wb3NfeD1hY2Nlc3Nvcj1wb3MueAotUHRDb2xvclNlbGVjdEluZm9fdF9wb3NfeT1hY2Nlc3Nvcj1wb3MueQotUHRDb2xvclNlbGVjdEluZm9fdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QdENvbG9yU2VsZWN0SW5mb190X3NpemVfaD1hY2Nlc3Nvcj1zaXplLmgKLVB0Q29sb3JTZWxlY3RJbmZvX3RfcGFsZXR0ZT1hY2Nlc3Nvcj1wYWxldHRlLmluc3RhbmNlLGNhc3Q9KHZvaWQgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfYWNjZXB0X3RleHQ9Y2FzdD0oY2hhciAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9kaXNtaXNzX3RleHQ9Y2FzdD0oY2hhciAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9hY2NlcHRfZGlzbWlzc190ZXh0PWNhc3Q9KGNoYXIgKikKLVB0Q29sb3JTZWxlY3RJbmZvX3RfYXBwbHlfZj1jYXN0PSh2b2lkICopCi1QdENvbG9yU2VsZWN0SW5mb190X2RhdGE9Y2FzdD0odm9pZCAqKQotUHRDb2xvclNlbGVjdEluZm9fdF9yZ2I9Ci1QdENvbG9yU2VsZWN0SW5mb190X2RpYWxvZz1jYXN0PShQdFdpZGdldF90ICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRGaWxlU2VsZWN0aW9uSW5mb18xdD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9yZXQ9Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfcGF0aD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9kaW09Ci1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfcG9zPQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2Zvcm1hdD0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF9mc3BlYz0KLVB0RmlsZVNlbGVjdGlvbkluZm9fdF91c2VyX2RhdGE9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2NvbmZpcm1fZGlzcGxheT1jYXN0PSh2b2lkICopCi1QdEZpbGVTZWxlY3Rpb25JbmZvX3RfY29uZmlybV9zZWxlY3Rpb249Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X25ld19kaXJlY3Rvcnk9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2J0bjE9Y2FzdD0oY2hhciAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2J0bjI9Y2FzdD0oY2hhciAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X251bV9hcmdzPQotUHRGaWxlU2VsZWN0aW9uSW5mb190X2FyZ3M9Y2FzdD0odm9pZCAqKQotUHRGaWxlU2VsZWN0aW9uSW5mb190X21pbmZvPWNhc3Q9KFB0RmlsZVNlbGVjdG9ySW5mb190ICopCi1QdEZpbGVTZWxlY3Rpb25JbmZvX3Rfc3BhcmU9Y2FzdD0obG9uZyAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0U2Nyb2xsYmFyQ2FsbGJhY2tfMXQ9Ci1QdFNjcm9sbGJhckNhbGxiYWNrX3RfYWN0aW9uPQotUHRTY3JvbGxiYXJDYWxsYmFja190X3Bvc2l0aW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0VGV4dENhbGxiYWNrXzF0PQotUHRUZXh0Q2FsbGJhY2tfdF9zdGFydF9wb3M9Ci1QdFRleHRDYWxsYmFja190X2VuZF9wb3M9Ci1QdFRleHRDYWxsYmFja190X2N1cl9pbnNlcnQ9Ci1QdFRleHRDYWxsYmFja190X25ld19pbnNlcnQ9Ci1QdFRleHRDYWxsYmFja190X2xlbmd0aD0KLVB0VGV4dENhbGxiYWNrX3RfcmVzZXJ2ZWQ9Ci1QdFRleHRDYWxsYmFja190X3RleHQ9Y2FzdD0oY2hhciAqKQotUHRUZXh0Q2FsbGJhY2tfdF9kb2l0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViQ2xpZW50RGF0YV8xdD0KLVB0V2ViQ2xpZW50RGF0YV90X3R5cGU9Ci1QdFdlYkNsaWVudERhdGFfdF91cmw9Ci1QdFdlYkNsaWVudERhdGFfdF9sZW5ndGg9Ci1QdFdlYkNsaWVudERhdGFfdF9kYXRhPWNhc3Q9Y2hhciAqCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJEYXRhUmVxQ2FsbGJhY2tfMXQ9Ci1QdFdlYkRhdGFSZXFDYWxsYmFja190X3R5cGU9Ci1QdFdlYkRhdGFSZXFDYWxsYmFja190X2xlbmd0aD0KLVB0V2ViRGF0YVJlcUNhbGxiYWNrX3RfdXJsPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX1B0V2ViTWV0YURhdGFDYWxsYmFja18xdD0KLVB0V2ViTWV0YURhdGFDYWxsYmFja190X25hbWU9Ci1QdFdlYk1ldGFEYXRhQ2FsbGJhY2tfdF92YWx1ZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3Bob3Rvbl9QdFdlYlN0YXR1c0NhbGxiYWNrXzF0PQotUHRXZWJTdGF0dXNDYWxsYmFja190X2Rlc2M9Ci1QdFdlYlN0YXR1c0NhbGxiYWNrX3RfdHlwZT0KLVB0V2ViU3RhdHVzQ2FsbGJhY2tfdF91cmw9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9waG90b25fUHRXZWJXaW5kb3dDYWxsYmFja18xdD0KLVB0V2ViV2luZG93Q2FsbGJhY2tfdF9zaXplX3c9YWNjZXNzb3I9c2l6ZS53Ci1QdFdlYldpbmRvd0NhbGxiYWNrX3Rfc2l6ZV9oPWFjY2Vzc29yPXNpemUuaAotUHRXZWJXaW5kb3dDYWxsYmFja190X2ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfcGhvdG9uX3V0c25hbWU9Ci11dHNuYW1lX3N5c25hbWU9Ci11dHNuYW1lX25vZGVuYW1lPQotdXRzbmFtZV9yZWxlYXNlPQotdXRzbmFtZV92ZXJzaW9uPQotdXRzbmFtZV9tYWNoaW5lPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGNjYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X2NvcHlyaWdodD0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIFwKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuIFwKLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuIFwKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG4gXAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuIFwKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcbiBcCi0qXG4gXAotKiBDb250cmlidXRvcnM6XG4gXAotKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbiBcCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuCi1zd3RfcHJvcGVydGllc19jb3B5cmlnaHQ9IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXAotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi0jXG5cCi0jIENvbnRyaWJ1dG9yczpcblwKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuXAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3d0X21haW5fY2xhc3Nlcz1cCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5ndGsuQVRLLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9ndGsvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvY2FyYm9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jZGUuQ0RFLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQcm9ncmFtL2NkZS9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ25vbWUuR05PTUUsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFByb2dyYW0vZ25vbWUvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmd0ay5HVEssLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL21vdGlmX2d0ay9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuZ3RrLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9ndGsvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vdGlmLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9tb3RpZi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYS5YUENPTSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgTW96aWxsYS9jb21tb24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGEuWFBDT01Jbml0LC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBNb3ppbGxhL2NvbW1vbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTSwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLnBob3Rvbi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvcGhvdG9uL2xpYnJhcnkvLFwKLW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUywuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmdkaXAuR2RpcCwuLi9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgUEkvd2luMzIvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhaXJvLkNhaXJvLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS9jYWlyby9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmdseC5HTFgsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9wZW5HTC9nbHgvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC53aW4zMi5XR0wsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9wZW5HTC93aW4zMi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmNhcmJvbi5BR0wsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIE9wZW5HTC9jYXJib24vbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkMsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2NvbW1vbi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud3BmLk9TLC4uL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVCBQSS93cGYvbGlicmFyeS8sXAotb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndwZi5DT00sLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL3dwZi9saWJyYXJ5LyxcCi1vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY29jb2EuQ29jb2EsLi4vb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUIFBJL2NhcmJvbi9saWJyYXJ5LwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNkMjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMPQotQUNDRUxfZlZpcnQ9Ci1BQ0NFTF9rZXk9Ci1BQ0NFTF9jbWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ1RDVFg9Ci1BQ1RDVFhfY2JTaXplPQotQUNUQ1RYX2R3RmxhZ3M9Ci1BQ1RDVFhfbHBTb3VyY2U9Y2FzdD0oTFBDVFNUUikKLUFDVENUWF93UHJvY2Vzc29yQXJjaGl0ZWN0dXJlPQotQUNUQ1RYX3dMYW5nSWQ9Ci1BQ1RDVFhfbHBBc3NlbWJseURpcmVjdG9yeT1jYXN0PShMUENUU1RSKQotQUNUQ1RYX2xwUmVzb3VyY2VOYW1lPWNhc3Q9KExQQ1RTVFIpCi1BQ1RDVFhfbHBBcHBsaWNhdGlvbk5hbWU9Y2FzdD0oTFBDVFNUUikKLUFDVENUWF9oTW9kdWxlPWNhc3Q9SE1PRFVMRQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQPQotQklUTUFQX2JtVHlwZT0KLUJJVE1BUF9ibVdpZHRoPQotQklUTUFQX2JtSGVpZ2h0PQotQklUTUFQX2JtV2lkdGhCeXRlcz0KLUJJVE1BUF9ibVBsYW5lcz0KLUJJVE1BUF9ibUJpdHNQaXhlbD0KLUJJVE1BUF9ibUJpdHM9Y2FzdD0oTFBWT0lEKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUj0KLUJJVE1BUElORk9IRUFERVJfYmlTaXplPQotQklUTUFQSU5GT0hFQURFUl9iaVdpZHRoPQotQklUTUFQSU5GT0hFQURFUl9iaUhlaWdodD0KLUJJVE1BUElORk9IRUFERVJfYmlQbGFuZXM9Ci1CSVRNQVBJTkZPSEVBREVSX2JpQml0Q291bnQ9Ci1CSVRNQVBJTkZPSEVBREVSX2JpQ29tcHJlc3Npb249Ci1CSVRNQVBJTkZPSEVBREVSX2JpU2l6ZUltYWdlPQotQklUTUFQSU5GT0hFQURFUl9iaVhQZWxzUGVyTWV0ZXI9Ci1CSVRNQVBJTkZPSEVBREVSX2JpWVBlbHNQZXJNZXRlcj0KLUJJVE1BUElORk9IRUFERVJfYmlDbHJVc2VkPQotQklUTUFQSU5GT0hFQURFUl9iaUNsckltcG9ydGFudD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JMRU5ERlVOQ1RJT049Ci1CTEVOREZVTkNUSU9OX0JsZW5kT3A9Ci1CTEVOREZVTkNUSU9OX0JsZW5kRmxhZ3M9Ci1CTEVOREZVTkNUSU9OX1NvdXJjZUNvbnN0YW50QWxwaGE9Ci1CTEVOREZVTkNUSU9OX0FscGhhRm9ybWF0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlBfMVBBSU5UUEFSQU1TPQotQlBfUEFJTlRQQVJBTVNfY2JTaXplPQotQlBfUEFJTlRQQVJBTVNfZHdGbGFncz0KLUJQX1BBSU5UUEFSQU1TX3ByY0V4Y2x1ZGU9Y2FzdD1SRUNUKgotQlBfUEFJTlRQQVJBTVNfcEJsZW5kRnVuY3Rpb249Y2FzdD1CTEVOREZVTkNUSU9OKgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlJPV1NFSU5GTz0KLUJST1dTRUlORk9faHduZE93bmVyPWNhc3Q9KEhXTkQpCi1CUk9XU0VJTkZPX3BpZGxSb290PWNhc3Q9KExQQ0lURU1JRExJU1QpCi1CUk9XU0VJTkZPX3BzekRpc3BsYXlOYW1lPWNhc3Q9KExQVFNUUikKLUJST1dTRUlORk9fbHBzelRpdGxlPWNhc3Q9KExQQ1RTVFIpCi1CUk9XU0VJTkZPX3VsRmxhZ3M9Ci1CUk9XU0VJTkZPX2xwZm49Y2FzdD0oQkZGQ0FMTEJBQ0spCi1CUk9XU0VJTkZPX2xQYXJhbT0KLUJST1dTRUlORk9faUltYWdlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1Q9Ci1CVVRUT05fSU1BR0VMSVNUX2hpbWw9Y2FzdD1ISU1BR0VMSVNUCi1CVVRUT05fSU1BR0VMSVNUX21hcmdpbl9sZWZ0PWFjY2Vzc29yPW1hcmdpbi5sZWZ0LGNhc3Q9TE9ORwotQlVUVE9OX0lNQUdFTElTVF9tYXJnaW5fdG9wPWFjY2Vzc29yPW1hcmdpbi50b3AsY2FzdD1MT05HCi1CVVRUT05fSU1BR0VMSVNUX21hcmdpbl9yaWdodD1hY2Nlc3Nvcj1tYXJnaW4ucmlnaHQsY2FzdD1MT05HCi1CVVRUT05fSU1BR0VMSVNUX21hcmdpbl9ib3R0b209YWNjZXNzb3I9bWFyZ2luLmJvdHRvbSxjYXN0PUxPTkcKLUJVVFRPTl9JTUFHRUxJU1RfdUFsaWduPWNhc3Q9VUlOVAotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQ0hPT1NFQ09MT1I9Ci1DSE9PU0VDT0xPUl9sU3RydWN0U2l6ZT0KLUNIT09TRUNPTE9SX2h3bmRPd25lcj1jYXN0PShIV05EKQotQ0hPT1NFQ09MT1JfaEluc3RhbmNlPWNhc3Q9KEhBTkRMRSkKLUNIT09TRUNPTE9SX3JnYlJlc3VsdD0KLUNIT09TRUNPTE9SX2xwQ3VzdENvbG9ycz1jYXN0PShDT0xPUlJFRiAqKQotQ0hPT1NFQ09MT1JfRmxhZ3M9Ci1DSE9PU0VDT0xPUl9sQ3VzdERhdGE9Ci1DSE9PU0VDT0xPUl9scGZuSG9vaz1jYXN0PShMUENDSE9PS1BST0MpCi1DSE9PU0VDT0xPUl9scFRlbXBsYXRlTmFtZT1jYXN0PShMUENUU1RSKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQ0hPT1NFRk9OVD0KLUNIT09TRUZPTlRfbFN0cnVjdFNpemU9Ci1DSE9PU0VGT05UX2h3bmRPd25lcj1jYXN0PShIV05EKQotQ0hPT1NFRk9OVF9oREM9Y2FzdD0oSERDKQotQ0hPT1NFRk9OVF9scExvZ0ZvbnQ9Y2FzdD0oTFBMT0dGT05UKQotQ0hPT1NFRk9OVF9pUG9pbnRTaXplPQotQ0hPT1NFRk9OVF9GbGFncz0KLUNIT09TRUZPTlRfcmdiQ29sb3JzPQotQ0hPT1NFRk9OVF9sQ3VzdERhdGE9Ci1DSE9PU0VGT05UX2xwZm5Ib29rPWNhc3Q9KExQQ0ZIT09LUFJPQykKLUNIT09TRUZPTlRfbHBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLUNIT09TRUZPTlRfaEluc3RhbmNlPWNhc3Q9KEhJTlNUQU5DRSkKLUNIT09TRUZPTlRfbHBzelN0eWxlPWNhc3Q9KExQVFNUUikKLUNIT09TRUZPTlRfbkZvbnRUeXBlPQotQ0hPT1NFRk9OVF9uU2l6ZU1pbj0KLUNIT09TRUZPTlRfblNpemVNYXg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9DT01CT0JPWElORk89Ci1DT01CT0JPWElORk9fY2JTaXplPQotQ09NQk9CT1hJTkZPX2l0ZW1MZWZ0PWFjY2Vzc29yPXJjSXRlbS5sZWZ0Ci1DT01CT0JPWElORk9faXRlbVRvcD1hY2Nlc3Nvcj1yY0l0ZW0udG9wCi1DT01CT0JPWElORk9faXRlbVJpZ2h0PWFjY2Vzc29yPXJjSXRlbS5yaWdodAotQ09NQk9CT1hJTkZPX2l0ZW1Cb3R0b209YWNjZXNzb3I9cmNJdGVtLmJvdHRvbQotQ09NQk9CT1hJTkZPX2J1dHRvbkxlZnQ9YWNjZXNzb3I9cmNCdXR0b24ubGVmdAotQ09NQk9CT1hJTkZPX2J1dHRvblRvcD1hY2Nlc3Nvcj1yY0J1dHRvbi50b3AKLUNPTUJPQk9YSU5GT19idXR0b25SaWdodD1hY2Nlc3Nvcj1yY0J1dHRvbi5yaWdodAotQ09NQk9CT1hJTkZPX2J1dHRvbkJvdHRvbT1hY2Nlc3Nvcj1yY0J1dHRvbi5ib3R0b20KLUNPTUJPQk9YSU5GT19zdGF0ZUJ1dHRvbj0KLUNPTUJPQk9YSU5GT19od25kQ29tYm89Y2FzdD1IV05ECi1DT01CT0JPWElORk9faHduZEl0ZW09Y2FzdD1IV05ECi1DT01CT0JPWElORk9faHduZExpc3Q9Y2FzdD1IV05ECi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9DT01QT1NJVElPTkZPUk09Ci1DT01QT1NJVElPTkZPUk1fZHdTdHlsZT0KLUNPTVBPU0lUSU9ORk9STV94PWFjY2Vzc29yPXB0Q3VycmVudFBvcy54Ci1DT01QT1NJVElPTkZPUk1feT1hY2Nlc3Nvcj1wdEN1cnJlbnRQb3MueQotQ09NUE9TSVRJT05GT1JNX2xlZnQ9YWNjZXNzb3I9cmNBcmVhLmxlZnQKLUNPTVBPU0lUSU9ORk9STV90b3A9YWNjZXNzb3I9cmNBcmVhLnRvcAotQ09NUE9TSVRJT05GT1JNX3JpZ2h0PWFjY2Vzc29yPXJjQXJlYS5yaWdodAotQ09NUE9TSVRJT05GT1JNX2JvdHRvbT1hY2Nlc3Nvcj1yY0FyZWEuYm90dG9tCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9DUkVBVEVTVFJVQ1Q9Ci1DUkVBVEVTVFJVQ1RfbHBDcmVhdGVQYXJhbXM9Y2FzdD0oTFBWT0lEKQotQ1JFQVRFU1RSVUNUX2hJbnN0YW5jZT1jYXN0PShISU5TVEFOQ0UpCi1DUkVBVEVTVFJVQ1RfaE1lbnU9Y2FzdD0oSE1FTlUpCi1DUkVBVEVTVFJVQ1RfaHduZFBhcmVudD1jYXN0PShIV05EKQotQ1JFQVRFU1RSVUNUX2N5PQotQ1JFQVRFU1RSVUNUX2N4PQotQ1JFQVRFU1RSVUNUX3k9Ci1DUkVBVEVTVFJVQ1RfeD0KLUNSRUFURVNUUlVDVF9zdHlsZT0KLUNSRUFURVNUUlVDVF9scHN6TmFtZT1jYXN0PShMUENUU1RSKQotQ1JFQVRFU1RSVUNUX2xwc3pDbGFzcz1jYXN0PShMUENUU1RSKQotQ1JFQVRFU1RSVUNUX2R3RXhTdHlsZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT049Ci1ESUJTRUNUSU9OX2JpU2l6ZT1hY2Nlc3Nvcj1kc0JtaWguYmlTaXplCi1ESUJTRUNUSU9OX2JpV2lkdGg9YWNjZXNzb3I9ZHNCbWloLmJpV2lkdGgKLURJQlNFQ1RJT05fYmlIZWlnaHQ9YWNjZXNzb3I9ZHNCbWloLmJpSGVpZ2h0Ci1ESUJTRUNUSU9OX2JpUGxhbmVzPWFjY2Vzc29yPWRzQm1paC5iaVBsYW5lcwotRElCU0VDVElPTl9iaUJpdENvdW50PWFjY2Vzc29yPWRzQm1paC5iaUJpdENvdW50Ci1ESUJTRUNUSU9OX2JpQ29tcHJlc3Npb249YWNjZXNzb3I9ZHNCbWloLmJpQ29tcHJlc3Npb24KLURJQlNFQ1RJT05fYmlTaXplSW1hZ2U9YWNjZXNzb3I9ZHNCbWloLmJpU2l6ZUltYWdlCi1ESUJTRUNUSU9OX2JpWFBlbHNQZXJNZXRlcj1hY2Nlc3Nvcj1kc0JtaWguYmlYUGVsc1Blck1ldGVyCi1ESUJTRUNUSU9OX2JpWVBlbHNQZXJNZXRlcj1hY2Nlc3Nvcj1kc0JtaWguYmlZUGVsc1Blck1ldGVyCi1ESUJTRUNUSU9OX2JpQ2xyVXNlZD1hY2Nlc3Nvcj1kc0JtaWguYmlDbHJVc2VkCi1ESUJTRUNUSU9OX2JpQ2xySW1wb3J0YW50PWFjY2Vzc29yPWRzQm1paC5iaUNsckltcG9ydGFudAotRElCU0VDVElPTl9kc0JpdGZpZWxkczA9YWNjZXNzb3I9ZHNCaXRmaWVsZHNbMF0KLURJQlNFQ1RJT05fZHNCaXRmaWVsZHMxPWFjY2Vzc29yPWRzQml0ZmllbGRzWzFdCi1ESUJTRUNUSU9OX2RzQml0ZmllbGRzMj1hY2Nlc3Nvcj1kc0JpdGZpZWxkc1syXQotRElCU0VDVElPTl9kc2hTZWN0aW9uPWNhc3Q9KEhBTkRMRSkKLURJQlNFQ1RJT05fZHNPZmZzZXQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ETExWRVJTSU9OSU5GTz0KLURMTFZFUlNJT05JTkZPX2NiU2l6ZT0KLURMTFZFUlNJT05JTkZPX2R3TWFqb3JWZXJzaW9uPQotRExMVkVSU0lPTklORk9fZHdNaW5vclZlcnNpb249Ci1ETExWRVJTSU9OSU5GT19kd0J1aWxkTnVtYmVyPQotRExMVkVSU0lPTklORk9fZHdQbGF0Zm9ybUlEPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRE9DSU5GTz0KLURPQ0lORk9fY2JTaXplPQotRE9DSU5GT19scHN6RG9jTmFtZT1jYXN0PShMUENUU1RSKQotRE9DSU5GT19scHN6T3V0cHV0PWNhc3Q9KExQQ1RTVFIpCi1ET0NJTkZPX2xwc3pEYXRhdHlwZT1jYXN0PShMUENUU1RSKQotRE9DSU5GT19md1R5cGU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUkFXSVRFTVNUUlVDVD0KLURSQVdJVEVNU1RSVUNUX0N0bFR5cGU9Ci1EUkFXSVRFTVNUUlVDVF9DdGxJRD0KLURSQVdJVEVNU1RSVUNUX2l0ZW1JRD0KLURSQVdJVEVNU1RSVUNUX2l0ZW1BY3Rpb249Ci1EUkFXSVRFTVNUUlVDVF9pdGVtU3RhdGU9Ci1EUkFXSVRFTVNUUlVDVF9od25kSXRlbT1jYXN0PShIV05EKQotRFJBV0lURU1TVFJVQ1RfaERDPWNhc3Q9KEhEQykKLURSQVdJVEVNU1RSVUNUX2xlZnQ9YWNjZXNzb3I9cmNJdGVtLmxlZnQKLURSQVdJVEVNU1RSVUNUX3RvcD1hY2Nlc3Nvcj1yY0l0ZW0udG9wCi1EUkFXSVRFTVNUUlVDVF9ib3R0b209YWNjZXNzb3I9cmNJdGVtLmJvdHRvbQotRFJBV0lURU1TVFJVQ1RfcmlnaHQ9YWNjZXNzb3I9cmNJdGVtLnJpZ2h0Ci1EUkFXSVRFTVNUUlVDVF9pdGVtRGF0YT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFUz0KLURST1BGSUxFU19wRmlsZXM9Ci1EUk9QRklMRVNfcHRfeD1hY2Nlc3Nvcj1wdC54Ci1EUk9QRklMRVNfcHRfeT1hY2Nlc3Nvcj1wdC55Ci1EUk9QRklMRVNfZk5DPQotRFJPUEZJTEVTX2ZXaWRlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOPQotRVhUTE9HUEVOX2VscFBlblN0eWxlPQotRVhUTE9HUEVOX2VscFdpZHRoPQotRVhUTE9HUEVOX2VscEJydXNoU3R5bGU9Ci1FWFRMT0dQRU5fZWxwQ29sb3I9Ci1FWFRMT0dQRU5fZWxwSGF0Y2g9Ci1FWFRMT0dQRU5fZWxwTnVtRW50cmllcz0KLUVYVExPR1BFTl9lbHBTdHlsZUVudHJ5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRklMRVRJTUU9Ci1GSUxFVElNRV9kd0xvd0RhdGVUaW1lPQotRklMRVRJTUVfZHdIaWdoRGF0ZVRpbWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HQ1BfMVJFU1VMVFM9Ci1HQ1BfUkVTVUxUU19sU3RydWN0U2l6ZT0KLUdDUF9SRVNVTFRTX2xwT3V0U3RyaW5nPWNhc3Q9KExQVFNUUikKLUdDUF9SRVNVTFRTX2xwT3JkZXI9Y2FzdD0oVUlOVCAgKikKLUdDUF9SRVNVTFRTX2xwRHg9Y2FzdD0oaW50ICAqKQotR0NQX1JFU1VMVFNfbHBDYXJldFBvcz1jYXN0PShpbnQgICopCi1HQ1BfUkVTVUxUU19scENsYXNzPWNhc3Q9KExQU1RSKQotR0NQX1JFU1VMVFNfbHBHbHlwaHM9Y2FzdD0oTFBXU1RSKQotR0NQX1JFU1VMVFNfbkdseXBocz0KLUdDUF9SRVNVTFRTX25NYXhGaXQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVD0KLUdSQURJRU5UX1JFQ1RfVXBwZXJMZWZ0PQotR1JBRElFTlRfUkVDVF9Mb3dlclJpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfR1VJVEhSRUFESU5GTz0KLUdVSVRIUkVBRElORk9fY2JTaXplPWNhc3Q9KERXT1JEKQotR1VJVEhSRUFESU5GT19mbGFncz1jYXN0PShEV09SRCkKLUdVSVRIUkVBRElORk9faHduZEFjdGl2ZT1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19od25kRm9jdXM9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9faHduZENhcHR1cmU9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9faHduZE1lbnVPd25lcj1jYXN0PShIV05EKQotR1VJVEhSRUFESU5GT19od25kTW92ZVNpemU9Y2FzdD0oSFdORCkKLUdVSVRIUkVBRElORk9faHduZENhcmV0PWNhc3Q9KEhXTkQpCi1HVUlUSFJFQURJTkZPX2xlZnQ9YWNjZXNzb3I9cmNDYXJldC5sZWZ0Ci1HVUlUSFJFQURJTkZPX3RvcD1hY2Nlc3Nvcj1yY0NhcmV0LnRvcAotR1VJVEhSRUFESU5GT19yaWdodD1hY2Nlc3Nvcj1yY0NhcmV0LnJpZ2h0Ci1HVUlUSFJFQURJTkZPX2JvdHRvbT1hY2Nlc3Nvcj1yY0NhcmV0LmJvdHRvbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GTz0KLUhESElUVEVTVElORk9feD1hY2Nlc3Nvcj1wdC54Ci1IREhJVFRFU1RJTkZPX3k9YWNjZXNzb3I9cHQueQotSERISVRURVNUSU5GT19mbGFncz0KLUhESElUVEVTVElORk9faUl0ZW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU09Ci1IRElURU1fbWFzaz0KLUhESVRFTV9jeHk9Ci1IRElURU1fcHN6VGV4dD1jYXN0PShMUFRTVFIpCi1IRElURU1faGJtPWNhc3Q9KEhCSVRNQVApCi1IRElURU1fY2NoVGV4dE1heD0KLUhESVRFTV9mbXQ9Ci1IRElURU1fbFBhcmFtPQotSERJVEVNX2lJbWFnZT0KLUhESVRFTV9pT3JkZXI9Ci1IRElURU1fdHlwZT1mbGFncz1ub193aW5jZQotSERJVEVNX3B2RmlsdGVyPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUPQotSERMQVlPVVRfcHJjPWNhc3Q9UkVDVCAqCi1IRExBWU9VVF9wd3Bvcz1jYXN0PShXSU5ET1dQT1MgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPPQotSEVMUElORk9fY2JTaXplPQotSEVMUElORk9faUNvbnRleHRUeXBlPQotSEVMUElORk9faUN0cmxJZD0KLUhFTFBJTkZPX2hJdGVtSGFuZGxlPWNhc3Q9KEhBTkRMRSkKLUhFTFBJTkZPX2R3Q29udGV4dElkPQotSEVMUElORk9feD1hY2Nlc3Nvcj1Nb3VzZVBvcy54Ci1IRUxQSU5GT195PWFjY2Vzc29yPU1vdXNlUG9zLnkKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVD0KLUhJR0hDT05UUkFTVF9jYlNpemU9Ci1ISUdIQ09OVFJBU1RfZHdGbGFncz0KLUhJR0hDT05UUkFTVF9scHN6RGVmYXVsdFNjaGVtZT1jYXN0PUxQVFNUUgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSUNPTklORk89Ci1JQ09OSU5GT19mSWNvbj0KLUlDT05JTkZPX3hIb3RzcG90PQotSUNPTklORk9feUhvdHNwb3Q9Ci1JQ09OSU5GT19oYm1NYXNrPWNhc3Q9KEhCSVRNQVApCi1JQ09OSU5GT19oYm1Db2xvcj1jYXN0PShIQklUTUFQKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSU5JVENPTU1PTkNPTlRST0xTRVg9Ci1JTklUQ09NTU9OQ09OVFJPTFNFWF9kd1NpemU9Ci1JTklUQ09NTU9OQ09OVFJPTFNFWF9kd0lDQz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0lOUFVUPQotSU5QVVRfdHlwZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVQ9Ci1LRVlCRElOUFVUX3dWaz0KLUtFWUJESU5QVVRfd1NjYW49Ci1LRVlCRElOUFVUX2R3RmxhZ3M9Ci1LRVlCRElOUFVUX3RpbWU9Ci1LRVlCRElOUFVUX2R3RXh0cmFJbmZvPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU09Ci1MSVRFTV9tYXNrPQotTElURU1faUxpbms9Ci1MSVRFTV9zdGF0ZT0KLUxJVEVNX3N0YXRlTWFzaz0KLUxJVEVNX3N6SUQ9Ci1MSVRFTV9zelVybD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIPQotTE9HQlJVU0hfbGJTdHlsZT0KLUxPR0JSVVNIX2xiQ29sb3I9Ci1MT0dCUlVTSF9sYkhhdGNoPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVD0KLUxPR0ZPTlRfbGZIZWlnaHQ9Ci1MT0dGT05UX2xmV2lkdGg9Ci1MT0dGT05UX2xmRXNjYXBlbWVudD0KLUxPR0ZPTlRfbGZPcmllbnRhdGlvbj0KLUxPR0ZPTlRfbGZXZWlnaHQ9Ci1MT0dGT05UX2xmSXRhbGljPQotTE9HRk9OVF9sZlVuZGVybGluZT0KLUxPR0ZPTlRfbGZTdHJpa2VPdXQ9Ci1MT0dGT05UX2xmQ2hhclNldD0KLUxPR0ZPTlRfbGZPdXRQcmVjaXNpb249Ci1MT0dGT05UX2xmQ2xpcFByZWNpc2lvbj0KLUxPR0ZPTlRfbGZRdWFsaXR5PQotTE9HRk9OVF9sZlBpdGNoQW5kRmFtaWx5PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEE9Ci1MT0dGT05UQV9sZkZhY2VOYW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFc9Ci1MT0dGT05UV19sZkZhY2VOYW1lPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOPQotTE9HUEVOX2xvcG5TdHlsZT0KLUxPR1BFTl94PWFjY2Vzc29yPWxvcG5XaWR0aC54Ci1MT0dQRU5feT1hY2Nlc3Nvcj1sb3BuV2lkdGgueQotTE9HUEVOX2xvcG5Db2xvcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xSRVNVTFQ9ZmxhZ3M9bm9fZ2VuCi1MUkVTVUxUX3ZhbHVlPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU49Ci1MVkNPTFVNTl9tYXNrPQotTFZDT0xVTU5fZm10PQotTFZDT0xVTU5fY3g9Ci1MVkNPTFVNTl9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLUxWQ09MVU1OX2NjaFRleHRNYXg9Ci1MVkNPTFVNTl9pU3ViSXRlbT0KLUxWQ09MVU1OX2lJbWFnZT0KLUxWQ09MVU1OX2lPcmRlcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk89Ci1MVkhJVFRFU1RJTkZPX3g9YWNjZXNzb3I9cHQueAotTFZISVRURVNUSU5GT195PWFjY2Vzc29yPXB0LnkKLUxWSElUVEVTVElORk9fZmxhZ3M9Ci1MVkhJVFRFU1RJTkZPX2lJdGVtPQotTFZISVRURVNUSU5GT19pU3ViSXRlbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSVRFTT0KLUxWSVRFTV9tYXNrPQotTFZJVEVNX2lJdGVtPQotTFZJVEVNX2lTdWJJdGVtPQotTFZJVEVNX3N0YXRlPQotTFZJVEVNX3N0YXRlTWFzaz0KLUxWSVRFTV9wc3pUZXh0PWNhc3Q9KExQVFNUUikKLUxWSVRFTV9jY2hUZXh0TWF4PQotTFZJVEVNX2lJbWFnZT0KLUxWSVRFTV9sUGFyYW09Ci1MVklURU1faUluZGVudD0KLUxWSVRFTV9pR3JvdXBJZD1mbGFncz1ub193aW5jZQotTFZJVEVNX2NDb2x1bW5zPWZsYWdzPW5vX3dpbmNlCi1MVklURU1fcHVDb2x1bW5zPWNhc3Q9KFBVSU5UKSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUFSR0lOUz0KLU1BUkdJTlNfY3hMZWZ0V2lkdGg9Ci1NQVJHSU5TX2N4UmlnaHRXaWR0aD0KLU1BUkdJTlNfY3lUb3BIZWlnaHQ9Ci1NQVJHSU5TX2N5Qm90dG9tSGVpZ2h0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1Q9Ci1NRUFTVVJFSVRFTVNUUlVDVF9DdGxUeXBlPQotTUVBU1VSRUlURU1TVFJVQ1RfQ3RsSUQ9Ci1NRUFTVVJFSVRFTVNUUlVDVF9pdGVtSUQ9Ci1NRUFTVVJFSVRFTVNUUlVDVF9pdGVtV2lkdGg9Ci1NRUFTVVJFSVRFTVNUUlVDVF9pdGVtSGVpZ2h0PQotTUVBU1VSRUlURU1TVFJVQ1RfaXRlbURhdGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRU5VQkFSSU5GTz0KLU1FTlVCQVJJTkZPX2NiU2l6ZT0KLU1FTlVCQVJJTkZPX2xlZnQ9YWNjZXNzb3I9cmNCYXIubGVmdAotTUVOVUJBUklORk9fdG9wPWFjY2Vzc29yPXJjQmFyLnRvcAotTUVOVUJBUklORk9fcmlnaHQ9YWNjZXNzb3I9cmNCYXIucmlnaHQKLU1FTlVCQVJJTkZPX2JvdHRvbT1hY2Nlc3Nvcj1yY0Jhci5ib3R0b20KLU1FTlVCQVJJTkZPX2hNZW51PWNhc3Q9KEhNRU5VKQotTUVOVUJBUklORk9faHduZE1lbnU9Y2FzdD0oSFdORCkKLU1FTlVCQVJJTkZPX2ZCYXJGb2N1c2VkPQotTUVOVUJBUklORk9fZkZvY3VzZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRU5VSU5GTz0KLU1FTlVJTkZPX2NiU2l6ZT0KLU1FTlVJTkZPX2ZNYXNrPQotTUVOVUlORk9fZHdTdHlsZT0KLU1FTlVJTkZPX2N5TWF4PQotTUVOVUlORk9faGJyQmFjaz1jYXN0PShIQlJVU0gpCi1NRU5VSU5GT19kd0NvbnRleHRIZWxwSUQ9Ci1NRU5VSU5GT19kd01lbnVEYXRhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVOVUlURU1JTkZPPQotTUVOVUlURU1JTkZPX2NiU2l6ZT0KLU1FTlVJVEVNSU5GT19mTWFzaz0KLU1FTlVJVEVNSU5GT19mVHlwZT0KLU1FTlVJVEVNSU5GT19mU3RhdGU9Ci1NRU5VSVRFTUlORk9fd0lEPQotTUVOVUlURU1JTkZPX2hTdWJNZW51PWNhc3Q9KEhNRU5VKQotTUVOVUlURU1JTkZPX2hibXBDaGVja2VkPWNhc3Q9KEhCSVRNQVApCi1NRU5VSVRFTUlORk9faGJtcFVuY2hlY2tlZD1jYXN0PShIQklUTUFQKQotTUVOVUlURU1JTkZPX2R3SXRlbURhdGE9Ci1NRU5VSVRFTUlORk9fZHdUeXBlRGF0YT1jYXN0PShMUFRTVFIpCi1NRU5VSVRFTUlORk9fY2NoPQotTUVOVUlURU1JTkZPX2hibXBJdGVtPWNhc3Q9KEhCSVRNQVApLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPPQotTUlOTUFYSU5GT19wdFJlc2VydmVkX3g9YWNjZXNzb3I9cHRSZXNlcnZlZC54Ci1NSU5NQVhJTkZPX3B0UmVzZXJ2ZWRfeT1hY2Nlc3Nvcj1wdFJlc2VydmVkLnkKLU1JTk1BWElORk9fcHRNYXhTaXplX3g9YWNjZXNzb3I9cHRNYXhTaXplLngKLU1JTk1BWElORk9fcHRNYXhTaXplX3k9YWNjZXNzb3I9cHRNYXhTaXplLnkKLU1JTk1BWElORk9fcHRNYXhQb3NpdGlvbl94PWFjY2Vzc29yPXB0TWF4UG9zaXRpb24ueAotTUlOTUFYSU5GT19wdE1heFBvc2l0aW9uX3k9YWNjZXNzb3I9cHRNYXhQb3NpdGlvbi55Ci1NSU5NQVhJTkZPX3B0TWluVHJhY2tTaXplX3g9YWNjZXNzb3I9cHRNaW5UcmFja1NpemUueAotTUlOTUFYSU5GT19wdE1pblRyYWNrU2l6ZV95PWFjY2Vzc29yPXB0TWluVHJhY2tTaXplLnkKLU1JTk1BWElORk9fcHRNYXhUcmFja1NpemVfeD1hY2Nlc3Nvcj1wdE1heFRyYWNrU2l6ZS54Ci1NSU5NQVhJTkZPX3B0TWF4VHJhY2tTaXplX3k9YWNjZXNzb3I9cHRNYXhUcmFja1NpemUueQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTU9OSVRPUklORk89Ci1NT05JVE9SSU5GT19jYlNpemU9Ci1NT05JVE9SSU5GT19yY01vbml0b3JfbGVmdD1hY2Nlc3Nvcj1yY01vbml0b3IubGVmdAotTU9OSVRPUklORk9fcmNNb25pdG9yX3RvcD1hY2Nlc3Nvcj1yY01vbml0b3IudG9wCi1NT05JVE9SSU5GT19yY01vbml0b3JfcmlnaHQ9YWNjZXNzb3I9cmNNb25pdG9yLnJpZ2h0Ci1NT05JVE9SSU5GT19yY01vbml0b3JfYm90dG9tPWFjY2Vzc29yPXJjTW9uaXRvci5ib3R0b20KLU1PTklUT1JJTkZPX3JjV29ya19sZWZ0PWFjY2Vzc29yPXJjV29yay5sZWZ0Ci1NT05JVE9SSU5GT19yY1dvcmtfdG9wPWFjY2Vzc29yPXJjV29yay50b3AKLU1PTklUT1JJTkZPX3JjV29ya19yaWdodD1hY2Nlc3Nvcj1yY1dvcmsucmlnaHQKLU1PTklUT1JJTkZPX3JjV29ya19ib3R0b209YWNjZXNzb3I9cmNXb3JrLmJvdHRvbQotTU9OSVRPUklORk9fZHdGbGFncz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVQ9Ci1NT1VTRUlOUFVUX2R4PQotTU9VU0VJTlBVVF9keT0KLU1PVVNFSU5QVVRfbW91c2VEYXRhPQotTU9VU0VJTlBVVF9kd0ZsYWdzPQotTU9VU0VJTlBVVF90aW1lPQotTU9VU0VJTlBVVF9kd0V4dHJhSW5mbz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TRz0KLU1TR19od25kPWNhc3Q9KEhXTkQpCi1NU0dfbWVzc2FnZT0KLU1TR193UGFyYW09Ci1NU0dfbFBhcmFtPQotTVNHX3RpbWU9Ci1NU0dfeD1hY2Nlc3Nvcj1wdC54Ci1NU0dfeT1hY2Nlc3Nvcj1wdC55Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUNVU1RPTURSQVc9Ci1OTUNVU1RPTURSQVdfZHdEcmF3U3RhZ2U9Ci1OTUNVU1RPTURSQVdfaGRjPWNhc3Q9KEhEQykKLU5NQ1VTVE9NRFJBV19sZWZ0PWFjY2Vzc29yPXJjLmxlZnQKLU5NQ1VTVE9NRFJBV190b3A9YWNjZXNzb3I9cmMudG9wCi1OTUNVU1RPTURSQVdfcmlnaHQ9YWNjZXNzb3I9cmMucmlnaHQKLU5NQ1VTVE9NRFJBV19ib3R0b209YWNjZXNzb3I9cmMuYm90dG9tCi1OTUNVU1RPTURSQVdfZHdJdGVtU3BlYz0KLU5NQ1VTVE9NRFJBV191SXRlbVN0YXRlPQotTk1DVVNUT01EUkFXX2xJdGVtbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRFI9Ci1OTUhEUl9od25kRnJvbT1jYXN0PShIV05EKQotTk1IRFJfaWRGcm9tPQotTk1IRFJfY29kZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSEVBREVSPQotTk1IRUFERVJfaUl0ZW09Ci1OTUhFQURFUl9pQnV0dG9uPQotTk1IRUFERVJfcGl0ZW09Y2FzdD0oSERJVEVNIEZBUiAqKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSU5LPQotTk1MSU5LX21hc2s9YWNjZXNzb3I9aXRlbS5tYXNrCi1OTUxJTktfaUxpbms9YWNjZXNzb3I9aXRlbS5pTGluawotTk1MSU5LX3N0YXRlPWFjY2Vzc29yPWl0ZW0uc3RhdGUKLU5NTElOS19zdGF0ZU1hc2s9YWNjZXNzb3I9aXRlbS5zdGF0ZU1hc2sKLU5NTElOS19zeklEPWFjY2Vzc29yPWl0ZW0uc3pJRAotTk1MSU5LX3N6VXJsPWFjY2Vzc29yPWl0ZW0uc3pVcmwKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElTVFZJRVc9Ci1OTUxJU1RWSUVXX2lJdGVtPQotTk1MSVNUVklFV19pU3ViSXRlbT0KLU5NTElTVFZJRVdfdU5ld1N0YXRlPQotTk1MSVNUVklFV191T2xkU3RhdGU9Ci1OTUxJU1RWSUVXX3VDaGFuZ2VkPQotTk1MSVNUVklFV194PWFjY2Vzc29yPXB0QWN0aW9uLngKLU5NTElTVFZJRVdfeT1hY2Nlc3Nvcj1wdEFjdGlvbi55Ci1OTUxJU1RWSUVXX2xQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXPQotTk1MVkNVU1RPTURSQVdfY2xyVGV4dD0KLU5NTFZDVVNUT01EUkFXX2NsclRleHRCaz0KLU5NTFZDVVNUT01EUkFXX2lTdWJJdGVtPQotTk1MVkNVU1RPTURSQVdfZHdJdGVtVHlwZT1mbGFncz1ub193aW5jZQotTk1MVkNVU1RPTURSQVdfY2xyRmFjZT1mbGFncz1ub193aW5jZQotTk1MVkNVU1RPTURSQVdfaUljb25FZmZlY3Q9ZmxhZ3M9bm9fd2luY2UKLU5NTFZDVVNUT01EUkFXX2lJY29uUGhhc2U9ZmxhZ3M9bm9fd2luY2UKLU5NTFZDVVNUT01EUkFXX2lQYXJ0SWQ9ZmxhZ3M9bm9fd2luY2UKLU5NTFZDVVNUT01EUkFXX2lTdGF0ZUlkPWZsYWdzPW5vX3dpbmNlCi1OTUxWQ1VTVE9NRFJBV19yY1RleHRfbGVmdD1hY2Nlc3Nvcj1yY1RleHQubGVmdCxmbGFncz1ub193aW5jZQotTk1MVkNVU1RPTURSQVdfcmNUZXh0X3RvcD1hY2Nlc3Nvcj1yY1RleHQudG9wLGZsYWdzPW5vX3dpbmNlCi1OTUxWQ1VTVE9NRFJBV19yY1RleHRfcmlnaHQ9YWNjZXNzb3I9cmNUZXh0LnJpZ2h0LGZsYWdzPW5vX3dpbmNlCi1OTUxWQ1VTVE9NRFJBV19yY1RleHRfYm90dG9tPWFjY2Vzc29yPXJjVGV4dC5ib3R0b20sZmxhZ3M9bm9fd2luY2UKLU5NTFZDVVNUT01EUkFXX3VBbGlnbj1mbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPPQotTk1MVkRJU1BJTkZPX21hc2s9YWNjZXNzb3I9aXRlbS5tYXNrCi1OTUxWRElTUElORk9faUl0ZW09YWNjZXNzb3I9aXRlbS5pSXRlbQotTk1MVkRJU1BJTkZPX2lTdWJJdGVtPWFjY2Vzc29yPWl0ZW0uaVN1Ykl0ZW0KLU5NTFZESVNQSU5GT19zdGF0ZT1hY2Nlc3Nvcj1pdGVtLnN0YXRlCi1OTUxWRElTUElORk9fc3RhdGVNYXNrPWFjY2Vzc29yPWl0ZW0uc3RhdGVNYXNrCi1OTUxWRElTUElORk9fcHN6VGV4dD1hY2Nlc3Nvcj1pdGVtLnBzelRleHQsY2FzdD1MUFRTVFIKLU5NTFZESVNQSU5GT19jY2hUZXh0TWF4PWFjY2Vzc29yPWl0ZW0uY2NoVGV4dE1heAotTk1MVkRJU1BJTkZPX2lJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlJbWFnZQotTk1MVkRJU1BJTkZPX2xQYXJhbT1hY2Nlc3Nvcj1pdGVtLmxQYXJhbQotTk1MVkRJU1BJTkZPX2lJbmRlbnQ9YWNjZXNzb3I9aXRlbS5pSW5kZW50Ci1OTUxWRElTUElORk9faUdyb3VwSWQ9YWNjZXNzb3I9aXRlbS5pR3JvdXBJZCxmbGFncz1ub193aW5jZQotTk1MVkRJU1BJTkZPX2NDb2x1bW5zPWFjY2Vzc29yPWl0ZW0uY0NvbHVtbnMsZmxhZ3M9bm9fd2luY2UKLU5NTFZESVNQSU5GT19wdUNvbHVtbnM9YWNjZXNzb3I9aXRlbS5wdUNvbHVtbnMsY2FzdD0oUFVJTlQpLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRklORElURU09Ci1OTUxWRklORElURU1faVN0YXJ0PQotTk1MVkZJTkRJVEVNX2ZsYWdzPWFjY2Vzc29yPWx2ZmkuZmxhZ3MKLU5NTFZGSU5ESVRFTV9wc3o9YWNjZXNzb3I9bHZmaS5wc3osY2FzdD1MUENUU1RSCi1OTUxWRklORElURU1fbFBhcmFtPWFjY2Vzc29yPWx2ZmkubFBhcmFtCi1OTUxWRklORElURU1feD1hY2Nlc3Nvcj1sdmZpLnB0LngKLU5NTFZGSU5ESVRFTV95PWFjY2Vzc29yPWx2ZmkucHQueQotTk1MVkZJTkRJVEVNX3ZrRGlyZWN0aW9uPWFjY2Vzc29yPWx2ZmkudmtEaXJlY3Rpb24KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSEVWUk9OPQotTk1SRUJBUkNIRVZST05fdUJhbmQ9Ci1OTVJFQkFSQ0hFVlJPTl93SUQ9Ci1OTVJFQkFSQ0hFVlJPTl9sUGFyYW09Ci1OTVJFQkFSQ0hFVlJPTl9sZWZ0PWFjY2Vzc29yPXJjLmxlZnQKLU5NUkVCQVJDSEVWUk9OX3RvcD1hY2Nlc3Nvcj1yYy50b3AKLU5NUkVCQVJDSEVWUk9OX3JpZ2h0PWFjY2Vzc29yPXJjLnJpZ2h0Ci1OTVJFQkFSQ0hFVlJPTl9ib3R0b209YWNjZXNzb3I9cmMuYm90dG9tCi1OTVJFQkFSQ0hFVlJPTl9sUGFyYW1OTT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSElMRFNJWkU9Ci1OTVJFQkFSQ0hJTERTSVpFX3VCYW5kPQotTk1SRUJBUkNISUxEU0laRV93SUQ9Ci1OTVJFQkFSQ0hJTERTSVpFX3JjQ2hpbGRfbGVmdD1hY2Nlc3Nvcj1yY0NoaWxkLmxlZnQKLU5NUkVCQVJDSElMRFNJWkVfcmNDaGlsZF90b3A9YWNjZXNzb3I9cmNDaGlsZC50b3AKLU5NUkVCQVJDSElMRFNJWkVfcmNDaGlsZF9yaWdodD1hY2Nlc3Nvcj1yY0NoaWxkLnJpZ2h0Ci1OTVJFQkFSQ0hJTERTSVpFX3JjQ2hpbGRfYm90dG9tPWFjY2Vzc29yPXJjQ2hpbGQuYm90dG9tCi1OTVJFQkFSQ0hJTERTSVpFX3JjQmFuZF9sZWZ0PWFjY2Vzc29yPXJjQmFuZC5sZWZ0Ci1OTVJFQkFSQ0hJTERTSVpFX3JjQmFuZF90b3A9YWNjZXNzb3I9cmNCYW5kLnRvcAotTk1SRUJBUkNISUxEU0laRV9yY0JhbmRfcmlnaHQ9YWNjZXNzb3I9cmNCYW5kLnJpZ2h0Ci1OTVJFQkFSQ0hJTERTSVpFX3JjQmFuZF9ib3R0b209YWNjZXNzb3I9cmNCYW5kLmJvdHRvbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SR0lORk89Ci1OTVJHSU5GT194PWFjY2Vzc29yPXB0QWN0aW9uLngKLU5NUkdJTkZPX3k9YWNjZXNzb3I9cHRBY3Rpb24ueQotTk1SR0lORk9fZHdJdGVtU3BlYz0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVEJIT1RJVEVNPQotTk1UQkhPVElURU1faWRPbGQ9Ci1OTVRCSE9USVRFTV9pZE5ldz0KLU5NVEJIT1RJVEVNX2R3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRPT0xCQVI9Ci1OTVRPT0xCQVJfaUl0ZW09Ci1OTVRPT0xCQVJfaUJpdG1hcD1hY2Nlc3Nvcj10YkJ1dHRvbi5pQml0bWFwCi1OTVRPT0xCQVJfaWRDb21tYW5kPWFjY2Vzc29yPXRiQnV0dG9uLmlkQ29tbWFuZAotTk1UT09MQkFSX2ZzU3RhdGU9YWNjZXNzb3I9dGJCdXR0b24uZnNTdGF0ZQotTk1UT09MQkFSX2ZzU3R5bGU9YWNjZXNzb3I9dGJCdXR0b24uZnNTdHlsZQotTk1UT09MQkFSX2R3RGF0YT1hY2Nlc3Nvcj10YkJ1dHRvbi5kd0RhdGEKLU5NVE9PTEJBUl9pU3RyaW5nPWFjY2Vzc29yPXRiQnV0dG9uLmlTdHJpbmcKLU5NVE9PTEJBUl9jY2hUZXh0PQotTk1UT09MQkFSX3BzelRleHQ9Y2FzdD0oTFBUU1RSKQotTk1UT09MQkFSX2xlZnQ9YWNjZXNzb3I9cmNCdXR0b24ubGVmdCxmbGFncz1ub193aW5jZQotTk1UT09MQkFSX3RvcD1hY2Nlc3Nvcj1yY0J1dHRvbi50b3AsZmxhZ3M9bm9fd2luY2UKLU5NVE9PTEJBUl9yaWdodD1hY2Nlc3Nvcj1yY0J1dHRvbi5yaWdodCxmbGFncz1ub193aW5jZQotTk1UT09MQkFSX2JvdHRvbT1hY2Nlc3Nvcj1yY0J1dHRvbi5ib3R0b20sZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GTz0KLU5NVFRESVNQSU5GT19scHN6VGV4dD1jYXN0PSh2b2lkICopCi1OTVRURElTUElORk9faGluc3Q9Y2FzdD0oSElOU1RBTkNFKQotTk1UVERJU1BJTkZPX3VGbGFncz0KLU5NVFRESVNQSU5GT19sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BPQotTk1UVERJU1BJTkZPQV9zelRleHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XPQotTk1UVERJU1BJTkZPV19zelRleHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBVz0KLU5NVFZDVVNUT01EUkFXX2NsclRleHQ9Ci1OTVRWQ1VTVE9NRFJBV19jbHJUZXh0Qms9Ci1OTVRWQ1VTVE9NRFJBV19pTGV2ZWw9ZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GTz0KLU5NVFZESVNQSU5GT19tYXNrPWFjY2Vzc29yPWl0ZW0ubWFzawotTk1UVkRJU1BJTkZPX2hJdGVtPWFjY2Vzc29yPWl0ZW0uaEl0ZW0sY2FzdD1IVFJFRUlURU0KLU5NVFZESVNQSU5GT19zdGF0ZT1hY2Nlc3Nvcj1pdGVtLnN0YXRlCi1OTVRWRElTUElORk9fc3RhdGVNYXNrPWFjY2Vzc29yPWl0ZW0uc3RhdGVNYXNrCi1OTVRWRElTUElORk9fcHN6VGV4dD1hY2Nlc3Nvcj1pdGVtLnBzelRleHQsY2FzdD1MUFRTVFIKLU5NVFZESVNQSU5GT19jY2hUZXh0TWF4PWFjY2Vzc29yPWl0ZW0uY2NoVGV4dE1heAotTk1UVkRJU1BJTkZPX2lJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlJbWFnZQotTk1UVkRJU1BJTkZPX2lTZWxlY3RlZEltYWdlPWFjY2Vzc29yPWl0ZW0uaVNlbGVjdGVkSW1hZ2UKLU5NVFZESVNQSU5GT19jQ2hpbGRyZW49YWNjZXNzb3I9aXRlbS5jQ2hpbGRyZW4KLU5NVFZESVNQSU5GT19sUGFyYW09YWNjZXNzb3I9aXRlbS5sUGFyYW0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZJVEVNQ0hBTkdFPQotTk1UVklURU1DSEFOR0VfdUNoYW5nZWQ9Ci1OTVRWSVRFTUNIQU5HRV9oSXRlbT1jYXN0PUhUUkVFSVRFTQotTk1UVklURU1DSEFOR0VfdVN0YXRlTmV3PQotTk1UVklURU1DSEFOR0VfdVN0YXRlT2xkPQotTk1UVklURU1DSEFOR0VfbFBhcmFtPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV049Ci1OTVVQRE9XTl9pUG9zPQotTk1VUERPV05faURlbHRhPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDUz0KLU5PTkNMSUVOVE1FVFJJQ1NfY2JTaXplPQotTk9OQ0xJRU5UTUVUUklDU19pQm9yZGVyV2lkdGg9Ci1OT05DTElFTlRNRVRSSUNTX2lTY3JvbGxXaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNjcm9sbEhlaWdodD0KLU5PTkNMSUVOVE1FVFJJQ1NfaUNhcHRpb25XaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaUNhcHRpb25IZWlnaHQ9Ci1OT05DTElFTlRNRVRSSUNTX2lTbUNhcHRpb25XaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaVNtQ2FwdGlvbkhlaWdodD0KLU5PTkNMSUVOVE1FVFJJQ1NfaU1lbnVXaWR0aD0KLU5PTkNMSUVOVE1FVFJJQ1NfaU1lbnVIZWlnaHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQT0KLU5PTkNMSUVOVE1FVFJJQ1NBX2xmQ2FwdGlvbkZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZlNtQ2FwdGlvbkZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTQV9sZk1lbnVGb250PQotTk9OQ0xJRU5UTUVUUklDU0FfbGZTdGF0dXNGb250PQotTk9OQ0xJRU5UTUVUUklDU0FfbGZNZXNzYWdlRm9udD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXPQotTk9OQ0xJRU5UTUVUUklDU1dfbGZDYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmU21DYXB0aW9uRm9udD0KLU5PTkNMSUVOVE1FVFJJQ1NXX2xmTWVudUZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTV19sZlN0YXR1c0ZvbnQ9Ci1OT05DTElFTlRNRVRSSUNTV19sZk1lc3NhZ2VGb250PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9USUZZSUNPTkRBVEE9Ci1OT1RJRllJQ09OREFUQV9jYlNpemU9Ci1OT1RJRllJQ09OREFUQV9oV25kPWNhc3Q9KEhXTkQpCi1OT1RJRllJQ09OREFUQV91SUQ9Ci1OT1RJRllJQ09OREFUQV91RmxhZ3M9Ci1OT1RJRllJQ09OREFUQV91Q2FsbGJhY2tNZXNzYWdlPQotTk9USUZZSUNPTkRBVEFfaEljb249Y2FzdD0oSElDT04pCi1OT1RJRllJQ09OREFUQV9kd1N0YXRlPWZsYWdzPW5vX3dpbmNlCi1OT1RJRllJQ09OREFUQV9kd1N0YXRlTWFzaz1mbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFfdVZlcnNpb249ZmxhZ3M9bm9fd2luY2UKLU5PVElGWUlDT05EQVRBX2R3SW5mb0ZsYWdzPWZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT1RJRllJQ09OREFUQUE9Ci1OT1RJRllJQ09OREFUQUFfc3pUaXA9Y2FzdD0oVENIQVIpCi1OT1RJRllJQ09OREFUQUFfc3pJbmZvPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotTk9USUZZSUNPTkRBVEFBX3N6SW5mb1RpdGxlPWNhc3Q9KFRDSEFSKSxmbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9USUZZSUNPTkRBVEFXPQotTk9USUZZSUNPTkRBVEFXX3N6VGlwPWNhc3Q9KFRDSEFSKQotTk9USUZZSUNPTkRBVEFXX3N6SW5mbz1jYXN0PShUQ0hBUiksZmxhZ3M9bm9fd2luY2UKLU5PVElGWUlDT05EQVRBV19zekluZm9UaXRsZT1jYXN0PShUQ0hBUiksZmxhZ3M9bm9fd2luY2UKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09GTk9USUZZPQotT0ZOT1RJRllfbHBPRk49Y2FzdD1MUE9QRU5GSUxFTkFNRQotT0ZOT1RJRllfcHN6RmlsZT1jYXN0PUxQVFNUUgotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1BFTkZJTEVOQU1FPQotT1BFTkZJTEVOQU1FX2xTdHJ1Y3RTaXplPQotT1BFTkZJTEVOQU1FX2h3bmRPd25lcj1jYXN0PShIV05EKQotT1BFTkZJTEVOQU1FX2hJbnN0YW5jZT1jYXN0PShISU5TVEFOQ0UpCi1PUEVORklMRU5BTUVfbHBzdHJGaWx0ZXI9Y2FzdD0oTFBDVFNUUikKLU9QRU5GSUxFTkFNRV9scHN0ckN1c3RvbUZpbHRlcj1jYXN0PShMUFRTVFIpCi1PUEVORklMRU5BTUVfbk1heEN1c3RGaWx0ZXI9Ci1PUEVORklMRU5BTUVfbkZpbHRlckluZGV4PQotT1BFTkZJTEVOQU1FX2xwc3RyRmlsZT1jYXN0PShMUFRTVFIpCi1PUEVORklMRU5BTUVfbk1heEZpbGU9Ci1PUEVORklMRU5BTUVfbHBzdHJGaWxlVGl0bGU9Y2FzdD0oTFBUU1RSKQotT1BFTkZJTEVOQU1FX25NYXhGaWxlVGl0bGU9Ci1PUEVORklMRU5BTUVfbHBzdHJJbml0aWFsRGlyPWNhc3Q9KExQQ1RTVFIpCi1PUEVORklMRU5BTUVfbHBzdHJUaXRsZT1jYXN0PShMUENUU1RSKQotT1BFTkZJTEVOQU1FX0ZsYWdzPQotT1BFTkZJTEVOQU1FX25GaWxlT2Zmc2V0PQotT1BFTkZJTEVOQU1FX25GaWxlRXh0ZW5zaW9uPQotT1BFTkZJTEVOQU1FX2xwc3RyRGVmRXh0PWNhc3Q9KExQQ1RTVFIpCi1PUEVORklMRU5BTUVfbEN1c3REYXRhPQotT1BFTkZJTEVOQU1FX2xwZm5Ib29rPWNhc3Q9KExQT0ZOSE9PS1BST0MpCi1PUEVORklMRU5BTUVfbHBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLU9QRU5GSUxFTkFNRV9wdlJlc2VydmVkPWNhc3Q9KHZvaWQgKiksZmxhZ3M9bm9fd2luY2UKLU9QRU5GSUxFTkFNRV9kd1Jlc2VydmVkPWZsYWdzPW5vX3dpbmNlCi1PUEVORklMRU5BTUVfRmxhZ3NFeD1mbGFncz1ub193aW5jZQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1M9Ci1PU19BQ0NFTF9zaXplb2Y9Ci0KLU9TX0FDVENUWF9zaXplb2Y9Ci0KLU9TX0Fib3J0RG9jPQotT1NfQWJvcnREb2NfMD1jYXN0PShIREMpCi0KLU9TX0FjdGl2YXRlQWN0Q3R4PWZsYWdzPWR5bmFtaWMKLU9TX0FjdGl2YXRlQWN0Q3R4XzA9Ci1PU19BY3RpdmF0ZUFjdEN0eF8xPWNhc3Q9VUxPTkdfUFRSKgotCi1PU19BY3RpdmF0ZUtleWJvYXJkTGF5b3V0PQotT1NfQWN0aXZhdGVLZXlib2FyZExheW91dF8wPWNhc3Q9KEhLTCkKLU9TX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXRfMT0KLQotT1NfQWRkRm9udFJlc291cmNlRXhXPWZsYWdzPWR5bmFtaWMKLU9TX0FkZEZvbnRSZXNvdXJjZUV4V18wPQotT1NfQWRkRm9udFJlc291cmNlRXhXXzE9Ci1PU19BZGRGb250UmVzb3VyY2VFeFdfMj0KLQotT1NfQWRqdXN0V2luZG93UmVjdEV4PQotT1NfQWRqdXN0V2luZG93UmVjdEV4XzA9Ci1PU19BZGp1c3RXaW5kb3dSZWN0RXhfMT0KLU9TX0FkanVzdFdpbmRvd1JlY3RFeF8yPQotT1NfQWRqdXN0V2luZG93UmVjdEV4XzM9Ci0KLU9TX0FscGhhQmxlbmQ9ZmxhZ3M9ZHluYW1pYwotT1NfQWxwaGFCbGVuZF8wPQotT1NfQWxwaGFCbGVuZF8xPQotT1NfQWxwaGFCbGVuZF8yPQotT1NfQWxwaGFCbGVuZF8zPQotT1NfQWxwaGFCbGVuZF80PQotT1NfQWxwaGFCbGVuZF81PQotT1NfQWxwaGFCbGVuZF82PQotT1NfQWxwaGFCbGVuZF83PQotT1NfQWxwaGFCbGVuZF84PQotT1NfQWxwaGFCbGVuZF85PQotT1NfQWxwaGFCbGVuZF8xMD1mbGFncz1zdHJ1Y3QKLQotT1NfQW5pbWF0ZVdpbmRvdz1mbGFncz1keW5hbWljCi1PU19BbmltYXRlV2luZG93XzA9Y2FzdD1IV05ECi1PU19BbmltYXRlV2luZG93XzE9Ci1PU19BbmltYXRlV2luZG93XzI9Ci0KLU9TX0FyYz0KLU9TX0FyY18wPWNhc3Q9KEhEQykKLU9TX0FyY18xPQotT1NfQXJjXzI9Ci1PU19BcmNfMz0KLU9TX0FyY180PQotT1NfQXJjXzU9Ci1PU19BcmNfNj0KLU9TX0FyY183PQotT1NfQXJjXzg9Ci0KLU9TX0F0dGFjaFRocmVhZElucHV0PQotT1NfQXR0YWNoVGhyZWFkSW5wdXRfMD1jYXN0PURXT1JECi1PU19BdHRhY2hUaHJlYWRJbnB1dF8xPWNhc3Q9RFdPUkQKLU9TX0F0dGFjaFRocmVhZElucHV0XzI9Ci0KLU9TX0JJVE1BUElORk9IRUFERVJfc2l6ZW9mPQotCi1PU19CSVRNQVBfc2l6ZW9mPQotCi1PU19CTEVOREZVTkNUSU9OX3NpemVvZj0KLQotT1NfQlBfUEFJTlRQQVJBTVNfc2l6ZW9mPQotCi1PU19CUk9XU0VJTkZPX3NpemVvZj0KLQotT1NfQlVUVE9OX0lNQUdFTElTVF9zaXplb2Y9Ci0KLU9TX0JlZ2luQnVmZmVyZWRQYWludD1mbGFncz1keW5hbWljCi1PU19CZWdpbkJ1ZmZlcmVkUGFpbnRfMD1jYXN0PUhEQwotT1NfQmVnaW5CdWZmZXJlZFBhaW50XzE9Ci1PU19CZWdpbkJ1ZmZlcmVkUGFpbnRfMj0KLU9TX0JlZ2luQnVmZmVyZWRQYWludF8zPQotT1NfQmVnaW5CdWZmZXJlZFBhaW50XzQ9Y2FzdD1IREMqCi0KLU9TX0JlZ2luRGVmZXJXaW5kb3dQb3M9Ci1PU19CZWdpbkRlZmVyV2luZG93UG9zXzA9Ci0KLU9TX0JlZ2luUGFpbnQ9Ci1PU19CZWdpblBhaW50XzA9Y2FzdD0oSFdORCkKLU9TX0JlZ2luUGFpbnRfMT0KLQotT1NfQmVnaW5QYXRoPQotT1NfQmVnaW5QYXRoXzA9Y2FzdD0oSERDKQotCi1PU19CaXRCbHQ9Ci1PU19CaXRCbHRfMD1jYXN0PShIREMpCi1PU19CaXRCbHRfMT0KLU9TX0JpdEJsdF8yPQotT1NfQml0Qmx0XzM9Ci1PU19CaXRCbHRfND0KLU9TX0JpdEJsdF81PWNhc3Q9KEhEQykKLU9TX0JpdEJsdF82PQotT1NfQml0Qmx0Xzc9Ci1PU19CaXRCbHRfOD0KLQotT1NfQnJpbmdXaW5kb3dUb1RvcD0KLU9TX0JyaW5nV2luZG93VG9Ub3BfMD1jYXN0PShIV05EKQotCi1PU19CdWZmZXJlZFBhaW50SW5pdD1mbGFncz1keW5hbWljCi0KLU9TX0J1ZmZlcmVkUGFpbnRTZXRBbHBoYT1mbGFncz1keW5hbWljCi1PU19CdWZmZXJlZFBhaW50U2V0QWxwaGFfMD1jYXN0PShIUEFJTlRCVUZGRVIpCi1PU19CdWZmZXJlZFBhaW50U2V0QWxwaGFfMT0KLU9TX0J1ZmZlcmVkUGFpbnRTZXRBbHBoYV8yPQotCi1PU19CdWZmZXJlZFBhaW50VW5Jbml0PWZsYWdzPWR5bmFtaWMKLQotT1NfQ0hPT1NFQ09MT1Jfc2l6ZW9mPQotCi1PU19DSE9PU0VGT05UX3NpemVvZj0KLQotT1NfQ09NQk9CT1hJTkZPX3NpemVvZj0KLQotT1NfQ09NUE9TSVRJT05GT1JNX3NpemVvZj0KLQotT1NfQ1JFQVRFU1RSVUNUX3NpemVvZj0KLQotT1NfQ2FsbD0KLU9TX0NhbGxfMD1jYXN0PShETExHRVRWRVJTSU9OUFJPQykKLU9TX0NhbGxfMT0KLQotT1NfQ2FsbE5leHRIb29rRXg9Ci1PU19DYWxsTmV4dEhvb2tFeF8wPWNhc3Q9KEhIT09LKQotT1NfQ2FsbE5leHRIb29rRXhfMT0KLU9TX0NhbGxOZXh0SG9va0V4XzI9Y2FzdD0oV1BBUkFNKQotT1NfQ2FsbE5leHRIb29rRXhfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0NhbGxXaW5kb3dQcm9jQT0KLU9TX0NhbGxXaW5kb3dQcm9jQV8wPWNhc3Q9KFdORFBST0MpCi1PU19DYWxsV2luZG93UHJvY0FfMT1jYXN0PShIV05EKQotT1NfQ2FsbFdpbmRvd1Byb2NBXzI9Ci1PU19DYWxsV2luZG93UHJvY0FfMz0KLU9TX0NhbGxXaW5kb3dQcm9jQV80PQotCi1PU19DYWxsV2luZG93UHJvY1c9Ci1PU19DYWxsV2luZG93UHJvY1dfMD1jYXN0PShXTkRQUk9DKQotT1NfQ2FsbFdpbmRvd1Byb2NXXzE9Y2FzdD0oSFdORCkKLU9TX0NhbGxXaW5kb3dQcm9jV18yPQotT1NfQ2FsbFdpbmRvd1Byb2NXXzM9Ci1PU19DYWxsV2luZG93UHJvY1dfND0KLQotT1NfQ2hhckxvd2VyQT0KLU9TX0NoYXJMb3dlckFfMD1jYXN0PShMUFNUUikKLQotT1NfQ2hhckxvd2VyVz0KLU9TX0NoYXJMb3dlcldfMD1jYXN0PShMUFdTVFIpCi0KLU9TX0NoYXJVcHBlckE9Ci1PU19DaGFyVXBwZXJBXzA9Y2FzdD0oTFBTVFIpCi0KLU9TX0NoYXJVcHBlclc9Ci1PU19DaGFyVXBwZXJXXzA9Y2FzdD0oTFBXU1RSKQotCi1PU19DaGVja01lbnVJdGVtPQotT1NfQ2hlY2tNZW51SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfQ2hlY2tNZW51SXRlbV8xPWNhc3Q9KFVJTlQpCi1PU19DaGVja01lbnVJdGVtXzI9Y2FzdD0oVUlOVCkKLQotT1NfQ2hvb3NlQ29sb3JBPQotT1NfQ2hvb3NlQ29sb3JBXzA9Ci0KLU9TX0Nob29zZUNvbG9yVz0KLU9TX0Nob29zZUNvbG9yV18wPWNhc3Q9KExQQ0hPT1NFQ09MT1JXKQotCi1PU19DaG9vc2VGb250QT0KLU9TX0Nob29zZUZvbnRBXzA9Ci0KLU9TX0Nob29zZUZvbnRXPQotT1NfQ2hvb3NlRm9udFdfMD1jYXN0PShMUENIT09TRUZPTlRXKQotCi1PU19DbGllbnRUb1NjcmVlbj0KLU9TX0NsaWVudFRvU2NyZWVuXzA9Y2FzdD0oSFdORCkKLU9TX0NsaWVudFRvU2NyZWVuXzE9Ci0KLU9TX0Nsb3NlQ2xpcGJvYXJkPQotCi1PU19DbG9zZUhhbmRsZT0KLU9TX0Nsb3NlSGFuZGxlXzA9Y2FzdD1IQU5ETEUKLQotT1NfQ2xvc2VUaGVtZURhdGE9ZmxhZ3M9ZHluYW1pYwotT1NfQ2xvc2VUaGVtZURhdGFfMD1jYXN0PUhUSEVNRQotCi1PU19Db0NyZWF0ZUluc3RhbmNlPQotT1NfQ29DcmVhdGVJbnN0YW5jZV8wPWNhc3Q9UkVGQ0xTSUQKLU9TX0NvQ3JlYXRlSW5zdGFuY2VfMT1jYXN0PUxQVU5LTk9XTgotT1NfQ29DcmVhdGVJbnN0YW5jZV8yPQotT1NfQ29DcmVhdGVJbnN0YW5jZV8zPWNhc3Q9UkVGSUlECi1PU19Db0NyZWF0ZUluc3RhbmNlXzQ9Y2FzdD1MUFZPSUQgKgotCi1PU19Db21iaW5lUmduPQotT1NfQ29tYmluZVJnbl8wPWNhc3Q9KEhSR04pCi1PU19Db21iaW5lUmduXzE9Y2FzdD0oSFJHTikKLU9TX0NvbWJpbmVSZ25fMj1jYXN0PShIUkdOKQotT1NfQ29tYmluZVJnbl8zPQotCi1PU19Db21tRGxnRXh0ZW5kZWRFcnJvcj0KLQotT1NfQ29tbWFuZEJhcl9BZGRBZG9ybm1lbnRzPQotT1NfQ29tbWFuZEJhcl9BZGRBZG9ybm1lbnRzXzA9Y2FzdD0oSFdORCkKLU9TX0NvbW1hbmRCYXJfQWRkQWRvcm5tZW50c18xPQotT1NfQ29tbWFuZEJhcl9BZGRBZG9ybm1lbnRzXzI9Ci0KLU9TX0NvbW1hbmRCYXJfQ3JlYXRlPQotT1NfQ29tbWFuZEJhcl9DcmVhdGVfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Db21tYW5kQmFyX0NyZWF0ZV8xPWNhc3Q9KEhXTkQpCi1PU19Db21tYW5kQmFyX0NyZWF0ZV8yPQotCi1PU19Db21tYW5kQmFyX0Rlc3Ryb3k9Ci1PU19Db21tYW5kQmFyX0Rlc3Ryb3lfMD1jYXN0PShIV05EKQotCi1PU19Db21tYW5kQmFyX0RyYXdNZW51QmFyPQotT1NfQ29tbWFuZEJhcl9EcmF3TWVudUJhcl8wPWNhc3Q9KEhXTkQpCi1PU19Db21tYW5kQmFyX0RyYXdNZW51QmFyXzE9Y2FzdD0oV09SRCkKLQotT1NfQ29tbWFuZEJhcl9IZWlnaHQ9Ci1PU19Db21tYW5kQmFyX0hlaWdodF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0NvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4PQotT1NfQ29tbWFuZEJhcl9JbnNlcnRNZW51YmFyRXhfMD1jYXN0PShIV05EKQotT1NfQ29tbWFuZEJhcl9JbnNlcnRNZW51YmFyRXhfMT1jYXN0PShISU5TVEFOQ0UpCi1PU19Db21tYW5kQmFyX0luc2VydE1lbnViYXJFeF8yPWNhc3Q9KExQVFNUUikKLU9TX0NvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4XzM9Y2FzdD0oV09SRCkKLQotT1NfQ29tbWFuZEJhcl9TaG93PQotT1NfQ29tbWFuZEJhcl9TaG93XzA9Y2FzdD0oSFdORCkKLU9TX0NvbW1hbmRCYXJfU2hvd18xPWNhc3Q9KEJPT0wpCi0KLU9TX0NvcHlJbWFnZT0KLU9TX0NvcHlJbWFnZV8wPWNhc3Q9KEhBTkRMRSkKLU9TX0NvcHlJbWFnZV8xPQotT1NfQ29weUltYWdlXzI9Ci1PU19Db3B5SW1hZ2VfMz0KLU9TX0NvcHlJbWFnZV80PQotCi1PU19DcmVhdGVBY2NlbGVyYXRvclRhYmxlQT0KLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVBXzA9Y2FzdD0oTFBBQ0NFTCkKLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVBXzE9Ci0KLU9TX0NyZWF0ZUFjY2VsZXJhdG9yVGFibGVXPQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZVdfMD1jYXN0PShMUEFDQ0VMKQotT1NfQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZVdfMT0KLQotT1NfQ3JlYXRlQWN0Q3R4QT1mbGFncz1keW5hbWljCi1PU19DcmVhdGVBY3RDdHhBXzA9ZmxhZ3M9bm9fb3V0Ci0KLU9TX0NyZWF0ZUFjdEN0eFc9ZmxhZ3M9ZHluYW1pYwotT1NfQ3JlYXRlQWN0Q3R4V18wPWZsYWdzPW5vX291dAotCi1PU19DcmVhdGVCaXRtYXA9Ci1PU19DcmVhdGVCaXRtYXBfMD0KLU9TX0NyZWF0ZUJpdG1hcF8xPQotT1NfQ3JlYXRlQml0bWFwXzI9Ci1PU19DcmVhdGVCaXRtYXBfMz0KLU9TX0NyZWF0ZUJpdG1hcF80PWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0NyZWF0ZUNhcmV0PQotT1NfQ3JlYXRlQ2FyZXRfMD1jYXN0PShIV05EKQotT1NfQ3JlYXRlQ2FyZXRfMT1jYXN0PShIQklUTUFQKQotT1NfQ3JlYXRlQ2FyZXRfMj0KLU9TX0NyZWF0ZUNhcmV0XzM9Ci0KLU9TX0NyZWF0ZUNvbXBhdGlibGVCaXRtYXA9Ci1PU19DcmVhdGVDb21wYXRpYmxlQml0bWFwXzA9Y2FzdD0oSERDKQotT1NfQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcF8xPQotT1NfQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcF8yPQotCi1PU19DcmVhdGVDb21wYXRpYmxlREM9Ci1PU19DcmVhdGVDb21wYXRpYmxlRENfMD1jYXN0PShIREMpCi0KLU9TX0NyZWF0ZUN1cnNvcj0KLU9TX0NyZWF0ZUN1cnNvcl8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0NyZWF0ZUN1cnNvcl8xPQotT1NfQ3JlYXRlQ3Vyc29yXzI9Ci1PU19DcmVhdGVDdXJzb3JfMz0KLU9TX0NyZWF0ZUN1cnNvcl80PQotT1NfQ3JlYXRlQ3Vyc29yXzU9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0NyZWF0ZUN1cnNvcl82PWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0NyZWF0ZURDQT0KLU9TX0NyZWF0ZURDQV8wPWNhc3Q9KExQU1RSKQotT1NfQ3JlYXRlRENBXzE9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVEQ0FfMj1jYXN0PShMUFNUUikKLU9TX0NyZWF0ZURDQV8zPWNhc3Q9KENPTlNUIERFVk1PREUgKikKLQotT1NfQ3JlYXRlRENXPQotT1NfQ3JlYXRlRENXXzA9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzE9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzI9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlRENXXzM9Y2FzdD0oQ09OU1QgREVWTU9ERVcgKikKLQotT1NfQ3JlYXRlRElCU2VjdGlvbj0KLU9TX0NyZWF0ZURJQlNlY3Rpb25fMD1jYXN0PShIREMpCi1PU19DcmVhdGVESUJTZWN0aW9uXzE9Y2FzdD0oQklUTUFQSU5GTyAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0NyZWF0ZURJQlNlY3Rpb25fMj0KLU9TX0NyZWF0ZURJQlNlY3Rpb25fMz1jYXN0PShWT0lEICoqKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfQ3JlYXRlRElCU2VjdGlvbl80PWNhc3Q9KEhBTkRMRSkKLU9TX0NyZWF0ZURJQlNlY3Rpb25fNT0KLQotT1NfQ3JlYXRlRm9udEluZGlyZWN0QV9fST0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdEFfX0lfMD1jYXN0PShMUExPR0ZPTlRBKQotCi1PU19DcmVhdGVGb250SW5kaXJlY3RBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzI9Ci1PU19DcmVhdGVGb250SW5kaXJlY3RBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJfMD1mbGFncz1ub19vdXQKLQotT1NfQ3JlYXRlRm9udEluZGlyZWN0V19fST0KLU9TX0NyZWF0ZUZvbnRJbmRpcmVjdFdfX0lfMD1jYXN0PShMUExPR0ZPTlRXKQotCi1PU19DcmVhdGVGb250SW5kaXJlY3RXX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzI9Ci1PU19DcmVhdGVGb250SW5kaXJlY3RXX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRXXzJfMD1mbGFncz1ub19vdXQKLQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0PQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0XzA9ZmxhZ3M9bm9fb3V0Ci0KLU9TX0NyZWF0ZU1lbnU9Ci0KLU9TX0NyZWF0ZVBhbGV0dGU9Ci1PU19DcmVhdGVQYWxldHRlXzA9Y2FzdD0oTE9HUEFMRVRURSAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfQ3JlYXRlUGF0dGVybkJydXNoPQotT1NfQ3JlYXRlUGF0dGVybkJydXNoXzA9Y2FzdD0oSEJJVE1BUCkKLQotT1NfQ3JlYXRlUGVuPQotT1NfQ3JlYXRlUGVuXzA9Ci1PU19DcmVhdGVQZW5fMT0KLU9TX0NyZWF0ZVBlbl8yPWNhc3Q9KENPTE9SUkVGKQotCi1PU19DcmVhdGVQb2x5Z29uUmduPQotT1NfQ3JlYXRlUG9seWdvblJnbl8wPWNhc3Q9KENPTlNUIFBPSU5UICopCi1PU19DcmVhdGVQb2x5Z29uUmduXzE9Ci1PU19DcmVhdGVQb2x5Z29uUmduXzI9Ci0KLU9TX0NyZWF0ZVBvcHVwTWVudT0KLQotT1NfQ3JlYXRlUHJvY2Vzc0E9Ci1PU19DcmVhdGVQcm9jZXNzQV8wPWNhc3Q9KExQQ1NUUikKLU9TX0NyZWF0ZVByb2Nlc3NBXzE9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVQcm9jZXNzQV8yPWNhc3Q9KExQU0VDVVJJVFlfQVRUUklCVVRFUykKLU9TX0NyZWF0ZVByb2Nlc3NBXzM9Y2FzdD0oTFBTRUNVUklUWV9BVFRSSUJVVEVTKQotT1NfQ3JlYXRlUHJvY2Vzc0FfND0KLU9TX0NyZWF0ZVByb2Nlc3NBXzU9Ci1PU19DcmVhdGVQcm9jZXNzQV82PWNhc3Q9KExQVk9JRCkKLU9TX0NyZWF0ZVByb2Nlc3NBXzc9Y2FzdD0oTFBTVFIpCi1PU19DcmVhdGVQcm9jZXNzQV84PWNhc3Q9TFBTVEFSVFVQSU5GT0EKLU9TX0NyZWF0ZVByb2Nlc3NBXzk9Y2FzdD0oTFBQUk9DRVNTX0lORk9STUFUSU9OKQotCi1PU19DcmVhdGVQcm9jZXNzVz0KLU9TX0NyZWF0ZVByb2Nlc3NXXzA9Y2FzdD0oTFBDV1NUUikKLU9TX0NyZWF0ZVByb2Nlc3NXXzE9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlUHJvY2Vzc1dfMj1jYXN0PShMUFNFQ1VSSVRZX0FUVFJJQlVURVMpCi1PU19DcmVhdGVQcm9jZXNzV18zPWNhc3Q9KExQU0VDVVJJVFlfQVRUUklCVVRFUykKLU9TX0NyZWF0ZVByb2Nlc3NXXzQ9Ci1PU19DcmVhdGVQcm9jZXNzV181PQotT1NfQ3JlYXRlUHJvY2Vzc1dfNj1jYXN0PShMUFZPSUQpCi1PU19DcmVhdGVQcm9jZXNzV183PWNhc3Q9KExQV1NUUikKLU9TX0NyZWF0ZVByb2Nlc3NXXzg9Y2FzdD1MUFNUQVJUVVBJTkZPVwotT1NfQ3JlYXRlUHJvY2Vzc1dfOT1jYXN0PShMUFBST0NFU1NfSU5GT1JNQVRJT04pCi0KLU9TX0NyZWF0ZVJlY3RSZ249Ci1PU19DcmVhdGVSZWN0UmduXzA9Ci1PU19DcmVhdGVSZWN0UmduXzE9Ci1PU19DcmVhdGVSZWN0UmduXzI9Ci1PU19DcmVhdGVSZWN0UmduXzM9Ci0KLU9TX0NyZWF0ZVNvbGlkQnJ1c2g9Ci1PU19DcmVhdGVTb2xpZEJydXNoXzA9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX0NyZWF0ZVN0cmVhbU9uSEdsb2JhbD0KLU9TX0NyZWF0ZVN0cmVhbU9uSEdsb2JhbF8wPWNhc3Q9SEdMT0JBTAotT1NfQ3JlYXRlU3RyZWFtT25IR2xvYmFsXzE9Y2FzdD1CT09MCi1PU19DcmVhdGVTdHJlYW1PbkhHbG9iYWxfMj1jYXN0PUxQU1RSRUFNICoKLQotT1NfQ3JlYXRlV2luZG93RXhBPQotT1NfQ3JlYXRlV2luZG93RXhBXzA9Ci1PU19DcmVhdGVXaW5kb3dFeEFfMT1jYXN0PShMUFNUUikKLU9TX0NyZWF0ZVdpbmRvd0V4QV8yPQotT1NfQ3JlYXRlV2luZG93RXhBXzM9Ci1PU19DcmVhdGVXaW5kb3dFeEFfND0KLU9TX0NyZWF0ZVdpbmRvd0V4QV81PQotT1NfQ3JlYXRlV2luZG93RXhBXzY9Ci1PU19DcmVhdGVXaW5kb3dFeEFfNz0KLU9TX0NyZWF0ZVdpbmRvd0V4QV84PWNhc3Q9KEhXTkQpCi1PU19DcmVhdGVXaW5kb3dFeEFfOT1jYXN0PShITUVOVSkKLU9TX0NyZWF0ZVdpbmRvd0V4QV8xMD1jYXN0PShISU5TVEFOQ0UpCi1PU19DcmVhdGVXaW5kb3dFeEFfMTE9Ci0KLU9TX0NyZWF0ZVdpbmRvd0V4Vz0KLU9TX0NyZWF0ZVdpbmRvd0V4V18wPQotT1NfQ3JlYXRlV2luZG93RXhXXzE9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlV2luZG93RXhXXzI9Y2FzdD0oTFBXU1RSKQotT1NfQ3JlYXRlV2luZG93RXhXXzM9Ci1PU19DcmVhdGVXaW5kb3dFeFdfND0KLU9TX0NyZWF0ZVdpbmRvd0V4V181PQotT1NfQ3JlYXRlV2luZG93RXhXXzY9Ci1PU19DcmVhdGVXaW5kb3dFeFdfNz0KLU9TX0NyZWF0ZVdpbmRvd0V4V184PWNhc3Q9KEhXTkQpCi1PU19DcmVhdGVXaW5kb3dFeFdfOT1jYXN0PShITUVOVSkKLU9TX0NyZWF0ZVdpbmRvd0V4V18xMD1jYXN0PShISU5TVEFOQ0UpCi1PU19DcmVhdGVXaW5kb3dFeFdfMTE9Ci0KLU9TX0RJQlNFQ1RJT05fc2l6ZW9mPQotCi1PU19ETExWRVJTSU9OSU5GT19zaXplb2Y9Ci0KLU9TX0RPQ0lORk9fc2l6ZW9mPQotCi1PU19EUkFXSVRFTVNUUlVDVF9zaXplb2Y9Ci0KLU9TX0RST1BGSUxFU19zaXplb2Y9Ci0KLU9TX0RlZkZyYW1lUHJvY0E9Ci1PU19EZWZGcmFtZVByb2NBXzA9Y2FzdD0oSFdORCkKLU9TX0RlZkZyYW1lUHJvY0FfMT1jYXN0PShIV05EKQotT1NfRGVmRnJhbWVQcm9jQV8yPQotT1NfRGVmRnJhbWVQcm9jQV8zPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZkZyYW1lUHJvY0FfND1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZkZyYW1lUHJvY1c9Ci1PU19EZWZGcmFtZVByb2NXXzA9Y2FzdD0oSFdORCkKLU9TX0RlZkZyYW1lUHJvY1dfMT1jYXN0PShIV05EKQotT1NfRGVmRnJhbWVQcm9jV18yPQotT1NfRGVmRnJhbWVQcm9jV18zPWNhc3Q9KFdQQVJBTSkKLU9TX0RlZkZyYW1lUHJvY1dfND1jYXN0PShMUEFSQU0pCi0KLU9TX0RlZk1ESUNoaWxkUHJvY0E9Ci1PU19EZWZNRElDaGlsZFByb2NBXzA9Y2FzdD0oSFdORCkKLU9TX0RlZk1ESUNoaWxkUHJvY0FfMT0KLU9TX0RlZk1ESUNoaWxkUHJvY0FfMj1jYXN0PShXUEFSQU0pCi1PU19EZWZNRElDaGlsZFByb2NBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19EZWZNRElDaGlsZFByb2NXPQotT1NfRGVmTURJQ2hpbGRQcm9jV18wPWNhc3Q9KEhXTkQpCi1PU19EZWZNRElDaGlsZFByb2NXXzE9Ci1PU19EZWZNRElDaGlsZFByb2NXXzI9Y2FzdD0oV1BBUkFNKQotT1NfRGVmTURJQ2hpbGRQcm9jV18zPWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmV2luZG93UHJvY0E9Ci1PU19EZWZXaW5kb3dQcm9jQV8wPWNhc3Q9KEhXTkQpCi1PU19EZWZXaW5kb3dQcm9jQV8xPQotT1NfRGVmV2luZG93UHJvY0FfMj1jYXN0PShXUEFSQU0pCi1PU19EZWZXaW5kb3dQcm9jQV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmV2luZG93UHJvY1c9Ci1PU19EZWZXaW5kb3dQcm9jV18wPWNhc3Q9KEhXTkQpCi1PU19EZWZXaW5kb3dQcm9jV18xPQotT1NfRGVmV2luZG93UHJvY1dfMj1jYXN0PShXUEFSQU0pCi1PU19EZWZXaW5kb3dQcm9jV18zPWNhc3Q9KExQQVJBTSkKLQotT1NfRGVmZXJXaW5kb3dQb3M9Ci1PU19EZWZlcldpbmRvd1Bvc18wPWNhc3Q9KEhEV1ApCi1PU19EZWZlcldpbmRvd1Bvc18xPWNhc3Q9KEhXTkQpCi1PU19EZWZlcldpbmRvd1Bvc18yPWNhc3Q9KEhXTkQpCi1PU19EZWZlcldpbmRvd1Bvc18zPQotT1NfRGVmZXJXaW5kb3dQb3NfND0KLU9TX0RlZmVyV2luZG93UG9zXzU9Ci1PU19EZWZlcldpbmRvd1Bvc182PQotT1NfRGVmZXJXaW5kb3dQb3NfNz0KLQotT1NfRGVsZXRlREM9Ci1PU19EZWxldGVEQ18wPWNhc3Q9KEhEQykKLQotT1NfRGVsZXRlTWVudT0KLU9TX0RlbGV0ZU1lbnVfMD1jYXN0PShITUVOVSkKLU9TX0RlbGV0ZU1lbnVfMT0KLU9TX0RlbGV0ZU1lbnVfMj0KLQotT1NfRGVsZXRlT2JqZWN0PQotT1NfRGVsZXRlT2JqZWN0XzA9Y2FzdD0oSEdESU9CSikKLQotT1NfRGVzdHJveUFjY2VsZXJhdG9yVGFibGU9Ci1PU19EZXN0cm95QWNjZWxlcmF0b3JUYWJsZV8wPWNhc3Q9KEhBQ0NFTCkKLQotT1NfRGVzdHJveUNhcmV0PQotCi1PU19EZXN0cm95Q3Vyc29yPQotT1NfRGVzdHJveUN1cnNvcl8wPWNhc3Q9KEhDVVJTT1IpCi0KLU9TX0Rlc3Ryb3lJY29uPQotT1NfRGVzdHJveUljb25fMD1jYXN0PShISUNPTikKLQotT1NfRGVzdHJveU1lbnU9Ci1PU19EZXN0cm95TWVudV8wPWNhc3Q9KEhNRU5VKQotCi1PU19EZXN0cm95V2luZG93PQotT1NfRGVzdHJveVdpbmRvd18wPWNhc3Q9KEhXTkQpCi0KLU9TX0Rpc3BhdGNoTWVzc2FnZUE9Ci1PU19EaXNwYXRjaE1lc3NhZ2VBXzA9Ci0KLU9TX0Rpc3BhdGNoTWVzc2FnZVc9Ci1PU19EaXNwYXRjaE1lc3NhZ2VXXzA9Ci0KLU9TX0RyYWdEZXRlY3Q9Ci1PU19EcmFnRGV0ZWN0XzA9Y2FzdD0oSFdORCkKLU9TX0RyYWdEZXRlY3RfMT1mbGFncz1zdHJ1Y3QKLQotT1NfRHJhZ0ZpbmlzaD0KLU9TX0RyYWdGaW5pc2hfMD1jYXN0PShIRFJPUCkKLQotT1NfRHJhZ1F1ZXJ5RmlsZUE9Ci1PU19EcmFnUXVlcnlGaWxlQV8wPWNhc3Q9KEhEUk9QKQotT1NfRHJhZ1F1ZXJ5RmlsZUFfMT0KLU9TX0RyYWdRdWVyeUZpbGVBXzI9Y2FzdD0oTFBUU1RSKQotT1NfRHJhZ1F1ZXJ5RmlsZUFfMz0KLQotT1NfRHJhZ1F1ZXJ5RmlsZVc9Ci1PU19EcmFnUXVlcnlGaWxlV18wPWNhc3Q9KEhEUk9QKQotT1NfRHJhZ1F1ZXJ5RmlsZVdfMT0KLU9TX0RyYWdRdWVyeUZpbGVXXzI9Y2FzdD0oTFBXU1RSKQotT1NfRHJhZ1F1ZXJ5RmlsZVdfMz0KLQotT1NfRHJhd0FuaW1hdGVkUmVjdHM9Ci1PU19EcmF3QW5pbWF0ZWRSZWN0c18wPWNhc3Q9SFdORAotT1NfRHJhd0FuaW1hdGVkUmVjdHNfMT0KLU9TX0RyYXdBbmltYXRlZFJlY3RzXzI9Ci1PU19EcmF3QW5pbWF0ZWRSZWN0c18zPQotCi1PU19EcmF3RWRnZT0KLU9TX0RyYXdFZGdlXzA9Y2FzdD0oSERDKQotT1NfRHJhd0VkZ2VfMT0KLU9TX0RyYXdFZGdlXzI9Ci1PU19EcmF3RWRnZV8zPQotCi1PU19EcmF3Rm9jdXNSZWN0PQotT1NfRHJhd0ZvY3VzUmVjdF8wPWNhc3Q9KEhEQykKLU9TX0RyYXdGb2N1c1JlY3RfMT0KLQotT1NfRHJhd0ZyYW1lQ29udHJvbD0KLU9TX0RyYXdGcmFtZUNvbnRyb2xfMD1jYXN0PShIREMpCi1PU19EcmF3RnJhbWVDb250cm9sXzE9Ci1PU19EcmF3RnJhbWVDb250cm9sXzI9Ci1PU19EcmF3RnJhbWVDb250cm9sXzM9Ci0KLU9TX0RyYXdJY29uRXg9Ci1PU19EcmF3SWNvbkV4XzA9Y2FzdD0oSERDKQotT1NfRHJhd0ljb25FeF8xPQotT1NfRHJhd0ljb25FeF8yPQotT1NfRHJhd0ljb25FeF8zPWNhc3Q9KEhJQ09OKQotT1NfRHJhd0ljb25FeF80PQotT1NfRHJhd0ljb25FeF81PQotT1NfRHJhd0ljb25FeF82PQotT1NfRHJhd0ljb25FeF83PWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdJY29uRXhfOD0KLQotT1NfRHJhd01lbnVCYXI9Ci1PU19EcmF3TWVudUJhcl8wPWNhc3Q9KEhXTkQpCi0KLU9TX0RyYXdTdGF0ZUE9Ci1PU19EcmF3U3RhdGVBXzA9Y2FzdD0oSERDKQotT1NfRHJhd1N0YXRlQV8xPWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdTdGF0ZUFfMj1jYXN0PShEUkFXU1RBVEVQUk9DKQotT1NfRHJhd1N0YXRlQV8zPWNhc3Q9KExQQVJBTSkKLU9TX0RyYXdTdGF0ZUFfND1jYXN0PShXUEFSQU0pCi1PU19EcmF3U3RhdGVBXzU9Ci1PU19EcmF3U3RhdGVBXzY9Ci1PU19EcmF3U3RhdGVBXzc9Ci1PU19EcmF3U3RhdGVBXzg9Ci1PU19EcmF3U3RhdGVBXzk9Ci0KLU9TX0RyYXdTdGF0ZVc9Ci1PU19EcmF3U3RhdGVXXzA9Y2FzdD0oSERDKQotT1NfRHJhd1N0YXRlV18xPWNhc3Q9KEhCUlVTSCkKLU9TX0RyYXdTdGF0ZVdfMj1jYXN0PShEUkFXU1RBVEVQUk9DKQotT1NfRHJhd1N0YXRlV18zPWNhc3Q9KExQQVJBTSkKLU9TX0RyYXdTdGF0ZVdfND1jYXN0PShXUEFSQU0pCi1PU19EcmF3U3RhdGVXXzU9Ci1PU19EcmF3U3RhdGVXXzY9Ci1PU19EcmF3U3RhdGVXXzc9Ci1PU19EcmF3U3RhdGVXXzg9Ci1PU19EcmF3U3RhdGVXXzk9Ci0KLU9TX0RyYXdUZXh0QT0KLU9TX0RyYXdUZXh0QV8wPWNhc3Q9KEhEQykKLU9TX0RyYXdUZXh0QV8xPWNhc3Q9KExQU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0RyYXdUZXh0QV8yPQotT1NfRHJhd1RleHRBXzM9Ci1PU19EcmF3VGV4dEFfND0KLQotT1NfRHJhd1RleHRXPQotT1NfRHJhd1RleHRXXzA9Y2FzdD0oSERDKQotT1NfRHJhd1RleHRXXzE9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0RyYXdUZXh0V18yPQotT1NfRHJhd1RleHRXXzM9Ci1PU19EcmF3VGV4dFdfND0KLQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZD1mbGFncz1keW5hbWljCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzA9Y2FzdD1IVEhFTUUKLU9TX0RyYXdUaGVtZUJhY2tncm91bmRfMT1jYXN0PUhEQwotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF8yPQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF8zPQotT1NfRHJhd1RoZW1lQmFja2dyb3VuZF80PWNhc3Q9Y29uc3QgUkVDVCAqCi1PU19EcmF3VGhlbWVCYWNrZ3JvdW5kXzU9Y2FzdD1jb25zdCBSRUNUICoKLQotT1NfRHJhd1RoZW1lRWRnZT1mbGFncz1keW5hbWljCi1PU19EcmF3VGhlbWVFZGdlXzA9Ci1PU19EcmF3VGhlbWVFZGdlXzE9Ci1PU19EcmF3VGhlbWVFZGdlXzI9Ci1PU19EcmF3VGhlbWVFZGdlXzM9Ci1PU19EcmF3VGhlbWVFZGdlXzQ9Ci1PU19EcmF3VGhlbWVFZGdlXzU9Ci1PU19EcmF3VGhlbWVFZGdlXzY9Ci1PU19EcmF3VGhlbWVFZGdlXzc9Ci0KLU9TX0RyYXdUaGVtZUljb249ZmxhZ3M9ZHluYW1pYwotT1NfRHJhd1RoZW1lSWNvbl8wPQotT1NfRHJhd1RoZW1lSWNvbl8xPQotT1NfRHJhd1RoZW1lSWNvbl8yPQotT1NfRHJhd1RoZW1lSWNvbl8zPQotT1NfRHJhd1RoZW1lSWNvbl80PQotT1NfRHJhd1RoZW1lSWNvbl81PQotT1NfRHJhd1RoZW1lSWNvbl82PQotCi1PU19EcmF3VGhlbWVQYXJlbnRCYWNrZ3JvdW5kPWZsYWdzPWR5bmFtaWMKLU9TX0RyYXdUaGVtZVBhcmVudEJhY2tncm91bmRfMD0KLU9TX0RyYXdUaGVtZVBhcmVudEJhY2tncm91bmRfMT0KLU9TX0RyYXdUaGVtZVBhcmVudEJhY2tncm91bmRfMj0KLQotT1NfRHJhd1RoZW1lVGV4dD1mbGFncz1keW5hbWljCi1PU19EcmF3VGhlbWVUZXh0XzA9Ci1PU19EcmF3VGhlbWVUZXh0XzE9Ci1PU19EcmF3VGhlbWVUZXh0XzI9Ci1PU19EcmF3VGhlbWVUZXh0XzM9Ci1PU19EcmF3VGhlbWVUZXh0XzQ9Ci1PU19EcmF3VGhlbWVUZXh0XzU9Ci1PU19EcmF3VGhlbWVUZXh0XzY9Ci1PU19EcmF3VGhlbWVUZXh0Xzc9Ci1PU19EcmF3VGhlbWVUZXh0Xzg9Ci0KLU9TX0R3bUV4dGVuZEZyYW1lSW50b0NsaWVudEFyZWE9ZmxhZ3M9ZHluYW1pYwotT1NfRHdtRXh0ZW5kRnJhbWVJbnRvQ2xpZW50QXJlYV8wPWNhc3Q9SFdORAotT1NfRHdtRXh0ZW5kRnJhbWVJbnRvQ2xpZW50QXJlYV8xPQotCi1PU19FWFRMT0dQRU5fc2l6ZW9mPQotCi1PU19FbGxpcHNlPQotT1NfRWxsaXBzZV8wPWNhc3Q9KEhEQykKLU9TX0VsbGlwc2VfMT0KLU9TX0VsbGlwc2VfMj0KLU9TX0VsbGlwc2VfMz0KLU9TX0VsbGlwc2VfND0KLQotT1NfRW5hYmxlTWVudUl0ZW09Ci1PU19FbmFibGVNZW51SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfRW5hYmxlTWVudUl0ZW1fMT0KLU9TX0VuYWJsZU1lbnVJdGVtXzI9Ci0KLU9TX0VuYWJsZVNjcm9sbEJhcj0KLU9TX0VuYWJsZVNjcm9sbEJhcl8wPWNhc3Q9KEhXTkQpCi1PU19FbmFibGVTY3JvbGxCYXJfMT0KLU9TX0VuYWJsZVNjcm9sbEJhcl8yPQotCi1PU19FbmFibGVXaW5kb3c9Ci1PU19FbmFibGVXaW5kb3dfMD1jYXN0PShIV05EKQotT1NfRW5hYmxlV2luZG93XzE9Ci0KLU9TX0VuZEJ1ZmZlcmVkUGFpbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfRW5kQnVmZmVyZWRQYWludF8wPWNhc3Q9KEhQQUlOVEJVRkZFUikKLU9TX0VuZEJ1ZmZlcmVkUGFpbnRfMT0KLQotT1NfRW5kRGVmZXJXaW5kb3dQb3M9Ci1PU19FbmREZWZlcldpbmRvd1Bvc18wPWNhc3Q9KEhEV1ApCi0KLU9TX0VuZERvYz0KLU9TX0VuZERvY18wPWNhc3Q9KEhEQykKLQotT1NfRW5kUGFnZT0KLU9TX0VuZFBhZ2VfMD1jYXN0PShIREMpCi0KLU9TX0VuZFBhaW50PQotT1NfRW5kUGFpbnRfMD1jYXN0PShIV05EKQotT1NfRW5kUGFpbnRfMT0KLQotT1NfRW5kUGF0aD0KLU9TX0VuZFBhdGhfMD1jYXN0PShIREMpCi0KLU9TX0VudW1EaXNwbGF5TW9uaXRvcnM9ZmxhZ3M9ZHluYW1pYwotT1NfRW51bURpc3BsYXlNb25pdG9yc18wPWNhc3Q9KEhEQykKLU9TX0VudW1EaXNwbGF5TW9uaXRvcnNfMT1jYXN0PShMUENSRUNUKQotT1NfRW51bURpc3BsYXlNb25pdG9yc18yPWNhc3Q9KE1PTklUT1JFTlVNUFJPQykKLU9TX0VudW1EaXNwbGF5TW9uaXRvcnNfMz1jYXN0PShMUEFSQU0pCi0KLU9TX0VudW1Gb250RmFtaWxpZXNBPQotT1NfRW51bUZvbnRGYW1pbGllc0FfMD1jYXN0PShIREMpCi1PU19FbnVtRm9udEZhbWlsaWVzQV8xPWNhc3Q9KExQU1RSKQotT1NfRW51bUZvbnRGYW1pbGllc0FfMj1jYXN0PShGT05URU5VTVBST0MpCi1PU19FbnVtRm9udEZhbWlsaWVzQV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfRW51bUZvbnRGYW1pbGllc0V4QT0KLU9TX0VudW1Gb250RmFtaWxpZXNFeEFfMD1jYXN0PUhEQwotT1NfRW51bUZvbnRGYW1pbGllc0V4QV8xPWNhc3Q9TFBMT0dGT05UQQotT1NfRW51bUZvbnRGYW1pbGllc0V4QV8yPWNhc3Q9KEZPTlRFTlVNUFJPQ0EpCi1PU19FbnVtRm9udEZhbWlsaWVzRXhBXzM9Y2FzdD0oTFBBUkFNKQotT1NfRW51bUZvbnRGYW1pbGllc0V4QV80PQotCi1PU19FbnVtRm9udEZhbWlsaWVzRXhXPQotT1NfRW51bUZvbnRGYW1pbGllc0V4V18wPWNhc3Q9SERDCi1PU19FbnVtRm9udEZhbWlsaWVzRXhXXzE9Y2FzdD1MUExPR0ZPTlRXCi1PU19FbnVtRm9udEZhbWlsaWVzRXhXXzI9Y2FzdD1GT05URU5VTVBST0NXCi1PU19FbnVtRm9udEZhbWlsaWVzRXhXXzM9Y2FzdD1MUEFSQU0KLU9TX0VudW1Gb250RmFtaWxpZXNFeFdfND0KLQotT1NfRW51bUZvbnRGYW1pbGllc1c9Ci1PU19FbnVtRm9udEZhbWlsaWVzV18wPWNhc3Q9KEhEQykKLU9TX0VudW1Gb250RmFtaWxpZXNXXzE9Y2FzdD0oTFBDV1NUUikKLU9TX0VudW1Gb250RmFtaWxpZXNXXzI9Y2FzdD0oRk9OVEVOVU1QUk9DVykKLU9TX0VudW1Gb250RmFtaWxpZXNXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNBPWZsYWdzPWR5bmFtaWMKLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc0FfMD1jYXN0PShMQU5HVUFHRUdST1VQX0VOVU1QUk9DQSkKLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc0FfMT0KLU9TX0VudW1TeXN0ZW1MYW5ndWFnZUdyb3Vwc0FfMj1jYXN0PShMT05HX1BUUikKLQotT1NfRW51bVN5c3RlbUxhbmd1YWdlR3JvdXBzVz1mbGFncz1keW5hbWljCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNXXzA9Y2FzdD0oTEFOR1VBR0VHUk9VUF9FTlVNUFJPQ1cpCi1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNXXzE9Ci1PU19FbnVtU3lzdGVtTGFuZ3VhZ2VHcm91cHNXXzI9Y2FzdD0oTE9OR19QVFIpCi0KLU9TX0VudW1TeXN0ZW1Mb2NhbGVzQT0KLU9TX0VudW1TeXN0ZW1Mb2NhbGVzQV8wPWNhc3Q9KExPQ0FMRV9FTlVNUFJPQ0EpCi1PU19FbnVtU3lzdGVtTG9jYWxlc0FfMT0KLQotT1NfRW51bVN5c3RlbUxvY2FsZXNXPQotT1NfRW51bVN5c3RlbUxvY2FsZXNXXzA9Y2FzdD0oTE9DQUxFX0VOVU1QUk9DVykKLU9TX0VudW1TeXN0ZW1Mb2NhbGVzV18xPQotCi1PU19FcXVhbFJlY3Q9Ci1PU19FcXVhbFJlY3RfMD1jYXN0PShDT05TVCBSRUNUICopLGZsYWdzPW5vX291dAotT1NfRXF1YWxSZWN0XzE9Y2FzdD0oQ09OU1QgUkVDVCAqKSxmbGFncz1ub19vdXQKLQotT1NfRXF1YWxSZ249Ci1PU19FcXVhbFJnbl8wPWNhc3Q9KEhSR04pCi1PU19FcXVhbFJnbl8xPWNhc3Q9KEhSR04pCi0KLU9TX0V4Y2x1ZGVDbGlwUmVjdD0KLU9TX0V4Y2x1ZGVDbGlwUmVjdF8wPWNhc3Q9SERDCi1PU19FeGNsdWRlQ2xpcFJlY3RfMT0KLU9TX0V4Y2x1ZGVDbGlwUmVjdF8yPQotT1NfRXhjbHVkZUNsaXBSZWN0XzM9Ci1PU19FeGNsdWRlQ2xpcFJlY3RfND0KLQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzQT0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc0FfMD0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc0FfMT0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc0FfMj0KLQotT1NfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVz0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc1dfMD0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc1dfMT0KLU9TX0V4cGFuZEVudmlyb25tZW50U3RyaW5nc1dfMj0KLQotT1NfRXh0Q3JlYXRlUGVuPQotT1NfRXh0Q3JlYXRlUGVuXzA9Ci1PU19FeHRDcmVhdGVQZW5fMT0KLU9TX0V4dENyZWF0ZVBlbl8yPWNhc3Q9Q09OU1QgTE9HQlJVU0ggKgotT1NfRXh0Q3JlYXRlUGVuXzM9Ci1PU19FeHRDcmVhdGVQZW5fND1jYXN0PUNPTlNUIERXT1JEICoKLQotT1NfRXh0Q3JlYXRlUmVnaW9uPQotT1NfRXh0Q3JlYXRlUmVnaW9uXzA9Y2FzdD1YRk9STSAqCi1PU19FeHRDcmVhdGVSZWdpb25fMT0KLU9TX0V4dENyZWF0ZVJlZ2lvbl8yPWNhc3Q9Q09OU1QgUkdOREFUQSAqCi0KLU9TX0V4dFRleHRPdXRBPQotT1NfRXh0VGV4dE91dEFfMD1jYXN0PShIREMpCi1PU19FeHRUZXh0T3V0QV8xPQotT1NfRXh0VGV4dE91dEFfMj0KLU9TX0V4dFRleHRPdXRBXzM9Ci1PU19FeHRUZXh0T3V0QV80PWZsYWdzPW5vX291dAotT1NfRXh0VGV4dE91dEFfNT1jYXN0PShMUFNUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19FeHRUZXh0T3V0QV82PQotT1NfRXh0VGV4dE91dEFfNz1jYXN0PShDT05TVCBJTlQgKiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi0KLU9TX0V4dFRleHRPdXRXPQotT1NfRXh0VGV4dE91dFdfMD1jYXN0PShIREMpCi1PU19FeHRUZXh0T3V0V18xPQotT1NfRXh0VGV4dE91dFdfMj0KLU9TX0V4dFRleHRPdXRXXzM9Ci1PU19FeHRUZXh0T3V0V180PWZsYWdzPW5vX291dAotT1NfRXh0VGV4dE91dFdfNT1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfRXh0VGV4dE91dFdfNj0KLU9TX0V4dFRleHRPdXRXXzc9Y2FzdD0oQ09OU1QgSU5UICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19FeHRyYWN0SWNvbkV4QT0KLU9TX0V4dHJhY3RJY29uRXhBXzA9Y2FzdD0oTFBTVFIpCi1PU19FeHRyYWN0SWNvbkV4QV8xPQotT1NfRXh0cmFjdEljb25FeEFfMj1jYXN0PShISUNPTiBGQVIgKikKLU9TX0V4dHJhY3RJY29uRXhBXzM9Y2FzdD0oSElDT04gRkFSICopCi1PU19FeHRyYWN0SWNvbkV4QV80PQotCi1PU19FeHRyYWN0SWNvbkV4Vz0KLU9TX0V4dHJhY3RJY29uRXhXXzA9Y2FzdD0oTFBXU1RSKQotT1NfRXh0cmFjdEljb25FeFdfMT0KLU9TX0V4dHJhY3RJY29uRXhXXzI9Y2FzdD0oSElDT04gRkFSICopCi1PU19FeHRyYWN0SWNvbkV4V18zPWNhc3Q9KEhJQ09OIEZBUiAqKQotT1NfRXh0cmFjdEljb25FeFdfND0KLQotT1NfRklMRVRJTUVfc2l6ZW9mPQotCi1PU19GaWxsUGF0aD0KLU9TX0ZpbGxQYXRoXzA9Y2FzdD0oSERDKQotCi1PU19GaWxsUmVjdD0KLU9TX0ZpbGxSZWN0XzA9Y2FzdD0oSERDKQotT1NfRmlsbFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX0ZpbGxSZWN0XzI9Y2FzdD0oSEJSVVNIKQotCi1PU19GaW5kV2luZG93QT0KLU9TX0ZpbmRXaW5kb3dBXzA9Y2FzdD0oTFBTVFIpCi1PU19GaW5kV2luZG93QV8xPWNhc3Q9KExQU1RSKQotCi1PU19GaW5kV2luZG93Vz0KLU9TX0ZpbmRXaW5kb3dXXzA9Y2FzdD0oTFBXU1RSKQotT1NfRmluZFdpbmRvd1dfMT1jYXN0PShMUFdTVFIpCi0KLU9TX0Zvcm1hdE1lc3NhZ2VBPQotT1NfRm9ybWF0TWVzc2FnZUFfMD0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzE9Y2FzdD1MUENWT0lECi1PU19Gb3JtYXRNZXNzYWdlQV8yPQotT1NfRm9ybWF0TWVzc2FnZUFfMz0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzQ9Y2FzdD1MUFNUUgotT1NfRm9ybWF0TWVzc2FnZUFfNT0KLU9TX0Zvcm1hdE1lc3NhZ2VBXzY9Y2FzdD12YV9saXN0KgotCi1PU19Gb3JtYXRNZXNzYWdlVz0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzA9Ci1PU19Gb3JtYXRNZXNzYWdlV18xPWNhc3Q9TFBDVk9JRAotT1NfRm9ybWF0TWVzc2FnZVdfMj0KLU9TX0Zvcm1hdE1lc3NhZ2VXXzM9Ci1PU19Gb3JtYXRNZXNzYWdlV180PWNhc3Q9TFBXU1RSCi1PU19Gb3JtYXRNZXNzYWdlV181PQotT1NfRm9ybWF0TWVzc2FnZVdfNj1jYXN0PXZhX2xpc3QqCi0KLU9TX0ZyZWVMaWJyYXJ5PQotT1NfRnJlZUxpYnJhcnlfMD1jYXN0PShITU9EVUxFKQotCi1PU19HQ1BfUkVTVUxUU19zaXplb2Y9Ci0KLU9TX0dSQURJRU5UX1JFQ1Rfc2l6ZW9mPQotCi1PU19HVUlUSFJFQURJTkZPX3NpemVvZj0KLQotT1NfR2RpU2V0QmF0Y2hMaW1pdD0KLU9TX0dkaVNldEJhdGNoTGltaXRfMD1jYXN0PURXT1JECi0KLU9TX0dldEFDUD0KLQotT1NfR2V0QWN0aXZlV2luZG93PQotCi1PU19HZXRCa0NvbG9yPQotT1NfR2V0QmtDb2xvcl8wPWNhc3Q9KEhEQykKLQotT1NfR2V0Q2FwdHVyZT0KLQotT1NfR2V0Q2FyZXRQb3M9Ci1PU19HZXRDYXJldFBvc18wPQotCi1PU19HZXRDaGFyQUJDV2lkdGhzQT0KLU9TX0dldENoYXJBQkNXaWR0aHNBXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhckFCQ1dpZHRoc0FfMT0KLU9TX0dldENoYXJBQkNXaWR0aHNBXzI9Ci1PU19HZXRDaGFyQUJDV2lkdGhzQV8zPWNhc3Q9KExQQUJDKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRDaGFyQUJDV2lkdGhzVz0KLU9TX0dldENoYXJBQkNXaWR0aHNXXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhckFCQ1dpZHRoc1dfMT0KLU9TX0dldENoYXJBQkNXaWR0aHNXXzI9Ci1PU19HZXRDaGFyQUJDV2lkdGhzV18zPWNhc3Q9KExQQUJDKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRDaGFyV2lkdGhBPQotT1NfR2V0Q2hhcldpZHRoQV8wPWNhc3Q9KEhEQykKLU9TX0dldENoYXJXaWR0aEFfMT0KLU9TX0dldENoYXJXaWR0aEFfMj0KLU9TX0dldENoYXJXaWR0aEFfMz1jYXN0PShMUElOVCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLQotT1NfR2V0Q2hhcldpZHRoVz0KLU9TX0dldENoYXJXaWR0aFdfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyV2lkdGhXXzE9Ci1PU19HZXRDaGFyV2lkdGhXXzI9Ci1PU19HZXRDaGFyV2lkdGhXXzM9Y2FzdD0oTFBJTlQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEE9Ci1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRBXzA9Y2FzdD0oSERDKQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50QV8xPWNhc3Q9KExQU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfMj0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfMz0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfND0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudEFfNT0KLQotT1NfR2V0Q2hhcmFjdGVyUGxhY2VtZW50Vz0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfMD1jYXN0PShIREMpCi1PU19HZXRDaGFyYWN0ZXJQbGFjZW1lbnRXXzE9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfMj0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfMz0KLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfND1jYXN0PShMUEdDUF9SRVNVTFRTVykKLU9TX0dldENoYXJhY3RlclBsYWNlbWVudFdfNT0KLQotT1NfR2V0Q2xhc3NJbmZvQT0KLU9TX0dldENsYXNzSW5mb0FfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19HZXRDbGFzc0luZm9BXzE9Y2FzdD0oTFBTVFIpCi1PU19HZXRDbGFzc0luZm9BXzI9Ci0KLU9TX0dldENsYXNzSW5mb1c9Ci1PU19HZXRDbGFzc0luZm9XXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfR2V0Q2xhc3NJbmZvV18xPWNhc3Q9KExQV1NUUikKLU9TX0dldENsYXNzSW5mb1dfMj1jYXN0PShMUFdORENMQVNTVykKLQotT1NfR2V0Q2xhc3NOYW1lQT0KLU9TX0dldENsYXNzTmFtZUFfMD1jYXN0PUhXTkQKLU9TX0dldENsYXNzTmFtZUFfMT0KLU9TX0dldENsYXNzTmFtZUFfMj0KLQotT1NfR2V0Q2xhc3NOYW1lVz0KLU9TX0dldENsYXNzTmFtZVdfMD1jYXN0PUhXTkQKLU9TX0dldENsYXNzTmFtZVdfMT0KLU9TX0dldENsYXNzTmFtZVdfMj0KLQotT1NfR2V0Q2xpZW50UmVjdD0KLU9TX0dldENsaWVudFJlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0Q2xpZW50UmVjdF8xPQotCi1PU19HZXRDbGlwQm94PQotT1NfR2V0Q2xpcEJveF8wPWNhc3Q9KEhEQykKLU9TX0dldENsaXBCb3hfMT0KLQotT1NfR2V0Q2xpcFJnbj0KLU9TX0dldENsaXBSZ25fMD1jYXN0PShIREMpCi1PU19HZXRDbGlwUmduXzE9Y2FzdD0oSFJHTikKLQotT1NfR2V0Q2xpcGJvYXJkRGF0YT0KLU9TX0dldENsaXBib2FyZERhdGFfMD0KLQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUE9Ci1PU19HZXRDbGlwYm9hcmRGb3JtYXROYW1lQV8wPQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUFfMT0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVBXzI9Ci0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVXPQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZVdfMD0KLU9TX0dldENsaXBib2FyZEZvcm1hdE5hbWVXXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZVdfMj0KLQotT1NfR2V0Q29tYm9Cb3hJbmZvPWZsYWdzPWR5bmFtaWMKLU9TX0dldENvbWJvQm94SW5mb18wPWNhc3Q9KEhXTkQpCi1PU19HZXRDb21ib0JveEluZm9fMT0KLQotT1NfR2V0Q3VycmVudE9iamVjdD0KLU9TX0dldEN1cnJlbnRPYmplY3RfMD1jYXN0PShIREMpCi1PU19HZXRDdXJyZW50T2JqZWN0XzE9Ci0KLU9TX0dldEN1cnJlbnRQcm9jZXNzSWQ9Ci0KLU9TX0dldEN1cnJlbnRUaHJlYWRJZD0KLQotT1NfR2V0Q3Vyc29yPQotCi1PU19HZXRDdXJzb3JQb3M9Ci1PU19HZXRDdXJzb3JQb3NfMD0KLQotT1NfR2V0REM9Ci1PU19HZXREQ18wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldERDRXg9Ci1PU19HZXREQ0V4XzA9Y2FzdD0oSFdORCkKLU9TX0dldERDRXhfMT1jYXN0PShIUkdOKQotT1NfR2V0RENFeF8yPQotCi1PU19HZXRESUJDb2xvclRhYmxlPQotT1NfR2V0RElCQ29sb3JUYWJsZV8wPWNhc3Q9KEhEQykKLU9TX0dldERJQkNvbG9yVGFibGVfMT0KLU9TX0dldERJQkNvbG9yVGFibGVfMj0KLU9TX0dldERJQkNvbG9yVGFibGVfMz1jYXN0PShSR0JRVUFEICopLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldERJQml0cz0KLU9TX0dldERJQml0c18wPWNhc3Q9KEhEQykKLU9TX0dldERJQml0c18xPWNhc3Q9KEhCSVRNQVApCi1PU19HZXRESUJpdHNfMj0KLU9TX0dldERJQml0c18zPQotT1NfR2V0RElCaXRzXzQ9Y2FzdD0oTFBWT0lEKQotT1NfR2V0RElCaXRzXzU9Y2FzdD0oTFBCSVRNQVBJTkZPKSxmbGFncz1jcml0aWNhbAotT1NfR2V0RElCaXRzXzY9Ci0KLU9TX0dldERhdGVGb3JtYXRBPQotT1NfR2V0RGF0ZUZvcm1hdEFfMD1jYXN0PShMQ0lEKQotT1NfR2V0RGF0ZUZvcm1hdEFfMT1jYXN0PShEV09SRCkKLU9TX0dldERhdGVGb3JtYXRBXzI9Ci1PU19HZXREYXRlRm9ybWF0QV8zPWNhc3Q9KExQU1RSKQotT1NfR2V0RGF0ZUZvcm1hdEFfND1jYXN0PShMUFNUUikKLU9TX0dldERhdGVGb3JtYXRBXzU9Ci0KLU9TX0dldERhdGVGb3JtYXRXPQotT1NfR2V0RGF0ZUZvcm1hdFdfMD1jYXN0PShMQ0lEKQotT1NfR2V0RGF0ZUZvcm1hdFdfMT1jYXN0PShEV09SRCkKLU9TX0dldERhdGVGb3JtYXRXXzI9Ci1PU19HZXREYXRlRm9ybWF0V18zPWNhc3Q9KExQV1NUUikKLU9TX0dldERhdGVGb3JtYXRXXzQ9Y2FzdD0oTFBXU1RSKQotT1NfR2V0RGF0ZUZvcm1hdFdfNT0KLQotT1NfR2V0RGVza3RvcFdpbmRvdz0KLQotT1NfR2V0RGV2aWNlQ2Fwcz0KLU9TX0dldERldmljZUNhcHNfMD1jYXN0PShIREMpCi1PU19HZXREZXZpY2VDYXBzXzE9Ci0KLU9TX0dldERpYWxvZ0Jhc2VVbml0cz0KLQotT1NfR2V0RGxnSXRlbT0KLU9TX0dldERsZ0l0ZW1fMD1jYXN0PShIV05EKQotT1NfR2V0RGxnSXRlbV8xPQotCi1PU19HZXREb3VibGVDbGlja1RpbWU9Ci0KLU9TX0dldEZvY3VzPQotCi1PU19HZXRGb250TGFuZ3VhZ2VJbmZvPQotT1NfR2V0Rm9udExhbmd1YWdlSW5mb18wPWNhc3Q9KEhEQykKLQotT1NfR2V0Rm9yZWdyb3VuZFdpbmRvdz0KLQotT1NfR2V0R1VJVGhyZWFkSW5mbz0KLU9TX0dldEdVSVRocmVhZEluZm9fMD1jYXN0PShEV09SRCkKLU9TX0dldEdVSVRocmVhZEluZm9fMT1jYXN0PShMUEdVSVRIUkVBRElORk8pCi0KLU9TX0dldEljb25JbmZvPQotT1NfR2V0SWNvbkluZm9fMD1jYXN0PShISUNPTikKLU9TX0dldEljb25JbmZvXzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0S2V5TmFtZVRleHRBPQotT1NfR2V0S2V5TmFtZVRleHRBXzA9Ci1PU19HZXRLZXlOYW1lVGV4dEFfMT1jYXN0PShMUFNUUikKLU9TX0dldEtleU5hbWVUZXh0QV8yPQotCi1PU19HZXRLZXlOYW1lVGV4dFc9Ci1PU19HZXRLZXlOYW1lVGV4dFdfMD0KLU9TX0dldEtleU5hbWVUZXh0V18xPWNhc3Q9KExQV1NUUikKLU9TX0dldEtleU5hbWVUZXh0V18yPQotCi1PU19HZXRLZXlTdGF0ZT0KLU9TX0dldEtleVN0YXRlXzA9Ci0KLU9TX0dldEtleWJvYXJkTGF5b3V0PQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRfMD0KLQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRMaXN0PQotT1NfR2V0S2V5Ym9hcmRMYXlvdXRMaXN0XzA9Ci1PU19HZXRLZXlib2FyZExheW91dExpc3RfMT1jYXN0PShIS0wgRkFSICopCi0KLU9TX0dldEtleWJvYXJkU3RhdGU9Ci1PU19HZXRLZXlib2FyZFN0YXRlXzA9Y2FzdD0oUEJZVEUpCi0KLU9TX0dldExhc3RBY3RpdmVQb3B1cD0KLU9TX0dldExhc3RBY3RpdmVQb3B1cF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldExhc3RFcnJvcj0KLQotT1NfR2V0TGF5b3V0PWZsYWdzPWR5bmFtaWMKLU9TX0dldExheW91dF8wPWNhc3Q9KEhEQykKLQotT1NfR2V0TGlicmFyeUhhbmRsZT1mbGFncz1ub19nZW4KLQotT1NfR2V0TG9jYWxlSW5mb0E9Ci1PU19HZXRMb2NhbGVJbmZvQV8wPQotT1NfR2V0TG9jYWxlSW5mb0FfMT0KLU9TX0dldExvY2FsZUluZm9BXzI9Y2FzdD0oTFBTVFIpCi1PU19HZXRMb2NhbGVJbmZvQV8zPQotCi1PU19HZXRMb2NhbGVJbmZvVz0KLU9TX0dldExvY2FsZUluZm9XXzA9Ci1PU19HZXRMb2NhbGVJbmZvV18xPQotT1NfR2V0TG9jYWxlSW5mb1dfMj1jYXN0PShMUFdTVFIpCi1PU19HZXRMb2NhbGVJbmZvV18zPQotCi1PU19HZXRNZW51PQotT1NfR2V0TWVudV8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldE1lbnVCYXJJbmZvPWZsYWdzPWR5bmFtaWMKLU9TX0dldE1lbnVCYXJJbmZvXzA9Ci1PU19HZXRNZW51QmFySW5mb18xPQotT1NfR2V0TWVudUJhckluZm9fMj0KLU9TX0dldE1lbnVCYXJJbmZvXzM9Ci0KLU9TX0dldE1lbnVEZWZhdWx0SXRlbT0KLU9TX0dldE1lbnVEZWZhdWx0SXRlbV8wPWNhc3Q9KEhNRU5VKQotT1NfR2V0TWVudURlZmF1bHRJdGVtXzE9Ci1PU19HZXRNZW51RGVmYXVsdEl0ZW1fMj0KLQotT1NfR2V0TWVudUluZm89ZmxhZ3M9ZHluYW1pYwotT1NfR2V0TWVudUluZm9fMD1jYXN0PShITUVOVSkKLU9TX0dldE1lbnVJbmZvXzE9Ci0KLU9TX0dldE1lbnVJdGVtQ291bnQ9Ci1PU19HZXRNZW51SXRlbUNvdW50XzA9Y2FzdD0oSE1FTlUpCi0KLU9TX0dldE1lbnVJdGVtSW5mb0E9Ci1PU19HZXRNZW51SXRlbUluZm9BXzA9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbUluZm9BXzE9Ci1PU19HZXRNZW51SXRlbUluZm9BXzI9Ci1PU19HZXRNZW51SXRlbUluZm9BXzM9Ci0KLU9TX0dldE1lbnVJdGVtSW5mb1c9Ci1PU19HZXRNZW51SXRlbUluZm9XXzA9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbUluZm9XXzE9Ci1PU19HZXRNZW51SXRlbUluZm9XXzI9Ci1PU19HZXRNZW51SXRlbUluZm9XXzM9Y2FzdD0oTFBNRU5VSVRFTUlORk9XKQotCi1PU19HZXRNZW51SXRlbVJlY3Q9Ci1PU19HZXRNZW51SXRlbVJlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0TWVudUl0ZW1SZWN0XzE9Y2FzdD0oSE1FTlUpCi1PU19HZXRNZW51SXRlbVJlY3RfMj0KLU9TX0dldE1lbnVJdGVtUmVjdF8zPQotCi1PU19HZXRNZXNzYWdlQT0KLU9TX0dldE1lc3NhZ2VBXzA9Ci1PU19HZXRNZXNzYWdlQV8xPWNhc3Q9KEhXTkQpCi1PU19HZXRNZXNzYWdlQV8yPQotT1NfR2V0TWVzc2FnZUFfMz0KLQotT1NfR2V0TWVzc2FnZVBvcz0KLQotT1NfR2V0TWVzc2FnZVRpbWU9Ci0KLU9TX0dldE1lc3NhZ2VXPQotT1NfR2V0TWVzc2FnZVdfMD0KLU9TX0dldE1lc3NhZ2VXXzE9Y2FzdD0oSFdORCkKLU9TX0dldE1lc3NhZ2VXXzI9Ci1PU19HZXRNZXNzYWdlV18zPQotCi1PU19HZXRNZXRhUmduPQotT1NfR2V0TWV0YVJnbl8wPWNhc3Q9SERDCi1PU19HZXRNZXRhUmduXzE9Y2FzdD1IUkdOCi0KLU9TX0dldE1vZHVsZUZpbGVOYW1lQT0KLU9TX0dldE1vZHVsZUZpbGVOYW1lQV8wPWNhc3Q9SE1PRFVMRQotT1NfR2V0TW9kdWxlRmlsZU5hbWVBXzE9Y2FzdD1MUFNUUgotT1NfR2V0TW9kdWxlRmlsZU5hbWVBXzI9Ci0KLU9TX0dldE1vZHVsZUZpbGVOYW1lVz0KLU9TX0dldE1vZHVsZUZpbGVOYW1lV18wPWNhc3Q9SE1PRFVMRQotT1NfR2V0TW9kdWxlRmlsZU5hbWVXXzE9Y2FzdD1MUFdTVFIKLU9TX0dldE1vZHVsZUZpbGVOYW1lV18yPQotCi1PU19HZXRNb2R1bGVIYW5kbGVBPQotT1NfR2V0TW9kdWxlSGFuZGxlQV8wPWNhc3Q9KExQU1RSKQotCi1PU19HZXRNb2R1bGVIYW5kbGVXPQotT1NfR2V0TW9kdWxlSGFuZGxlV18wPWNhc3Q9KExQV1NUUikKLQotT1NfR2V0TW9uaXRvckluZm9BPWZsYWdzPWR5bmFtaWMKLU9TX0dldE1vbml0b3JJbmZvQV8wPWNhc3Q9KEhNT05JVE9SKQotT1NfR2V0TW9uaXRvckluZm9BXzE9Y2FzdD0oTFBNT05JVE9SSU5GTykKLQotT1NfR2V0TW9uaXRvckluZm9XPWZsYWdzPWR5bmFtaWMKLU9TX0dldE1vbml0b3JJbmZvV18wPWNhc3Q9KEhNT05JVE9SKQotT1NfR2V0TW9uaXRvckluZm9XXzE9Y2FzdD0oTFBNT05JVE9SSU5GTykKLQotT1NfR2V0TmVhcmVzdFBhbGV0dGVJbmRleD0KLU9TX0dldE5lYXJlc3RQYWxldHRlSW5kZXhfMD1jYXN0PShIUEFMRVRURSkKLU9TX0dldE5lYXJlc3RQYWxldHRlSW5kZXhfMT1jYXN0PShDT0xPUlJFRikKLQotT1NfR2V0T2JqZWN0QV9fSUlJPQotT1NfR2V0T2JqZWN0QV9fSUlJXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJSV8xPQotT1NfR2V0T2JqZWN0QV9fSUlJXzI9Y2FzdD1MUFZPSUQsZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBfMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ESUJTRUNUSU9OXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMj0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRVhUTE9HUEVOXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMT0KLU9TX0dldE9iamVjdEFfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dCUlVTSF8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMl8xPQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzI9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0QV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR1BFTl8yXzE9Ci1PU19HZXRPYmplY3RBX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUk9Ci1PU19HZXRPYmplY3RXX19JSUlfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlJXzE9Ci1PU19HZXRPYmplY3RXX19JSUlfMj1jYXN0PUxQVk9JRCxmbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMD1jYXN0PShIR0RJT0JKKQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUF8yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RJQlNFQ1RJT05fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRElCU0VDVElPTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8yXzI9ZmxhZ3M9bm9faW4KLQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzI9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HQlJVU0hfMl8xPQotT1NfR2V0T2JqZWN0V19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0JSVVNIXzJfMj1mbGFncz1ub19pbgotCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18yXzA9Y2FzdD0oSEdESU9CSikKLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18yXzE9Ci1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMj0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8wPWNhc3Q9KEhHRElPQkopCi1PU19HZXRPYmplY3RXX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HUEVOXzJfMT0KLU9TX0dldE9iamVjdFdfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dQRU5fMl8yPWZsYWdzPW5vX2luCi0KLU9TX0dldE9wZW5GaWxlTmFtZUE9Ci1PU19HZXRPcGVuRmlsZU5hbWVBXzA9Ci0KLU9TX0dldE9wZW5GaWxlTmFtZVc9Ci1PU19HZXRPcGVuRmlsZU5hbWVXXzA9Y2FzdD0oTFBPUEVORklMRU5BTUVXKQotCi1PU19HZXRQYWxldHRlRW50cmllcz0KLU9TX0dldFBhbGV0dGVFbnRyaWVzXzA9Y2FzdD0oSFBBTEVUVEUpCi1PU19HZXRQYWxldHRlRW50cmllc18xPQotT1NfR2V0UGFsZXR0ZUVudHJpZXNfMj0KLU9TX0dldFBhbGV0dGVFbnRyaWVzXzM9Y2FzdD0oTFBQQUxFVFRFRU5UUlkpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi0KLU9TX0dldFBhcmVudD0KLU9TX0dldFBhcmVudF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldFBhdGg9Ci1PU19HZXRQYXRoXzA9Y2FzdD1IREMKLU9TX0dldFBhdGhfMT1jYXN0PUxQUE9JTlQKLU9TX0dldFBhdGhfMj1jYXN0PUxQQllURQotT1NfR2V0UGF0aF8zPQotCi1PU19HZXRQaXhlbD0KLU9TX0dldFBpeGVsXzA9Y2FzdD0oSERDKQotT1NfR2V0UGl4ZWxfMT0KLU9TX0dldFBpeGVsXzI9Ci0KLU9TX0dldFBvbHlGaWxsTW9kZT0KLU9TX0dldFBvbHlGaWxsTW9kZV8wPWNhc3Q9SERDCi0KLU9TX0dldFByb2NBZGRyZXNzPQotT1NfR2V0UHJvY0FkZHJlc3NfMD1jYXN0PShITU9EVUxFKQotT1NfR2V0UHJvY0FkZHJlc3NfMT1jYXN0PShMUENUU1RSKQotCi1PU19HZXRQcm9jZXNzSGVhcD0KLQotT1NfR2V0UHJvY2Vzc0hlYXBzPQotT1NfR2V0UHJvY2Vzc0hlYXBzXzA9Ci1PU19HZXRQcm9jZXNzSGVhcHNfMT1jYXN0PVBIQU5ETEUKLQotT1NfR2V0UHJvZmlsZVN0cmluZ0E9Ci1PU19HZXRQcm9maWxlU3RyaW5nQV8wPWNhc3Q9KExQU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfMT1jYXN0PShMUFNUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdBXzI9Y2FzdD0oTFBTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nQV8zPWNhc3Q9KExQU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ0FfND0KLQotT1NfR2V0UHJvZmlsZVN0cmluZ1c9Ci1PU19HZXRQcm9maWxlU3RyaW5nV18wPWNhc3Q9KExQV1NUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdXXzE9Y2FzdD0oTFBXU1RSKQotT1NfR2V0UHJvZmlsZVN0cmluZ1dfMj1jYXN0PShMUFdTVFIpCi1PU19HZXRQcm9maWxlU3RyaW5nV18zPWNhc3Q9KExQV1NUUikKLU9TX0dldFByb2ZpbGVTdHJpbmdXXzQ9Ci0KLU9TX0dldFByb3BBPQotT1NfR2V0UHJvcEFfMD1jYXN0PUhXTkQKLU9TX0dldFByb3BBXzE9Y2FzdD1MUENUU1RSCi0KLU9TX0dldFByb3BXPQotT1NfR2V0UHJvcFdfMD1jYXN0PUhXTkQKLU9TX0dldFByb3BXXzE9Y2FzdD0oTFBDV1NUUikKLQotT1NfR2V0Uk9QMj0KLU9TX0dldFJPUDJfMD1jYXN0PShIREMpCi0KLU9TX0dldFJhbmRvbVJnbj0KLU9TX0dldFJhbmRvbVJnbl8wPWNhc3Q9SERDCi1PU19HZXRSYW5kb21SZ25fMT1jYXN0PUhSR04KLU9TX0dldFJhbmRvbVJnbl8yPQotCi1PU19HZXRSZWdpb25EYXRhPQotT1NfR2V0UmVnaW9uRGF0YV8wPWNhc3Q9KEhSR04pCi1PU19HZXRSZWdpb25EYXRhXzE9Ci1PU19HZXRSZWdpb25EYXRhXzI9Y2FzdD0oUkdOREFUQSAqKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRSZ25Cb3g9Ci1PU19HZXRSZ25Cb3hfMD1jYXN0PShIUkdOKQotT1NfR2V0UmduQm94XzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0U2F2ZUZpbGVOYW1lQT0KLU9TX0dldFNhdmVGaWxlTmFtZUFfMD0KLQotT1NfR2V0U2F2ZUZpbGVOYW1lVz0KLU9TX0dldFNhdmVGaWxlTmFtZVdfMD1jYXN0PShMUE9QRU5GSUxFTkFNRVcpCi0KLU9TX0dldFNjcm9sbEluZm89Ci1PU19HZXRTY3JvbGxJbmZvXzA9Y2FzdD0oSFdORCkKLU9TX0dldFNjcm9sbEluZm9fMT0KLU9TX0dldFNjcm9sbEluZm9fMj0KLQotT1NfR2V0U3RhcnR1cEluZm9BPQotT1NfR2V0U3RhcnR1cEluZm9BXzA9Y2FzdD0oTFBTVEFSVFVQSU5GT0EpCi0KLU9TX0dldFN0YXJ0dXBJbmZvVz0KLU9TX0dldFN0YXJ0dXBJbmZvV18wPWNhc3Q9KExQU1RBUlRVUElORk9XKQotCi1PU19HZXRTdG9ja09iamVjdD0KLU9TX0dldFN0b2NrT2JqZWN0XzA9Ci0KLU9TX0dldFN5c0NvbG9yPQotT1NfR2V0U3lzQ29sb3JfMD0KLQotT1NfR2V0U3lzQ29sb3JCcnVzaD0KLU9TX0dldFN5c0NvbG9yQnJ1c2hfMD0KLQotT1NfR2V0U3lzdGVtRGVmYXVsdFVJTGFuZ3VhZ2U9ZmxhZ3M9ZHluYW1pYwotCi1PU19HZXRTeXN0ZW1NZW51PQotT1NfR2V0U3lzdGVtTWVudV8wPWNhc3Q9KEhXTkQpCi1PU19HZXRTeXN0ZW1NZW51XzE9Ci0KLU9TX0dldFN5c3RlbU1ldHJpY3M9Ci1PU19HZXRTeXN0ZW1NZXRyaWNzXzA9Ci0KLU9TX0dldFN5c3RlbVBhbGV0dGVFbnRyaWVzPQotT1NfR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXNfMD1jYXN0PShIREMpCi1PU19HZXRTeXN0ZW1QYWxldHRlRW50cmllc18xPWNhc3Q9KFVJTlQpCi1PU19HZXRTeXN0ZW1QYWxldHRlRW50cmllc18yPWNhc3Q9KFVJTlQpCi1PU19HZXRTeXN0ZW1QYWxldHRlRW50cmllc18zPWNhc3Q9KExQUEFMRVRURUVOVFJZKSxmbGFncz1ub19pbiBjcml0aWNhbAotCi1PU19HZXRUZXh0Q2hhcnNldD0KLU9TX0dldFRleHRDaGFyc2V0XzA9Y2FzdD0oSERDKQotCi1PU19HZXRUZXh0Q29sb3I9Ci1PU19HZXRUZXh0Q29sb3JfMD1jYXN0PShIREMpCi0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyQT0KLU9TX0dldFRleHRFeHRlbnRQb2ludDMyQV8wPWNhc3Q9KEhEQykKLU9TX0dldFRleHRFeHRlbnRQb2ludDMyQV8xPWNhc3Q9KExQU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0dldFRleHRFeHRlbnRQb2ludDMyQV8yPQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJBXzM9ZmxhZ3M9bm9faW4KLQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJXPQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJXXzA9Y2FzdD0oSERDKQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJXXzE9Y2FzdD0oTFBXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX0dldFRleHRFeHRlbnRQb2ludDMyV18yPQotT1NfR2V0VGV4dEV4dGVudFBvaW50MzJXXzM9ZmxhZ3M9bm9faW4KLQotT1NfR2V0VGV4dE1ldHJpY3NBPQotT1NfR2V0VGV4dE1ldHJpY3NBXzA9Y2FzdD0oSERDKQotT1NfR2V0VGV4dE1ldHJpY3NBXzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0VGV4dE1ldHJpY3NXPQotT1NfR2V0VGV4dE1ldHJpY3NXXzA9Y2FzdD0oSERDKQotT1NfR2V0VGV4dE1ldHJpY3NXXzE9ZmxhZ3M9bm9faW4KLQotT1NfR2V0VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3Q9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3RfMD0KLU9TX0dldFRoZW1lQmFja2dyb3VuZENvbnRlbnRSZWN0XzE9Ci1PU19HZXRUaGVtZUJhY2tncm91bmRDb250ZW50UmVjdF8yPQotT1NfR2V0VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3RfMz0KLU9TX0dldFRoZW1lQmFja2dyb3VuZENvbnRlbnRSZWN0XzQ9Ci1PU19HZXRUaGVtZUJhY2tncm91bmRDb250ZW50UmVjdF81PQotCi1PU19HZXRUaGVtZUJhY2tncm91bmRFeHRlbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0VGhlbWVCYWNrZ3JvdW5kRXh0ZW50XzA9Ci1PU19HZXRUaGVtZUJhY2tncm91bmRFeHRlbnRfMT0KLU9TX0dldFRoZW1lQmFja2dyb3VuZEV4dGVudF8yPQotT1NfR2V0VGhlbWVCYWNrZ3JvdW5kRXh0ZW50XzM9Ci1PU19HZXRUaGVtZUJhY2tncm91bmRFeHRlbnRfND1mbGFncz1ub19vdXQKLU9TX0dldFRoZW1lQmFja2dyb3VuZEV4dGVudF81PQotCi1PU19HZXRUaGVtZUNvbG9yPWZsYWdzPWR5bmFtaWMKLU9TX0dldFRoZW1lQ29sb3JfMD0KLU9TX0dldFRoZW1lQ29sb3JfMT0KLU9TX0dldFRoZW1lQ29sb3JfMj0KLU9TX0dldFRoZW1lQ29sb3JfMz0KLU9TX0dldFRoZW1lQ29sb3JfND0KLQotT1NfR2V0VGhlbWVJbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0VGhlbWVJbnRfMD0KLU9TX0dldFRoZW1lSW50XzE9Ci1PU19HZXRUaGVtZUludF8yPQotT1NfR2V0VGhlbWVJbnRfMz0KLU9TX0dldFRoZW1lSW50XzQ9Ci0KLU9TX0dldFRoZW1lTWFyZ2lucz1mbGFncz1keW5hbWljCi1PU19HZXRUaGVtZU1hcmdpbnNfMD0KLU9TX0dldFRoZW1lTWFyZ2luc18xPQotT1NfR2V0VGhlbWVNYXJnaW5zXzI9Ci1PU19HZXRUaGVtZU1hcmdpbnNfMz0KLU9TX0dldFRoZW1lTWFyZ2luc180PQotT1NfR2V0VGhlbWVNYXJnaW5zXzU9Ci1PU19HZXRUaGVtZU1hcmdpbnNfNj0KLQotT1NfR2V0VGhlbWVNZXRyaWM9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0VGhlbWVNZXRyaWNfMD0KLU9TX0dldFRoZW1lTWV0cmljXzE9Ci1PU19HZXRUaGVtZU1ldHJpY18yPQotT1NfR2V0VGhlbWVNZXRyaWNfMz0KLU9TX0dldFRoZW1lTWV0cmljXzQ9Ci1PU19HZXRUaGVtZU1ldHJpY181PQotCi1PU19HZXRUaGVtZVBhcnRTaXplPWZsYWdzPWR5bmFtaWMKLU9TX0dldFRoZW1lUGFydFNpemVfMD0KLU9TX0dldFRoZW1lUGFydFNpemVfMT0KLU9TX0dldFRoZW1lUGFydFNpemVfMj0KLU9TX0dldFRoZW1lUGFydFNpemVfMz0KLU9TX0dldFRoZW1lUGFydFNpemVfND0KLU9TX0dldFRoZW1lUGFydFNpemVfNT0KLU9TX0dldFRoZW1lUGFydFNpemVfNj0KLQotT1NfR2V0VGhlbWVSZWN0PWZsYWdzPWR5bmFtaWMKLU9TX0dldFRoZW1lUmVjdF8wPQotT1NfR2V0VGhlbWVSZWN0XzE9Ci1PU19HZXRUaGVtZVJlY3RfMj0KLU9TX0dldFRoZW1lUmVjdF8zPQotT1NfR2V0VGhlbWVSZWN0XzQ9Ci0KLU9TX0dldFRoZW1lU3lzU2l6ZT1mbGFncz1keW5hbWljCi1PU19HZXRUaGVtZVN5c1NpemVfMD0KLU9TX0dldFRoZW1lU3lzU2l6ZV8xPQotCi1PU19HZXRUaGVtZVRleHRFeHRlbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfR2V0VGhlbWVUZXh0RXh0ZW50XzA9Ci1PU19HZXRUaGVtZVRleHRFeHRlbnRfMT0KLU9TX0dldFRoZW1lVGV4dEV4dGVudF8yPQotT1NfR2V0VGhlbWVUZXh0RXh0ZW50XzM9Ci1PU19HZXRUaGVtZVRleHRFeHRlbnRfND0KLU9TX0dldFRoZW1lVGV4dEV4dGVudF81PQotT1NfR2V0VGhlbWVUZXh0RXh0ZW50XzY9Ci1PU19HZXRUaGVtZVRleHRFeHRlbnRfNz0KLU9TX0dldFRoZW1lVGV4dEV4dGVudF84PQotCi1PU19HZXRUaWNrQ291bnQ9Ci0KLU9TX0dldFRpbWVGb3JtYXRBPQotT1NfR2V0VGltZUZvcm1hdEFfMD1jYXN0PShMQ0lEKQotT1NfR2V0VGltZUZvcm1hdEFfMT1jYXN0PShEV09SRCkKLU9TX0dldFRpbWVGb3JtYXRBXzI9Ci1PU19HZXRUaW1lRm9ybWF0QV8zPWNhc3Q9KExQU1RSKQotT1NfR2V0VGltZUZvcm1hdEFfND1jYXN0PShMUFNUUikKLU9TX0dldFRpbWVGb3JtYXRBXzU9Ci0KLU9TX0dldFRpbWVGb3JtYXRXPQotT1NfR2V0VGltZUZvcm1hdFdfMD1jYXN0PShMQ0lEKQotT1NfR2V0VGltZUZvcm1hdFdfMT1jYXN0PShEV09SRCkKLU9TX0dldFRpbWVGb3JtYXRXXzI9Ci1PU19HZXRUaW1lRm9ybWF0V18zPWNhc3Q9KExQV1NUUikKLU9TX0dldFRpbWVGb3JtYXRXXzQ9Y2FzdD0oTFBXU1RSKQotT1NfR2V0VGltZUZvcm1hdFdfNT0KLQotT1NfR2V0VXBkYXRlUmVjdD0KLU9TX0dldFVwZGF0ZVJlY3RfMD1jYXN0PShIV05EKQotT1NfR2V0VXBkYXRlUmVjdF8xPWNhc3Q9KExQUkVDVCkKLU9TX0dldFVwZGF0ZVJlY3RfMj1jYXN0PShCT09MKQotCi1PU19HZXRVcGRhdGVSZ249Ci1PU19HZXRVcGRhdGVSZ25fMD1jYXN0PShIV05EKQotT1NfR2V0VXBkYXRlUmduXzE9Y2FzdD0oSFJHTikKLU9TX0dldFVwZGF0ZVJnbl8yPQotCi1PU19HZXRWZXJzaW9uRXhBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9BXzI9Ci1PU19HZXRWZXJzaW9uRXhBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9BXzJfMD0KLQotT1NfR2V0VmVyc2lvbkV4QV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPRVhBXzI9Ci1PU19HZXRWZXJzaW9uRXhBX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9FWEFfMl8wPWNhc3Q9TFBPU1ZFUlNJT05JTkZPQQotCi1PU19HZXRWZXJzaW9uRXhXX19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9FWFdfMj0KLU9TX0dldFZlcnNpb25FeFdfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1NWRVJTSU9OSU5GT0VYV18yXzA9Y2FzdD0oTFBPU1ZFUlNJT05JTkZPVykKLQotT1NfR2V0VmVyc2lvbkV4V19fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPV18yPQotT1NfR2V0VmVyc2lvbkV4V19fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPV18yXzA9Ci0KLU9TX0dldFdpbmRvdz0KLU9TX0dldFdpbmRvd18wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dfMT0KLQotT1NfR2V0V2luZG93REM9Ci1PU19HZXRXaW5kb3dEQ18wPWNhc3Q9SFdORAotCi1PU19HZXRXaW5kb3dMb25nQT0KLU9TX0dldFdpbmRvd0xvbmdBXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd0xvbmdBXzE9Ci0KLU9TX0dldFdpbmRvd0xvbmdQdHJBPQotT1NfR2V0V2luZG93TG9uZ1B0ckFfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93TG9uZ1B0ckFfMT0KLQotT1NfR2V0V2luZG93TG9uZ1B0clc9Ci1PU19HZXRXaW5kb3dMb25nUHRyV18wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dMb25nUHRyV18xPQotCi1PU19HZXRXaW5kb3dMb25nVz0KLU9TX0dldFdpbmRvd0xvbmdXXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd0xvbmdXXzE9Ci0KLU9TX0dldFdpbmRvd09yZ0V4PQotT1NfR2V0V2luZG93T3JnRXhfMD1jYXN0PUhEQwotT1NfR2V0V2luZG93T3JnRXhfMT0KLQotT1NfR2V0V2luZG93UGxhY2VtZW50PQotT1NfR2V0V2luZG93UGxhY2VtZW50XzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1BsYWNlbWVudF8xPQotCi1PU19HZXRXaW5kb3dSZWN0PQotT1NfR2V0V2luZG93UmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dSZWN0XzE9Ci0KLU9TX0dldFdpbmRvd1Jnbj0KLU9TX0dldFdpbmRvd1Jnbl8wPWNhc3Q9KEhXTkQpCi1PU19HZXRXaW5kb3dSZ25fMT1jYXN0PShIUkdOKQotCi1PU19HZXRXaW5kb3dUZXh0QT0KLU9TX0dldFdpbmRvd1RleHRBXzA9Y2FzdD0oSFdORCkKLU9TX0dldFdpbmRvd1RleHRBXzE9Y2FzdD0oTFBTVFIpCi1PU19HZXRXaW5kb3dUZXh0QV8yPQotCi1PU19HZXRXaW5kb3dUZXh0TGVuZ3RoQT0KLU9TX0dldFdpbmRvd1RleHRMZW5ndGhBXzA9Y2FzdD0oSFdORCkKLQotT1NfR2V0V2luZG93VGV4dExlbmd0aFc9Ci1PU19HZXRXaW5kb3dUZXh0TGVuZ3RoV18wPWNhc3Q9KEhXTkQpCi0KLU9TX0dldFdpbmRvd1RleHRXPQotT1NfR2V0V2luZG93VGV4dFdfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93VGV4dFdfMT1jYXN0PShMUFdTVFIpCi1PU19HZXRXaW5kb3dUZXh0V18yPQotCi1PU19HZXRXaW5kb3dUaGVtZT1mbGFncz1keW5hbWljCi1PU19HZXRXaW5kb3dUaGVtZV8wPWNhc3Q9SFdORAotCi1PU19HZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQ9Ci1PU19HZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWRfMD1jYXN0PShIV05EKQotT1NfR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkXzE9Y2FzdD0oTFBEV09SRCkKLQotT1NfR2V0V29ybGRUcmFuc2Zvcm09Ci1PU19HZXRXb3JsZFRyYW5zZm9ybV8wPWNhc3Q9SERDCi1PU19HZXRXb3JsZFRyYW5zZm9ybV8xPWNhc3Q9TFBYRk9STQotCi1PU19HbG9iYWxBZGRBdG9tQT0KLU9TX0dsb2JhbEFkZEF0b21BXzA9Y2FzdD1MUENUU1RSCi0KLU9TX0dsb2JhbEFkZEF0b21XPQotT1NfR2xvYmFsQWRkQXRvbVdfMD1jYXN0PShMUENXU1RSKQotCi1PU19HbG9iYWxBbGxvYz0KLU9TX0dsb2JhbEFsbG9jXzA9Ci1PU19HbG9iYWxBbGxvY18xPQotCi1PU19HbG9iYWxGcmVlPQotT1NfR2xvYmFsRnJlZV8wPWNhc3Q9KEhBTkRMRSkKLQotT1NfR2xvYmFsTG9jaz0KLU9TX0dsb2JhbExvY2tfMD1jYXN0PShIQU5ETEUpCi0KLU9TX0dsb2JhbFNpemU9Ci1PU19HbG9iYWxTaXplXzA9Y2FzdD0oSEFORExFKQotCi1PU19HbG9iYWxVbmxvY2s9Ci1PU19HbG9iYWxVbmxvY2tfMD1jYXN0PShIQU5ETEUpCi0KLU9TX0dyYWRpZW50RmlsbD1mbGFncz1keW5hbWljCi1PU19HcmFkaWVudEZpbGxfMD1jYXN0PShIREMpCi1PU19HcmFkaWVudEZpbGxfMT1jYXN0PShQVFJJVkVSVEVYKQotT1NfR3JhZGllbnRGaWxsXzI9Y2FzdD0oVUxPTkcpCi1PU19HcmFkaWVudEZpbGxfMz1jYXN0PShQVk9JRCkKLU9TX0dyYWRpZW50RmlsbF80PWNhc3Q9KFVMT05HKQotT1NfR3JhZGllbnRGaWxsXzU9Y2FzdD0oVUxPTkcpCi0KLU9TX0hESElUVEVTVElORk9fc2l6ZW9mPQotCi1PU19IRElURU1fc2l6ZW9mPQotCi1PU19IRExBWU9VVF9zaXplb2Y9Ci0KLU9TX0hFTFBJTkZPX3NpemVvZj0KLQotT1NfSElHSENPTlRSQVNUX3NpemVvZj0KLQotT1NfSGVhcEFsbG9jPQotT1NfSGVhcEFsbG9jXzA9Y2FzdD0oSEFORExFKQotT1NfSGVhcEFsbG9jXzE9Ci1PU19IZWFwQWxsb2NfMj0KLQotT1NfSGVhcEZyZWU9Ci1PU19IZWFwRnJlZV8wPWNhc3Q9KEhBTkRMRSkKLU9TX0hlYXBGcmVlXzE9Ci1PU19IZWFwRnJlZV8yPWNhc3Q9KExQVk9JRCkKLQotT1NfSGVhcFZhbGlkYXRlPQotT1NfSGVhcFZhbGlkYXRlXzA9Y2FzdD1IQU5ETEUKLU9TX0hlYXBWYWxpZGF0ZV8xPQotT1NfSGVhcFZhbGlkYXRlXzI9Y2FzdD1MUENWT0lECi0KLU9TX0hpZGVDYXJldD0KLU9TX0hpZGVDYXJldF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0hpdFRlc3RUaGVtZUJhY2tncm91bmQ9ZmxhZ3M9ZHluYW1pYwotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF8wPQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF8xPQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF8yPQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF8zPQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF80PQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF81PQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF82PQotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF83PWZsYWdzPXN0cnVjdAotT1NfSGl0VGVzdFRoZW1lQmFja2dyb3VuZF84PQotCi1PU19JQ09OSU5GT19zaXplb2Y9Ci0KLU9TX0lJREZyb21TdHJpbmc9Ci1PU19JSURGcm9tU3RyaW5nXzA9Y2FzdD1MUE9MRVNUUgotT1NfSUlERnJvbVN0cmluZ18xPWNhc3Q9TFBJSUQKLQotT1NfSU5JVENPTU1PTkNPTlRST0xTRVhfc2l6ZW9mPQotCi1PU19JTlBVVF9zaXplb2Y9Ci0KLU9TX0ltYWdlTGlzdF9BZGQ9Ci1PU19JbWFnZUxpc3RfQWRkXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9BZGRfMT1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X0FkZF8yPWNhc3Q9KEhCSVRNQVApCi0KLU9TX0ltYWdlTGlzdF9BZGRNYXNrZWQ9Ci1PU19JbWFnZUxpc3RfQWRkTWFza2VkXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9BZGRNYXNrZWRfMT1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X0FkZE1hc2tlZF8yPWNhc3Q9KENPTE9SUkVGKQotCi1PU19JbWFnZUxpc3RfQmVnaW5EcmFnPQotT1NfSW1hZ2VMaXN0X0JlZ2luRHJhZ18wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfQmVnaW5EcmFnXzE9Ci1PU19JbWFnZUxpc3RfQmVnaW5EcmFnXzI9Ci1PU19JbWFnZUxpc3RfQmVnaW5EcmFnXzM9Ci0KLU9TX0ltYWdlTGlzdF9DcmVhdGU9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzA9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzE9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzI9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzM9Ci1PU19JbWFnZUxpc3RfQ3JlYXRlXzQ9Ci0KLU9TX0ltYWdlTGlzdF9EZXN0cm95PQotT1NfSW1hZ2VMaXN0X0Rlc3Ryb3lfMD1jYXN0PShISU1BR0VMSVNUKQotCi1PU19JbWFnZUxpc3RfRHJhZ0VudGVyPQotT1NfSW1hZ2VMaXN0X0RyYWdFbnRlcl8wPWNhc3Q9KEhXTkQpCi1PU19JbWFnZUxpc3RfRHJhZ0VudGVyXzE9Ci1PU19JbWFnZUxpc3RfRHJhZ0VudGVyXzI9Ci0KLU9TX0ltYWdlTGlzdF9EcmFnTGVhdmU9Ci1PU19JbWFnZUxpc3RfRHJhZ0xlYXZlXzA9Y2FzdD0oSFdORCkKLQotT1NfSW1hZ2VMaXN0X0RyYWdNb3ZlPQotT1NfSW1hZ2VMaXN0X0RyYWdNb3ZlXzA9Ci1PU19JbWFnZUxpc3RfRHJhZ01vdmVfMT0KLQotT1NfSW1hZ2VMaXN0X0RyYWdTaG93Tm9sb2NrPQotT1NfSW1hZ2VMaXN0X0RyYWdTaG93Tm9sb2NrXzA9Y2FzdD0oQk9PTCkKLQotT1NfSW1hZ2VMaXN0X0RyYXc9Ci1PU19JbWFnZUxpc3RfRHJhd18wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfRHJhd18xPQotT1NfSW1hZ2VMaXN0X0RyYXdfMj1jYXN0PShIREMpCi1PU19JbWFnZUxpc3RfRHJhd18zPQotT1NfSW1hZ2VMaXN0X0RyYXdfND0KLU9TX0ltYWdlTGlzdF9EcmF3XzU9Y2FzdD0oVUlOVCkKLQotT1NfSW1hZ2VMaXN0X0VuZERyYWc9Ci0KLU9TX0ltYWdlTGlzdF9HZXREcmFnSW1hZ2U9Ci1PU19JbWFnZUxpc3RfR2V0RHJhZ0ltYWdlXzA9Y2FzdD0oUE9JTlQgKikKLU9TX0ltYWdlTGlzdF9HZXREcmFnSW1hZ2VfMT1jYXN0PShQT0lOVCAqKQotCi1PU19JbWFnZUxpc3RfR2V0SWNvbj0KLU9TX0ltYWdlTGlzdF9HZXRJY29uXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9HZXRJY29uXzE9Ci1PU19JbWFnZUxpc3RfR2V0SWNvbl8yPQotCi1PU19JbWFnZUxpc3RfR2V0SWNvblNpemU9Ci1PU19JbWFnZUxpc3RfR2V0SWNvblNpemVfMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X0dldEljb25TaXplXzE9Ci1PU19JbWFnZUxpc3RfR2V0SWNvblNpemVfMj0KLQotT1NfSW1hZ2VMaXN0X0dldEltYWdlQ291bnQ9Ci1PU19JbWFnZUxpc3RfR2V0SW1hZ2VDb3VudF8wPWNhc3Q9KEhJTUFHRUxJU1QpCi0KLU9TX0ltYWdlTGlzdF9SZW1vdmU9Ci1PU19JbWFnZUxpc3RfUmVtb3ZlXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9SZW1vdmVfMT0KLQotT1NfSW1hZ2VMaXN0X1JlcGxhY2U9Ci1PU19JbWFnZUxpc3RfUmVwbGFjZV8wPWNhc3Q9KEhJTUFHRUxJU1QpCi1PU19JbWFnZUxpc3RfUmVwbGFjZV8xPQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMj1jYXN0PShIQklUTUFQKQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VfMz1jYXN0PShIQklUTUFQKQotCi1PU19JbWFnZUxpc3RfUmVwbGFjZUljb249Ci1PU19JbWFnZUxpc3RfUmVwbGFjZUljb25fMD1jYXN0PShISU1BR0VMSVNUKQotT1NfSW1hZ2VMaXN0X1JlcGxhY2VJY29uXzE9Ci1PU19JbWFnZUxpc3RfUmVwbGFjZUljb25fMj1jYXN0PShISUNPTikKLQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplPQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplXzA9Y2FzdD0oSElNQUdFTElTVCkKLU9TX0ltYWdlTGlzdF9TZXRJY29uU2l6ZV8xPQotT1NfSW1hZ2VMaXN0X1NldEljb25TaXplXzI9Ci0KLU9TX0ltbUFzc29jaWF0ZUNvbnRleHQ9Ci1PU19JbW1Bc3NvY2lhdGVDb250ZXh0XzA9Y2FzdD0oSFdORCkKLU9TX0ltbUFzc29jaWF0ZUNvbnRleHRfMT1jYXN0PShISU1DKQotCi1PU19JbW1DcmVhdGVDb250ZXh0PQotCi1PU19JbW1EZXN0cm95Q29udGV4dD0KLU9TX0ltbURlc3Ryb3lDb250ZXh0XzA9Y2FzdD0oSElNQykKLQotT1NfSW1tRGlzYWJsZVRleHRGcmFtZVNlcnZpY2U9ZmxhZ3M9ZHluYW1pYwotT1NfSW1tRGlzYWJsZVRleHRGcmFtZVNlcnZpY2VfMD0KLQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250QT0KLU9TX0ltbUdldENvbXBvc2l0aW9uRm9udEFfMD1jYXN0PShISU1DKQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250QV8xPQotCi1PU19JbW1HZXRDb21wb3NpdGlvbkZvbnRXPQotT1NfSW1tR2V0Q29tcG9zaXRpb25Gb250V18wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvbkZvbnRXXzE9Ci0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQV8wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ0FfMT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nQV8yPWNhc3Q9KExQU1RSKQotT1NfSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBXzM9Ci0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nVz0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18wPWNhc3Q9KEhJTUMpCi1PU19JbW1HZXRDb21wb3NpdGlvblN0cmluZ1dfMT0KLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18yPWNhc3Q9KExQV1NUUikKLU9TX0ltbUdldENvbXBvc2l0aW9uU3RyaW5nV18zPQotCi1PU19JbW1HZXRDb250ZXh0PQotT1NfSW1tR2V0Q29udGV4dF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXM9Ci1PU19JbW1HZXRDb252ZXJzaW9uU3RhdHVzXzA9Y2FzdD0oSElNQykKLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXNfMT0KLU9TX0ltbUdldENvbnZlcnNpb25TdGF0dXNfMj0KLQotT1NfSW1tR2V0RGVmYXVsdElNRVduZD0KLU9TX0ltbUdldERlZmF1bHRJTUVXbmRfMD1jYXN0PShIV05EKQotCi1PU19JbW1HZXRPcGVuU3RhdHVzPQotT1NfSW1tR2V0T3BlblN0YXR1c18wPWNhc3Q9KEhJTUMpCi0KLU9TX0ltbVJlbGVhc2VDb250ZXh0PQotT1NfSW1tUmVsZWFzZUNvbnRleHRfMD1jYXN0PShIV05EKQotT1NfSW1tUmVsZWFzZUNvbnRleHRfMT1jYXN0PShISU1DKQotCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRBPQotT1NfSW1tU2V0Q29tcG9zaXRpb25Gb250QV8wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRBXzE9Ci0KLU9TX0ltbVNldENvbXBvc2l0aW9uRm9udFc9Ci1PU19JbW1TZXRDb21wb3NpdGlvbkZvbnRXXzA9Y2FzdD0oSElNQykKLU9TX0ltbVNldENvbXBvc2l0aW9uRm9udFdfMT0KLQotT1NfSW1tU2V0Q29tcG9zaXRpb25XaW5kb3c9Ci1PU19JbW1TZXRDb21wb3NpdGlvbldpbmRvd18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb21wb3NpdGlvbldpbmRvd18xPQotCi1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzPQotT1NfSW1tU2V0Q29udmVyc2lvblN0YXR1c18wPWNhc3Q9KEhJTUMpCi1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzXzE9Ci1PU19JbW1TZXRDb252ZXJzaW9uU3RhdHVzXzI9Ci0KLU9TX0ltbVNldE9wZW5TdGF0dXM9Ci1PU19JbW1TZXRPcGVuU3RhdHVzXzA9Y2FzdD0oSElNQykKLU9TX0ltbVNldE9wZW5TdGF0dXNfMT0KLQotT1NfSW5pdENvbW1vbkNvbnRyb2xzPQotCi1PU19Jbml0Q29tbW9uQ29udHJvbHNFeD0KLU9TX0luaXRDb21tb25Db250cm9sc0V4XzA9Ci0KLU9TX0luc2VydE1lbnVBPQotT1NfSW5zZXJ0TWVudUFfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVBXzE9Ci1PU19JbnNlcnRNZW51QV8yPQotT1NfSW5zZXJ0TWVudUFfMz0KLU9TX0luc2VydE1lbnVBXzQ9Ci0KLU9TX0luc2VydE1lbnVJdGVtQT0KLU9TX0luc2VydE1lbnVJdGVtQV8wPWNhc3Q9KEhNRU5VKQotT1NfSW5zZXJ0TWVudUl0ZW1BXzE9Ci1PU19JbnNlcnRNZW51SXRlbUFfMj0KLU9TX0luc2VydE1lbnVJdGVtQV8zPQotCi1PU19JbnNlcnRNZW51SXRlbVc9Ci1PU19JbnNlcnRNZW51SXRlbVdfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVJdGVtV18xPQotT1NfSW5zZXJ0TWVudUl0ZW1XXzI9Ci1PU19JbnNlcnRNZW51SXRlbVdfMz1jYXN0PShMUE1FTlVJVEVNSU5GT1cpCi0KLU9TX0luc2VydE1lbnVXPQotT1NfSW5zZXJ0TWVudVdfMD1jYXN0PShITUVOVSkKLU9TX0luc2VydE1lbnVXXzE9Ci1PU19JbnNlcnRNZW51V18yPQotT1NfSW5zZXJ0TWVudVdfMz0KLU9TX0luc2VydE1lbnVXXzQ9Ci0KLU9TX0ludGVybmV0U2V0T3B0aW9uPQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMD1jYXN0PShISU5URVJORVQpCi1PU19JbnRlcm5ldFNldE9wdGlvbl8xPQotT1NfSW50ZXJuZXRTZXRPcHRpb25fMj1jYXN0PShMUFZPSUQpCi1PU19JbnRlcm5ldFNldE9wdGlvbl8zPQotCi1PU19JbnRlcnNlY3RDbGlwUmVjdD0KLU9TX0ludGVyc2VjdENsaXBSZWN0XzA9Y2FzdD1IREMKLU9TX0ludGVyc2VjdENsaXBSZWN0XzE9Ci1PU19JbnRlcnNlY3RDbGlwUmVjdF8yPQotT1NfSW50ZXJzZWN0Q2xpcFJlY3RfMz0KLU9TX0ludGVyc2VjdENsaXBSZWN0XzQ9Ci0KLU9TX0ludGVyc2VjdFJlY3Q9Ci1PU19JbnRlcnNlY3RSZWN0XzA9ZmxhZ3M9bm9faW4KLU9TX0ludGVyc2VjdFJlY3RfMT1mbGFncz1ub19vdXQKLU9TX0ludGVyc2VjdFJlY3RfMj1mbGFncz1ub19vdXQKLQotT1NfSW52YWxpZGF0ZVJlY3Q9Ci1PU19JbnZhbGlkYXRlUmVjdF8wPWNhc3Q9KEhXTkQpCi1PU19JbnZhbGlkYXRlUmVjdF8xPQotT1NfSW52YWxpZGF0ZVJlY3RfMj0KLQotT1NfSW52YWxpZGF0ZVJnbj0KLU9TX0ludmFsaWRhdGVSZ25fMD1jYXN0PShIV05EKQotT1NfSW52YWxpZGF0ZVJnbl8xPWNhc3Q9KEhSR04pCi1PU19JbnZhbGlkYXRlUmduXzI9Ci0KLU9TX0lzQXBwVGhlbWVkPWZsYWdzPWR5bmFtaWMKLQotT1NfSXNCYWRSZWFkUHRyPQotT1NfSXNCYWRSZWFkUHRyXzA9Y2FzdD1MUFZPSUQKLU9TX0lzQmFkUmVhZFB0cl8xPWNhc3Q9VUlOVF9QVFIKLQotT1NfSXNCYWRXcml0ZVB0cj0KLU9TX0lzQmFkV3JpdGVQdHJfMD1jYXN0PUxQVk9JRAotT1NfSXNCYWRXcml0ZVB0cl8xPWNhc3Q9VUlOVF9QVFIKLQotT1NfSXNEQkNTTGVhZEJ5dGU9Ci1PU19Jc0RCQ1NMZWFkQnl0ZV8wPQotCi1PU19Jc0h1bmdBcHBXaW5kb3c9ZmxhZ3M9ZHluYW1pYwotT1NfSXNIdW5nQXBwV2luZG93XzA9Y2FzdD1IV05ECi0KLU9TX0lzSWNvbmljPQotT1NfSXNJY29uaWNfMD1jYXN0PShIV05EKQotCi1PU19Jc1BQQz1mbGFncz1ub19nZW4KLQotT1NfSXNTUD1mbGFncz1ub19nZW4KLQotT1NfSXNXaW5kb3dFbmFibGVkPQotT1NfSXNXaW5kb3dFbmFibGVkXzA9Y2FzdD0oSFdORCkKLQotT1NfSXNXaW5kb3dWaXNpYmxlPQotT1NfSXNXaW5kb3dWaXNpYmxlXzA9Y2FzdD0oSFdORCkKLQotT1NfSXNab29tZWQ9Ci1PU19Jc1pvb21lZF8wPWNhc3Q9KEhXTkQpCi0KLU9TX0tFWUJESU5QVVRfc2l6ZW9mPQotCi1PU19LaWxsVGltZXI9Ci1PU19LaWxsVGltZXJfMD1jYXN0PShIV05EKQotT1NfS2lsbFRpbWVyXzE9Ci0KLU9TX0xJVEVNX3NpemVvZj0KLQotT1NfTE9HQlJVU0hfc2l6ZW9mPQotCi1PU19MT0dGT05UQV9zaXplb2Y9Ci0KLU9TX0xPR0ZPTlRXX3NpemVvZj0KLQotT1NfTE9HUEVOX3NpemVvZj0KLQotT1NfTFZDT0xVTU5fc2l6ZW9mPQotCi1PU19MVkhJVFRFU1RJTkZPX3NpemVvZj0KLQotT1NfTFZJVEVNX3NpemVvZj0KLQotT1NfTGluZVRvPQotT1NfTGluZVRvXzA9Y2FzdD0oSERDKQotT1NfTGluZVRvXzE9Ci1PU19MaW5lVG9fMj0KLQotT1NfTG9hZEJpdG1hcEE9Ci1PU19Mb2FkQml0bWFwQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRCaXRtYXBBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRCaXRtYXBXPQotT1NfTG9hZEJpdG1hcFdfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQml0bWFwV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEN1cnNvckE9Ci1PU19Mb2FkQ3Vyc29yQV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRDdXJzb3JBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRDdXJzb3JXPQotT1NfTG9hZEN1cnNvcldfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkQ3Vyc29yV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEljb25BPQotT1NfTG9hZEljb25BXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEljb25BXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRJY29uVz0KLU9TX0xvYWRJY29uV18wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJY29uV18xPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZEltYWdlQV9fSUlJSUlJPQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzE9Y2FzdD0oTFBTVFIpCi1PU19Mb2FkSW1hZ2VBX19JSUlJSUlfMj0KLU9TX0xvYWRJbWFnZUFfX0lJSUlJSV8zPQotT1NfTG9hZEltYWdlQV9fSUlJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VBX19JSUlJSUlfNT0KLQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUk9Ci1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJXzE9Y2FzdD0oTFBTVFIpCi1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV8yPQotT1NfTG9hZEltYWdlQV9fSV8zQklJSUlfMz0KLU9TX0xvYWRJbWFnZUFfX0lfM0JJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VBX19JXzNCSUlJSV81PQotCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUk9Ci1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMD1jYXN0PShISU5TVEFOQ0UpCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMT1jYXN0PShMUFdTVFIpCi1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfMj0KLU9TX0xvYWRJbWFnZVdfX0lJSUlJSV8zPQotT1NfTG9hZEltYWdlV19fSUlJSUlJXzQ9Ci1PU19Mb2FkSW1hZ2VXX19JSUlJSUlfNT0KLQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUk9Ci1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV8wPWNhc3Q9KEhJTlNUQU5DRSkKLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzE9Y2FzdD0oTFBXU1RSKQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfMj0KLU9TX0xvYWRJbWFnZVdfX0lfM0NJSUlJXzM9Ci1PU19Mb2FkSW1hZ2VXX19JXzNDSUlJSV80PQotT1NfTG9hZEltYWdlV19fSV8zQ0lJSUlfNT0KLQotT1NfTG9hZExpYnJhcnlBPQotT1NfTG9hZExpYnJhcnlBXzA9Y2FzdD0oTFBTVFIpCi0KLU9TX0xvYWRMaWJyYXJ5Vz0KLU9TX0xvYWRMaWJyYXJ5V18wPWNhc3Q9KExQV1NUUikKLQotT1NfTG9hZFN0cmluZ0E9Ci1PU19Mb2FkU3RyaW5nQV8wPWNhc3Q9SElOU1RBTkNFCi1PU19Mb2FkU3RyaW5nQV8xPQotT1NfTG9hZFN0cmluZ0FfMj1jYXN0PUxQU1RSCi1PU19Mb2FkU3RyaW5nQV8zPQotCi1PU19Mb2FkU3RyaW5nVz0KLU9TX0xvYWRTdHJpbmdXXzA9Y2FzdD1ISU5TVEFOQ0UKLU9TX0xvYWRTdHJpbmdXXzE9Ci1PU19Mb2FkU3RyaW5nV18yPWNhc3Q9TFBXU1RSCi1PU19Mb2FkU3RyaW5nV18zPQotCi1PU19Mb2NhbEZyZWU9Ci1PU19Mb2NhbEZyZWVfMD1jYXN0PUhMT0NBTAotCi1PU19Mb2NrV2luZG93VXBkYXRlPQotT1NfTG9ja1dpbmRvd1VwZGF0ZV8wPWNhc3Q9KEhXTkQpCi0KLU9TX01BUkdJTlNfc2l6ZW9mPQotCi1PU19NQ0lXbmRSZWdpc3RlckNsYXNzPWZsYWdzPWR5bmFtaWMKLQotT1NfTUVBU1VSRUlURU1TVFJVQ1Rfc2l6ZW9mPQotCi1PU19NRU5VQkFSSU5GT19zaXplb2Y9Ci0KLU9TX01FTlVJTkZPX3NpemVvZj0KLQotT1NfTUVOVUlURU1JTkZPX3NpemVvZj0KLQotT1NfTUlOTUFYSU5GT19zaXplb2Y9Ci0KLU9TX01PTklUT1JJTkZPX3NpemVvZj0KLQotT1NfTU9VU0VJTlBVVF9zaXplb2Y9Ci0KLU9TX01TR19zaXplb2Y9Ci0KLU9TX01hcFZpcnR1YWxLZXlBPQotT1NfTWFwVmlydHVhbEtleUFfMD0KLU9TX01hcFZpcnR1YWxLZXlBXzE9Ci0KLU9TX01hcFZpcnR1YWxLZXlXPQotT1NfTWFwVmlydHVhbEtleVdfMD0KLU9TX01hcFZpcnR1YWxLZXlXXzE9Ci0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJPQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMD1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMT1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMj1jYXN0PShMUFBPSU5UKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklfMz0KLQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD1jYXN0PShIV05EKQotT1NfTWFwV2luZG93UG9pbnRzX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8xPWNhc3Q9KEhXTkQpCi1PU19NYXBXaW5kb3dQb2ludHNfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzI9Y2FzdD0oTFBQT0lOVCkKLU9TX01hcFdpbmRvd1BvaW50c19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMz0KLQotT1NfTWVzc2FnZUJlZXA9Ci1PU19NZXNzYWdlQmVlcF8wPQotCi1PU19NZXNzYWdlQm94QT0KLU9TX01lc3NhZ2VCb3hBXzA9Y2FzdD0oSFdORCkKLU9TX01lc3NhZ2VCb3hBXzE9Y2FzdD0oTFBTVFIpCi1PU19NZXNzYWdlQm94QV8yPWNhc3Q9KExQU1RSKQotT1NfTWVzc2FnZUJveEFfMz0KLQotT1NfTWVzc2FnZUJveFc9Ci1PU19NZXNzYWdlQm94V18wPWNhc3Q9KEhXTkQpCi1PU19NZXNzYWdlQm94V18xPWNhc3Q9KExQV1NUUikKLU9TX01lc3NhZ2VCb3hXXzI9Y2FzdD0oTFBXU1RSKQotT1NfTWVzc2FnZUJveFdfMz0KLQotT1NfTW9uaXRvckZyb21XaW5kb3c9ZmxhZ3M9ZHluYW1pYwotT1NfTW9uaXRvckZyb21XaW5kb3dfMD0KLU9TX01vbml0b3JGcm9tV2luZG93XzE9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJPUEZJTEVTXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0RST1BGSUxFU18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0dSQURJRU5UXzFSRUNUXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9HUkFESUVOVF8xUkVDVF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9LRVlCRElOUFVUXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfS0VZQkRJTlBVVF8ySV8wPWNhc3Q9UFZPSUQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVRfMklfMT1jYXN0PUNPTlNUIFZPSUQgKixmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0tFWUJESU5QVVRfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UQV8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUVBU1VSRUlURU1TVFJVQ1RfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTU9VU0VJTlBVVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVRfMklfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NT1VTRUlOUFVUXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01PVVNFSU5QVVRfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTVNHXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJXzA9Y2FzdD0oUFZPSUQpCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWQ1VTVE9NRFJBV18ySV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJPQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzA9Y2FzdD1QVk9JRAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8ySV8wPWNhc3Q9UFZPSUQKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8ySV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PUEVORklMRU5BTUVfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UUklWRVJURVhfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UUklWRVJURVhfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UUklWRVJURVhfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8yST0KLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dAotT1NfTW92ZU1lbW9yeV9fSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMkk9Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklfMD1jYXN0PShQVk9JRCkKLU9TX01vdmVNZW1vcnlfX0lMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19JTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zQkk9Ci1PU19Nb3ZlTWVtb3J5X19JXzNCSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zQklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zQklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zQ0k9Ci1PU19Nb3ZlTWVtb3J5X19JXzNDSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zQ0lfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zQ0lfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zREk9Ci1PU19Nb3ZlTWVtb3J5X19JXzNESV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zRElfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zRElfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zRkk9Ci1PU19Nb3ZlTWVtb3J5X19JXzNGSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zRklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zRklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zSUk9Ci1PU19Nb3ZlTWVtb3J5X19JXzNJSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zSUlfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zSUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zSkk9Ci1PU19Nb3ZlTWVtb3J5X19JXzNKSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zSklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zSklfMj0KLQotT1NfTW92ZU1lbW9yeV9fSV8zU0k9Ci1PU19Nb3ZlTWVtb3J5X19JXzNTSV8wPWNhc3Q9KFBWT0lEKQotT1NfTW92ZU1lbW9yeV9fSV8zU0lfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fSV8zU0lfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJfM0JJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJfM0JJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JJVE1BUElORk9IRUFERVJfMl8zQklfMT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJfM0JJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJBV0lURU1TVFJVQ1RfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUkFXSVRFTVNUUlVDVF8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfRFJBV0lURU1TVFJVQ1RfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9EUkFXSVRFTVNUUlVDVF8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9FWFRMT0dQRU5fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0VYVExPR1BFTl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRUxQSU5GT18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRUxQSU5GT18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hFTFBJTkZPXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRBXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEFfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVFdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05UV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NRUFTVVJFSVRFTVNUUlVDVF8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01FQVNVUkVJVEVNU1RSVUNUXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01JTk1BWElORk9fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NSU5NQVhJTkZPXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTUlOTUFYSU5GT18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NU0dfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01TR18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUNVU1RPTURSQVdfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUNVU1RPTURSQVdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NQ1VTVE9NRFJBV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NQ1VTVE9NRFJBV18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhEUl8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSERSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUhEUl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSERSXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSEVBREVSXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRUFERVJfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NSEVBREVSXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1IRUFERVJfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSU5LXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSU5LXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJTktfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJTktfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MSVNUVklFV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElTVFZJRVdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTElTVFZJRVdfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxJU1RWSUVXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZDVVNUT01EUkFXXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkNVU1RPTURSQVdfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJSV8wPWNhc3Q9KFBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZESVNQSU5GT18ySUlfMT1jYXN0PShDT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1MVkRJU1BJTkZPXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZGSU5ESVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZGSU5ESVRFTV8ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NTFZGSU5ESVRFTV8ySUlfMT1jYXN0PUNPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTUxWRklORElURU1fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNIRVZST05fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hFVlJPTl8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNIRVZST05fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hFVlJPTl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJFQkFSQ0hJTERTSVpFXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNISUxEU0laRV8ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkVCQVJDSElMRFNJWkVfMklJXzE9Y2FzdD1DT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SRUJBUkNISUxEU0laRV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVJHSU5GT18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NUkdJTkZPXzJJSV8wPWNhc3Q9UFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SR0lORk9fMklJXzE9Y2FzdD1DT05TVCBWT0lEICoKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1SR0lORk9fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UQkhPVElURU1fMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRCSE9USVRFTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UQkhPVElURU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRCSE9USVRFTV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRPT0xCQVJfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRPT0xCQVJfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVE9PTEJBUl8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVE9PTEJBUl8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9BXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPQV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT0FfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVERJU1BJTkZPV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFRESVNQSU5GT1dfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRURElTUElORk9XXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZDVVNUT01EUkFXXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkNVU1RPTURSQVdfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJSV8wPWNhc3Q9UFZPSUQsZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1UVkRJU1BJTkZPXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZESVNQSU5GT18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWSVRFTUNIQU5HRV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZJVEVNQ0hBTkdFXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OTVRWSVRFTUNIQU5HRV8ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVFZJVEVNQ0hBTkdFXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVVBET1dOXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05NVVBET1dOXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk1VUERPV05fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT0ZOT1RJRllfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PRk5PVElGWV8ySUlfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09GTk9USUZZXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09GTk9USUZZXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8ySUlfMD1jYXN0PVBWT0lECi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09QRU5GSUxFTkFNRV8ySUlfMT1jYXN0PUNPTlNUIFZPSUQgKgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PUEVORklMRU5BTUVfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUE9JTlRfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8ySUlfMD1jYXN0PVBWT0lELGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJSV8xPWNhc3Q9Q09OU1QgVk9JRCAqCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zSUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zSUlfMD0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzNJSV8xPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJfM0lJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFJVEVNXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUlURU1fMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUlURU1fMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFMT0dBVFRSXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUxPR0FUVFJfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUxPR0FUVFJfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJST0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFQUk9QRVJUSUVTXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVBST1BFUlRJRVNfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMVBST1BFUlRJRVNfMklJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDQV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0FfMklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDQV8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNXXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDV18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUNXXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUk9Ci1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSVRFTV8ySUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4KLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbgotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVURBQ0NFTF8ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJPQotT1NfTW92ZU1lbW9yeV9fTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQT1NfMklJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1dJTkRPV1BPU18ySUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNCSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0JJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0JJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMXzJJPQotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8ySV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9BQ0NFTF8ySV8xPWNhc3Q9KENPTlNUIFZPSUQgKiksZmxhZ3M9bm9fb3V0Ci1PU19Nb3ZlTWVtb3J5X19fM0JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0FDQ0VMXzJJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8yST0KLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8ySV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNCTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CSVRNQVBJTkZPSEVBREVSXzJJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQKLU9TX01vdmVNZW1vcnlfX18zQkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQklUTUFQSU5GT0hFQURFUl8ySV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0NJST0KLU9TX01vdmVNZW1vcnlfX18zQ0lJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM0NJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zQ0lJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zRElJPQotT1NfTW92ZU1lbW9yeV9fXzNESUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zRElJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNESUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNGSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM0ZJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNGSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM0ZJSV8yPQotCi1PU19Nb3ZlTWVtb3J5X19fM0lJST0KLU9TX01vdmVNZW1vcnlfX18zSUlJXzA9Y2FzdD0oUFZPSUQpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19Nb3ZlTWVtb3J5X19fM0lJSV8xPWNhc3Q9KENPTlNUIFZPSUQgKikKLU9TX01vdmVNZW1vcnlfX18zSUlJXzI9Ci0KLU9TX01vdmVNZW1vcnlfX18zSklJPQotT1NfTW92ZU1lbW9yeV9fXzNKSUlfMD1jYXN0PShQVk9JRCksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX01vdmVNZW1vcnlfX18zSklJXzE9Y2FzdD0oQ09OU1QgVk9JRCAqKQotT1NfTW92ZU1lbW9yeV9fXzNKSUlfMj0KLQotT1NfTW92ZU1lbW9yeV9fXzNTSUk9Ci1PU19Nb3ZlTWVtb3J5X19fM1NJSV8wPWNhc3Q9KFBWT0lEKSxmbGFncz1ub19pbiBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV9fXzNTSUlfMT1jYXN0PShDT05TVCBWT0lEICopCi1PU19Nb3ZlTWVtb3J5X19fM1NJSV8yPQotCi1PU19Nb3ZlVG9FeD0KLU9TX01vdmVUb0V4XzA9Y2FzdD0oSERDKQotT1NfTW92ZVRvRXhfMT0KLU9TX01vdmVUb0V4XzI9Ci1PU19Nb3ZlVG9FeF8zPWNhc3Q9KExQUE9JTlQpCi0KLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeD0KLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeF8wPWNhc3Q9KERXT1JEKQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4XzE9Y2FzdD0oTFBIQU5ETEUpCi1PU19Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXhfMj1jYXN0PShEV09SRCkKLU9TX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeF8zPWNhc3Q9KERXT1JEKQotT1NfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4XzQ9Y2FzdD0oRFdPUkQpCi0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJPQotT1NfTXVsdGlCeXRlVG9XaWRlQ2hhcl9fSUlJSV8zQ0lfMD0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzE9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV8yPWNhc3Q9KExQQ1NUUikKLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzM9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSUlJXzNDSV80PWNhc3Q9KExQV1NUUiksZmxhZ3M9bm9faW4gY3JpdGljYWwKLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJSUlfM0NJXzU9Ci0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0k9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzA9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzE9Ci1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzI9Y2FzdD0oTFBDU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfMz0KLU9TX011bHRpQnl0ZVRvV2lkZUNoYXJfX0lJXzNCSV8zQ0lfND1jYXN0PShMUFdTVFIpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19NdWx0aUJ5dGVUb1dpZGVDaGFyX19JSV8zQklfM0NJXzU9Ci0KLU9TX05NQ1VTVE9NRFJBV19zaXplb2Y9Ci0KLU9TX05NSERSX3NpemVvZj0KLQotT1NfTk1IRUFERVJfc2l6ZW9mPQotCi1PU19OTUxJTktfc2l6ZW9mPQotCi1PU19OTUxJU1RWSUVXX3NpemVvZj0KLQotT1NfTk1MVkNVU1RPTURSQVdfc2l6ZW9mPQotCi1PU19OTUxWRElTUElORk9fc2l6ZW9mPQotCi1PU19OTUxWRklORElURU1fc2l6ZW9mPQotCi1PU19OTVJFQkFSQ0hFVlJPTl9zaXplb2Y9Ci0KLU9TX05NUkVCQVJDSElMRFNJWkVfc2l6ZW9mPQotCi1PU19OTVJHSU5GT19zaXplb2Y9Ci0KLU9TX05NVEJIT1RJVEVNX3NpemVvZj0KLQotT1NfTk1UT09MQkFSX3NpemVvZj0KLQotT1NfTk1UVERJU1BJTkZPQV9zaXplb2Y9Ci0KLU9TX05NVFRESVNQSU5GT1dfc2l6ZW9mPQotCi1PU19OTVRWQ1VTVE9NRFJBV19zaXplb2Y9Ci0KLU9TX05NVFZESVNQSU5GT19zaXplb2Y9Ci0KLU9TX05NVFZJVEVNQ0hBTkdFX3NpemVvZj0KLQotT1NfTk1VUERPV05fc2l6ZW9mPQotCi1PU19OT05DTElFTlRNRVRSSUNTQV9zaXplb2Y9Ci0KLU9TX05PTkNMSUVOVE1FVFJJQ1NXX3NpemVvZj0KLQotT1NfTk9USUZZSUNPTkRBVEFBX1YyX1NJWkU9ZmxhZ3M9Y29uc3QKLQotT1NfTk9USUZZSUNPTkRBVEFXX1YyX1NJWkU9ZmxhZ3M9Y29uc3QKLQotT1NfTm90aWZ5V2luRXZlbnQ9ZmxhZ3M9ZHluYW1pYwotT1NfTm90aWZ5V2luRXZlbnRfMD1jYXN0PURXT1JECi1PU19Ob3RpZnlXaW5FdmVudF8xPWNhc3Q9SFdORAotT1NfTm90aWZ5V2luRXZlbnRfMj1jYXN0PUxPTkcKLU9TX05vdGlmeVdpbkV2ZW50XzM9Y2FzdD1MT05HCi0KLU9TX09GTk9USUZZX3NpemVvZj0KLQotT1NfT1BFTkZJTEVOQU1FX3NpemVvZj0KLQotT1NfT1NWRVJTSU9OSU5GT0Ffc2l6ZW9mPQotCi1PU19PU1ZFUlNJT05JTkZPRVhBX3NpemVvZj0KLQotT1NfT1NWRVJTSU9OSU5GT0VYV19zaXplb2Y9Ci0KLU9TX09TVkVSU0lPTklORk9XX3NpemVvZj0KLQotT1NfT2Zmc2V0UmVjdD0KLU9TX09mZnNldFJlY3RfMD0KLU9TX09mZnNldFJlY3RfMT0KLU9TX09mZnNldFJlY3RfMj0KLQotT1NfT2Zmc2V0UmduPQotT1NfT2Zmc2V0UmduXzA9Y2FzdD1IUkdOCi1PU19PZmZzZXRSZ25fMT0KLU9TX09mZnNldFJnbl8yPQotCi1PU19PbGVJbml0aWFsaXplPQotT1NfT2xlSW5pdGlhbGl6ZV8wPWNhc3Q9KExQVk9JRCkKLQotT1NfT2xlVW5pbml0aWFsaXplPQotCi1PU19PcGVuQ2xpcGJvYXJkPQotT1NfT3BlbkNsaXBib2FyZF8wPWNhc3Q9KEhXTkQpCi0KLU9TX09wZW5UaGVtZURhdGE9ZmxhZ3M9ZHluYW1pYwotT1NfT3BlblRoZW1lRGF0YV8wPWNhc3Q9SFdORAotT1NfT3BlblRoZW1lRGF0YV8xPWNhc3Q9TFBDV1NUUgotCi1PU19QQUlOVFNUUlVDVF9zaXplb2Y9Ci0KLU9TX1BPSU5UX3NpemVvZj0KLQotT1NfUFJJTUFSWUxBTkdJRD0KLU9TX1BSSU1BUllMQU5HSURfMD0KLQotT1NfUFJJTlRETEdfc2l6ZW9mPQotCi1PU19QUk9DRVNTX0lORk9STUFUSU9OX3NpemVvZj0KLQotT1NfUGF0Qmx0PQotT1NfUGF0Qmx0XzA9Y2FzdD0oSERDKQotT1NfUGF0Qmx0XzE9Ci1PU19QYXRCbHRfMj0KLU9TX1BhdEJsdF8zPQotT1NfUGF0Qmx0XzQ9Ci1PU19QYXRCbHRfNT0KLQotT1NfUGVla01lc3NhZ2VBPQotT1NfUGVla01lc3NhZ2VBXzA9Ci1PU19QZWVrTWVzc2FnZUFfMT1jYXN0PShIV05EKQotT1NfUGVla01lc3NhZ2VBXzI9Ci1PU19QZWVrTWVzc2FnZUFfMz0KLU9TX1BlZWtNZXNzYWdlQV80PQotCi1PU19QZWVrTWVzc2FnZVc9Ci1PU19QZWVrTWVzc2FnZVdfMD0KLU9TX1BlZWtNZXNzYWdlV18xPWNhc3Q9KEhXTkQpCi1PU19QZWVrTWVzc2FnZVdfMj0KLU9TX1BlZWtNZXNzYWdlV18zPQotT1NfUGVla01lc3NhZ2VXXzQ9Ci0KLU9TX1BpZT0KLU9TX1BpZV8wPWNhc3Q9KEhEQykKLU9TX1BpZV8xPQotT1NfUGllXzI9Ci1PU19QaWVfMz0KLU9TX1BpZV80PQotT1NfUGllXzU9Ci1PU19QaWVfNj0KLU9TX1BpZV83PQotT1NfUGllXzg9Ci0KLU9TX1BvbHlnb249Ci1PU19Qb2x5Z29uXzA9Y2FzdD0oSERDKQotT1NfUG9seWdvbl8xPWNhc3Q9KENPTlNUIFBPSU5UICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfUG9seWdvbl8yPQotCi1PU19Qb2x5bGluZT0KLU9TX1BvbHlsaW5lXzA9Y2FzdD0oSERDKQotT1NfUG9seWxpbmVfMT1jYXN0PShDT05TVCBQT0lOVCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX1BvbHlsaW5lXzI9Ci0KLU9TX1Bvc3RNZXNzYWdlQT0KLU9TX1Bvc3RNZXNzYWdlQV8wPWNhc3Q9KEhXTkQpCi1PU19Qb3N0TWVzc2FnZUFfMT0KLU9TX1Bvc3RNZXNzYWdlQV8yPWNhc3Q9KFdQQVJBTSkKLU9TX1Bvc3RNZXNzYWdlQV8zPWNhc3Q9KExQQVJBTSkKLQotT1NfUG9zdE1lc3NhZ2VXPQotT1NfUG9zdE1lc3NhZ2VXXzA9Y2FzdD0oSFdORCkKLU9TX1Bvc3RNZXNzYWdlV18xPQotT1NfUG9zdE1lc3NhZ2VXXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdE1lc3NhZ2VXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19Qb3N0VGhyZWFkTWVzc2FnZUE9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZUFfMD0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlQV8xPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VBXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdFRocmVhZE1lc3NhZ2VBXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19Qb3N0VGhyZWFkTWVzc2FnZVc9Ci1PU19Qb3N0VGhyZWFkTWVzc2FnZVdfMD0KLU9TX1Bvc3RUaHJlYWRNZXNzYWdlV18xPQotT1NfUG9zdFRocmVhZE1lc3NhZ2VXXzI9Y2FzdD0oV1BBUkFNKQotT1NfUG9zdFRocmVhZE1lc3NhZ2VXXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19QcmludERsZ0E9Ci1PU19QcmludERsZ0FfMD0KLQotT1NfUHJpbnREbGdXPQotT1NfUHJpbnREbGdXXzA9Y2FzdD0oTFBQUklOVERMR1cpCi0KLU9TX1B0SW5SZWN0PQotT1NfUHRJblJlY3RfMD1mbGFncz1ub19vdXQKLU9TX1B0SW5SZWN0XzE9ZmxhZ3M9bm9fb3V0IHN0cnVjdAotCi1PU19QdEluUmVnaW9uPQotT1NfUHRJblJlZ2lvbl8wPWNhc3Q9KEhSR04pCi1PU19QdEluUmVnaW9uXzE9Ci1PU19QdEluUmVnaW9uXzI9Ci0KLU9TX1JFQkFSQkFORElORk9fc2l6ZW9mPQotCi1PU19SRUNUX3NpemVvZj0KLQotT1NfUmVhbGl6ZVBhbGV0dGU9Ci1PU19SZWFsaXplUGFsZXR0ZV8wPWNhc3Q9KEhEQykKLQotT1NfUmVjdEluUmVnaW9uPQotT1NfUmVjdEluUmVnaW9uXzA9Y2FzdD0oSFJHTikKLU9TX1JlY3RJblJlZ2lvbl8xPWZsYWdzPW5vX291dAotCi1PU19SZWN0YW5nbGU9Ci1PU19SZWN0YW5nbGVfMD1jYXN0PShIREMpCi1PU19SZWN0YW5nbGVfMT0KLU9TX1JlY3RhbmdsZV8yPQotT1NfUmVjdGFuZ2xlXzM9Ci1PU19SZWN0YW5nbGVfND0KLQotT1NfUmVkcmF3V2luZG93PQotT1NfUmVkcmF3V2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX1JlZHJhd1dpbmRvd18xPQotT1NfUmVkcmF3V2luZG93XzI9Y2FzdD0oSFJHTikKLU9TX1JlZHJhd1dpbmRvd18zPQotCi1PU19SZWdDbG9zZUtleT0KLU9TX1JlZ0Nsb3NlS2V5XzA9Y2FzdD0oSEtFWSkKLQotT1NfUmVnRW51bUtleUV4QT0KLU9TX1JlZ0VudW1LZXlFeEFfMD1jYXN0PShIS0VZKQotT1NfUmVnRW51bUtleUV4QV8xPQotT1NfUmVnRW51bUtleUV4QV8yPWNhc3Q9KExQU1RSKQotT1NfUmVnRW51bUtleUV4QV8zPQotT1NfUmVnRW51bUtleUV4QV80PQotT1NfUmVnRW51bUtleUV4QV81PWNhc3Q9KExQU1RSKQotT1NfUmVnRW51bUtleUV4QV82PQotT1NfUmVnRW51bUtleUV4QV83PQotCi1PU19SZWdFbnVtS2V5RXhXPQotT1NfUmVnRW51bUtleUV4V18wPWNhc3Q9KEhLRVkpCi1PU19SZWdFbnVtS2V5RXhXXzE9Ci1PU19SZWdFbnVtS2V5RXhXXzI9Y2FzdD0oTFBXU1RSKQotT1NfUmVnRW51bUtleUV4V18zPQotT1NfUmVnRW51bUtleUV4V180PQotT1NfUmVnRW51bUtleUV4V181PWNhc3Q9KExQV1NUUikKLU9TX1JlZ0VudW1LZXlFeFdfNj0KLU9TX1JlZ0VudW1LZXlFeFdfNz0KLQotT1NfUmVnT3BlbktleUV4QT0KLU9TX1JlZ09wZW5LZXlFeEFfMD1jYXN0PShIS0VZKQotT1NfUmVnT3BlbktleUV4QV8xPWNhc3Q9KExQU1RSKQotT1NfUmVnT3BlbktleUV4QV8yPQotT1NfUmVnT3BlbktleUV4QV8zPQotT1NfUmVnT3BlbktleUV4QV80PWNhc3Q9KFBIS0VZKQotCi1PU19SZWdPcGVuS2V5RXhXPQotT1NfUmVnT3BlbktleUV4V18wPWNhc3Q9KEhLRVkpCi1PU19SZWdPcGVuS2V5RXhXXzE9Y2FzdD0oTFBXU1RSKQotT1NfUmVnT3BlbktleUV4V18yPQotT1NfUmVnT3BlbktleUV4V18zPQotT1NfUmVnT3BlbktleUV4V180PWNhc3Q9KFBIS0VZKQotCi1PU19SZWdRdWVyeUluZm9LZXlBPQotT1NfUmVnUXVlcnlJbmZvS2V5QV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeUluZm9LZXlBXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeUluZm9LZXlBXzI9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzM9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfND0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNj0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfNz0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfOD0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfOT0KLU9TX1JlZ1F1ZXJ5SW5mb0tleUFfMTA9Ci1PU19SZWdRdWVyeUluZm9LZXlBXzExPWNhc3Q9KFBGSUxFVElNRSkKLQotT1NfUmVnUXVlcnlJbmZvS2V5Vz0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMD1jYXN0PShIS0VZKQotT1NfUmVnUXVlcnlJbmZvS2V5V18xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMj0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMz1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlJbmZvS2V5V180PQotT1NfUmVnUXVlcnlJbmZvS2V5V181PQotT1NfUmVnUXVlcnlJbmZvS2V5V182PQotT1NfUmVnUXVlcnlJbmZvS2V5V183PQotT1NfUmVnUXVlcnlJbmZvS2V5V184PQotT1NfUmVnUXVlcnlJbmZvS2V5V185PQotT1NfUmVnUXVlcnlJbmZvS2V5V18xMD0KLU9TX1JlZ1F1ZXJ5SW5mb0tleVdfMTE9Y2FzdD0oUEZJTEVUSU1FKQotCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNCXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNCXzNJXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8yPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV8zPQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0JfM0lfND1jYXN0PShMUEJZVEUpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zQl8zSV81PQotCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNJXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeEFfX0lfM0JJXzNJXzNJXzNJXzE9Y2FzdD0oTFBTVFIpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8yPWNhc3Q9KExQRFdPUkQpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV8zPQotT1NfUmVnUXVlcnlWYWx1ZUV4QV9fSV8zQklfM0lfM0lfM0lfND1jYXN0PShMUEJZVEUpCi1PU19SZWdRdWVyeVZhbHVlRXhBX19JXzNCSV8zSV8zSV8zSV81PQotCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zQ18zST0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzA9Y2FzdD0oSEtFWSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzE9Y2FzdD0oTFBXU1RSKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfMj1jYXN0PShMUERXT1JEKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfMz0KLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNDXzNJXzQ9Y2FzdD0oTFBCWVRFKQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0NfM0lfNT0KLQotT1NfUmVnUXVlcnlWYWx1ZUV4V19fSV8zQ0lfM0lfM0lfM0k9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8wPWNhc3Q9KEhLRVkpCi1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV8xPWNhc3Q9KExQV1NUUikKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzI9Y2FzdD0oTFBEV09SRCkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzM9Ci1PU19SZWdRdWVyeVZhbHVlRXhXX19JXzNDSV8zSV8zSV8zSV80PWNhc3Q9KExQQllURSkKLU9TX1JlZ1F1ZXJ5VmFsdWVFeFdfX0lfM0NJXzNJXzNJXzNJXzU9Ci0KLU9TX1JlZ2lzdGVyQ2xhc3NBPQotT1NfUmVnaXN0ZXJDbGFzc0FfMD0KLQotT1NfUmVnaXN0ZXJDbGFzc1c9Ci1PU19SZWdpc3RlckNsYXNzV18wPWNhc3Q9KExQV05EQ0xBU1NXKQotCi1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdEE9Ci1PU19SZWdpc3RlckNsaXBib2FyZEZvcm1hdEFfMD1jYXN0PShMUFRTVFIpCi0KLU9TX1JlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0Vz0KLU9TX1JlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0V18wPWNhc3Q9KExQV1NUUikKLQotT1NfUmVnaXN0ZXJXaW5kb3dNZXNzYWdlQT0KLU9TX1JlZ2lzdGVyV2luZG93TWVzc2FnZUFfMD1jYXN0PShMUFRTVFIpCi0KLU9TX1JlZ2lzdGVyV2luZG93TWVzc2FnZVc9Ci1PU19SZWdpc3RlcldpbmRvd01lc3NhZ2VXXzA9Y2FzdD0oTFBXU1RSKQotCi1PU19SZWxlYXNlQ2FwdHVyZT0KLQotT1NfUmVsZWFzZURDPQotT1NfUmVsZWFzZURDXzA9Y2FzdD0oSFdORCkKLU9TX1JlbGVhc2VEQ18xPWNhc3Q9KEhEQykKLQotT1NfUmVtb3ZlRm9udFJlc291cmNlRXhXPWZsYWdzPWR5bmFtaWMKLU9TX1JlbW92ZUZvbnRSZXNvdXJjZUV4V18wPQotT1NfUmVtb3ZlRm9udFJlc291cmNlRXhXXzE9Ci1PU19SZW1vdmVGb250UmVzb3VyY2VFeFdfMj0KLQotT1NfUmVtb3ZlTWVudT0KLU9TX1JlbW92ZU1lbnVfMD1jYXN0PShITUVOVSkKLU9TX1JlbW92ZU1lbnVfMT0KLU9TX1JlbW92ZU1lbnVfMj0KLQotT1NfUmVtb3ZlUHJvcEE9Ci1PU19SZW1vdmVQcm9wQV8wPWNhc3Q9SFdORAotT1NfUmVtb3ZlUHJvcEFfMT1jYXN0PUxQQ1RTVFIKLQotT1NfUmVtb3ZlUHJvcFc9Ci1PU19SZW1vdmVQcm9wV18wPWNhc3Q9SFdORAotT1NfUmVtb3ZlUHJvcFdfMT1jYXN0PShMUENXU1RSKQotCi1PU19SZXN0b3JlREM9Ci1PU19SZXN0b3JlRENfMD1jYXN0PShIREMpCi1PU19SZXN0b3JlRENfMT1jYXN0PShpbnQpCi0KLU9TX1JvdW5kUmVjdD0KLU9TX1JvdW5kUmVjdF8wPWNhc3Q9KEhEQykKLU9TX1JvdW5kUmVjdF8xPQotT1NfUm91bmRSZWN0XzI9Ci1PU19Sb3VuZFJlY3RfMz0KLU9TX1JvdW5kUmVjdF80PQotT1NfUm91bmRSZWN0XzU9Ci1PU19Sb3VuZFJlY3RfNj0KLQotT1NfU0NSSVBUX0FOQUxZU0lTX3NpemVvZj0KLQotT1NfU0NSSVBUX0NPTlRST0xfc2l6ZW9mPQotCi1PU19TQ1JJUFRfRElHSVRTVUJTVElUVVRFX3NpemVvZj0KLQotT1NfU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX3NpemVvZj0KLQotT1NfU0NSSVBUX0lURU1fc2l6ZW9mPQotCi1PU19TQ1JJUFRfTE9HQVRUUl9zaXplb2Y9Ci0KLU9TX1NDUklQVF9QUk9QRVJUSUVTX3NpemVvZj0KLQotT1NfU0NSSVBUX1NUQVRFX3NpemVvZj0KLQotT1NfU0NST0xMSU5GT19zaXplb2Y9Ci0KLU9TX1NIQUNUSVZBVEVJTkZPX3NpemVvZj0KLQotT1NfU0hCcm93c2VGb3JGb2xkZXJBPQotT1NfU0hCcm93c2VGb3JGb2xkZXJBXzA9Ci0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyVz0KLU9TX1NIQnJvd3NlRm9yRm9sZGVyV18wPWNhc3Q9KExQQlJPV1NFSU5GT1cpCi0KLU9TX1NIQ3JlYXRlTWVudUJhcj0KLU9TX1NIQ3JlYXRlTWVudUJhcl8wPWNhc3Q9KFBTSE1FTlVCQVJJTkZPKQotCi1PU19TSEVMTEVYRUNVVEVJTkZPX3NpemVvZj0KLQotT1NfU0hGSUxFSU5GT0Ffc2l6ZW9mPQotCi1PU19TSEZJTEVJTkZPV19zaXplb2Y9Ci0KLU9TX1NIR2V0RmlsZUluZm9BPQotT1NfU0hHZXRGaWxlSW5mb0FfMD1jYXN0PUxQQ1NUUgotT1NfU0hHZXRGaWxlSW5mb0FfMT0KLU9TX1NIR2V0RmlsZUluZm9BXzI9Y2FzdD0oU0hGSUxFSU5GT0EgKikKLU9TX1NIR2V0RmlsZUluZm9BXzM9Ci1PU19TSEdldEZpbGVJbmZvQV80PQotCi1PU19TSEdldEZpbGVJbmZvVz0KLU9TX1NIR2V0RmlsZUluZm9XXzA9Y2FzdD1MUENXU1RSCi1PU19TSEdldEZpbGVJbmZvV18xPQotT1NfU0hHZXRGaWxlSW5mb1dfMj1jYXN0PShTSEZJTEVJTkZPVyAqKQotT1NfU0hHZXRGaWxlSW5mb1dfMz0KLU9TX1NIR2V0RmlsZUluZm9XXzQ9Ci0KLU9TX1NIR2V0TWFsbG9jPQotT1NfU0hHZXRNYWxsb2NfMD1jYXN0PShMUE1BTExPQyAqKQotCi1PU19TSEdldFBhdGhGcm9tSURMaXN0QT0KLU9TX1NIR2V0UGF0aEZyb21JRExpc3RBXzA9Y2FzdD0oTFBDSVRFTUlETElTVCkKLU9TX1NIR2V0UGF0aEZyb21JRExpc3RBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX1NIR2V0UGF0aEZyb21JRExpc3RXPQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdFdfMD1jYXN0PShMUENJVEVNSURMSVNUKQotT1NfU0hHZXRQYXRoRnJvbUlETGlzdFdfMT1jYXN0PShMUFdTVFIpCi0KLU9TX1NISGFuZGxlV01TZXR0aW5nQ2hhbmdlPQotT1NfU0hIYW5kbGVXTVNldHRpbmdDaGFuZ2VfMD1jYXN0PShIV05EKQotT1NfU0hIYW5kbGVXTVNldHRpbmdDaGFuZ2VfMT0KLU9TX1NISGFuZGxlV01TZXR0aW5nQ2hhbmdlXzI9Ci1PU19TSEhhbmRsZVdNU2V0dGluZ0NoYW5nZV8zPQotCi1PU19TSE1FTlVCQVJJTkZPX3NpemVvZj0KLQotT1NfU0hSR0lORk9fc2l6ZW9mPQotCi1PU19TSFJlY29nbml6ZUdlc3R1cmU9Ci1PU19TSFJlY29nbml6ZUdlc3R1cmVfMD0KLQotT1NfU0hTZW5kQmFja1RvRm9jdXNXaW5kb3c9Ci1PU19TSFNlbmRCYWNrVG9Gb2N1c1dpbmRvd18wPQotT1NfU0hTZW5kQmFja1RvRm9jdXNXaW5kb3dfMT0KLU9TX1NIU2VuZEJhY2tUb0ZvY3VzV2luZG93XzI9Ci0KLU9TX1NIU2V0QXBwS2V5V25kQXNzb2M9Ci1PU19TSFNldEFwcEtleVduZEFzc29jXzA9Y2FzdD0oQllURSkKLU9TX1NIU2V0QXBwS2V5V25kQXNzb2NfMT1jYXN0PShIV05EKQotCi1PU19TSFNpcFByZWZlcmVuY2U9Ci1PU19TSFNpcFByZWZlcmVuY2VfMD1jYXN0PShIV05EKQotT1NfU0hTaXBQcmVmZXJlbmNlXzE9Ci0KLU9TX1NJUElORk9fc2l6ZW9mPQotCi1PU19TSVpFX3NpemVvZj0KLQotT1NfU1RBUlRVUElORk9fc2l6ZW9mPQotCi1PU19TWVNURU1USU1FX3NpemVvZj0KLQotT1NfU2F2ZURDPQotT1NfU2F2ZURDXzA9Y2FzdD0oSERDKQotCi1PU19TY3JlZW5Ub0NsaWVudD0KLU9TX1NjcmVlblRvQ2xpZW50XzA9Y2FzdD0oSFdORCkKLU9TX1NjcmVlblRvQ2xpZW50XzE9Ci0KLU9TX1NjcmlwdEFwcGx5RGlnaXRTdWJzdGl0dXRpb249Ci1PU19TY3JpcHRBcHBseURpZ2l0U3Vic3RpdHV0aW9uXzA9Y2FzdD1jb25zdCBTQ1JJUFRfRElHSVRTVUJTVElUVVRFKgotT1NfU2NyaXB0QXBwbHlEaWdpdFN1YnN0aXR1dGlvbl8xPWNhc3Q9U0NSSVBUX0NPTlRST0wqCi1PU19TY3JpcHRBcHBseURpZ2l0U3Vic3RpdHV0aW9uXzI9Y2FzdD1TQ1JJUFRfU1RBVEUqCi0KLU9TX1NjcmlwdEJyZWFrPQotT1NfU2NyaXB0QnJlYWtfMD1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdEJyZWFrXzE9Ci1PU19TY3JpcHRCcmVha18yPWNhc3Q9Y29uc3QgU0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdEJyZWFrXzM9Y2FzdD1TQ1JJUFRfTE9HQVRUUiAqCi0KLU9TX1NjcmlwdENQdG9YPQotT1NfU2NyaXB0Q1B0b1hfMD0KLU9TX1NjcmlwdENQdG9YXzE9Ci1PU19TY3JpcHRDUHRvWF8yPQotT1NfU2NyaXB0Q1B0b1hfMz0KLU9TX1NjcmlwdENQdG9YXzQ9Y2FzdD1jb25zdCBXT1JEICoKLU9TX1NjcmlwdENQdG9YXzU9Y2FzdD1jb25zdCBTQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRDUHRvWF82PWNhc3Q9Y29uc3QgaW50ICoKLU9TX1NjcmlwdENQdG9YXzc9Y2FzdD1jb25zdCBTQ1JJUFRfQU5BTFlTSVMgKgotT1NfU2NyaXB0Q1B0b1hfOD1jYXN0PWludCAqCi0KLU9TX1NjcmlwdENhY2hlR2V0SGVpZ2h0PQotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHRfMD1jYXN0PUhEQwotT1NfU2NyaXB0Q2FjaGVHZXRIZWlnaHRfMT1jYXN0PShTQ1JJUFRfQ0FDSEUgKikKLU9TX1NjcmlwdENhY2hlR2V0SGVpZ2h0XzI9Y2FzdD1sb25nICoKLQotT1NfU2NyaXB0RnJlZUNhY2hlPQotT1NfU2NyaXB0RnJlZUNhY2hlXzA9Y2FzdD0oU0NSSVBUX0NBQ0hFICopCi0KLU9TX1NjcmlwdEdldEZvbnRQcm9wZXJ0aWVzPQotT1NfU2NyaXB0R2V0Rm9udFByb3BlcnRpZXNfMD1jYXN0PUhEQwotT1NfU2NyaXB0R2V0Rm9udFByb3BlcnRpZXNfMT1jYXN0PVNDUklQVF9DQUNIRSAqCi1PU19TY3JpcHRHZXRGb250UHJvcGVydGllc18yPWNhc3Q9U0NSSVBUX0ZPTlRQUk9QRVJUSUVTICoKLQotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRocz0KLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfMD1jYXN0PWNvbnN0IFNDUklQVF9BTkFMWVNJUyAqCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzE9Ci1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzI9Ci1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzM9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0R2V0TG9naWNhbFdpZHRoc180PWNhc3Q9Y29uc3QgV09SRCAqCi1PU19TY3JpcHRHZXRMb2dpY2FsV2lkdGhzXzU9Y2FzdD0oY29uc3QgU0NSSVBUX1ZJU0FUVFIgKikKLU9TX1NjcmlwdEdldExvZ2ljYWxXaWR0aHNfNj1jYXN0PShpbnQgKikKLQotT1NfU2NyaXB0R2V0UHJvcGVydGllcz0KLU9TX1NjcmlwdEdldFByb3BlcnRpZXNfMD1jYXN0PWNvbnN0IFNDUklQVF9QUk9QRVJUSUVTICoqKgotT1NfU2NyaXB0R2V0UHJvcGVydGllc18xPWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0SXRlbWl6ZT0KLU9TX1NjcmlwdEl0ZW1pemVfMD1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdEl0ZW1pemVfMT0KLU9TX1NjcmlwdEl0ZW1pemVfMj0KLU9TX1NjcmlwdEl0ZW1pemVfMz1jYXN0PWNvbnN0IFNDUklQVF9DT05UUk9MICoKLU9TX1NjcmlwdEl0ZW1pemVfND1jYXN0PWNvbnN0IFNDUklQVF9TVEFURSAqCi1PU19TY3JpcHRJdGVtaXplXzU9Y2FzdD1TQ1JJUFRfSVRFTSAqCi1PU19TY3JpcHRJdGVtaXplXzY9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRKdXN0aWZ5PQotT1NfU2NyaXB0SnVzdGlmeV8wPWNhc3Q9KFNDUklQVF9WSVNBVFRSICopCi1PU19TY3JpcHRKdXN0aWZ5XzE9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0SnVzdGlmeV8yPQotT1NfU2NyaXB0SnVzdGlmeV8zPQotT1NfU2NyaXB0SnVzdGlmeV80PQotT1NfU2NyaXB0SnVzdGlmeV81PWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0TGF5b3V0PQotT1NfU2NyaXB0TGF5b3V0XzA9Ci1PU19TY3JpcHRMYXlvdXRfMT1jYXN0PWNvbnN0IEJZVEUgKgotT1NfU2NyaXB0TGF5b3V0XzI9Y2FzdD1pbnQgKgotT1NfU2NyaXB0TGF5b3V0XzM9Y2FzdD1pbnQgKgotCi1PU19TY3JpcHRQbGFjZT0KLU9TX1NjcmlwdFBsYWNlXzA9Y2FzdD1IREMKLU9TX1NjcmlwdFBsYWNlXzE9Y2FzdD1TQ1JJUFRfQ0FDSEUgKgotT1NfU2NyaXB0UGxhY2VfMj1jYXN0PWNvbnN0IFdPUkQgKgotT1NfU2NyaXB0UGxhY2VfMz0KLU9TX1NjcmlwdFBsYWNlXzQ9Y2FzdD1jb25zdCBTQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRQbGFjZV81PWNhc3Q9U0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdFBsYWNlXzY9Y2FzdD1pbnQgKgotT1NfU2NyaXB0UGxhY2VfNz1jYXN0PUdPRkZTRVQgKgotT1NfU2NyaXB0UGxhY2VfOD1jYXN0PUFCQyAqCi0KLU9TX1NjcmlwdFJlY29yZERpZ2l0U3Vic3RpdHV0aW9uPQotT1NfU2NyaXB0UmVjb3JkRGlnaXRTdWJzdGl0dXRpb25fMD1jYXN0PUxDSUQKLU9TX1NjcmlwdFJlY29yZERpZ2l0U3Vic3RpdHV0aW9uXzE9Y2FzdD1TQ1JJUFRfRElHSVRTVUJTVElUVVRFKgotCi1PU19TY3JpcHRTaGFwZT0KLU9TX1NjcmlwdFNoYXBlXzA9Y2FzdD1IREMKLU9TX1NjcmlwdFNoYXBlXzE9Y2FzdD1TQ1JJUFRfQ0FDSEUgKgotT1NfU2NyaXB0U2hhcGVfMj1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdFNoYXBlXzM9Ci1PU19TY3JpcHRTaGFwZV80PQotT1NfU2NyaXB0U2hhcGVfNT1jYXN0PShTQ1JJUFRfQU5BTFlTSVMgKikKLU9TX1NjcmlwdFNoYXBlXzY9Y2FzdD1XT1JEICoKLU9TX1NjcmlwdFNoYXBlXzc9Y2FzdD1XT1JEICoKLU9TX1NjcmlwdFNoYXBlXzg9Y2FzdD1TQ1JJUFRfVklTQVRUUiAqCi1PU19TY3JpcHRTaGFwZV85PWNhc3Q9aW50ICoKLQotT1NfU2NyaXB0VGV4dE91dD0KLU9TX1NjcmlwdFRleHRPdXRfMD1jYXN0PWNvbnN0IEhEQwotT1NfU2NyaXB0VGV4dE91dF8xPWNhc3Q9U0NSSVBUX0NBQ0hFICoKLU9TX1NjcmlwdFRleHRPdXRfMj0KLU9TX1NjcmlwdFRleHRPdXRfMz0KLU9TX1NjcmlwdFRleHRPdXRfND0KLU9TX1NjcmlwdFRleHRPdXRfNT1jYXN0PWNvbnN0IFJFQ1QgKgotT1NfU2NyaXB0VGV4dE91dF82PWNhc3Q9Y29uc3QgU0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdFRleHRPdXRfNz1jYXN0PWNvbnN0IFdDSEFSICoKLU9TX1NjcmlwdFRleHRPdXRfOD0KLU9TX1NjcmlwdFRleHRPdXRfOT1jYXN0PWNvbnN0IFdPUkQgKgotT1NfU2NyaXB0VGV4dE91dF8xMD0KLU9TX1NjcmlwdFRleHRPdXRfMTE9Y2FzdD1jb25zdCBpbnQgKgotT1NfU2NyaXB0VGV4dE91dF8xMj1jYXN0PWNvbnN0IGludCAqCi1PU19TY3JpcHRUZXh0T3V0XzEzPWNhc3Q9Y29uc3QgR09GRlNFVCAqCi0KLU9TX1NjcmlwdFh0b0NQPQotT1NfU2NyaXB0WHRvQ1BfMD0KLU9TX1NjcmlwdFh0b0NQXzE9Ci1PU19TY3JpcHRYdG9DUF8yPQotT1NfU2NyaXB0WHRvQ1BfMz1jYXN0PShjb25zdCBXT1JEICopCi1PU19TY3JpcHRYdG9DUF80PWNhc3Q9Y29uc3QgU0NSSVBUX1ZJU0FUVFIgKgotT1NfU2NyaXB0WHRvQ1BfNT1jYXN0PWNvbnN0IGludCAqCi1PU19TY3JpcHRYdG9DUF82PWNhc3Q9Y29uc3QgU0NSSVBUX0FOQUxZU0lTICoKLU9TX1NjcmlwdFh0b0NQXzc9Y2FzdD1pbnQgKgotT1NfU2NyaXB0WHRvQ1BfOD1jYXN0PWludCAqCi0KLU9TX1Njcm9sbFdpbmRvd0V4PQotT1NfU2Nyb2xsV2luZG93RXhfMD1jYXN0PShIV05EKQotT1NfU2Nyb2xsV2luZG93RXhfMT0KLU9TX1Njcm9sbFdpbmRvd0V4XzI9Ci1PU19TY3JvbGxXaW5kb3dFeF8zPQotT1NfU2Nyb2xsV2luZG93RXhfND0KLU9TX1Njcm9sbFdpbmRvd0V4XzU9Y2FzdD0oSFJHTikKLU9TX1Njcm9sbFdpbmRvd0V4XzY9Ci1PU19TY3JvbGxXaW5kb3dFeF83PQotCi1PU19TZWxlY3RDbGlwUmduPQotT1NfU2VsZWN0Q2xpcFJnbl8wPWNhc3Q9KEhEQykKLU9TX1NlbGVjdENsaXBSZ25fMT1jYXN0PShIUkdOKQotCi1PU19TZWxlY3RPYmplY3Q9Ci1PU19TZWxlY3RPYmplY3RfMD1jYXN0PShIREMpCi1PU19TZWxlY3RPYmplY3RfMT1jYXN0PShIR0RJT0JKKQotCi1PU19TZWxlY3RQYWxldHRlPQotT1NfU2VsZWN0UGFsZXR0ZV8wPWNhc3Q9KEhEQykKLU9TX1NlbGVjdFBhbGV0dGVfMT1jYXN0PShIUEFMRVRURSkKLU9TX1NlbGVjdFBhbGV0dGVfMj0KLQotT1NfU2VuZElucHV0PQotT1NfU2VuZElucHV0XzA9Ci1PU19TZW5kSW5wdXRfMT1jYXN0PUxQSU5QVVQKLU9TX1NlbmRJbnB1dF8yPQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUk9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlJXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUlfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IREhJVFRFU1RJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IREhJVFRFU1RJTkZPXzJfMz1jYXN0PUxQQVJBTQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU1lTVEVNVElNRV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU1lTVEVNVElNRV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZUFfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMj0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8xPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlQV9fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNCPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNCXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0JfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNDPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0NfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNDXzE9Ci1PU19TZW5kTWVzc2FnZUFfX0lJSV8zQ18yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZUFfX0lJSV8zQ18zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNJPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM0lfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNTPQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlJXzNTXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSUlfM1NfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lJPQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VBX19JSV8zSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0k9Ci1PU19TZW5kTWVzc2FnZUFfX0lJXzNJXzNJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMT0KLU9TX1NlbmRNZXNzYWdlQV9fSUlfM0lfM0lfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZUFfX0lJXzNJXzNJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUk9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlJXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0JVVFRPTl8xSU1BR0VMSVNUXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9CVVRUT05fMUlNQUdFTElTVF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8yPWNhc3Q9V1BBUkFNCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfQlVUVE9OXzFJTUFHRUxJU1RfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IREhJVFRFU1RJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzA9Y2FzdD1IV05ECi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERISVRURVNUSU5GT18yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IREhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRElURU1fMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERJVEVNXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hESVRFTV8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSERMQVlPVVRfMl8wPWNhc3Q9SFdORAotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hETEFZT1VUXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzI9Y2FzdD1XUEFSQU0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9IRExBWU9VVF8yXzM9Y2FzdD1MUEFSQU0KLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xJVEVNXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTElURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWQ09MVU1OXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZDT0xVTU5fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX01BUkdJTlNfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9NQVJHSU5TXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QT0lOVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVCQVJCQU5ESU5GT18yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMD1jYXN0PUhXTkQKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFXzJfMj1jYXN0PVdQQVJBTQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NJWkVfMl8zPWNhc3Q9TFBBUkFNCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU1lTVEVNVElNRV8yXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TWVNURU1USU1FXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU1lTVEVNVElNRV8yXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OSU5GT18yXzE9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQkJVVFRPTl8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RCQlVUVE9OXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVENJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzI9Ci1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPXzJfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVE9PTElORk9fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSElUVEVTVElORk9fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVF8yXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RWSU5TRVJUU1RSVUNUXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8wPWNhc3Q9KEhXTkQpCi1PU19TZW5kTWVzc2FnZVdfX0lJSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVFZJVEVNXzJfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1fMl8zPWNhc3Q9KExQQVJBTSkKLQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMj0KLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8xPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUxfMl8yPWNhc3Q9KFdQQVJBTSkKLU9TX1NlbmRNZXNzYWdlV19fSUlJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9VREFDQ0VMXzJfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNDPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0NfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0NfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNDXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0NfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNJPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0lfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0lfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM0lfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNTPQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM1NfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM1NfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlJXzNTXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSUlfM1NfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lJPQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSUlfMD1jYXN0PShIV05EKQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSUlfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lJXzI9Y2FzdD0oV1BBUkFNKQotT1NfU2VuZE1lc3NhZ2VXX19JSV8zSUlfMz1jYXN0PShMUEFSQU0pCi0KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lfM0k9ZmxhZ3M9bm9fZ2VuCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJXzNJXzA9Y2FzdD0oSFdORCkKLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lfM0lfMT0KLU9TX1NlbmRNZXNzYWdlV19fSUlfM0lfM0lfMj1jYXN0PShXUEFSQU0pCi1PU19TZW5kTWVzc2FnZVdfX0lJXzNJXzNJXzM9Y2FzdD0oTFBBUkFNKQotCi1PU19TZXRBY3RpdmVXaW5kb3c9Ci1PU19TZXRBY3RpdmVXaW5kb3dfMD1jYXN0PShIV05EKQotCi1PU19TZXRCa0NvbG9yPQotT1NfU2V0QmtDb2xvcl8wPWNhc3Q9KEhEQykKLU9TX1NldEJrQ29sb3JfMT1jYXN0PShDT0xPUlJFRikKLQotT1NfU2V0QmtNb2RlPQotT1NfU2V0QmtNb2RlXzA9Y2FzdD0oSERDKQotT1NfU2V0QmtNb2RlXzE9Ci0KLU9TX1NldEJydXNoT3JnRXg9Ci1PU19TZXRCcnVzaE9yZ0V4XzA9Y2FzdD1IREMKLU9TX1NldEJydXNoT3JnRXhfMT0KLU9TX1NldEJydXNoT3JnRXhfMj0KLU9TX1NldEJydXNoT3JnRXhfMz1jYXN0PShMUFBPSU5UKQotCi1PU19TZXRDYXB0dXJlPQotT1NfU2V0Q2FwdHVyZV8wPWNhc3Q9KEhXTkQpCi0KLU9TX1NldENhcmV0UG9zPQotT1NfU2V0Q2FyZXRQb3NfMD0KLU9TX1NldENhcmV0UG9zXzE9Ci0KLU9TX1NldENsaXBib2FyZERhdGE9Ci1PU19TZXRDbGlwYm9hcmREYXRhXzA9Ci1PU19TZXRDbGlwYm9hcmREYXRhXzE9Y2FzdD0oSEFORExFKQotCi1PU19TZXRDdXJzb3I9Ci1PU19TZXRDdXJzb3JfMD1jYXN0PShIQ1VSU09SKQotCi1PU19TZXRDdXJzb3JQb3M9Ci1PU19TZXRDdXJzb3JQb3NfMD0KLU9TX1NldEN1cnNvclBvc18xPQotCi1PU19TZXRESUJDb2xvclRhYmxlPQotT1NfU2V0RElCQ29sb3JUYWJsZV8wPWNhc3Q9KEhEQykKLU9TX1NldERJQkNvbG9yVGFibGVfMT0KLU9TX1NldERJQkNvbG9yVGFibGVfMj0KLU9TX1NldERJQkNvbG9yVGFibGVfMz1jYXN0PShSR0JRVUFEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotCi1PU19TZXRFcnJvck1vZGU9Ci1PU19TZXRFcnJvck1vZGVfMD0KLQotT1NfU2V0Rm9jdXM9Ci1PU19TZXRGb2N1c18wPWNhc3Q9KEhXTkQpCi0KLU9TX1NldEZvcmVncm91bmRXaW5kb3c9Ci1PU19TZXRGb3JlZ3JvdW5kV2luZG93XzA9Y2FzdD0oSFdORCkKLQotT1NfU2V0R3JhcGhpY3NNb2RlPQotT1NfU2V0R3JhcGhpY3NNb2RlXzA9Y2FzdD1IREMKLU9TX1NldEdyYXBoaWNzTW9kZV8xPQotCi1PU19TZXRMYXllcmVkV2luZG93QXR0cmlidXRlcz1mbGFncz1keW5hbWljCi1PU19TZXRMYXllcmVkV2luZG93QXR0cmlidXRlc18wPQotT1NfU2V0TGF5ZXJlZFdpbmRvd0F0dHJpYnV0ZXNfMT0KLU9TX1NldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzXzI9Ci1PU19TZXRMYXllcmVkV2luZG93QXR0cmlidXRlc18zPQotCi1PU19TZXRMYXlvdXQ9ZmxhZ3M9ZHluYW1pYwotT1NfU2V0TGF5b3V0XzA9Y2FzdD0oSERDKQotT1NfU2V0TGF5b3V0XzE9Y2FzdD0oRFdPUkQpCi0KLU9TX1NldE1lbnU9Ci1PU19TZXRNZW51XzA9Y2FzdD0oSFdORCkKLU9TX1NldE1lbnVfMT1jYXN0PShITUVOVSkKLQotT1NfU2V0TWVudURlZmF1bHRJdGVtPQotT1NfU2V0TWVudURlZmF1bHRJdGVtXzA9Y2FzdD0oSE1FTlUpCi1PU19TZXRNZW51RGVmYXVsdEl0ZW1fMT0KLU9TX1NldE1lbnVEZWZhdWx0SXRlbV8yPQotCi1PU19TZXRNZW51SW5mbz1mbGFncz1keW5hbWljCi1PU19TZXRNZW51SW5mb18wPWNhc3Q9KEhNRU5VKQotT1NfU2V0TWVudUluZm9fMT0KLQotT1NfU2V0TWVudUl0ZW1JbmZvQT0KLU9TX1NldE1lbnVJdGVtSW5mb0FfMD1jYXN0PShITUVOVSkKLU9TX1NldE1lbnVJdGVtSW5mb0FfMT0KLU9TX1NldE1lbnVJdGVtSW5mb0FfMj0KLU9TX1NldE1lbnVJdGVtSW5mb0FfMz0KLQotT1NfU2V0TWVudUl0ZW1JbmZvVz0KLU9TX1NldE1lbnVJdGVtSW5mb1dfMD1jYXN0PShITUVOVSkKLU9TX1NldE1lbnVJdGVtSW5mb1dfMT0KLU9TX1NldE1lbnVJdGVtSW5mb1dfMj0KLU9TX1NldE1lbnVJdGVtSW5mb1dfMz1jYXN0PShMUE1FTlVJVEVNSU5GT1cpCi0KLU9TX1NldE1ldGFSZ249Ci1PU19TZXRNZXRhUmduXzA9Y2FzdD1IREMKLQotT1NfU2V0UGFsZXR0ZUVudHJpZXM9Ci1PU19TZXRQYWxldHRlRW50cmllc18wPWNhc3Q9KEhQQUxFVFRFKQotT1NfU2V0UGFsZXR0ZUVudHJpZXNfMT0KLU9TX1NldFBhbGV0dGVFbnRyaWVzXzI9Ci1PU19TZXRQYWxldHRlRW50cmllc18zPWNhc3Q9KFBBTEVUVEVFTlRSWSAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfU2V0UGFyZW50PQotT1NfU2V0UGFyZW50XzA9Y2FzdD0oSFdORCkKLU9TX1NldFBhcmVudF8xPWNhc3Q9KEhXTkQpCi0KLU9TX1NldFBpeGVsPQotT1NfU2V0UGl4ZWxfMD1jYXN0PShIREMpCi1PU19TZXRQaXhlbF8xPQotT1NfU2V0UGl4ZWxfMj0KLU9TX1NldFBpeGVsXzM9Ci0KLU9TX1NldFBvbHlGaWxsTW9kZT0KLU9TX1NldFBvbHlGaWxsTW9kZV8wPWNhc3Q9SERDCi1PU19TZXRQb2x5RmlsbE1vZGVfMT0KLQotT1NfU2V0UHJvY2Vzc0RQSUF3YXJlPWZsYWdzPWR5bmFtaWMKLQotT1NfU2V0UHJvcEE9Ci1PU19TZXRQcm9wQV8wPWNhc3Q9SFdORAotT1NfU2V0UHJvcEFfMT1jYXN0PUxQQ1RTVFIKLU9TX1NldFByb3BBXzI9Y2FzdD0oSEFORExFKQotCi1PU19TZXRQcm9wVz0KLU9TX1NldFByb3BXXzA9Y2FzdD1IV05ECi1PU19TZXRQcm9wV18xPWNhc3Q9KExQQ1dTVFIpCi1PU19TZXRQcm9wV18yPWNhc3Q9SEFORExFCi0KLU9TX1NldFJPUDI9Ci1PU19TZXRST1AyXzA9Y2FzdD0oSERDKQotT1NfU2V0Uk9QMl8xPQotCi1PU19TZXRSZWN0PQotT1NfU2V0UmVjdF8wPWZsYWdzPW5vX2luCi1PU19TZXRSZWN0XzE9Ci1PU19TZXRSZWN0XzI9Ci1PU19TZXRSZWN0XzM9Ci1PU19TZXRSZWN0XzQ9Ci0KLU9TX1NldFJlY3RSZ249Ci1PU19TZXRSZWN0UmduXzA9Y2FzdD0oSFJHTikKLU9TX1NldFJlY3RSZ25fMT0KLU9TX1NldFJlY3RSZ25fMj0KLU9TX1NldFJlY3RSZ25fMz0KLU9TX1NldFJlY3RSZ25fND0KLQotT1NfU2V0U2Nyb2xsSW5mbz0KLU9TX1NldFNjcm9sbEluZm9fMD1jYXN0PShIV05EKQotT1NfU2V0U2Nyb2xsSW5mb18xPQotT1NfU2V0U2Nyb2xsSW5mb18yPQotT1NfU2V0U2Nyb2xsSW5mb18zPQotCi1PU19TZXRTdHJldGNoQmx0TW9kZT0KLU9TX1NldFN0cmV0Y2hCbHRNb2RlXzA9Y2FzdD0oSERDKQotT1NfU2V0U3RyZXRjaEJsdE1vZGVfMT0KLQotT1NfU2V0VGV4dEFsaWduPQotT1NfU2V0VGV4dEFsaWduXzA9Y2FzdD0oSERDKQotT1NfU2V0VGV4dEFsaWduXzE9Ci0KLU9TX1NldFRleHRDb2xvcj0KLU9TX1NldFRleHRDb2xvcl8wPWNhc3Q9KEhEQykKLU9TX1NldFRleHRDb2xvcl8xPWNhc3Q9KENPTE9SUkVGKQotCi1PU19TZXRUaW1lcj0KLU9TX1NldFRpbWVyXzA9Y2FzdD0oSFdORCkKLU9TX1NldFRpbWVyXzE9Ci1PU19TZXRUaW1lcl8yPQotT1NfU2V0VGltZXJfMz1jYXN0PShUSU1FUlBST0MpCi0KLU9TX1NldFdpbmRvd0xvbmdBPQotT1NfU2V0V2luZG93TG9uZ0FfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93TG9uZ0FfMT0KLU9TX1NldFdpbmRvd0xvbmdBXzI9Ci0KLU9TX1NldFdpbmRvd0xvbmdQdHJBPQotT1NfU2V0V2luZG93TG9uZ1B0ckFfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93TG9uZ1B0ckFfMT0KLU9TX1NldFdpbmRvd0xvbmdQdHJBXzI9Y2FzdD0oTE9OR19QVFIpCi0KLU9TX1NldFdpbmRvd0xvbmdQdHJXPQotT1NfU2V0V2luZG93TG9uZ1B0cldfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93TG9uZ1B0cldfMT0KLU9TX1NldFdpbmRvd0xvbmdQdHJXXzI9Y2FzdD0oTE9OR19QVFIpCi0KLU9TX1NldFdpbmRvd0xvbmdXPQotT1NfU2V0V2luZG93TG9uZ1dfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93TG9uZ1dfMT0KLU9TX1NldFdpbmRvd0xvbmdXXzI9Ci0KLU9TX1NldFdpbmRvd09yZ0V4PQotT1NfU2V0V2luZG93T3JnRXhfMD1jYXN0PUhEQwotT1NfU2V0V2luZG93T3JnRXhfMT0KLU9TX1NldFdpbmRvd09yZ0V4XzI9Ci1PU19TZXRXaW5kb3dPcmdFeF8zPQotCi1PU19TZXRXaW5kb3dQbGFjZW1lbnQ9Ci1PU19TZXRXaW5kb3dQbGFjZW1lbnRfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93UGxhY2VtZW50XzE9Ci0KLU9TX1NldFdpbmRvd1Bvcz0KLU9TX1NldFdpbmRvd1Bvc18wPWNhc3Q9KEhXTkQpCi1PU19TZXRXaW5kb3dQb3NfMT1jYXN0PShIV05EKQotT1NfU2V0V2luZG93UG9zXzI9Ci1PU19TZXRXaW5kb3dQb3NfMz0KLU9TX1NldFdpbmRvd1Bvc180PQotT1NfU2V0V2luZG93UG9zXzU9Ci1PU19TZXRXaW5kb3dQb3NfNj0KLQotT1NfU2V0V2luZG93UmduPQotT1NfU2V0V2luZG93UmduXzA9Y2FzdD1IV05ECi1PU19TZXRXaW5kb3dSZ25fMT1jYXN0PUhSR04KLU9TX1NldFdpbmRvd1Jnbl8yPQotCi1PU19TZXRXaW5kb3dUZXh0QT0KLU9TX1NldFdpbmRvd1RleHRBXzA9Y2FzdD0oSFdORCkKLU9TX1NldFdpbmRvd1RleHRBXzE9Y2FzdD0oTFBTVFIpCi0KLU9TX1NldFdpbmRvd1RleHRXPQotT1NfU2V0V2luZG93VGV4dFdfMD1jYXN0PShIV05EKQotT1NfU2V0V2luZG93VGV4dFdfMT1jYXN0PShMUFdTVFIpCi0KLU9TX1NldFdpbmRvd1RoZW1lPWZsYWdzPWR5bmFtaWMKLU9TX1NldFdpbmRvd1RoZW1lXzA9Y2FzdD1IV05ECi1PU19TZXRXaW5kb3dUaGVtZV8xPWNhc3Q9TFBDV1NUUgotT1NfU2V0V2luZG93VGhlbWVfMj1jYXN0PUxQQ1dTVFIKLQotT1NfU2V0V2luZG93c0hvb2tFeEE9Ci1PU19TZXRXaW5kb3dzSG9va0V4QV8wPQotT1NfU2V0V2luZG93c0hvb2tFeEFfMT1jYXN0PShIT09LUFJPQykKLU9TX1NldFdpbmRvd3NIb29rRXhBXzI9Y2FzdD0oSElOU1RBTkNFKQotT1NfU2V0V2luZG93c0hvb2tFeEFfMz0KLQotT1NfU2V0V2luZG93c0hvb2tFeFc9Ci1PU19TZXRXaW5kb3dzSG9va0V4V18wPQotT1NfU2V0V2luZG93c0hvb2tFeFdfMT1jYXN0PShIT09LUFJPQykKLU9TX1NldFdpbmRvd3NIb29rRXhXXzI9Y2FzdD0oSElOU1RBTkNFKQotT1NfU2V0V2luZG93c0hvb2tFeFdfMz0KLQotT1NfU2V0V29ybGRUcmFuc2Zvcm09Ci1PU19TZXRXb3JsZFRyYW5zZm9ybV8wPWNhc3Q9SERDCi1PU19TZXRXb3JsZFRyYW5zZm9ybV8xPWNhc3Q9WEZPUk0gKgotCi1PU19TaGVsbEV4ZWN1dGVFeEE9Ci1PU19TaGVsbEV4ZWN1dGVFeEFfMD0KLQotT1NfU2hlbGxFeGVjdXRlRXhXPQotT1NfU2hlbGxFeGVjdXRlRXhXXzA9Y2FzdD0oTFBTSEVMTEVYRUNVVEVJTkZPVykKLQotT1NfU2hlbGxfTm90aWZ5SWNvbkE9Ci1PU19TaGVsbF9Ob3RpZnlJY29uQV8wPQotT1NfU2hlbGxfTm90aWZ5SWNvbkFfMT0KLQotT1NfU2hlbGxfTm90aWZ5SWNvblc9Ci1PU19TaGVsbF9Ob3RpZnlJY29uV18wPQotT1NfU2hlbGxfTm90aWZ5SWNvbldfMT0KLQotT1NfU2hvd0NhcmV0PQotT1NfU2hvd0NhcmV0XzA9Y2FzdD0oSFdORCkKLQotT1NfU2hvd093bmVkUG9wdXBzPQotT1NfU2hvd093bmVkUG9wdXBzXzA9Y2FzdD0oSFdORCkKLU9TX1Nob3dPd25lZFBvcHVwc18xPQotCi1PU19TaG93U2Nyb2xsQmFyPQotT1NfU2hvd1Njcm9sbEJhcl8wPWNhc3Q9KEhXTkQpCi1PU19TaG93U2Nyb2xsQmFyXzE9Ci1PU19TaG93U2Nyb2xsQmFyXzI9Ci0KLU9TX1Nob3dXaW5kb3c9Ci1PU19TaG93V2luZG93XzA9Y2FzdD0oSFdORCkKLU9TX1Nob3dXaW5kb3dfMT0KLQotT1NfU2lwR2V0SW5mbz0KLU9TX1NpcEdldEluZm9fMD0KLQotT1NfU3RhcnREb2NBPQotT1NfU3RhcnREb2NBXzA9Y2FzdD0oSERDKQotT1NfU3RhcnREb2NBXzE9Ci0KLU9TX1N0YXJ0RG9jVz0KLU9TX1N0YXJ0RG9jV18wPWNhc3Q9KEhEQykKLU9TX1N0YXJ0RG9jV18xPWNhc3Q9KExQRE9DSU5GT1cpCi0KLU9TX1N0YXJ0UGFnZT0KLU9TX1N0YXJ0UGFnZV8wPWNhc3Q9KEhEQykKLQotT1NfU3RyZXRjaEJsdD0KLU9TX1N0cmV0Y2hCbHRfMD1jYXN0PShIREMpCi1PU19TdHJldGNoQmx0XzE9Ci1PU19TdHJldGNoQmx0XzI9Ci1PU19TdHJldGNoQmx0XzM9Ci1PU19TdHJldGNoQmx0XzQ9Ci1PU19TdHJldGNoQmx0XzU9Y2FzdD0oSERDKQotT1NfU3RyZXRjaEJsdF82PQotT1NfU3RyZXRjaEJsdF83PQotT1NfU3RyZXRjaEJsdF84PQotT1NfU3RyZXRjaEJsdF85PQotT1NfU3RyZXRjaEJsdF8xMD0KLQotT1NfU3Ryb2tlUGF0aD0KLU9TX1N0cm9rZVBhdGhfMD1jYXN0PShIREMpCi0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8zPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQV8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTQV8ySV8xPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU0FfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NBXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMkk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlfM0lJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUlfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvQV9fSUlfM0lJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb0FfX0lJXzNJSV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9BX19JSV8zSUlfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzA9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9ISUdIQ09OVFJBU1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0hJR0hDT05UUkFTVF8ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfSElHSENPTlRSQVNUXzJJXzM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXXzJJPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX05PTkNMSUVOVE1FVFJJQ1NXXzJJXzE9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9OT05DTElFTlRNRVRSSUNTV18ySV8yPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTk9OQ0xJRU5UTUVUUklDU1dfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSUxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUkVDVF8yST0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMD0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMj0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1JFQ1RfMklfMz0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSV8zSUk9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJSV8wPQotT1NfU3lzdGVtUGFyYW1ldGVyc0luZm9XX19JSV8zSUlfMT0KLU9TX1N5c3RlbVBhcmFtZXRlcnNJbmZvV19fSUlfM0lJXzI9Ci1PU19TeXN0ZW1QYXJhbWV0ZXJzSW5mb1dfX0lJXzNJSV8zPQotCi1PU19UQkJVVFRPTklORk9fc2l6ZW9mPQotCi1PU19UQkJVVFRPTl9zaXplb2Y9Ci0KLU9TX1RDSVRFTV9zaXplb2Y9Ci0KLU9TX1RFWFRNRVRSSUNBX3NpemVvZj0KLQotT1NfVEVYVE1FVFJJQ1dfc2l6ZW9mPQotCi1PU19UT09MSU5GT19zaXplb2Y9Ci0KLU9TX1RSQUNLTU9VU0VFVkVOVF9zaXplb2Y9Ci0KLU9TX1RSSVZFUlRFWF9zaXplb2Y9Ci0KLU9TX1RWSElUVEVTVElORk9fc2l6ZW9mPQotCi1PU19UVklOU0VSVFNUUlVDVF9zaXplb2Y9Ci0KLU9TX1RWSVRFTUVYX3NpemVvZj0KLQotT1NfVFZJVEVNX3NpemVvZj0KLQotT1NfVG9Bc2NpaT0KLU9TX1RvQXNjaWlfMD0KLU9TX1RvQXNjaWlfMT0KLU9TX1RvQXNjaWlfMj1jYXN0PShQQllURSkKLU9TX1RvQXNjaWlfMz1jYXN0PShMUFdPUkQpCi1PU19Ub0FzY2lpXzQ9Ci0KLU9TX1RvVW5pY29kZT0KLU9TX1RvVW5pY29kZV8wPQotT1NfVG9Vbmljb2RlXzE9Ci1PU19Ub1VuaWNvZGVfMj1jYXN0PShQQllURSkKLU9TX1RvVW5pY29kZV8zPWNhc3Q9KExQV1NUUikKLU9TX1RvVW5pY29kZV80PQotT1NfVG9Vbmljb2RlXzU9Ci0KLU9TX1RyYWNrTW91c2VFdmVudD0KLU9TX1RyYWNrTW91c2VFdmVudF8wPQotCi1PU19UcmFja1BvcHVwTWVudT0KLU9TX1RyYWNrUG9wdXBNZW51XzA9Y2FzdD0oSE1FTlUpCi1PU19UcmFja1BvcHVwTWVudV8xPQotT1NfVHJhY2tQb3B1cE1lbnVfMj0KLU9TX1RyYWNrUG9wdXBNZW51XzM9Ci1PU19UcmFja1BvcHVwTWVudV80PQotT1NfVHJhY2tQb3B1cE1lbnVfNT1jYXN0PShIV05EKQotT1NfVHJhY2tQb3B1cE1lbnVfNj0KLQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JBPQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JBXzA9Y2FzdD0oSFdORCkKLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yQV8xPWNhc3Q9KEhBQ0NFTCkKLU9TX1RyYW5zbGF0ZUFjY2VsZXJhdG9yQV8yPQotCi1PU19UcmFuc2xhdGVBY2NlbGVyYXRvclc9Ci1PU19UcmFuc2xhdGVBY2NlbGVyYXRvcldfMD1jYXN0PShIV05EKQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JXXzE9Y2FzdD0oSEFDQ0VMKQotT1NfVHJhbnNsYXRlQWNjZWxlcmF0b3JXXzI9Ci0KLU9TX1RyYW5zbGF0ZUNoYXJzZXRJbmZvPQotT1NfVHJhbnNsYXRlQ2hhcnNldEluZm9fMD1jYXN0PShEV09SRCAqKQotT1NfVHJhbnNsYXRlQ2hhcnNldEluZm9fMT1jYXN0PShMUENIQVJTRVRJTkZPKQotT1NfVHJhbnNsYXRlQ2hhcnNldEluZm9fMj0KLQotT1NfVHJhbnNsYXRlTURJU3lzQWNjZWw9Ci1PU19UcmFuc2xhdGVNRElTeXNBY2NlbF8wPWNhc3Q9KEhXTkQpCi1PU19UcmFuc2xhdGVNRElTeXNBY2NlbF8xPWNhc3Q9KExQTVNHKQotCi1PU19UcmFuc2xhdGVNZXNzYWdlPQotT1NfVHJhbnNsYXRlTWVzc2FnZV8wPQotCi1PU19UcmFuc3BhcmVudEJsdD1mbGFncz1keW5hbWljCi1PU19UcmFuc3BhcmVudEJsdF8wPQotT1NfVHJhbnNwYXJlbnRCbHRfMT0KLU9TX1RyYW5zcGFyZW50Qmx0XzI9Ci1PU19UcmFuc3BhcmVudEJsdF8zPQotT1NfVHJhbnNwYXJlbnRCbHRfND0KLU9TX1RyYW5zcGFyZW50Qmx0XzU9Ci1PU19UcmFuc3BhcmVudEJsdF82PQotT1NfVHJhbnNwYXJlbnRCbHRfNz0KLU9TX1RyYW5zcGFyZW50Qmx0Xzg9Ci1PU19UcmFuc3BhcmVudEJsdF85PQotT1NfVHJhbnNwYXJlbnRCbHRfMTA9Ci0KLU9TX1RyYW5zcGFyZW50SW1hZ2U9Ci1PU19UcmFuc3BhcmVudEltYWdlXzA9Y2FzdD0oSERDKQotT1NfVHJhbnNwYXJlbnRJbWFnZV8xPQotT1NfVHJhbnNwYXJlbnRJbWFnZV8yPQotT1NfVHJhbnNwYXJlbnRJbWFnZV8zPQotT1NfVHJhbnNwYXJlbnRJbWFnZV80PQotT1NfVHJhbnNwYXJlbnRJbWFnZV81PWNhc3Q9KEhBTkRMRSkKLU9TX1RyYW5zcGFyZW50SW1hZ2VfNj0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfNz0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfOD0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfOT0KLU9TX1RyYW5zcGFyZW50SW1hZ2VfMTA9Y2FzdD0oQ09MT1JSRUYpCi0KLU9TX1VEQUNDRUxfc2l6ZW9mPQotCi1PU19Vbmhvb2tXaW5kb3dzSG9va0V4PQotT1NfVW5ob29rV2luZG93c0hvb2tFeF8wPWNhc3Q9KEhIT09LKQotCi1PU19VbnJlZ2lzdGVyQ2xhc3NBPQotT1NfVW5yZWdpc3RlckNsYXNzQV8wPWNhc3Q9KExQU1RSKQotT1NfVW5yZWdpc3RlckNsYXNzQV8xPWNhc3Q9KEhJTlNUQU5DRSkKLQotT1NfVW5yZWdpc3RlckNsYXNzVz0KLU9TX1VucmVnaXN0ZXJDbGFzc1dfMD1jYXN0PShMUFdTVFIpCi1PU19VbnJlZ2lzdGVyQ2xhc3NXXzE9Y2FzdD0oSElOU1RBTkNFKQotCi1PU19VcGRhdGVXaW5kb3c9Ci1PU19VcGRhdGVXaW5kb3dfMD1jYXN0PShIV05EKQotCi1PU19WYWxpZGF0ZVJlY3Q9Ci1PU19WYWxpZGF0ZVJlY3RfMD1jYXN0PShIV05EKQotT1NfVmFsaWRhdGVSZWN0XzE9Ci0KLU9TX1ZrS2V5U2NhbkE9Ci1PU19Wa0tleVNjYW5BXzA9Y2FzdD0oVENIQVIpCi0KLU9TX1ZrS2V5U2Nhblc9Ci1PU19Wa0tleVNjYW5XXzA9Y2FzdD0oV0NIQVIpCi0KLU9TX1Z0YmxDYWxsX19JST0KLU9TX1Z0YmxDYWxsX19JSV8wPQotT1NfVnRibENhbGxfX0lJXzE9Ci0KLU9TX1Z0YmxDYWxsX19JSUk9Ci1PU19WdGJsQ2FsbF9fSUlJXzA9Ci1PU19WdGJsQ2FsbF9fSUlJXzE9Ci1PU19WdGJsQ2FsbF9fSUlJXzI9Ci0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zST0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV8wPQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzE9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfMj0KLU9TX1Z0YmxDYWxsX19JSUlJSV8zSV8zPQotT1NfVnRibENhbGxfX0lJSUlJXzNJXzQ9Ci1PU19WdGJsQ2FsbF9fSUlJSUlfM0lfNT0KLQotT1NfVnRibENhbGxfX0lJSUpJXzNKPQotT1NfVnRibENhbGxfX0lJSUpJXzNKXzA9Ci1PU19WdGJsQ2FsbF9fSUlJSklfM0pfMT0KLU9TX1Z0YmxDYWxsX19JSUlKSV8zSl8yPQotT1NfVnRibENhbGxfX0lJSUpJXzNKXzM9Ci1PU19WdGJsQ2FsbF9fSUlJSklfM0pfND0KLU9TX1Z0YmxDYWxsX19JSUlKSV8zSl81PQotCi1PU19WdGJsQ2FsbF9fSUlKPQotT1NfVnRibENhbGxfX0lJSl8wPQotT1NfVnRibENhbGxfX0lJSl8xPQotT1NfVnRibENhbGxfX0lJSl8yPQotCi1PU19WdGJsQ2FsbF9fSUlKSUlfM0o9Ci1PU19WdGJsQ2FsbF9fSUlKSUlfM0pfMD0KLU9TX1Z0YmxDYWxsX19JSUpJSV8zSl8xPQotT1NfVnRibENhbGxfX0lJSklJXzNKXzI9Ci1PU19WdGJsQ2FsbF9fSUlKSUlfM0pfMz0KLU9TX1Z0YmxDYWxsX19JSUpJSV8zSl80PQotT1NfVnRibENhbGxfX0lJSklJXzNKXzU9Ci0KLU9TX1Z0YmxDYWxsX19JSUpKSV8zSj0KLU9TX1Z0YmxDYWxsX19JSUpKSV8zSl8wPQotT1NfVnRibENhbGxfX0lJSkpJXzNKXzE9Ci1PU19WdGJsQ2FsbF9fSUlKSklfM0pfMj0KLU9TX1Z0YmxDYWxsX19JSUpKSV8zSl8zPQotT1NfVnRibENhbGxfX0lJSkpJXzNKXzQ9Ci1PU19WdGJsQ2FsbF9fSUlKSklfM0pfNT0KLQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0k9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV8wPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfMT0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzI9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV8zPQotT1NfVnRibENhbGxfX0lJXzNDSUlfM0lfM0lfND0KLU9TX1Z0YmxDYWxsX19JSV8zQ0lJXzNJXzNJXzU9Ci1PU19WdGJsQ2FsbF9fSUlfM0NJSV8zSV8zSV82PQotCi1PU19XSU5ET1dQTEFDRU1FTlRfc2l6ZW9mPQotCi1PU19XSU5ET1dQT1Nfc2l6ZW9mPQotCi1PU19XTkRDTEFTU19zaXplb2Y9Ci0KLU9TX1dhaXRNZXNzYWdlPQotCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWj0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzA9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl8xPQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfMj1jYXN0PShMUENXU1RSKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzM9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lJSV8zQl8zWl80PWNhc3Q9KExQU1RSKQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfNT0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSUlJXzNCXzNaXzY9Y2FzdD0oTFBDU1RSKQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJSUlfM0JfM1pfNz1jYXN0PShMUEJPT0wpCi0KLU9TX1dpZGVDaGFyVG9NdWx0aUJ5dGVfX0lJXzNDSV8zQklfM0JfM1o9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzA9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzE9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzI9Y2FzdD0oTFBDV1NUUiksZmxhZ3M9bm9fb3V0IGNyaXRpY2FsCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzM9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzQ9Y2FzdD0oTFBTVFIpLGZsYWdzPW5vX2luIGNyaXRpY2FsCi1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzU9Ci1PU19XaWRlQ2hhclRvTXVsdGlCeXRlX19JSV8zQ0lfM0JJXzNCXzNaXzY9Y2FzdD0oTFBDU1RSKQotT1NfV2lkZUNoYXJUb011bHRpQnl0ZV9fSUlfM0NJXzNCSV8zQl8zWl83PWNhc3Q9KExQQk9PTCkKLQotT1NfV2luZG93RnJvbURDPQotT1NfV2luZG93RnJvbURDXzA9Y2FzdD0oSERDKQotCi1PU19XaW5kb3dGcm9tUG9pbnQ9Ci1PU19XaW5kb3dGcm9tUG9pbnRfMD1mbGFncz1zdHJ1Y3QKLQotT1Nfd2NzbGVuPQotT1Nfd2NzbGVuXzA9Y2FzdD0oY29uc3Qgd2NoYXJfdCAqKQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9PU1ZFUlNJT05JTkZPPQotT1NWRVJTSU9OSU5GT19kd09TVmVyc2lvbkluZm9TaXplPQotT1NWRVJTSU9OSU5GT19kd01ham9yVmVyc2lvbj0KLU9TVkVSU0lPTklORk9fZHdNaW5vclZlcnNpb249Ci1PU1ZFUlNJT05JTkZPX2R3QnVpbGROdW1iZXI9Ci1PU1ZFUlNJT05JTkZPX2R3UGxhdGZvcm1JZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9BPQotT1NWRVJTSU9OSU5GT0Ffc3pDU0RWZXJzaW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfT1NWRVJTSU9OSU5GT0VYPQotT1NWRVJTSU9OSU5GT0VYX3dTZXJ2aWNlUGFja01ham9yPQotT1NWRVJTSU9OSU5GT0VYX3dTZXJ2aWNlUGFja01pbm9yPQotT1NWRVJTSU9OSU5GT0VYX3dTdWl0ZU1hc2s9Ci1PU1ZFUlNJT05JTkZPRVhfd1Byb2R1Y3RUeXBlPQotT1NWRVJTSU9OSU5GT0VYX3dSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9FWEE9Ci1PU1ZFUlNJT05JTkZPRVhBX3N6Q1NEVmVyc2lvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9FWFc9Ci1PU1ZFUlNJT05JTkZPRVhXX3N6Q1NEVmVyc2lvbj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX09TVkVSU0lPTklORk9XPQotT1NWRVJTSU9OSU5GT1dfc3pDU0RWZXJzaW9uPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUEFJTlRTVFJVQ1Q9Ci1QQUlOVFNUUlVDVF9oZGM9Y2FzdD0oSERDKQotUEFJTlRTVFJVQ1RfZkVyYXNlPQotUEFJTlRTVFJVQ1RfbGVmdD1hY2Nlc3Nvcj1yY1BhaW50LmxlZnQKLVBBSU5UU1RSVUNUX3RvcD1hY2Nlc3Nvcj1yY1BhaW50LnRvcAotUEFJTlRTVFJVQ1RfcmlnaHQ9YWNjZXNzb3I9cmNQYWludC5yaWdodAotUEFJTlRTVFJVQ1RfYm90dG9tPWFjY2Vzc29yPXJjUGFpbnQuYm90dG9tCi1QQUlOVFNUUlVDVF9mUmVzdG9yZT0KLVBBSU5UU1RSVUNUX2ZJbmNVcGRhdGU9Ci1QQUlOVFNUUlVDVF9yZ2JSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1BPSU5UPQotUE9JTlRfeD0KLVBPSU5UX3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9QUklOVERMRz0KLVBSSU5URExHX2xTdHJ1Y3RTaXplPQotUFJJTlRETEdfaHduZE93bmVyPWNhc3Q9KEhXTkQpCi1QUklOVERMR19oRGV2TW9kZT1jYXN0PShIR0xPQkFMKQotUFJJTlRETEdfaERldk5hbWVzPWNhc3Q9KEhHTE9CQUwpCi1QUklOVERMR19oREM9Y2FzdD0oSERDKQotUFJJTlRETEdfRmxhZ3M9Ci1QUklOVERMR19uRnJvbVBhZ2U9Ci1QUklOVERMR19uVG9QYWdlPQotUFJJTlRETEdfbk1pblBhZ2U9Ci1QUklOVERMR19uTWF4UGFnZT0KLVBSSU5URExHX25Db3BpZXM9Ci1QUklOVERMR19oSW5zdGFuY2U9Y2FzdD0oSElOU1RBTkNFKQotUFJJTlRETEdfbEN1c3REYXRhPQotUFJJTlRETEdfbHBmblByaW50SG9vaz1jYXN0PShMUFBSSU5USE9PS1BST0MpCi1QUklOVERMR19scGZuU2V0dXBIb29rPWNhc3Q9KExQUFJJTlRIT09LUFJPQykKLVBSSU5URExHX2xwUHJpbnRUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLVBSSU5URExHX2xwU2V0dXBUZW1wbGF0ZU5hbWU9Y2FzdD0oTFBDVFNUUikKLVBSSU5URExHX2hQcmludFRlbXBsYXRlPWNhc3Q9KEhHTE9CQUwpCi1QUklOVERMR19oU2V0dXBUZW1wbGF0ZT1jYXN0PShIR0xPQkFMKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfUFJPQ0VTU18xSU5GT1JNQVRJT049Ci1QUk9DRVNTX0lORk9STUFUSU9OX2hQcm9jZXNzPWNhc3Q9SEFORExFCi1QUk9DRVNTX0lORk9STUFUSU9OX2hUaHJlYWQ9Y2FzdD1IQU5ETEUKLVBST0NFU1NfSU5GT1JNQVRJT05fZHdQcm9jZXNzSWQ9Ci1QUk9DRVNTX0lORk9STUFUSU9OX2R3VGhyZWFkSWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUJBUkJBTkRJTkZPPQotUkVCQVJCQU5ESU5GT19jYlNpemU9Ci1SRUJBUkJBTkRJTkZPX2ZNYXNrPQotUkVCQVJCQU5ESU5GT19mU3R5bGU9Ci1SRUJBUkJBTkRJTkZPX2NsckZvcmU9Ci1SRUJBUkJBTkRJTkZPX2NsckJhY2s9Ci1SRUJBUkJBTkRJTkZPX2xwVGV4dD1jYXN0PShMUFRTVFIpCi1SRUJBUkJBTkRJTkZPX2NjaD0KLVJFQkFSQkFORElORk9faUltYWdlPQotUkVCQVJCQU5ESU5GT19od25kQ2hpbGQ9Y2FzdD0oSFdORCkKLVJFQkFSQkFORElORk9fY3hNaW5DaGlsZD0KLVJFQkFSQkFORElORk9fY3lNaW5DaGlsZD0KLVJFQkFSQkFORElORk9fY3g9Ci1SRUJBUkJBTkRJTkZPX2hibUJhY2s9Y2FzdD0oSEJJVE1BUCkKLVJFQkFSQkFORElORk9fd0lEPQotUkVCQVJCQU5ESU5GT19jeUNoaWxkPQotUkVCQVJCQU5ESU5GT19jeU1heENoaWxkPQotUkVCQVJCQU5ESU5GT19jeUludGVncmFsPQotUkVCQVJCQU5ESU5GT19jeElkZWFsPQotUkVCQVJCQU5ESU5GT19sUGFyYW09Ci1SRUJBUkJBTkRJTkZPX2N4SGVhZGVyPWZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9SRUNUPQotUkVDVF9sZWZ0PQotUkVDVF90b3A9Ci1SRUNUX3JpZ2h0PQotUkVDVF9ib3R0b209Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUFOQUxZU0lTPQotU0NSSVBUX0FOQUxZU0lTX2VTY3JpcHQ9Ci1TQ1JJUFRfQU5BTFlTSVNfZlJUTD0KLVNDUklQVF9BTkFMWVNJU19mTGF5b3V0UlRMPQotU0NSSVBUX0FOQUxZU0lTX2ZMaW5rQmVmb3JlPQotU0NSSVBUX0FOQUxZU0lTX2ZMaW5rQWZ0ZXI9Ci1TQ1JJUFRfQU5BTFlTSVNfZkxvZ2ljYWxPcmRlcj0KLVNDUklQVF9BTkFMWVNJU19mTm9HbHlwaEluZGV4PQotU0NSSVBUX0FOQUxZU0lTX3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUNPTlRST0w9Ci1TQ1JJUFRfQ09OVFJPTF91RGVmYXVsdExhbmd1YWdlPQotU0NSSVBUX0NPTlRST0xfZkNvbnRleHREaWdpdHM9Ci1TQ1JJUFRfQ09OVFJPTF9mSW52ZXJ0UHJlQm91bmREaXI9Ci1TQ1JJUFRfQ09OVFJPTF9mSW52ZXJ0UG9zdEJvdW5kRGlyPQotU0NSSVBUX0NPTlRST0xfZkxpbmtTdHJpbmdCZWZvcmU9Ci1TQ1JJUFRfQ09OVFJPTF9mTGlua1N0cmluZ0FmdGVyPQotU0NSSVBUX0NPTlRST0xfZk5ldXRyYWxPdmVycmlkZT0KLVNDUklQVF9DT05UUk9MX2ZOdW1lcmljT3ZlcnJpZGU9Ci1TQ1JJUFRfQ09OVFJPTF9mTGVnYWN5QmlkaUNsYXNzPQotU0NSSVBUX0NPTlRST0xfZlJlc2VydmVkPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0NSSVBUXzFESUdJVFNVQlNUSVRVVEU9Ci1TQ1JJUFRfRElHSVRTVUJTVElUVVRFX05hdGlvbmFsRGlnaXRMYW5ndWFnZT0KLVNDUklQVF9ESUdJVFNVQlNUSVRVVEVfVHJhZGl0aW9uYWxEaWdpdExhbmd1YWdlPQotU0NSSVBUX0RJR0lUU1VCU1RJVFVURV9EaWdpdFN1YnN0aXR1dGU9Ci1TQ1JJUFRfRElHSVRTVUJTVElUVVRFX2R3UmVzZXJ2ZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUZPTlRQUk9QRVJUSUVTPQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX2NCeXRlcz0KLVNDUklQVF9GT05UUFJPUEVSVElFU193Z0JsYW5rPQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX3dnRGVmYXVsdD0KLVNDUklQVF9GT05UUFJPUEVSVElFU193Z0ludmFsaWQ9Ci1TQ1JJUFRfRk9OVFBST1BFUlRJRVNfd2dLYXNoaWRhPQotU0NSSVBUX0ZPTlRQUk9QRVJUSUVTX2lLYXNoaWRhV2lkdGg9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUlURU09Ci1TQ1JJUFRfSVRFTV9pQ2hhclBvcz0KLVNDUklQVF9JVEVNX2E9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TQ1JJUFRfMUxPR0FUVFI9Ci1TQ1JJUFRfTE9HQVRUUl9mU29mdEJyZWFrPQotU0NSSVBUX0xPR0FUVFJfZldoaXRlU3BhY2U9Ci1TQ1JJUFRfTE9HQVRUUl9mQ2hhclN0b3A9Ci1TQ1JJUFRfTE9HQVRUUl9mV29yZFN0b3A9Ci1TQ1JJUFRfTE9HQVRUUl9mSW52YWxpZD0KLVNDUklQVF9MT0dBVFRSX2ZSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xUFJPUEVSVElFUz0KLVNDUklQVF9QUk9QRVJUSUVTX2xhbmdpZD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZOdW1lcmljPQotU0NSSVBUX1BST1BFUlRJRVNfZkNvbXBsZXg9Ci1TQ1JJUFRfUFJPUEVSVElFU19mTmVlZHNXb3JkQnJlYWtpbmc9Ci1TQ1JJUFRfUFJPUEVSVElFU19mTmVlZHNDYXJldEluZm89Ci1TQ1JJUFRfUFJPUEVSVElFU19iQ2hhclNldD0KLVNDUklQVF9QUk9QRVJUSUVTX2ZDb250cm9sPQotU0NSSVBUX1BST1BFUlRJRVNfZlByaXZhdGVVc2VBcmVhPQotU0NSSVBUX1BST1BFUlRJRVNfZk5lZWRzQ2hhcmFjdGVySnVzdGlmeT0KLVNDUklQVF9QUk9QRVJUSUVTX2ZJbnZhbGlkR2x5cGg9Ci1TQ1JJUFRfUFJPUEVSVElFU19mSW52YWxpZExvZ0F0dHI9Ci1TQ1JJUFRfUFJPUEVSVElFU19mQ0RNPQotU0NSSVBUX1BST1BFUlRJRVNfZkFtYmlndW91c0NoYXJTZXQ9Ci1TQ1JJUFRfUFJPUEVSVElFU19mQ2x1c3RlclNpemVWYXJpZXM9Ci1TQ1JJUFRfUFJPUEVSVElFU19mUmVqZWN0SW52YWxpZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUklQVF8xU1RBVEU9Ci1TQ1JJUFRfU1RBVEVfdUJpZGlMZXZlbD0KLVNDUklQVF9TVEFURV9mT3ZlcnJpZGVEaXJlY3Rpb249Ci1TQ1JJUFRfU1RBVEVfZkluaGliaXRTeW1Td2FwPQotU0NSSVBUX1NUQVRFX2ZDaGFyU2hhcGU9Ci1TQ1JJUFRfU1RBVEVfZkRpZ2l0U3Vic3RpdHV0ZT0KLVNDUklQVF9TVEFURV9mSW5oaWJpdExpZ2F0ZT0KLVNDUklQVF9TVEFURV9mRGlzcGxheVpXRz0KLVNDUklQVF9TVEFURV9mQXJhYmljTnVtQ29udGV4dD0KLVNDUklQVF9TVEFURV9mR2NwQ2x1c3RlcnM9Ci1TQ1JJUFRfU1RBVEVfZlJlc2VydmVkPQotU0NSSVBUX1NUQVRFX2ZFbmdpbmVSZXNlcnZlZD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NDUk9MTElORk89Ci1TQ1JPTExJTkZPX2NiU2l6ZT0KLVNDUk9MTElORk9fZk1hc2s9Ci1TQ1JPTExJTkZPX25NaW49Ci1TQ1JPTExJTkZPX25NYXg9Ci1TQ1JPTExJTkZPX25QYWdlPQotU0NST0xMSU5GT19uUG9zPQotU0NST0xMSU5GT19uVHJhY2tQb3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSEFDVElWQVRFSU5GTz0KLVNIQUNUSVZBVEVJTkZPX2NiU2l6ZT0KLVNIQUNUSVZBVEVJTkZPX2h3bmRMYXN0Rm9jdXM9Y2FzdD0oSFdORCkKLVNIQUNUSVZBVEVJTkZPX2ZTaXBVcD0KLVNIQUNUSVZBVEVJTkZPX2ZTaXBPbkRlYWN0aXZhdGlvbj0KLVNIQUNUSVZBVEVJTkZPX2ZBY3RpdmU9Ci1TSEFDVElWQVRFSU5GT19mUmVzZXJ2ZWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSEVMTEVYRUNVVEVJTkZPPQotU0hFTExFWEVDVVRFSU5GT19jYlNpemU9Ci1TSEVMTEVYRUNVVEVJTkZPX2ZNYXNrPQotU0hFTExFWEVDVVRFSU5GT19od25kPWNhc3Q9KEhXTkQpCi1TSEVMTEVYRUNVVEVJTkZPX2xwVmVyYj1jYXN0PShMUENUU1RSKQotU0hFTExFWEVDVVRFSU5GT19scEZpbGU9Y2FzdD0oTFBDVFNUUikKLVNIRUxMRVhFQ1VURUlORk9fbHBQYXJhbWV0ZXJzPWNhc3Q9KExQQ1RTVFIpCi1TSEVMTEVYRUNVVEVJTkZPX2xwRGlyZWN0b3J5PWNhc3Q9KExQQ1RTVFIpCi1TSEVMTEVYRUNVVEVJTkZPX25TaG93PQotU0hFTExFWEVDVVRFSU5GT19oSW5zdEFwcD1jYXN0PShISU5TVEFOQ0UpCi1TSEVMTEVYRUNVVEVJTkZPX2xwSURMaXN0PWNhc3Q9KExQVk9JRCkKLVNIRUxMRVhFQ1VURUlORk9fbHBDbGFzcz1jYXN0PShMUENUU1RSKQotU0hFTExFWEVDVVRFSU5GT19oa2V5Q2xhc3M9Y2FzdD0oSEtFWSkKLVNIRUxMRVhFQ1VURUlORk9fZHdIb3RLZXk9Ci1TSEVMTEVYRUNVVEVJTkZPX2hJY29uPWNhc3Q9KEhBTkRMRSkKLVNIRUxMRVhFQ1VURUlORk9faFByb2Nlc3M9Y2FzdD0oSEFORExFKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hGSUxFSU5GTz0KLVNIRklMRUlORk9faEljb249Y2FzdD1ISUNPTgotU0hGSUxFSU5GT19pSWNvbj0KLVNIRklMRUlORk9fZHdBdHRyaWJ1dGVzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hGSUxFSU5GT0E9Ci1TSEZJTEVJTkZPQV9zekRpc3BsYXlOYW1lPQotU0hGSUxFSU5GT0Ffc3pUeXBlTmFtZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NIRklMRUlORk9XPQotU0hGSUxFSU5GT1dfc3pEaXNwbGF5TmFtZT0KLVNIRklMRUlORk9XX3N6VHlwZU5hbWU9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSE1FTlVCQVJJTkZPPQotU0hNRU5VQkFSSU5GT19jYlNpemU9Ci1TSE1FTlVCQVJJTkZPX2h3bmRQYXJlbnQ9Y2FzdD0oSFdORCkKLVNITUVOVUJBUklORk9fZHdGbGFncz0KLVNITUVOVUJBUklORk9fblRvb2xCYXJJZD0KLVNITUVOVUJBUklORk9faEluc3RSZXM9Y2FzdD0oSElOU1RBTkNFKQotU0hNRU5VQkFSSU5GT19uQm1wSWQ9Ci1TSE1FTlVCQVJJTkZPX2NCbXBJbWFnZXM9Ci1TSE1FTlVCQVJJTkZPX2h3bmRNQj1jYXN0PShIV05EKQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfU0hSR0lORk89Ci1TSFJHSU5GT19jYlNpemU9Ci1TSFJHSU5GT19od25kQ2xpZW50PWNhc3Q9KEhXTkQpCi1TSFJHSU5GT19wdERvd25feD1hY2Nlc3Nvcj1wdERvd24ueAotU0hSR0lORk9fcHREb3duX3k9YWNjZXNzb3I9cHREb3duLnkKLVNIUkdJTkZPX2R3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVBJTkZPPQotU0lQSU5GT19jYlNpemU9Ci1TSVBJTkZPX2Zkd0ZsYWdzPQotU0lQSU5GT19yY1Zpc2libGVEZXNrdG9wX2xlZnQ9YWNjZXNzb3I9cmNWaXNpYmxlRGVza3RvcC5sZWZ0Ci1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfdG9wPWFjY2Vzc29yPXJjVmlzaWJsZURlc2t0b3AudG9wCi1TSVBJTkZPX3JjVmlzaWJsZURlc2t0b3BfcmlnaHQ9YWNjZXNzb3I9cmNWaXNpYmxlRGVza3RvcC5yaWdodAotU0lQSU5GT19yY1Zpc2libGVEZXNrdG9wX2JvdHRvbT1hY2Nlc3Nvcj1yY1Zpc2libGVEZXNrdG9wLmJvdHRvbQotU0lQSU5GT19yY1NpcFJlY3RfbGVmdD1hY2Nlc3Nvcj1yY1NpcFJlY3QubGVmdAotU0lQSU5GT19yY1NpcFJlY3RfdG9wPWFjY2Vzc29yPXJjU2lwUmVjdC50b3AKLVNJUElORk9fcmNTaXBSZWN0X3JpZ2h0PWFjY2Vzc29yPXJjU2lwUmVjdC5yaWdodAotU0lQSU5GT19yY1NpcFJlY3RfYm90dG9tPWFjY2Vzc29yPXJjU2lwUmVjdC5ib3R0b20KLVNJUElORk9fZHdJbURhdGFTaXplPQotU0lQSU5GT19wdkltRGF0YT1jYXN0PSh2b2lkICopCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TSVpFPQotU0laRV9jeD0KLVNJWkVfY3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9TVEFSVFVQSU5GTz0KLVNUQVJUVVBJTkZPX2NiPQotU1RBUlRVUElORk9fbHBSZXNlcnZlZD1jYXN0PUxQVFNUUgotU1RBUlRVUElORk9fbHBEZXNrdG9wPWNhc3Q9TFBUU1RSCi1TVEFSVFVQSU5GT19scFRpdGxlPWNhc3Q9TFBUU1RSCi1TVEFSVFVQSU5GT19kd1g9Ci1TVEFSVFVQSU5GT19kd1k9Ci1TVEFSVFVQSU5GT19kd1hTaXplPQotU1RBUlRVUElORk9fZHdZU2l6ZT0KLVNUQVJUVVBJTkZPX2R3WENvdW50Q2hhcnM9Ci1TVEFSVFVQSU5GT19kd1lDb3VudENoYXJzPQotU1RBUlRVUElORk9fZHdGaWxsQXR0cmlidXRlPQotU1RBUlRVUElORk9fZHdGbGFncz0KLVNUQVJUVVBJTkZPX3dTaG93V2luZG93PQotU1RBUlRVUElORk9fY2JSZXNlcnZlZDI9Ci1TVEFSVFVQSU5GT19scFJlc2VydmVkMj1jYXN0PUxQQllURQotU1RBUlRVUElORk9faFN0ZElucHV0PWNhc3Q9SEFORExFCi1TVEFSVFVQSU5GT19oU3RkT3V0cHV0PWNhc3Q9SEFORExFCi1TVEFSVFVQSU5GT19oU3RkRXJyb3I9Y2FzdD1IQU5ETEUKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1NZU1RFTVRJTUU9Ci1TWVNURU1USU1FX3dZZWFyPQotU1lTVEVNVElNRV93TW9udGg9Ci1TWVNURU1USU1FX3dEYXlPZldlZWs9Ci1TWVNURU1USU1FX3dEYXk9Ci1TWVNURU1USU1FX3dIb3VyPQotU1lTVEVNVElNRV93TWludXRlPQotU1lTVEVNVElNRV93U2Vjb25kPQotU1lTVEVNVElNRV93TWlsbGlzZWNvbmRzPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT049Ci1UQkJVVFRPTl9pQml0bWFwPQotVEJCVVRUT05faWRDb21tYW5kPQotVEJCVVRUT05fZnNTdGF0ZT0KLVRCQlVUVE9OX2ZzU3R5bGU9Ci1UQkJVVFRPTl9kd0RhdGE9Ci1UQkJVVFRPTl9pU3RyaW5nPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEJCVVRUT05JTkZPPQotVEJCVVRUT05JTkZPX2NiU2l6ZT0KLVRCQlVUVE9OSU5GT19kd01hc2s9Ci1UQkJVVFRPTklORk9faWRDb21tYW5kPQotVEJCVVRUT05JTkZPX2lJbWFnZT0KLVRCQlVUVE9OSU5GT19mc1N0YXRlPQotVEJCVVRUT05JTkZPX2ZzU3R5bGU9Ci1UQkJVVFRPTklORk9fY3g9Ci1UQkJVVFRPTklORk9fbFBhcmFtPQotVEJCVVRUT05JTkZPX3BzelRleHQ9Y2FzdD0oTFBUU1RSKQotVEJCVVRUT05JTkZPX2NjaFRleHQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0hBUj1mbGFncz1ub19nZW4KLVRDSEFSX2NoYXJzPQotVENIQVJfYnl0ZXM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UQ0lURU09Ci1UQ0lURU1fbWFzaz0KLVRDSVRFTV9kd1N0YXRlPQotVENJVEVNX2R3U3RhdGVNYXNrPQotVENJVEVNX3BzelRleHQ9Y2FzdD0oTFBUU1RSKQotVENJVEVNX2NjaFRleHRNYXg9Ci1UQ0lURU1faUltYWdlPQotVENJVEVNX2xQYXJhbT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUM9Ci1URVhUTUVUUklDX3RtSGVpZ2h0PQotVEVYVE1FVFJJQ190bUFzY2VudD0KLVRFWFRNRVRSSUNfdG1EZXNjZW50PQotVEVYVE1FVFJJQ190bUludGVybmFsTGVhZGluZz0KLVRFWFRNRVRSSUNfdG1FeHRlcm5hbExlYWRpbmc9Ci1URVhUTUVUUklDX3RtQXZlQ2hhcldpZHRoPQotVEVYVE1FVFJJQ190bU1heENoYXJXaWR0aD0KLVRFWFRNRVRSSUNfdG1XZWlnaHQ9Ci1URVhUTUVUUklDX3RtT3Zlcmhhbmc9Ci1URVhUTUVUUklDX3RtRGlnaXRpemVkQXNwZWN0WD0KLVRFWFRNRVRSSUNfdG1EaWdpdGl6ZWRBc3BlY3RZPQotVEVYVE1FVFJJQ190bUl0YWxpYz0KLVRFWFRNRVRSSUNfdG1VbmRlcmxpbmVkPQotVEVYVE1FVFJJQ190bVN0cnVja091dD0KLVRFWFRNRVRSSUNfdG1QaXRjaEFuZEZhbWlseT0KLVRFWFRNRVRSSUNfdG1DaGFyU2V0PQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQ0E9Ci1URVhUTUVUUklDQV90bUZpcnN0Q2hhcj0KLVRFWFRNRVRSSUNBX3RtTGFzdENoYXI9Ci1URVhUTUVUUklDQV90bURlZmF1bHRDaGFyPQotVEVYVE1FVFJJQ0FfdG1CcmVha0NoYXI9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDVz0KLVRFWFRNRVRSSUNXX3RtRmlyc3RDaGFyPQotVEVYVE1FVFJJQ1dfdG1MYXN0Q2hhcj0KLVRFWFRNRVRSSUNXX3RtRGVmYXVsdENoYXI9Ci1URVhUTUVUUklDV190bUJyZWFrQ2hhcj0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RPT0xJTkZPPQotVE9PTElORk9fY2JTaXplPQotVE9PTElORk9fdUZsYWdzPQotVE9PTElORk9faHduZD1jYXN0PShIV05EKQotVE9PTElORk9fdUlkPQotVE9PTElORk9fbGVmdD1hY2Nlc3Nvcj1yZWN0LmxlZnQKLVRPT0xJTkZPX3RvcD1hY2Nlc3Nvcj1yZWN0LnRvcAotVE9PTElORk9fcmlnaHQ9YWNjZXNzb3I9cmVjdC5yaWdodAotVE9PTElORk9fYm90dG9tPWFjY2Vzc29yPXJlY3QuYm90dG9tCi1UT09MSU5GT19oaW5zdD1jYXN0PShISU5TVEFOQ0UpCi1UT09MSU5GT19scHN6VGV4dD1jYXN0PShMUFRTVFIpCi1UT09MSU5GT19sUGFyYW09Ci1UT09MSU5GT19scFJlc2VydmVkPWNhc3Q9KHZvaWQgKikKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSQUNLTU9VU0VFVkVOVD0KLVRSQUNLTU9VU0VFVkVOVF9jYlNpemU9Ci1UUkFDS01PVVNFRVZFTlRfZHdGbGFncz0KLVRSQUNLTU9VU0VFVkVOVF9od25kVHJhY2s9Y2FzdD0oSFdORCkKLVRSQUNLTU9VU0VFVkVOVF9kd0hvdmVyVGltZT0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RSSVZFUlRFWD0KLVRSSVZFUlRFWF94PQotVFJJVkVSVEVYX3k9Ci1UUklWRVJURVhfUmVkPQotVFJJVkVSVEVYX0dyZWVuPQotVFJJVkVSVEVYX0JsdWU9Ci1UUklWRVJURVhfQWxwaGE9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVkhJVFRFU1RJTkZPPQotVFZISVRURVNUSU5GT194PWFjY2Vzc29yPXB0LngKLVRWSElUVEVTVElORk9feT1hY2Nlc3Nvcj1wdC55Ci1UVkhJVFRFU1RJTkZPX2ZsYWdzPQotVFZISVRURVNUSU5GT19oSXRlbT1jYXN0PShIVFJFRUlURU0pCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklOU0VSVFNUUlVDVD0KLVRWSU5TRVJUU1RSVUNUX2hQYXJlbnQ9Y2FzdD0oSFRSRUVJVEVNKQotVFZJTlNFUlRTVFJVQ1RfaEluc2VydEFmdGVyPWNhc3Q9KEhUUkVFSVRFTSkKLVRWSU5TRVJUU1RSVUNUX21hc2s9YWNjZXNzb3I9aXRlbS5tYXNrCi1UVklOU0VSVFNUUlVDVF9oSXRlbT1hY2Nlc3Nvcj1pdGVtLmhJdGVtLGNhc3Q9KEhUUkVFSVRFTSkKLVRWSU5TRVJUU1RSVUNUX3N0YXRlPWFjY2Vzc29yPWl0ZW0uc3RhdGUKLVRWSU5TRVJUU1RSVUNUX3N0YXRlTWFzaz1hY2Nlc3Nvcj1pdGVtLnN0YXRlTWFzawotVFZJTlNFUlRTVFJVQ1RfcHN6VGV4dD1hY2Nlc3Nvcj1pdGVtLnBzelRleHQsY2FzdD0oTFBUU1RSKQotVFZJTlNFUlRTVFJVQ1RfY2NoVGV4dE1heD1hY2Nlc3Nvcj1pdGVtLmNjaFRleHRNYXgKLVRWSU5TRVJUU1RSVUNUX2lJbWFnZT1hY2Nlc3Nvcj1pdGVtLmlJbWFnZQotVFZJTlNFUlRTVFJVQ1RfaVNlbGVjdGVkSW1hZ2U9YWNjZXNzb3I9aXRlbS5pU2VsZWN0ZWRJbWFnZQotVFZJTlNFUlRTVFJVQ1RfY0NoaWxkcmVuPWFjY2Vzc29yPWl0ZW0uY0NoaWxkcmVuCi1UVklOU0VSVFNUUlVDVF9sUGFyYW09YWNjZXNzb3I9aXRlbS5sUGFyYW0KLVRWSU5TRVJUU1RSVUNUX2lJbnRlZ3JhbD1hY2Nlc3Nvcj1pdGVtZXguaUludGVncmFsLGZsYWdzPW5vX3dpbmNlCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU09Ci1UVklURU1fbWFzaz0KLVRWSVRFTV9oSXRlbT1jYXN0PShIVFJFRUlURU0pCi1UVklURU1fc3RhdGU9Ci1UVklURU1fc3RhdGVNYXNrPQotVFZJVEVNX3BzelRleHQ9Y2FzdD0oTFBUU1RSKQotVFZJVEVNX2NjaFRleHRNYXg9Ci1UVklURU1faUltYWdlPQotVFZJVEVNX2lTZWxlY3RlZEltYWdlPQotVFZJVEVNX2NDaGlsZHJlbj0KLVRWSVRFTV9sUGFyYW09Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9UVklURU1FWD0KLVRWSVRFTUVYX2lJbnRlZ3JhbD0KLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1VEQUNDRUw9Ci1VREFDQ0VMX25TZWM9Ci1VREFDQ0VMX25JbmM9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XSU5ET1dQTEFDRU1FTlQ9Ci1XSU5ET1dQTEFDRU1FTlRfbGVuZ3RoPQotV0lORE9XUExBQ0VNRU5UX2ZsYWdzPQotV0lORE9XUExBQ0VNRU5UX3Nob3dDbWQ9Ci1XSU5ET1dQTEFDRU1FTlRfcHRNaW5Qb3NpdGlvbl94PWFjY2Vzc29yPXB0TWluUG9zaXRpb24ueAotV0lORE9XUExBQ0VNRU5UX3B0TWluUG9zaXRpb25feT1hY2Nlc3Nvcj1wdE1pblBvc2l0aW9uLnkKLVdJTkRPV1BMQUNFTUVOVF9wdE1heFBvc2l0aW9uX3g9YWNjZXNzb3I9cHRNYXhQb3NpdGlvbi54Ci1XSU5ET1dQTEFDRU1FTlRfcHRNYXhQb3NpdGlvbl95PWFjY2Vzc29yPXB0TWF4UG9zaXRpb24ueQotV0lORE9XUExBQ0VNRU5UX2xlZnQ9YWNjZXNzb3I9cmNOb3JtYWxQb3NpdGlvbi5sZWZ0Ci1XSU5ET1dQTEFDRU1FTlRfdG9wPWFjY2Vzc29yPXJjTm9ybWFsUG9zaXRpb24udG9wCi1XSU5ET1dQTEFDRU1FTlRfcmlnaHQ9YWNjZXNzb3I9cmNOb3JtYWxQb3NpdGlvbi5yaWdodAotV0lORE9XUExBQ0VNRU5UX2JvdHRvbT1hY2Nlc3Nvcj1yY05vcm1hbFBvc2l0aW9uLmJvdHRvbQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfV0lORE9XUE9TPQotV0lORE9XUE9TX2h3bmQ9Y2FzdD0oSFdORCkKLVdJTkRPV1BPU19od25kSW5zZXJ0QWZ0ZXI9Y2FzdD0oSFdORCkKLVdJTkRPV1BPU194PQotV0lORE9XUE9TX3k9Ci1XSU5ET1dQT1NfY3g9Ci1XSU5ET1dQT1NfY3k9Ci1XSU5ET1dQT1NfZmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9XTkRDTEFTUz0KLVdORENMQVNTX3N0eWxlPQotV05EQ0xBU1NfbHBmblduZFByb2M9Y2FzdD0oV05EUFJPQykKLVdORENMQVNTX2NiQ2xzRXh0cmE9Ci1XTkRDTEFTU19jYlduZEV4dHJhPQotV05EQ0xBU1NfaEluc3RhbmNlPWNhc3Q9KEhJTlNUQU5DRSkKLVdORENMQVNTX2hJY29uPWNhc3Q9KEhJQ09OKQotV05EQ0xBU1NfaEN1cnNvcj1jYXN0PShIQ1VSU09SKQotV05EQ0xBU1NfaGJyQmFja2dyb3VuZD1jYXN0PShIQlJVU0gpCi1XTkRDTEFTU19scHN6TWVudU5hbWU9Y2FzdD0oTFBDVFNUUikKLVdORENMQVNTX2xwc3pDbGFzc05hbWU9Y2FzdD0oTFBDVFNUUikKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvSk5JIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL29yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53cGYuQ09NLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndwZi5DT00ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkMjhkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndwZi5DT00ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dwZl9DT009Ci1DT01fT2xlSW5pdGlhbGl6ZT0KLUNPTV9PbGVJbml0aWFsaXplXzA9Y2FzdD1MUFZPSUQKLQotQ09NX09sZVVuaW5pdGlhbGl6ZT0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd3BmX0lDT05JTkZPPWZsYWdzPW5vX2dlbgotSUNPTklORk9fZkljb249Ci1JQ09OSU5GT194SG90c3BvdD0KLUlDT05JTkZPX3lIb3RzcG90PQotSUNPTklORk9faGJtTWFzaz0KLUlDT05JTkZPX2hibUNvbG9yPQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd3BmX09TPWZsYWdzPW5vX2dlbgotT1NfQWNjZXNzVGV4dF9BY2Nlc3NLZXk9Ci1PU19BY2Nlc3NUZXh0X0FjY2Vzc0tleV8wPQotCi1PU19BY2Nlc3NUZXh0X1RleHQ9Ci1PU19BY2Nlc3NUZXh0X1RleHRfMD0KLU9TX0FjY2Vzc1RleHRfVGV4dF8xPQotCi1PU19BcHBsaWNhdGlvbkNvbW1hbmRzX0N1dD0KLQotT1NfQXBwbGljYXRpb25Db21tYW5kc19QYXN0ZT0KLQotT1NfQXBwbGljYXRpb25Db21tYW5kc19SZWRvPQotCi1PU19BcHBsaWNhdGlvbkNvbW1hbmRzX1VuZG89Ci0KLU9TX0FwcGxpY2F0aW9uX0Rpc3BhdGNoZXI9Ci1PU19BcHBsaWNhdGlvbl9EaXNwYXRjaGVyXzA9Ci0KLU9TX0FwcGxpY2F0aW9uX1J1bj0KLU9TX0FwcGxpY2F0aW9uX1J1bl8wPQotCi1PU19BcHBsaWNhdGlvbl9TaHV0ZG93bj0KLU9TX0FwcGxpY2F0aW9uX1NodXRkb3duXzA9Ci0KLU9TX0FwcGxpY2F0aW9uX1NodXRkb3duTW9kZT0KLU9TX0FwcGxpY2F0aW9uX1NodXRkb3duTW9kZV8wPQotT1NfQXBwbGljYXRpb25fU2h1dGRvd25Nb2RlXzE9Ci0KLU9TX0FwcGxpY2F0aW9uX1dpbmRvd3M9Ci1PU19BcHBsaWNhdGlvbl9XaW5kb3dzXzA9Ci0KLU9TX0JpbmRpbmdFeHByZXNzaW9uX1VwZGF0ZVRhcmdldD0KLU9TX0JpbmRpbmdFeHByZXNzaW9uX1VwZGF0ZVRhcmdldF8wPQotCi1PU19CaW5kaW5nX0NvbnZlcnRlcj0KLU9TX0JpbmRpbmdfQ29udmVydGVyXzA9Ci1PU19CaW5kaW5nX0NvbnZlcnRlcl8xPQotCi1PU19CaW5kaW5nX0NvbnZlcnRlclBhcmFtZXRlcj0KLU9TX0JpbmRpbmdfQ29udmVydGVyUGFyYW1ldGVyXzA9Ci1PU19CaW5kaW5nX0NvbnZlcnRlclBhcmFtZXRlcl8xPQotCi1PU19CaXRtYXBJbWFnZV9CZWdpbkluaXQ9Ci1PU19CaXRtYXBJbWFnZV9CZWdpbkluaXRfMD0KLQotT1NfQml0bWFwSW1hZ2VfQ3JlYXRlT3B0aW9ucz0KLU9TX0JpdG1hcEltYWdlX0NyZWF0ZU9wdGlvbnNfMD0KLU9TX0JpdG1hcEltYWdlX0NyZWF0ZU9wdGlvbnNfMT0KLQotT1NfQml0bWFwSW1hZ2VfRW5kSW5pdD0KLU9TX0JpdG1hcEltYWdlX0VuZEluaXRfMD0KLQotT1NfQml0bWFwSW1hZ2VfVXJpU291cmNlPQotT1NfQml0bWFwSW1hZ2VfVXJpU291cmNlXzA9Ci1PU19CaXRtYXBJbWFnZV9VcmlTb3VyY2VfMT0KLQotT1NfQml0bWFwUGFsZXR0ZV9Db2xvcnM9Ci1PU19CaXRtYXBQYWxldHRlX0NvbG9yc18wPQotCi1PU19CaXRtYXBTb3VyY2VfQ2xvbmU9Ci1PU19CaXRtYXBTb3VyY2VfQ2xvbmVfMD0KLQotT1NfQml0bWFwU291cmNlX0NvcHlQaXhlbHM9Ci1PU19CaXRtYXBTb3VyY2VfQ29weVBpeGVsc18wPQotT1NfQml0bWFwU291cmNlX0NvcHlQaXhlbHNfMT0KLU9TX0JpdG1hcFNvdXJjZV9Db3B5UGl4ZWxzXzI9Ci1PU19CaXRtYXBTb3VyY2VfQ29weVBpeGVsc18zPQotT1NfQml0bWFwU291cmNlX0NvcHlQaXhlbHNfND0KLQotT1NfQml0bWFwU291cmNlX0NyZWF0ZT0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfMD0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfMT0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfMj0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfMz0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfND0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfNT0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfNj0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfNz0KLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfOD0KLQotT1NfQml0bWFwU291cmNlX0Zvcm1hdD0KLU9TX0JpdG1hcFNvdXJjZV9Gb3JtYXRfMD0KLQotT1NfQml0bWFwU291cmNlX1BhbGV0dGU9Ci1PU19CaXRtYXBTb3VyY2VfUGFsZXR0ZV8wPQotCi1PU19CaXRtYXBTb3VyY2VfUGl4ZWxIZWlnaHQ9Ci1PU19CaXRtYXBTb3VyY2VfUGl4ZWxIZWlnaHRfMD0KLQotT1NfQml0bWFwU291cmNlX1BpeGVsV2lkdGg9Ci1PU19CaXRtYXBTb3VyY2VfUGl4ZWxXaWR0aF8wPQotCi1PU19CaXRtYXBfR2V0SGljb249Ci1PU19CaXRtYXBfR2V0SGljb25fMD0KLQotT1NfQm9yZGVyX3R5cGVpZD0KLQotT1NfQnJ1c2hfT3BhY2l0eT0KLU9TX0JydXNoX09wYWNpdHlfMD0KLU9TX0JydXNoX09wYWNpdHlfMT0KLQotT1NfQnJ1c2hlc19CbGFjaz0KLQotT1NfQnJ1c2hlc19MaWdodFNreUJsdWU9Ci0KLU9TX0JydXNoZXNfTmF2eT0KLQotT1NfQnJ1c2hlc19UcmFuc3BhcmVudD0KLQotT1NfQnJ1c2hlc19XaGl0ZT0KLQotT1NfQnV0dG9uQmFzZV9DbGljaz0KLU9TX0J1dHRvbkJhc2VfQ2xpY2tfMD0KLU9TX0J1dHRvbkJhc2VfQ2xpY2tfMT0KLQotT1NfQnV0dG9uXzFJc0RlZmF1bHRfX0k9Ci1PU19CdXR0b25fMUlzRGVmYXVsdF9fSV8wPQotCi1PU19CdXR0b25fMUlzRGVmYXVsdF9fSVo9Ci1PU19CdXR0b25fMUlzRGVmYXVsdF9fSVpfMD0KLU9TX0J1dHRvbl8xSXNEZWZhdWx0X19JWl8xPQotCi1PU19DYW5jZWxFdmVudEFyZ3NfQ2FuY2VsPQotT1NfQ2FuY2VsRXZlbnRBcmdzX0NhbmNlbF8wPQotT1NfQ2FuY2VsRXZlbnRBcmdzX0NhbmNlbF8xPQotCi1PU19DYW52YXNfR2V0TGVmdD0KLU9TX0NhbnZhc19HZXRMZWZ0XzA9Ci0KLU9TX0NhbnZhc19HZXRUb3A9Ci1PU19DYW52YXNfR2V0VG9wXzA9Ci0KLU9TX0NhbnZhc19TZXRMZWZ0PQotT1NfQ2FudmFzX1NldExlZnRfMD0KLU9TX0NhbnZhc19TZXRMZWZ0XzE9Ci0KLU9TX0NhbnZhc19TZXRUb3A9Ci1PU19DYW52YXNfU2V0VG9wXzA9Ci1PU19DYW52YXNfU2V0VG9wXzE9Ci0KLU9TX0NoYXJhY3RlckhpdF9GaXJzdENoYXJhY3RlckluZGV4PQotT1NfQ2hhcmFjdGVySGl0X0ZpcnN0Q2hhcmFjdGVySW5kZXhfMD0KLQotT1NfQ2hhcmFjdGVySGl0X1RyYWlsaW5nTGVuZ3RoPQotT1NfQ2hhcmFjdGVySGl0X1RyYWlsaW5nTGVuZ3RoXzA9Ci0KLU9TX0NoZWNrQm94X3R5cGVpZD0KLQotT1NfQ2xpcGJvYXJkX0dldFRleHQ9Ci0KLU9TX0NvbG9yRGlhbG9nX0FueUNvbG9yPQotT1NfQ29sb3JEaWFsb2dfQW55Q29sb3JfMD0KLU9TX0NvbG9yRGlhbG9nX0FueUNvbG9yXzE9Ci0KLU9TX0NvbG9yRGlhbG9nXzFDb2xvcl9fST0KLU9TX0NvbG9yRGlhbG9nXzFDb2xvcl9fSV8wPQotCi1PU19Db2xvckRpYWxvZ18xQ29sb3JfX0lJPQotT1NfQ29sb3JEaWFsb2dfMUNvbG9yX19JSV8wPQotT1NfQ29sb3JEaWFsb2dfMUNvbG9yX19JSV8xPQotCi1PU19Db2xvckRpYWxvZ18xQ3VzdG9tQ29sb3JzX19JPQotT1NfQ29sb3JEaWFsb2dfMUN1c3RvbUNvbG9yc19fSV8wPQotCi1PU19Db2xvckRpYWxvZ18xQ3VzdG9tQ29sb3JzX19JST0KLU9TX0NvbG9yRGlhbG9nXzFDdXN0b21Db2xvcnNfX0lJXzA9Ci1PU19Db2xvckRpYWxvZ18xQ3VzdG9tQ29sb3JzX19JSV8xPQotCi1PU19Db2xvckxpc3RfQWRkPQotT1NfQ29sb3JMaXN0X0FkZF8wPQotT1NfQ29sb3JMaXN0X0FkZF8xPQotCi1PU19Db2xvckxpc3RfQ291bnQ9Ci1PU19Db2xvckxpc3RfQ291bnRfMD0KLQotT1NfQ29sb3JMaXN0X0N1cnJlbnQ9Ci1PU19Db2xvckxpc3RfQ3VycmVudF8wPQotCi1PU19Db2xvckxpc3RfR2V0RW51bWVyYXRvcj0KLU9TX0NvbG9yTGlzdF9HZXRFbnVtZXJhdG9yXzA9Ci0KLU9TX0NvbG9yX0E9Ci1PU19Db2xvcl9BXzA9Ci0KLU9TX0NvbG9yX0I9Ci1PU19Db2xvcl9CXzA9Ci0KLU9TX0NvbG9yX0Zyb21BcmdiPQotT1NfQ29sb3JfRnJvbUFyZ2JfMD0KLU9TX0NvbG9yX0Zyb21BcmdiXzE9Ci1PU19Db2xvcl9Gcm9tQXJnYl8yPQotT1NfQ29sb3JfRnJvbUFyZ2JfMz0KLQotT1NfQ29sb3JfRz0KLU9TX0NvbG9yX0dfMD0KLQotT1NfQ29sb3JfUj0KLU9TX0NvbG9yX1JfMD0KLQotT1NfQ29sb3JzX0JsYWNrPQotCi1PU19Db2xvcnNfQmx1ZT0KLQotT1NfQ29sb3JzX0N5YW49Ci0KLU9TX0NvbG9yc19EYXJrR3JheT0KLQotT1NfQ29sb3JzX0dyZWVuPQotCi1PU19Db2xvcnNfTGlnaHRTa3lCbHVlPQotCi1PU19Db2xvcnNfTGltZT0KLQotT1NfQ29sb3JzX01hZ2VudGE9Ci0KLU9TX0NvbG9yc19NYXJvb249Ci0KLU9TX0NvbG9yc19OYXZ5PQotCi1PU19Db2xvcnNfT2xpdmU9Ci0KLU9TX0NvbG9yc19QdXJwbGU9Ci0KLU9TX0NvbG9yc19SZWQ9Ci0KLU9TX0NvbG9yc19TaWx2ZXI9Ci0KLU9TX0NvbG9yc19UZWFsPQotCi1PU19Db2xvcnNfVHJhbnNwYXJlbnQ9Ci0KLU9TX0NvbG9yc19XaGl0ZT0KLQotT1NfQ29sb3JzX1llbGxvdz0KLQotT1NfQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkPQotT1NfQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkXzA9Ci1PU19Db2x1bW5EZWZpbml0aW9uQ29sbGVjdGlvbl9BZGRfMT0KLQotT1NfQ29sdW1uRGVmaW5pdGlvbl9XaWR0aD0KLU9TX0NvbHVtbkRlZmluaXRpb25fV2lkdGhfMD0KLU9TX0NvbHVtbkRlZmluaXRpb25fV2lkdGhfMT0KLQotT1NfQ29tYm9Cb3hfMUlzRHJvcERvd25PcGVuX19JPQotT1NfQ29tYm9Cb3hfMUlzRHJvcERvd25PcGVuX19JXzA9Ci0KLU9TX0NvbWJvQm94XzFJc0Ryb3BEb3duT3Blbl9fSVo9Ci1PU19Db21ib0JveF8xSXNEcm9wRG93bk9wZW5fX0laXzA9Ci1PU19Db21ib0JveF8xSXNEcm9wRG93bk9wZW5fX0laXzE9Ci0KLU9TX0NvbWJvQm94X0lzRWRpdGFibGU9Ci1PU19Db21ib0JveF9Jc0VkaXRhYmxlXzA9Ci1PU19Db21ib0JveF9Jc0VkaXRhYmxlXzE9Ci0KLU9TX0NvbWJvQm94X1NlbGVjdGlvbkJveEl0ZW09Ci1PU19Db21ib0JveF9TZWxlY3Rpb25Cb3hJdGVtXzA9Ci0KLU9TX0NvbW1hbmRNYW5hZ2VyX0FkZFByZXZpZXdFeGVjdXRlZEhhbmRsZXI9Ci1PU19Db21tYW5kTWFuYWdlcl9BZGRQcmV2aWV3RXhlY3V0ZWRIYW5kbGVyXzA9Ci1PU19Db21tYW5kTWFuYWdlcl9BZGRQcmV2aWV3RXhlY3V0ZWRIYW5kbGVyXzE9Ci0KLU9TX0NvbW1vbkRpYWxvZ19TaG93RGlhbG9nPQotT1NfQ29tbW9uRGlhbG9nX1Nob3dEaWFsb2dfMD0KLU9TX0NvbW1vbkRpYWxvZ19TaG93RGlhbG9nXzE9Ci0KLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fSW5kZXhPZj0KLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fSW5kZXhPZl8wPQotT1NfQ29tcG9zaXRlQ29sbGVjdGlvbl9JbmRleE9mXzE9Ci0KLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fSW5zZXJ0PQotT1NfQ29tcG9zaXRlQ29sbGVjdGlvbl9JbnNlcnRfMD0KLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fSW5zZXJ0XzE9Ci1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luc2VydF8yPQotCi1PU19Db21wb3NpdGVDb2xsZWN0aW9uX1JlbW92ZT0KLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fUmVtb3ZlXzA9Ci1PU19Db21wb3NpdGVDb2xsZWN0aW9uX1JlbW92ZV8xPQotCi1PU19Db25zb2xlX0JlZXA9Ci0KLU9TX0NvbnRhaW5lclZpc3VhbF8xQ2xpcF9fST0KLU9TX0NvbnRhaW5lclZpc3VhbF8xQ2xpcF9fSV8wPQotCi1PU19Db250YWluZXJWaXN1YWxfMUNsaXBfX0lJPQotT1NfQ29udGFpbmVyVmlzdWFsXzFDbGlwX19JSV8wPQotT1NfQ29udGFpbmVyVmlzdWFsXzFDbGlwX19JSV8xPQotCi1PU19Db250ZW50Q29udHJvbF8xQ29udGVudF9fST0KLU9TX0NvbnRlbnRDb250cm9sXzFDb250ZW50X19JXzA9Ci0KLU9TX0NvbnRlbnRDb250cm9sXzFDb250ZW50X19JST0KLU9TX0NvbnRlbnRDb250cm9sXzFDb250ZW50X19JSV8wPQotT1NfQ29udGVudENvbnRyb2xfMUNvbnRlbnRfX0lJXzE9Ci0KLU9TX0NvbnRlbnRQcmVzZW50ZXJfQ29udGVudD0KLU9TX0NvbnRlbnRQcmVzZW50ZXJfQ29udGVudF8wPQotCi1PU19Db250ZW50UHJlc2VudGVyX3R5cGVpZD0KLQotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yTGVmdD0KLU9TX0NvbnRleHRNZW51RXZlbnRBcmdzX0N1cnNvckxlZnRfMD0KLQotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yVG9wPQotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yVG9wXzA9Ci0KLU9TX0NvbnRleHRNZW51X0Nsb3NlZD0KLU9TX0NvbnRleHRNZW51X0Nsb3NlZF8wPQotT1NfQ29udGV4dE1lbnVfQ2xvc2VkXzE9Ci0KLU9TX0NvbnRleHRNZW51X0hvcml6b250YWxPZmZzZXQ9Ci1PU19Db250ZXh0TWVudV9Ib3Jpem9udGFsT2Zmc2V0XzA9Ci1PU19Db250ZXh0TWVudV9Ib3Jpem9udGFsT2Zmc2V0XzE9Ci0KLU9TX0NvbnRleHRNZW51X0lzT3Blbj0KLU9TX0NvbnRleHRNZW51X0lzT3Blbl8wPQotT1NfQ29udGV4dE1lbnVfSXNPcGVuXzE9Ci0KLU9TX0NvbnRleHRNZW51X09wZW5lZD0KLU9TX0NvbnRleHRNZW51X09wZW5lZF8wPQotT1NfQ29udGV4dE1lbnVfT3BlbmVkXzE9Ci0KLU9TX0NvbnRleHRNZW51X1BsYWNlbWVudD0KLU9TX0NvbnRleHRNZW51X1BsYWNlbWVudF8wPQotT1NfQ29udGV4dE1lbnVfUGxhY2VtZW50XzE9Ci0KLU9TX0NvbnRleHRNZW51X1ZlcnRpY2FsT2Zmc2V0PQotT1NfQ29udGV4dE1lbnVfVmVydGljYWxPZmZzZXRfMD0KLU9TX0NvbnRleHRNZW51X1ZlcnRpY2FsT2Zmc2V0XzE9Ci0KLU9TX0NvbnRyb2xfQmFja2dyb3VuZD0KLU9TX0NvbnRyb2xfQmFja2dyb3VuZF8wPQotT1NfQ29udHJvbF9CYWNrZ3JvdW5kXzE9Ci0KLU9TX0NvbnRyb2xfQmFja2dyb3VuZFByb3BlcnR5PQotCi1PU19Db250cm9sX0ZvbnRGYW1pbHk9Ci1PU19Db250cm9sX0ZvbnRGYW1pbHlfMD0KLU9TX0NvbnRyb2xfRm9udEZhbWlseV8xPQotCi1PU19Db250cm9sX0ZvbnRGYW1pbHlQcm9wZXJ0eT0KLQotT1NfQ29udHJvbF9Gb250U2l6ZT0KLU9TX0NvbnRyb2xfRm9udFNpemVfMD0KLU9TX0NvbnRyb2xfRm9udFNpemVfMT0KLQotT1NfQ29udHJvbF9Gb250U2l6ZVByb3BlcnR5PQotCi1PU19Db250cm9sX0ZvbnRTdHJldGNoPQotT1NfQ29udHJvbF9Gb250U3RyZXRjaF8wPQotT1NfQ29udHJvbF9Gb250U3RyZXRjaF8xPQotCi1PU19Db250cm9sX0ZvbnRTdHJldGNoUHJvcGVydHk9Ci0KLU9TX0NvbnRyb2xfRm9udFN0eWxlPQotT1NfQ29udHJvbF9Gb250U3R5bGVfMD0KLU9TX0NvbnRyb2xfRm9udFN0eWxlXzE9Ci0KLU9TX0NvbnRyb2xfRm9udFN0eWxlUHJvcGVydHk9Ci0KLU9TX0NvbnRyb2xfRm9udFdlaWdodD0KLU9TX0NvbnRyb2xfRm9udFdlaWdodF8wPQotT1NfQ29udHJvbF9Gb250V2VpZ2h0XzE9Ci0KLU9TX0NvbnRyb2xfRm9udFdlaWdodFByb3BlcnR5PQotCi1PU19Db250cm9sX0ZvcmVncm91bmQ9Ci1PU19Db250cm9sX0ZvcmVncm91bmRfMD0KLU9TX0NvbnRyb2xfRm9yZWdyb3VuZF8xPQotCi1PU19Db250cm9sX0ZvcmVncm91bmRQcm9wZXJ0eT0KLQotT1NfQ29udHJvbF8xSG9yaXpvbnRhbENvbnRlbnRBbGlnbm1lbnRfX0k9Ci1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSV8wPQotCi1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSUk9Ci1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSUlfMD0KLU9TX0NvbnRyb2xfMUhvcml6b250YWxDb250ZW50QWxpZ25tZW50X19JSV8xPQotCi1PU19Db250cm9sX01vdXNlRG91YmxlQ2xpY2s9Ci1PU19Db250cm9sX01vdXNlRG91YmxlQ2xpY2tfMD0KLU9TX0NvbnRyb2xfTW91c2VEb3VibGVDbGlja18xPQotCi1PU19Db250cm9sXzFUZW1wbGF0ZV9fST0KLU9TX0NvbnRyb2xfMVRlbXBsYXRlX19JXzA9Ci0KLU9TX0NvbnRyb2xfMVRlbXBsYXRlX19JST0KLU9TX0NvbnRyb2xfMVRlbXBsYXRlX19JSV8wPQotT1NfQ29udHJvbF8xVGVtcGxhdGVfX0lJXzE9Ci0KLU9TX0NyZWF0ZUN1cnNvcj0KLU9TX0NyZWF0ZUN1cnNvcl8wPQotT1NfQ3JlYXRlQ3Vyc29yXzE9Ci1PU19DcmVhdGVDdXJzb3JfMj0KLU9TX0NyZWF0ZUN1cnNvcl8zPQotT1NfQ3JlYXRlQ3Vyc29yXzQ9Ci1PU19DcmVhdGVDdXJzb3JfNT0KLU9TX0NyZWF0ZUN1cnNvcl82PQotCi1PU19DcmVhdGVJY29uSW5kaXJlY3Q9Ci1PU19DcmVhdGVJY29uSW5kaXJlY3RfMD0KLQotT1NfQ3VsdHVyZUluZm9fQ3VycmVudFVJQ3VsdHVyZT0KLQotT1NfQ3Vyc29ySW50ZXJvcEhlbHBlcl9DcmVhdGU9Ci1PU19DdXJzb3JJbnRlcm9wSGVscGVyX0NyZWF0ZV8wPQotCi1PU19DdXJzb3JzX0FwcFN0YXJ0aW5nPQotCi1PU19DdXJzb3JzX0Fycm93PQotCi1PU19DdXJzb3JzX0Nyb3NzPQotCi1PU19DdXJzb3JzX0hhbmQ9Ci0KLU9TX0N1cnNvcnNfSGVscD0KLQotT1NfQ3Vyc29yc19JQmVhbT0KLQotT1NfQ3Vyc29yc19Obz0KLQotT1NfQ3Vyc29yc19TY3JvbGxFPQotCi1PU19DdXJzb3JzX1Njcm9sbE49Ci0KLU9TX0N1cnNvcnNfU2Nyb2xsTkU9Ci0KLU9TX0N1cnNvcnNfU2Nyb2xsTlc9Ci0KLU9TX0N1cnNvcnNfU2Nyb2xsUz0KLQotT1NfQ3Vyc29yc19TY3JvbGxTRT0KLQotT1NfQ3Vyc29yc19TY3JvbGxTVz0KLQotT1NfQ3Vyc29yc19TY3JvbGxXPQotCi1PU19DdXJzb3JzX1NpemVBbGw9Ci0KLU9TX0N1cnNvcnNfU2l6ZU5FU1c9Ci0KLU9TX0N1cnNvcnNfU2l6ZU5TPQotCi1PU19DdXJzb3JzX1NpemVOV1NFPQotCi1PU19DdXJzb3JzX1NpemVXRT0KLQotT1NfQ3Vyc29yc19VcEFycm93PQotCi1PU19DdXJzb3JzX1dhaXQ9Ci0KLU9TX0Rhc2hTdHlsZXNfRGFzaD0KLQotT1NfRGFzaFN0eWxlc19EYXNoRG90PQotCi1PU19EYXNoU3R5bGVzX0Rhc2hEb3REb3Q9Ci0KLU9TX0Rhc2hTdHlsZXNfRG90PQotCi1PU19EYXNoU3R5bGVzX1NvbGlkPQotCi1PU19EZWxldGVHbG9iYWxSZWY9Ci1PU19EZWxldGVHbG9iYWxSZWZfMD0KLQotT1NfRGVsZXRlT2JqZWN0PQotT1NfRGVsZXRlT2JqZWN0XzA9Ci0KLU9TX0RlcGVuZGVuY3lPYmplY3RfQ2xlYXJWYWx1ZT0KLU9TX0RlcGVuZGVuY3lPYmplY3RfQ2xlYXJWYWx1ZV8wPQotT1NfRGVwZW5kZW5jeU9iamVjdF9DbGVhclZhbHVlXzE9Ci0KLU9TX0RlcGVuZGVuY3lPYmplY3RfU2V0VmFsdWU9Ci1PU19EZXBlbmRlbmN5T2JqZWN0X1NldFZhbHVlXzA9Ci1PU19EZXBlbmRlbmN5T2JqZWN0X1NldFZhbHVlXzE9Ci1PU19EZXBlbmRlbmN5T2JqZWN0X1NldFZhbHVlXzI9Ci0KLU9TX0Rlc3Ryb3lJY29uPQotT1NfRGVzdHJveUljb25fMD0KLQotT1NfRGlzcGF0Y2hlckZyYW1lX0NvbnRpbnVlPQotT1NfRGlzcGF0Y2hlckZyYW1lX0NvbnRpbnVlXzA9Ci1PU19EaXNwYXRjaGVyRnJhbWVfQ29udGludWVfMT0KLQotT1NfRGlzcGF0Y2hlckhvb2tFdmVudEFyZ3NfT3BlcmF0aW9uPQotT1NfRGlzcGF0Y2hlckhvb2tFdmVudEFyZ3NfT3BlcmF0aW9uXzA9Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19EaXNwYXRjaGVySW5hY3RpdmU9Ci1PU19EaXNwYXRjaGVySG9va3NfRGlzcGF0Y2hlckluYWN0aXZlXzA9Ci1PU19EaXNwYXRjaGVySG9va3NfRGlzcGF0Y2hlckluYWN0aXZlXzE9Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19PcGVyYXRpb25BYm9ydGVkPQotT1NfRGlzcGF0Y2hlckhvb2tzX09wZXJhdGlvbkFib3J0ZWRfMD0KLU9TX0Rpc3BhdGNoZXJIb29rc19PcGVyYXRpb25BYm9ydGVkXzE9Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19PcGVyYXRpb25Db21wbGV0ZWQ9Ci1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQ29tcGxldGVkXzA9Ci1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQ29tcGxldGVkXzE9Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19PcGVyYXRpb25Qb3N0ZWQ9Ci1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uUG9zdGVkXzA9Ci1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uUG9zdGVkXzE9Ci0KLU9TX0Rpc3BhdGNoZXJPcGVyYXRpb25fUHJpb3JpdHk9Ci1PU19EaXNwYXRjaGVyT3BlcmF0aW9uX1ByaW9yaXR5XzA9Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9JbnRlcnZhbD0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9JbnRlcnZhbF8wPQotT1NfRGlzcGF0Y2hlclRpbWVyX0ludGVydmFsXzE9Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdGFydD0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdGFydF8wPQotCi1PU19EaXNwYXRjaGVyVGltZXJfU3RvcD0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdG9wXzA9Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl8xVGFnX19JPQotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lfMD0KLQotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lJPQotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lJXzA9Ci1PU19EaXNwYXRjaGVyVGltZXJfMVRhZ19fSUlfMT0KLQotT1NfRGlzcGF0Y2hlclRpbWVyX1RpY2s9Ci1PU19EaXNwYXRjaGVyVGltZXJfVGlja18wPQotT1NfRGlzcGF0Y2hlclRpbWVyX1RpY2tfMT0KLQotT1NfRGlzcGF0Y2hlcl9CZWdpbkludm9rZT0KLU9TX0Rpc3BhdGNoZXJfQmVnaW5JbnZva2VfMD0KLU9TX0Rpc3BhdGNoZXJfQmVnaW5JbnZva2VfMT0KLU9TX0Rpc3BhdGNoZXJfQmVnaW5JbnZva2VfMj0KLQotT1NfRGlzcGF0Y2hlcl9Ib29rcz0KLU9TX0Rpc3BhdGNoZXJfSG9va3NfMD0KLQotT1NfRGlzcGF0Y2hlcl9QdXNoRnJhbWU9Ci1PU19EaXNwYXRjaGVyX1B1c2hGcmFtZV8wPQotCi1PU19Eb2NrUGFuZWxfRG9ja1Byb3BlcnR5PQotCi1PU19Eb2NrUGFuZWxfdHlwZWlkPQotCi1PU19Eb3VibGVBbmltYXRpb25Vc2luZ0tleUZyYW1lc19LZXlGcmFtZXM9Ci1PU19Eb3VibGVBbmltYXRpb25Vc2luZ0tleUZyYW1lc19LZXlGcmFtZXNfMD0KLQotT1NfRG91YmxlQ29sbGVjdGlvbl9BZGQ9Ci1PU19Eb3VibGVDb2xsZWN0aW9uX0FkZF8wPQotT1NfRG91YmxlQ29sbGVjdGlvbl9BZGRfMT0KLQotT1NfRG91YmxlS2V5RnJhbWVDb2xsZWN0aW9uX0FkZD0KLU9TX0RvdWJsZUtleUZyYW1lQ29sbGVjdGlvbl9BZGRfMD0KLU9TX0RvdWJsZUtleUZyYW1lQ29sbGVjdGlvbl9BZGRfMT0KLQotT1NfRHJhd2luZ0NvbG9yX0Zyb21BcmdiPQotT1NfRHJhd2luZ0NvbG9yX0Zyb21BcmdiXzA9Ci1PU19EcmF3aW5nQ29sb3JfRnJvbUFyZ2JfMT0KLU9TX0RyYXdpbmdDb2xvcl9Gcm9tQXJnYl8yPQotT1NfRHJhd2luZ0NvbG9yX0Zyb21BcmdiXzM9Ci0KLU9TX0RyYXdpbmdDb2xvcl9Ub0FyZ2I9Ci1PU19EcmF3aW5nQ29sb3JfVG9BcmdiXzA9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0Nsb3NlPQotT1NfRHJhd2luZ0NvbnRleHRfQ2xvc2VfMD0KLQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0VsbGlwc2U9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3RWxsaXBzZV8wPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0VsbGlwc2VfMT0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdFbGxpcHNlXzI9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3RWxsaXBzZV8zPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0VsbGlwc2VfND0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdFbGxpcHNlXzU9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeT0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeV8wPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0dlb21ldHJ5XzE9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3R2VvbWV0cnlfMj0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeV8zPQotCi1PU19EcmF3aW5nQ29udGV4dF9EcmF3SW1hZ2U9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3SW1hZ2VfMD0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdJbWFnZV8xPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0ltYWdlXzI9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdMaW5lPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0xpbmVfMD0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdMaW5lXzE9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3TGluZV8yPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0xpbmVfMz0KLQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JlY3RhbmdsZT0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMD0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMT0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMj0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMz0KLQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGU9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3Um91bmRlZFJlY3RhbmdsZV8wPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGVfMT0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSb3VuZGVkUmVjdGFuZ2xlXzI9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3Um91bmRlZFJlY3RhbmdsZV8zPQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGVfND0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSb3VuZGVkUmVjdGFuZ2xlXzU9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdUZXh0PQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1RleHRfMD0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdUZXh0XzE9Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3VGV4dF8yPQotCi1PU19EcmF3aW5nQ29udGV4dF9Qb3A9Ci1PU19EcmF3aW5nQ29udGV4dF9Qb3BfMD0KLQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaENsaXA9Ci1PU19EcmF3aW5nQ29udGV4dF9QdXNoQ2xpcF8wPQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaENsaXBfMT0KLQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaE9wYWNpdHk9Ci1PU19EcmF3aW5nQ29udGV4dF9QdXNoT3BhY2l0eV8wPQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaE9wYWNpdHlfMT0KLQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaFRyYW5zZm9ybT0KLU9TX0RyYXdpbmdDb250ZXh0X1B1c2hUcmFuc2Zvcm1fMD0KLU9TX0RyYXdpbmdDb250ZXh0X1B1c2hUcmFuc2Zvcm1fMT0KLQotT1NfRHJhd2luZ1Zpc3VhbF9SZW5kZXJPcGVuPQotT1NfRHJhd2luZ1Zpc3VhbF9SZW5kZXJPcGVuXzA9Ci0KLU9TX0RyYXdpbmdWaXN1YWxfdHlwZWlkPQotCi1PU19FZGl0aW5nQ29tbWFuZHNfQmFja3NwYWNlPQotCi1PU19FZGl0aW5nQ29tbWFuZHNfRGVsZXRlPQotCi1PU19FZGl0aW5nQ29tbWFuZHNfRGVsZXRlTmV4dFdvcmQ9Ci0KLU9TX0VkaXRpbmdDb21tYW5kc19EZWxldGVQcmV2aW91c1dvcmQ9Ci0KLU9TX0Vudmlyb25tZW50X0V4cGFuZEVudmlyb25tZW50VmFyaWFibGVzPQotT1NfRW52aXJvbm1lbnRfRXhwYW5kRW52aXJvbm1lbnRWYXJpYWJsZXNfMD0KLQotT1NfRXhlY3V0ZWRSb3V0ZWRFdmVudEFyZ3NfQ29tbWFuZD0KLU9TX0V4ZWN1dGVkUm91dGVkRXZlbnRBcmdzX0NvbW1hbmRfMD0KLQotT1NfRXhlY3V0ZWRSb3V0ZWRFdmVudEFyZ3NfSGFuZGxlZD0KLU9TX0V4ZWN1dGVkUm91dGVkRXZlbnRBcmdzX0hhbmRsZWRfMD0KLU9TX0V4ZWN1dGVkUm91dGVkRXZlbnRBcmdzX0hhbmRsZWRfMT0KLQotT1NfRXhwYW5kZXJfQ29sbGFwc2VkPQotT1NfRXhwYW5kZXJfQ29sbGFwc2VkXzA9Ci1PU19FeHBhbmRlcl9Db2xsYXBzZWRfMT0KLQotT1NfRXhwYW5kZXJfRXhwYW5kZWQ9Ci1PU19FeHBhbmRlcl9FeHBhbmRlZF8wPQotT1NfRXhwYW5kZXJfRXhwYW5kZWRfMT0KLQotT1NfRXhwYW5kZXJfMUlzRXhwYW5kZWRfX0k9Ci1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fSV8wPQotCi1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fSVo9Ci1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fSVpfMD0KLU9TX0V4cGFuZGVyXzFJc0V4cGFuZGVkX19JWl8xPQotCi1PU19GaWxlRGlhbG9nX0ZpbGVOYW1lPQotT1NfRmlsZURpYWxvZ19GaWxlTmFtZV8wPQotT1NfRmlsZURpYWxvZ19GaWxlTmFtZV8xPQotCi1PU19GaWxlRGlhbG9nX0ZpbGVOYW1lcz0KLU9TX0ZpbGVEaWFsb2dfRmlsZU5hbWVzXzA9Ci0KLU9TX0ZpbGVEaWFsb2dfRmlsdGVyPQotT1NfRmlsZURpYWxvZ19GaWx0ZXJfMD0KLU9TX0ZpbGVEaWFsb2dfRmlsdGVyXzE9Ci0KLU9TX0ZpbGVEaWFsb2dfSW5pdGlhbERpcmVjdG9yeT0KLU9TX0ZpbGVEaWFsb2dfSW5pdGlhbERpcmVjdG9yeV8wPQotT1NfRmlsZURpYWxvZ19Jbml0aWFsRGlyZWN0b3J5XzE9Ci0KLU9TX0ZpbGVEaWFsb2dfVGl0bGU9Ci1PU19GaWxlRGlhbG9nX1RpdGxlXzA9Ci1PU19GaWxlRGlhbG9nX1RpdGxlXzE9Ci0KLU9TX0ZpbGVJbmZvX0RpcmVjdG9yeU5hbWU9Ci1PU19GaWxlSW5mb19EaXJlY3RvcnlOYW1lXzA9Ci0KLU9TX0ZpbGVJbmZvX05hbWU9Ci1PU19GaWxlSW5mb19OYW1lXzA9Ci0KLU9TX0ZvbnRGYW1pbHlfR2V0VHlwZWZhY2VzPQotT1NfRm9udEZhbWlseV9HZXRUeXBlZmFjZXNfMD0KLQotT1NfRm9udEZhbWlseV9Tb3VyY2U9Ci1PU19Gb250RmFtaWx5X1NvdXJjZV8wPQotCi1PU19Gb250U3RyZXRjaF9Gcm9tT3BlblR5cGVTdHJldGNoPQotT1NfRm9udFN0cmV0Y2hfRnJvbU9wZW5UeXBlU3RyZXRjaF8wPQotCi1PU19Gb250U3RyZXRjaF9Ub09wZW5UeXBlU3RyZXRjaD0KLU9TX0ZvbnRTdHJldGNoX1RvT3BlblR5cGVTdHJldGNoXzA9Ci0KLU9TX0ZvbnRTdHJldGNoZXNfTm9ybWFsPQotCi1PU19Gb250U3R5bGVzX0l0YWxpYz0KLQotT1NfRm9udFN0eWxlc19Ob3JtYWw9Ci0KLU9TX0ZvbnRTdHlsZXNfT2JsaXF1ZT0KLQotT1NfRm9udFdlaWdodF9Gcm9tT3BlblR5cGVXZWlnaHQ9Ci1PU19Gb250V2VpZ2h0X0Zyb21PcGVuVHlwZVdlaWdodF8wPQotCi1PU19Gb250V2VpZ2h0X1RvT3BlblR5cGVXZWlnaHQ9Ci1PU19Gb250V2VpZ2h0X1RvT3BlblR5cGVXZWlnaHRfMD0KLQotT1NfRm9udFdlaWdodHNfQm9sZD0KLQotT1NfRm9udFdlaWdodHNfTm9ybWFsPQotCi1PU19Gb250c19TeXN0ZW1UeXBlZmFjZXM9Ci0KLU9TX0Zvcm1hdHRlZFRleHRfQmFzZWxpbmU9Ci1PU19Gb3JtYXR0ZWRUZXh0X0Jhc2VsaW5lXzA9Ci0KLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRHZW9tZXRyeT0KLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRHZW9tZXRyeV8wPQotT1NfRm9ybWF0dGVkVGV4dF9CdWlsZEdlb21ldHJ5XzE9Ci0KLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRIaWdobGlnaHRHZW9tZXRyeT0KLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRIaWdobGlnaHRHZW9tZXRyeV8wPQotT1NfRm9ybWF0dGVkVGV4dF9CdWlsZEhpZ2hsaWdodEdlb21ldHJ5XzE9Ci0KLU9TX0Zvcm1hdHRlZFRleHRfSGVpZ2h0PQotT1NfRm9ybWF0dGVkVGV4dF9IZWlnaHRfMD0KLQotT1NfRm9ybWF0dGVkVGV4dF9XaWR0aEluY2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZT0KLU9TX0Zvcm1hdHRlZFRleHRfV2lkdGhJbmNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2VfMD0KLQotT1NfRm9ybXNDb21tb25EaWFsb2dfU2hvd0RpYWxvZz0KLU9TX0Zvcm1zQ29tbW9uRGlhbG9nX1Nob3dEaWFsb2dfMD0KLQotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfUGFyZW50PQotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfUGFyZW50XzA9Ci0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50XzFUYWdfX0k9Ci1PU19GcmFtZXdvcmtDb250ZW50RWxlbWVudF8xVGFnX19JXzA9Ci0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50XzFUYWdfX0lJPQotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfMVRhZ19fSUlfMD0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50XzFUYWdfX0lJXzE9Ci0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50X3R5cGVpZD0KLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfQXBwZW5kQ2hpbGQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9BcHBlbmRDaGlsZF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfQXBwZW5kQ2hpbGRfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0QmluZGluZz0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmdfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmdfMT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmdfMj0KLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSUk9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV8xU2V0VmFsdWVfX0lJSV8wPQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSUlfMT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlJXzI9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlaPQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSVpfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlaXzE9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV8xU2V0VmFsdWVfX0lJWl8yPQotCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZURvY2s9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZURvY2tfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlRG9ja18xPQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVEb2NrXzI9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlT3JpZW50YXRpb249Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZU9yaWVudGF0aW9uXzA9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZU9yaWVudGF0aW9uXzE9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZU9yaWVudGF0aW9uXzI9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlU3RyZXRjaD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlU3RyZXRjaF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVTdHJldGNoXzE9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVN0cmV0Y2hfMj0KLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVWZXJ0aWNhbEFsaWdubWVudD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlVmVydGljYWxBbGlnbm1lbnRfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlVmVydGljYWxBbGlnbm1lbnRfMT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlVmVydGljYWxBbGlnbm1lbnRfMj0KLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVWaXNpYmlsaXR5PQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVWaXNpYmlsaXR5XzA9Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZpc2liaWxpdHlfMT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlVmlzaWJpbGl0eV8yPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X0FjdHVhbEhlaWdodD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQWN0dWFsSGVpZ2h0XzA9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQWN0dWFsSGVpZ2h0UHJvcGVydHk9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQWN0dWFsV2lkdGg9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0FjdHVhbFdpZHRoXzA9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQWN0dWFsV2lkdGhQcm9wZXJ0eT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9CZWdpbkluaXQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0JlZ2luSW5pdF8wPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X0JyaW5nSW50b1ZpZXc9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0JyaW5nSW50b1ZpZXdfMD0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ29udGV4dE1lbnVfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ29udGV4dE1lbnVfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudUNsb3Npbmc9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51Q2xvc2luZ18wPQotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudUNsb3NpbmdfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudU9wZW5pbmc9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51T3BlbmluZ18wPQotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudU9wZW5pbmdfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9DdXJzb3I9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0N1cnNvcl8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF9DdXJzb3JfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9DdXJzb3JQcm9wZXJ0eT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9HZXRCaW5kaW5nRXhwcmVzc2lvbj0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfR2V0QmluZGluZ0V4cHJlc3Npb25fMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfR2V0QmluZGluZ0V4cHJlc3Npb25fMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xSGVpZ2h0X19JPQotT1NfRnJhbWV3b3JrRWxlbWVudF8xSGVpZ2h0X19JXzA9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMUhlaWdodF9fSUQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFIZWlnaHRfX0lEXzA9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFIZWlnaHRfX0lEXzE9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSGVpZ2h0UHJvcGVydHk9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSG9yaXpvbnRhbEFsaWdubWVudD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSG9yaXpvbnRhbEFsaWdubWVudF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF9Ib3Jpem9udGFsQWxpZ25tZW50XzE9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSXNMb2FkZWQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50X0lzTG9hZGVkXzA9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTG9hZGVkPQotT1NfRnJhbWV3b3JrRWxlbWVudF9Mb2FkZWRfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTG9hZGVkXzE9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTWFyZ2luPQotT1NfRnJhbWV3b3JrRWxlbWVudF9NYXJnaW5fMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTWFyZ2luXzE9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTWFyZ2luUHJvcGVydHk9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbkhlaWdodF9fST0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbkhlaWdodF9fSV8wPQotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5IZWlnaHRfX0lEPQotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWluSGVpZ2h0X19JRF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWluSGVpZ2h0X19JRF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5XaWR0aF9fST0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbldpZHRoX19JXzA9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbldpZHRoX19JRD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbldpZHRoX19JRF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWluV2lkdGhfX0lEXzE9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTmFtZT0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfTmFtZV8wPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X05hbWVQcm9wZXJ0eT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9QYXJlbnQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50X1BhcmVudF8wPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X1NpemVDaGFuZ2VkPQotT1NfRnJhbWV3b3JrRWxlbWVudF9TaXplQ2hhbmdlZF8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF9TaXplQ2hhbmdlZF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFUYWdfX0k9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFUYWdfX0lfMD0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xVGFnX19JST0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRhZ19fSUlfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRhZ19fSUlfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xVG9vbFRpcF9fST0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRvb2xUaXBfX0lfMD0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xVG9vbFRpcF9fSUk9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFUb29sVGlwX19JSV8wPQotT1NfRnJhbWV3b3JrRWxlbWVudF8xVG9vbFRpcF9fSUlfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9WZXJ0aWNhbEFsaWdubWVudD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfVmVydGljYWxBbGlnbm1lbnRfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfVmVydGljYWxBbGlnbm1lbnRfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF9WZXJ0aWNhbEFsaWdubWVudFByb3BlcnR5PQotCi1PU19GcmFtZXdvcmtFbGVtZW50X1Zpc2liaWxpdHlQcm9wZXJ0eT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xV2lkdGhfX0k9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSV8wPQotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSUQ9Ci1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSURfMD0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVdpZHRoX19JRF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X1dpZHRoUHJvcGVydHk9Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfdHlwZWlkPQotCi1PU19GcmFtZXdvcmtUZW1wbGF0ZV9GaW5kTmFtZT0KLU9TX0ZyYW1ld29ya1RlbXBsYXRlX0ZpbmROYW1lXzA9Ci1PU19GcmFtZXdvcmtUZW1wbGF0ZV9GaW5kTmFtZV8xPQotT1NfRnJhbWV3b3JrVGVtcGxhdGVfRmluZE5hbWVfMj0KLQotT1NfRnJhbWV3b3JrVGVtcGxhdGVfVmlzdWFsVHJlZT0KLU9TX0ZyYW1ld29ya1RlbXBsYXRlX1Zpc3VhbFRyZWVfMD0KLU9TX0ZyYW1ld29ya1RlbXBsYXRlX1Zpc3VhbFRyZWVfMT0KLQotT1NfRnJlZXphYmxlX0NhbkZyZWV6ZT0KLU9TX0ZyZWV6YWJsZV9DYW5GcmVlemVfMD0KLQotT1NfRnJlZXphYmxlX0Nsb25lPQotT1NfRnJlZXphYmxlX0Nsb25lXzA9Ci0KLU9TX0ZyZWV6YWJsZV9GcmVlemU9Ci1PU19GcmVlemFibGVfRnJlZXplXzA9Ci0KLU9TX0dDSGFuZGxlX0ZyZWU9Ci1PU19HQ0hhbmRsZV9GcmVlXzA9Ci0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9BZGQ9Ci1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQWRkXzA9Ci1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9DbGVhcj0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9DbGVhcl8wPQotCi1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQ291bnQ9Ci1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQ291bnRfMD0KLQotT1NfR2VvbWV0cnlDb2xsZWN0aW9uX1JlbW92ZT0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9SZW1vdmVfMD0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9SZW1vdmVfMT0KLQotT1NfR2VvbWV0cnlHcm91cF8xQ2hpbGRyZW5fX0k9Ci1PU19HZW9tZXRyeUdyb3VwXzFDaGlsZHJlbl9fSV8wPQotCi1PU19HZW9tZXRyeUdyb3VwXzFDaGlsZHJlbl9fSUk9Ci1PU19HZW9tZXRyeUdyb3VwXzFDaGlsZHJlbl9fSUlfMD0KLU9TX0dlb21ldHJ5R3JvdXBfMUNoaWxkcmVuX19JSV8xPQotCi1PU19HZW9tZXRyeV9Cb3VuZHM9Ci1PU19HZW9tZXRyeV9Cb3VuZHNfMD0KLQotT1NfR2VvbWV0cnlfQ2xvbmU9Ci1PU19HZW9tZXRyeV9DbG9uZV8wPQotCi1PU19HZW9tZXRyeV9GaWxsQ29udGFpbnM9Ci1PU19HZW9tZXRyeV9GaWxsQ29udGFpbnNfMD0KLU9TX0dlb21ldHJ5X0ZpbGxDb250YWluc18xPQotCi1PU19HZW9tZXRyeV9GaWxsQ29udGFpbnNXaXRoRGV0YWlsPQotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zV2l0aERldGFpbF8wPQotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zV2l0aERldGFpbF8xPQotCi1PU19HZW9tZXRyeV9HZXRGbGF0dGVuZWRQYXRoR2VvbWV0cnk9Ci1PU19HZW9tZXRyeV9HZXRGbGF0dGVuZWRQYXRoR2VvbWV0cnlfMD0KLQotT1NfR2VvbWV0cnlfSXNFbXB0eT0KLU9TX0dlb21ldHJ5X0lzRW1wdHlfMD0KLQotT1NfR2VvbWV0cnlfU3Ryb2tlQ29udGFpbnM9Ci1PU19HZW9tZXRyeV9TdHJva2VDb250YWluc18wPQotT1NfR2VvbWV0cnlfU3Ryb2tlQ29udGFpbnNfMT0KLU9TX0dlb21ldHJ5X1N0cm9rZUNvbnRhaW5zXzI9Ci0KLU9TX0dlb21ldHJ5XzFUcmFuc2Zvcm1fX0k9Ci1PU19HZW9tZXRyeV8xVHJhbnNmb3JtX19JXzA9Ci0KLU9TX0dlb21ldHJ5XzFUcmFuc2Zvcm1fX0lJPQotT1NfR2VvbWV0cnlfMVRyYW5zZm9ybV9fSUlfMD0KLU9TX0dlb21ldHJ5XzFUcmFuc2Zvcm1fX0lJXzE9Ci0KLU9TX0dldEN1cnNvclBvcz0KLU9TX0dldEN1cnNvclBvc18wPQotCi1PU19HZXRJY29uSW5mbz0KLU9TX0dldEljb25JbmZvXzA9Ci1PU19HZXRJY29uSW5mb18xPQotCi1PU19HZXRLZXlib2FyZFN0YXRlPQotT1NfR2V0S2V5Ym9hcmRTdGF0ZV8wPQotCi1PU19HZXRNb2R1bGVIYW5kbGVXPQotT1NfR2V0TW9kdWxlSGFuZGxlV18wPQotCi1PU19HbHlwaFJ1bl9CaWRpTGV2ZWw9Ci1PU19HbHlwaFJ1bl9CaWRpTGV2ZWxfMD0KLQotT1NfR3JhZGllbnRCcnVzaF9NYXBwaW5nTW9kZT0KLU9TX0dyYWRpZW50QnJ1c2hfTWFwcGluZ01vZGVfMD0KLU9TX0dyYWRpZW50QnJ1c2hfTWFwcGluZ01vZGVfMT0KLQotT1NfR3JhZGllbnRCcnVzaF9TcHJlYWRNZXRob2Q9Ci1PU19HcmFkaWVudEJydXNoX1NwcmVhZE1ldGhvZF8wPQotT1NfR3JhZGllbnRCcnVzaF9TcHJlYWRNZXRob2RfMT0KLQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0NsZWFyPQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0NsZWFyXzA9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9Db3VudD0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9Db3VudF8wPQotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5kZXhPZj0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9JbmRleE9mXzA9Ci1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5kZXhPZl8xPQotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5zZXJ0PQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0luc2VydF8wPQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0luc2VydF8xPQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0luc2VydF8yPQotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fUmVtb3ZlPQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX1JlbW92ZV8wPQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX1JlbW92ZV8xPQotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fZGVmYXVsdD0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9kZWZhdWx0XzA9Ci1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fZGVmYXVsdF8xPQotCi1PU19HcmlkVmlld0NvbHVtbkhlYWRlcl9Db250ZW50PQotT1NfR3JpZFZpZXdDb2x1bW5IZWFkZXJfQ29udGVudF8wPQotT1NfR3JpZFZpZXdDb2x1bW5IZWFkZXJfQ29udGVudF8xPQotCi1PU19HcmlkVmlld0NvbHVtbl9BY3R1YWxXaWR0aD0KLU9TX0dyaWRWaWV3Q29sdW1uX0FjdHVhbFdpZHRoXzA9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFDZWxsVGVtcGxhdGVfX0k9Ci1PU19HcmlkVmlld0NvbHVtbl8xQ2VsbFRlbXBsYXRlX19JXzA9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFDZWxsVGVtcGxhdGVfX0lJPQotT1NfR3JpZFZpZXdDb2x1bW5fMUNlbGxUZW1wbGF0ZV9fSUlfMD0KLU9TX0dyaWRWaWV3Q29sdW1uXzFDZWxsVGVtcGxhdGVfX0lJXzE9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0k9Ci1PU19HcmlkVmlld0NvbHVtbl8xSGVhZGVyX19JXzA9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0lJPQotT1NfR3JpZFZpZXdDb2x1bW5fMUhlYWRlcl9fSUlfMD0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0lJXzE9Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fST0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fSV8wPQotCi1PU19HcmlkVmlld0NvbHVtbl8xSGVhZGVyVGVtcGxhdGVfX0lJPQotT1NfR3JpZFZpZXdDb2x1bW5fMUhlYWRlclRlbXBsYXRlX19JSV8wPQotT1NfR3JpZFZpZXdDb2x1bW5fMUhlYWRlclRlbXBsYXRlX19JSV8xPQotCi1PU19HcmlkVmlld0NvbHVtbl8xV2lkdGhfX0k9Ci1PU19HcmlkVmlld0NvbHVtbl8xV2lkdGhfX0lfMD0KLQotT1NfR3JpZFZpZXdDb2x1bW5fMVdpZHRoX19JRD0KLU9TX0dyaWRWaWV3Q29sdW1uXzFXaWR0aF9fSURfMD0KLU9TX0dyaWRWaWV3Q29sdW1uXzFXaWR0aF9fSURfMT0KLQotT1NfR3JpZFZpZXdDb2x1bW5fV2lkdGhQcm9wZXJ0eT0KLQotT1NfR3JpZFZpZXdIZWFkZXJSb3dQcmVzZW50ZXJfQ29sdW1uc1Byb3BlcnR5PQotCi1PU19HcmlkVmlld0hlYWRlclJvd1ByZXNlbnRlcl90eXBlaWQ9Ci0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyQmFzZV9Db2x1bW5zPQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJCYXNlX0NvbHVtbnNfMD0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyQmFzZV9Db2x1bW5zXzE9Ci0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyXzFDb250ZW50X19JPQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfMUNvbnRlbnRfX0lfMD0KLQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfMUNvbnRlbnRfX0lJPQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfMUNvbnRlbnRfX0lJXzA9Ci1PU19HcmlkVmlld1Jvd1ByZXNlbnRlcl8xQ29udGVudF9fSUlfMT0KLQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfdHlwZWlkPQotCi1PU19HcmlkVmlld19BbGxvd3NDb2x1bW5SZW9yZGVyPQotT1NfR3JpZFZpZXdfQWxsb3dzQ29sdW1uUmVvcmRlcl8wPQotT1NfR3JpZFZpZXdfQWxsb3dzQ29sdW1uUmVvcmRlcl8xPQotCi1PU19HcmlkVmlld19Db2x1bW5IZWFkZXJDb250YWluZXJTdHlsZT0KLU9TX0dyaWRWaWV3X0NvbHVtbkhlYWRlckNvbnRhaW5lclN0eWxlXzA9Ci1PU19HcmlkVmlld19Db2x1bW5IZWFkZXJDb250YWluZXJTdHlsZV8xPQotCi1PU19HcmlkVmlld19Db2x1bW5zPQotT1NfR3JpZFZpZXdfQ29sdW1uc18wPQotCi1PU19HcmlkX0NvbHVtbkRlZmluaXRpb25zPQotT1NfR3JpZF9Db2x1bW5EZWZpbml0aW9uc18wPQotCi1PU19HcmlkX1Jvd0RlZmluaXRpb25zPQotT1NfR3JpZF9Sb3dEZWZpbml0aW9uc18wPQotCi1PU19HcmlkX1NldENvbHVtbj0KLU9TX0dyaWRfU2V0Q29sdW1uXzA9Ci1PU19HcmlkX1NldENvbHVtbl8xPQotCi1PU19HcmlkX1NldENvbHVtblNwYW49Ci1PU19HcmlkX1NldENvbHVtblNwYW5fMD0KLU9TX0dyaWRfU2V0Q29sdW1uU3Bhbl8xPQotCi1PU19HcmlkX1NldFJvdz0KLU9TX0dyaWRfU2V0Um93XzA9Ci1PU19HcmlkX1NldFJvd18xPQotCi1PU19HcmlkX1NldFJvd1NwYW49Ci1PU19HcmlkX1NldFJvd1NwYW5fMD0KLU9TX0dyaWRfU2V0Um93U3Bhbl8xPQotCi1PU19IZWFkZXJlZENvbnRlbnRDb250cm9sXzFIZWFkZXJfX0k9Ci1PU19IZWFkZXJlZENvbnRlbnRDb250cm9sXzFIZWFkZXJfX0lfMD0KLQotT1NfSGVhZGVyZWRDb250ZW50Q29udHJvbF8xSGVhZGVyX19JST0KLU9TX0hlYWRlcmVkQ29udGVudENvbnRyb2xfMUhlYWRlcl9fSUlfMD0KLU9TX0hlYWRlcmVkQ29udGVudENvbnRyb2xfMUhlYWRlcl9fSUlfMT0KLQotT1NfSGVhZGVyZWRJdGVtc0NvbnRyb2xfMUhlYWRlcl9fST0KLU9TX0hlYWRlcmVkSXRlbXNDb250cm9sXzFIZWFkZXJfX0lfMD0KLQotT1NfSGVhZGVyZWRJdGVtc0NvbnRyb2xfMUhlYWRlcl9fSUk9Ci1PU19IZWFkZXJlZEl0ZW1zQ29udHJvbF8xSGVhZGVyX19JSV8wPQotT1NfSGVhZGVyZWRJdGVtc0NvbnRyb2xfMUhlYWRlcl9fSUlfMT0KLQotT1NfSHlwZXJsaW5rX0NsaWNrPQotT1NfSHlwZXJsaW5rX0NsaWNrXzA9Ci1PU19IeXBlcmxpbmtfQ2xpY2tfMT0KLQotT1NfSUNvbGxlY3Rpb25fQ291bnQ9Ci1PU19JQ29sbGVjdGlvbl9Db3VudF8wPQotCi1PU19JRW51bWVyYXRvcl9DdXJyZW50PQotT1NfSUVudW1lcmF0b3JfQ3VycmVudF8wPQotCi1PU19JRW51bWVyYXRvcl9Nb3ZlTmV4dD0KLU9TX0lFbnVtZXJhdG9yX01vdmVOZXh0XzA9Ci0KLU9TX0lMaXN0X0FkZD0KLU9TX0lMaXN0X0FkZF8wPQotT1NfSUxpc3RfQWRkXzE9Ci0KLU9TX0lMaXN0X0dldEVudW1lcmF0b3I9Ci1PU19JTGlzdF9HZXRFbnVtZXJhdG9yXzA9Ci0KLU9TX0lMaXN0X2RlZmF1bHQ9Ci1PU19JTGlzdF9kZWZhdWx0XzA9Ci1PU19JTGlzdF9kZWZhdWx0XzE9Ci0KLU9TX0ltYWdlU291cmNlX3R5cGVpZD0KLQotT1NfSW1hZ2VfU291cmNlPQotT1NfSW1hZ2VfU291cmNlXzA9Ci1PU19JbWFnZV9Tb3VyY2VfMT0KLQotT1NfSW1hZ2VfU291cmNlUHJvcGVydHk9Ci0KLU9TX0ltYWdlX1N0cmV0Y2g9Ci1PU19JbWFnZV9TdHJldGNoXzA9Ci1PU19JbWFnZV9TdHJldGNoXzE9Ci0KLU9TX0ltYWdlX1N0cmV0Y2hQcm9wZXJ0eT0KLQotT1NfSW1hZ2VfdHlwZWlkPQotCi1PU19JbWFnaW5nX0NyZWF0ZUJpdG1hcFNvdXJjZUZyb21ISWNvbj0KLU9TX0ltYWdpbmdfQ3JlYXRlQml0bWFwU291cmNlRnJvbUhJY29uXzA9Ci1PU19JbWFnaW5nX0NyZWF0ZUJpdG1hcFNvdXJjZUZyb21ISWNvbl8xPQotT1NfSW1hZ2luZ19DcmVhdGVCaXRtYXBTb3VyY2VGcm9tSEljb25fMj0KLQotT1NfSW5kZXhlZEdseXBoUnVuQ29sbGVjdGlvbl9DdXJyZW50PQotT1NfSW5kZXhlZEdseXBoUnVuQ29sbGVjdGlvbl9DdXJyZW50XzA9Ci0KLU9TX0luZGV4ZWRHbHlwaFJ1bkNvbGxlY3Rpb25fR2V0RW51bWVyYXRvcj0KLU9TX0luZGV4ZWRHbHlwaFJ1bkNvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPQotCi1PU19JbmRleGVkR2x5cGhSdW5fR2x5cGhSdW49Ci1PU19JbmRleGVkR2x5cGhSdW5fR2x5cGhSdW5fMD0KLQotT1NfSW5kZXhlZEdseXBoUnVuX1RleHRTb3VyY2VDaGFyYWN0ZXJJbmRleD0KLU9TX0luZGV4ZWRHbHlwaFJ1bl9UZXh0U291cmNlQ2hhcmFjdGVySW5kZXhfMD0KLQotT1NfSW5kZXhlZEdseXBoUnVuX1RleHRTb3VyY2VMZW5ndGg9Ci1PU19JbmRleGVkR2x5cGhSdW5fVGV4dFNvdXJjZUxlbmd0aF8wPQotCi1PU19JbmxpbmVDb2xsZWN0aW9uX0FkZD0KLU9TX0lubGluZUNvbGxlY3Rpb25fQWRkXzA9Ci1PU19JbmxpbmVDb2xsZWN0aW9uX0FkZF8xPQotCi1PU19JbmxpbmVDb2xsZWN0aW9uX0NsZWFyPQotT1NfSW5saW5lQ29sbGVjdGlvbl9DbGVhcl8wPQotCi1PU19JbnB1dEV2ZW50QXJnc19UaW1lc3RhbXA9Ci1PU19JbnB1dEV2ZW50QXJnc19UaW1lc3RhbXBfMD0KLQotT1NfSW50MzJSZWN0X0VtcHR5PQotCi1PU19JbnRQdHJfVG9JbnQzMj0KLU9TX0ludFB0cl9Ub0ludDMyXzA9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX0FkZD0KLU9TX0l0ZW1Db2xsZWN0aW9uX0FkZF8wPQotT1NfSXRlbUNvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX0NsZWFyPQotT1NfSXRlbUNvbGxlY3Rpb25fQ2xlYXJfMD0KLQotT1NfSXRlbUNvbGxlY3Rpb25fQ291bnQ9Ci1PU19JdGVtQ29sbGVjdGlvbl9Db3VudF8wPQotCi1PU19JdGVtQ29sbGVjdGlvbl9DdXJyZW50SXRlbT0KLU9TX0l0ZW1Db2xsZWN0aW9uX0N1cnJlbnRJdGVtXzA9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX0N1cnJlbnRQb3NpdGlvbj0KLU9TX0l0ZW1Db2xsZWN0aW9uX0N1cnJlbnRQb3NpdGlvbl8wPQotCi1PU19JdGVtQ29sbGVjdGlvbl9HZXRJdGVtQXQ9Ci1PU19JdGVtQ29sbGVjdGlvbl9HZXRJdGVtQXRfMD0KLU9TX0l0ZW1Db2xsZWN0aW9uX0dldEl0ZW1BdF8xPQotCi1PU19JdGVtQ29sbGVjdGlvbl9JbmRleE9mPQotT1NfSXRlbUNvbGxlY3Rpb25fSW5kZXhPZl8wPQotT1NfSXRlbUNvbGxlY3Rpb25fSW5kZXhPZl8xPQotCi1PU19JdGVtQ29sbGVjdGlvbl9JbnNlcnQ9Ci1PU19JdGVtQ29sbGVjdGlvbl9JbnNlcnRfMD0KLU9TX0l0ZW1Db2xsZWN0aW9uX0luc2VydF8xPQotT1NfSXRlbUNvbGxlY3Rpb25fSW5zZXJ0XzI9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZT0KLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZV8wPQotT1NfSXRlbUNvbGxlY3Rpb25fUmVtb3ZlXzE9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZUF0PQotT1NfSXRlbUNvbGxlY3Rpb25fUmVtb3ZlQXRfMD0KLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZUF0XzE9Ci0KLU9TX0l0ZW1zQ29udHJvbF9IYXNJdGVtcz0KLU9TX0l0ZW1zQ29udHJvbF9IYXNJdGVtc18wPQotCi1PU19JdGVtc0NvbnRyb2xfSXRlbXM9Ci1PU19JdGVtc0NvbnRyb2xfSXRlbXNfMD0KLQotT1NfSXRlbXNDb250cm9sX0l0ZW1zU291cmNlPQotT1NfSXRlbXNDb250cm9sX0l0ZW1zU291cmNlXzA9Ci1PU19JdGVtc0NvbnRyb2xfSXRlbXNTb3VyY2VfMT0KLQotT1NfSXRlbXNQcmVzZW50ZXJfdHlwZWlkPQotCi1PU19KTklHZXRPYmplY3Q9Ci1PU19KTklHZXRPYmplY3RfMD0KLQotT1NfS2V5RXZlbnRBcmdzX0lzRG93bj0KLU9TX0tleUV2ZW50QXJnc19Jc0Rvd25fMD0KLQotT1NfS2V5RXZlbnRBcmdzX0lzUmVwZWF0PQotT1NfS2V5RXZlbnRBcmdzX0lzUmVwZWF0XzA9Ci0KLU9TX0tleUV2ZW50QXJnc19Jc1RvZ2dsZWQ9Ci1PU19LZXlFdmVudEFyZ3NfSXNUb2dnbGVkXzA9Ci0KLU9TX0tleUV2ZW50QXJnc19LZXk9Ci1PU19LZXlFdmVudEFyZ3NfS2V5XzA9Ci0KLU9TX0tleUV2ZW50QXJnc19TeXN0ZW1LZXk9Ci1PU19LZXlFdmVudEFyZ3NfU3lzdGVtS2V5XzA9Ci0KLU9TX0tleUludGVyb3BfVmlydHVhbEtleUZyb21LZXk9Ci1PU19LZXlJbnRlcm9wX1ZpcnR1YWxLZXlGcm9tS2V5XzA9Ci0KLU9TX0tleVRpbWVfVW5pZm9ybT0KLQotT1NfS2V5Ym9hcmREZXZpY2VfTW9kaWZpZXJzPQotT1NfS2V5Ym9hcmREZXZpY2VfTW9kaWZpZXJzXzA9Ci0KLU9TX0tleWJvYXJkRXZlbnRBcmdzX0tleWJvYXJkRGV2aWNlPQotT1NfS2V5Ym9hcmRFdmVudEFyZ3NfS2V5Ym9hcmREZXZpY2VfMD0KLQotT1NfS2V5Ym9hcmROYXZpZ2F0aW9uX1NldFRhYk5hdmlnYXRpb249Ci1PU19LZXlib2FyZE5hdmlnYXRpb25fU2V0VGFiTmF2aWdhdGlvbl8wPQotT1NfS2V5Ym9hcmROYXZpZ2F0aW9uX1NldFRhYk5hdmlnYXRpb25fMT0KLQotT1NfS2V5Ym9hcmRfRm9jdXNlZEVsZW1lbnQ9Ci0KLU9TX0tleWJvYXJkX01vZGlmaWVycz0KLQotT1NfTGlzdEJveEl0ZW1fMUlzU2VsZWN0ZWRfX0k9Ci1PU19MaXN0Qm94SXRlbV8xSXNTZWxlY3RlZF9fSV8wPQotCi1PU19MaXN0Qm94SXRlbV8xSXNTZWxlY3RlZF9fSVo9Ci1PU19MaXN0Qm94SXRlbV8xSXNTZWxlY3RlZF9fSVpfMD0KLU9TX0xpc3RCb3hJdGVtXzFJc1NlbGVjdGVkX19JWl8xPQotCi1PU19MaXN0Qm94X1Njcm9sbEludG9WaWV3PQotT1NfTGlzdEJveF9TY3JvbGxJbnRvVmlld18wPQotT1NfTGlzdEJveF9TY3JvbGxJbnRvVmlld18xPQotCi1PU19MaXN0Qm94X1NlbGVjdEFsbD0KLU9TX0xpc3RCb3hfU2VsZWN0QWxsXzA9Ci0KLU9TX0xpc3RCb3hfU2VsZWN0ZWRJdGVtcz0KLU9TX0xpc3RCb3hfU2VsZWN0ZWRJdGVtc18wPQotCi1PU19MaXN0Qm94X1NlbGVjdGlvbk1vZGU9Ci1PU19MaXN0Qm94X1NlbGVjdGlvbk1vZGVfMD0KLU9TX0xpc3RCb3hfU2VsZWN0aW9uTW9kZV8xPQotCi1PU19MaXN0Qm94X1Vuc2VsZWN0QWxsPQotT1NfTGlzdEJveF9VbnNlbGVjdEFsbF8wPQotCi1PU19MaXN0Vmlld19WaWV3PQotT1NfTGlzdFZpZXdfVmlld18wPQotT1NfTGlzdFZpZXdfVmlld18xPQotCi1PU19Mb2FkSW1hZ2U9Ci1PU19Mb2FkSW1hZ2VfMD0KLU9TX0xvYWRJbWFnZV8xPQotT1NfTG9hZEltYWdlXzI9Ci1PU19Mb2FkSW1hZ2VfMz0KLU9TX0xvYWRJbWFnZV80PQotT1NfTG9hZEltYWdlXzU9Ci0KLU9TX01hcFZpcnR1YWxLZXlXPQotT1NfTWFwVmlydHVhbEtleVdfMD0KLU9TX01hcFZpcnR1YWxLZXlXXzE9Ci0KLU9TX01hdHJpeFRyYW5zZm9ybV8xTWF0cml4X19JPQotT1NfTWF0cml4VHJhbnNmb3JtXzFNYXRyaXhfX0lfMD0KLQotT1NfTWF0cml4VHJhbnNmb3JtXzFNYXRyaXhfX0lJPQotT1NfTWF0cml4VHJhbnNmb3JtXzFNYXRyaXhfX0lJXzA9Ci1PU19NYXRyaXhUcmFuc2Zvcm1fMU1hdHJpeF9fSUlfMT0KLQotT1NfTWF0cml4X0ludmVydD0KLU9TX01hdHJpeF9JbnZlcnRfMD0KLQotT1NfTWF0cml4X0lzSWRlbnRpdHk9Ci1PU19NYXRyaXhfSXNJZGVudGl0eV8wPQotCi1PU19NYXRyaXhfMU0xMV9fST0KLU9TX01hdHJpeF8xTTExX19JXzA9Ci0KLU9TX01hdHJpeF8xTTExX19JRD0KLU9TX01hdHJpeF8xTTExX19JRF8wPQotT1NfTWF0cml4XzFNMTFfX0lEXzE9Ci0KLU9TX01hdHJpeF8xTTEyX19JPQotT1NfTWF0cml4XzFNMTJfX0lfMD0KLQotT1NfTWF0cml4XzFNMTJfX0lEPQotT1NfTWF0cml4XzFNMTJfX0lEXzA9Ci1PU19NYXRyaXhfMU0xMl9fSURfMT0KLQotT1NfTWF0cml4XzFNMjFfX0k9Ci1PU19NYXRyaXhfMU0yMV9fSV8wPQotCi1PU19NYXRyaXhfMU0yMV9fSUQ9Ci1PU19NYXRyaXhfMU0yMV9fSURfMD0KLU9TX01hdHJpeF8xTTIxX19JRF8xPQotCi1PU19NYXRyaXhfMU0yMl9fST0KLU9TX01hdHJpeF8xTTIyX19JXzA9Ci0KLU9TX01hdHJpeF8xTTIyX19JRD0KLU9TX01hdHJpeF8xTTIyX19JRF8wPQotT1NfTWF0cml4XzFNMjJfX0lEXzE9Ci0KLU9TX01hdHJpeF9NdWx0aXBseT0KLU9TX01hdHJpeF9NdWx0aXBseV8wPQotT1NfTWF0cml4X011bHRpcGx5XzE9Ci0KLU9TX01hdHJpeF8xT2Zmc2V0WF9fST0KLU9TX01hdHJpeF8xT2Zmc2V0WF9fSV8wPQotCi1PU19NYXRyaXhfMU9mZnNldFhfX0lEPQotT1NfTWF0cml4XzFPZmZzZXRYX19JRF8wPQotT1NfTWF0cml4XzFPZmZzZXRYX19JRF8xPQotCi1PU19NYXRyaXhfMU9mZnNldFlfX0k9Ci1PU19NYXRyaXhfMU9mZnNldFlfX0lfMD0KLQotT1NfTWF0cml4XzFPZmZzZXRZX19JRD0KLU9TX01hdHJpeF8xT2Zmc2V0WV9fSURfMD0KLU9TX01hdHJpeF8xT2Zmc2V0WV9fSURfMT0KLQotT1NfTWF0cml4X1JvdGF0ZVByZXBlbmQ9Ci1PU19NYXRyaXhfUm90YXRlUHJlcGVuZF8wPQotT1NfTWF0cml4X1JvdGF0ZVByZXBlbmRfMT0KLQotT1NfTWF0cml4X1NjYWxlUHJlcGVuZD0KLU9TX01hdHJpeF9TY2FsZVByZXBlbmRfMD0KLU9TX01hdHJpeF9TY2FsZVByZXBlbmRfMT0KLU9TX01hdHJpeF9TY2FsZVByZXBlbmRfMj0KLQotT1NfTWF0cml4X1RyYW5zZm9ybT0KLU9TX01hdHJpeF9UcmFuc2Zvcm1fMD0KLU9TX01hdHJpeF9UcmFuc2Zvcm1fMT0KLQotT1NfTWF0cml4X1RyYW5zbGF0ZVByZXBlbmQ9Ci1PU19NYXRyaXhfVHJhbnNsYXRlUHJlcGVuZF8wPQotT1NfTWF0cml4X1RyYW5zbGF0ZVByZXBlbmRfMT0KLU9TX01hdHJpeF9UcmFuc2xhdGVQcmVwZW5kXzI9Ci0KLU9TX01lbnVJdGVtX0NsaWNrPQotT1NfTWVudUl0ZW1fQ2xpY2tfMD0KLU9TX01lbnVJdGVtX0NsaWNrXzE9Ci0KLU9TX01lbnVJdGVtX0ljb249Ci1PU19NZW51SXRlbV9JY29uXzA9Ci1PU19NZW51SXRlbV9JY29uXzE9Ci0KLU9TX01lbnVJdGVtX0lucHV0R2VzdHVyZVRleHQ9Ci1PU19NZW51SXRlbV9JbnB1dEdlc3R1cmVUZXh0XzA9Ci1PU19NZW51SXRlbV9JbnB1dEdlc3R1cmVUZXh0XzE9Ci0KLU9TX01lbnVJdGVtX0lzQ2hlY2thYmxlPQotT1NfTWVudUl0ZW1fSXNDaGVja2FibGVfMD0KLU9TX01lbnVJdGVtX0lzQ2hlY2thYmxlXzE9Ci0KLU9TX01lbnVJdGVtXzFJc0NoZWNrZWRfX0k9Ci1PU19NZW51SXRlbV8xSXNDaGVja2VkX19JXzA9Ci0KLU9TX01lbnVJdGVtXzFJc0NoZWNrZWRfX0laPQotT1NfTWVudUl0ZW1fMUlzQ2hlY2tlZF9fSVpfMD0KLU9TX01lbnVJdGVtXzFJc0NoZWNrZWRfX0laXzE9Ci0KLU9TX01lbnVJdGVtX1N1Ym1lbnVDbG9zZWQ9Ci1PU19NZW51SXRlbV9TdWJtZW51Q2xvc2VkXzA9Ci1PU19NZW51SXRlbV9TdWJtZW51Q2xvc2VkXzE9Ci0KLU9TX01lbnVJdGVtX1N1Ym1lbnVPcGVuZWQ9Ci1PU19NZW51SXRlbV9TdWJtZW51T3BlbmVkXzA9Ci1PU19NZW51SXRlbV9TdWJtZW51T3BlbmVkXzE9Ci0KLU9TX01lbnVfSXNNYWluTWVudT0KLU9TX01lbnVfSXNNYWluTWVudV8wPQotT1NfTWVudV9Jc01haW5NZW51XzE9Ci0KLU9TX01lc3NhZ2VCb3hfU2hvdz0KLU9TX01lc3NhZ2VCb3hfU2hvd18wPQotT1NfTWVzc2FnZUJveF9TaG93XzE9Ci1PU19NZXNzYWdlQm94X1Nob3dfMj0KLU9TX01lc3NhZ2VCb3hfU2hvd18zPQotT1NfTWVzc2FnZUJveF9TaG93XzQ9Ci0KLU9TX01vdXNlQnV0dG9uRXZlbnRBcmdzX0J1dHRvblN0YXRlPQotT1NfTW91c2VCdXR0b25FdmVudEFyZ3NfQnV0dG9uU3RhdGVfMD0KLQotT1NfTW91c2VCdXR0b25FdmVudEFyZ3NfQ2hhbmdlZEJ1dHRvbj0KLU9TX01vdXNlQnV0dG9uRXZlbnRBcmdzX0NoYW5nZWRCdXR0b25fMD0KLQotT1NfTW91c2VCdXR0b25FdmVudEFyZ3NfQ2xpY2tDb3VudD0KLU9TX01vdXNlQnV0dG9uRXZlbnRBcmdzX0NsaWNrQ291bnRfMD0KLQotT1NfTW91c2VFdmVudEFyZ3NfR2V0UG9zaXRpb249Ci1PU19Nb3VzZUV2ZW50QXJnc19HZXRQb3NpdGlvbl8wPQotT1NfTW91c2VFdmVudEFyZ3NfR2V0UG9zaXRpb25fMT0KLQotT1NfTW91c2VFdmVudEFyZ3NfTGVmdEJ1dHRvbj0KLU9TX01vdXNlRXZlbnRBcmdzX0xlZnRCdXR0b25fMD0KLQotT1NfTW91c2VFdmVudEFyZ3NfTWlkZGxlQnV0dG9uPQotT1NfTW91c2VFdmVudEFyZ3NfTWlkZGxlQnV0dG9uXzA9Ci0KLU9TX01vdXNlRXZlbnRBcmdzX1JpZ2h0QnV0dG9uPQotT1NfTW91c2VFdmVudEFyZ3NfUmlnaHRCdXR0b25fMD0KLQotT1NfTW91c2VFdmVudEFyZ3NfWEJ1dHRvbjE9Ci1PU19Nb3VzZUV2ZW50QXJnc19YQnV0dG9uMV8wPQotCi1PU19Nb3VzZUV2ZW50QXJnc19YQnV0dG9uMj0KLU9TX01vdXNlRXZlbnRBcmdzX1hCdXR0b24yXzA9Ci0KLU9TX01vdXNlV2hlZWxFdmVudEFyZ3NfRGVsdGE9Ci1PU19Nb3VzZVdoZWVsRXZlbnRBcmdzX0RlbHRhXzA9Ci0KLU9TX01vdXNlX0RpcmVjdGx5T3Zlcj0KLQotT1NfTW91c2VfR2V0UG9zaXRpb249Ci1PU19Nb3VzZV9HZXRQb3NpdGlvbl8wPQotCi1PU19Nb3VzZV9MZWZ0QnV0dG9uPQotCi1PU19Nb3VzZV9NaWRkbGVCdXR0b249Ci0KLU9TX01vdXNlX1JpZ2h0QnV0dG9uPQotCi1PU19Nb3VzZV9TZXRDdXJzb3I9Ci1PU19Nb3VzZV9TZXRDdXJzb3JfMD0KLQotT1NfTW91c2VfWEJ1dHRvbjE9Ci0KLU9TX01vdXNlX1hCdXR0b24yPQotCi1PU19OZXdHbG9iYWxSZWY9Ci1PU19OZXdHbG9iYWxSZWZfMD0KLQotT1NfT2JqZWN0X0VxdWFscz0KLU9TX09iamVjdF9FcXVhbHNfMD0KLU9TX09iamVjdF9FcXVhbHNfMT0KLQotT1NfT2JqZWN0X0dldFR5cGU9Ci1PU19PYmplY3RfR2V0VHlwZV8wPQotCi1PU19PYmplY3RfVG9TdHJpbmc9Ci1PU19PYmplY3RfVG9TdHJpbmdfMD0KLQotT1NfT3BlbkZpbGVEaWFsb2dfTXVsdGlzZWxlY3Q9Ci1PU19PcGVuRmlsZURpYWxvZ19NdWx0aXNlbGVjdF8wPQotT1NfT3BlbkZpbGVEaWFsb2dfTXVsdGlzZWxlY3RfMT0KLQotT1NfUGFuZWxfQmFja2dyb3VuZD0KLU9TX1BhbmVsX0JhY2tncm91bmRfMD0KLU9TX1BhbmVsX0JhY2tncm91bmRfMT0KLQotT1NfUGFuZWxfQmFja2dyb3VuZFByb3BlcnR5PQotCi1PU19QYW5lbF9DaGlsZHJlbj0KLU9TX1BhbmVsX0NoaWxkcmVuXzA9Ci0KLU9TX1BhbmVsX0dldFpJbmRleD0KLU9TX1BhbmVsX0dldFpJbmRleF8wPQotCi1PU19QYW5lbF9TZXRaSW5kZXg9Ci1PU19QYW5lbF9TZXRaSW5kZXhfMD0KLU9TX1BhbmVsX1NldFpJbmRleF8xPQotCi1PU19QYXNzd29yZEJveF8xTWF4TGVuZ3RoX19JPQotT1NfUGFzc3dvcmRCb3hfMU1heExlbmd0aF9fSV8wPQotCi1PU19QYXNzd29yZEJveF8xTWF4TGVuZ3RoX19JST0KLU9TX1Bhc3N3b3JkQm94XzFNYXhMZW5ndGhfX0lJXzA9Ci1PU19QYXNzd29yZEJveF8xTWF4TGVuZ3RoX19JSV8xPQotCi1PU19QYXNzd29yZEJveF8xUGFzc3dvcmRfX0k9Ci1PU19QYXNzd29yZEJveF8xUGFzc3dvcmRfX0lfMD0KLQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkX19JST0KLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZF9fSUlfMD0KLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZF9fSUlfMT0KLQotT1NfUGFzc3dvcmRCb3hfUGFzc3dvcmRDaGFuZ2VkPQotT1NfUGFzc3dvcmRCb3hfUGFzc3dvcmRDaGFuZ2VkXzA9Ci1PU19QYXNzd29yZEJveF9QYXNzd29yZENoYW5nZWRfMT0KLQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fST0KLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZENoYXJfX0lfMD0KLQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fSUM9Ci1PU19QYXNzd29yZEJveF8xUGFzc3dvcmRDaGFyX19JQ18wPQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fSUNfMT0KLQotT1NfUGFzc3dvcmRCb3hfUGFzdGU9Ci1PU19QYXNzd29yZEJveF9QYXN0ZV8wPQotCi1PU19QYXRoRmlndXJlQ29sbGVjdGlvbl9BZGQ9Ci1PU19QYXRoRmlndXJlQ29sbGVjdGlvbl9BZGRfMD0KLU9TX1BhdGhGaWd1cmVDb2xsZWN0aW9uX0FkZF8xPQotCi1PU19QYXRoRmlndXJlQ29sbGVjdGlvbl9Db3VudD0KLU9TX1BhdGhGaWd1cmVDb2xsZWN0aW9uX0NvdW50XzA9Ci0KLU9TX1BhdGhGaWd1cmVfMUlzQ2xvc2VkX19JPQotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0lfMD0KLQotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0laPQotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0laXzA9Ci1PU19QYXRoRmlndXJlXzFJc0Nsb3NlZF9fSVpfMT0KLQotT1NfUGF0aEZpZ3VyZV8xU2VnbWVudHNfX0k9Ci1PU19QYXRoRmlndXJlXzFTZWdtZW50c19fSV8wPQotCi1PU19QYXRoRmlndXJlXzFTZWdtZW50c19fSUk9Ci1PU19QYXRoRmlndXJlXzFTZWdtZW50c19fSUlfMD0KLU9TX1BhdGhGaWd1cmVfMVNlZ21lbnRzX19JSV8xPQotCi1PU19QYXRoRmlndXJlX1N0YXJ0UG9pbnQ9Ci1PU19QYXRoRmlndXJlX1N0YXJ0UG9pbnRfMD0KLU9TX1BhdGhGaWd1cmVfU3RhcnRQb2ludF8xPQotCi1PU19QYXRoR2VvbWV0cnlfQWRkR2VvbWV0cnk9Ci1PU19QYXRoR2VvbWV0cnlfQWRkR2VvbWV0cnlfMD0KLU9TX1BhdGhHZW9tZXRyeV9BZGRHZW9tZXRyeV8xPQotCi1PU19QYXRoR2VvbWV0cnlfQm91bmRzPQotT1NfUGF0aEdlb21ldHJ5X0JvdW5kc18wPQotCi1PU19QYXRoR2VvbWV0cnlfMUZpZ3VyZXNfX0k9Ci1PU19QYXRoR2VvbWV0cnlfMUZpZ3VyZXNfX0lfMD0KLQotT1NfUGF0aEdlb21ldHJ5XzFGaWd1cmVzX19JST0KLU9TX1BhdGhHZW9tZXRyeV8xRmlndXJlc19fSUlfMD0KLU9TX1BhdGhHZW9tZXRyeV8xRmlndXJlc19fSUlfMT0KLQotT1NfUGF0aEdlb21ldHJ5X0ZpbGxSdWxlPQotT1NfUGF0aEdlb21ldHJ5X0ZpbGxSdWxlXzA9Ci1PU19QYXRoR2VvbWV0cnlfRmlsbFJ1bGVfMT0KLQotT1NfUGF0aFNlZ21lbnRDb2xsZWN0aW9uX0FkZD0KLU9TX1BhdGhTZWdtZW50Q29sbGVjdGlvbl9BZGRfMD0KLU9TX1BhdGhTZWdtZW50Q29sbGVjdGlvbl9BZGRfMT0KLQotT1NfUGF0aFNlZ21lbnRDb2xsZWN0aW9uX0NvdW50PQotT1NfUGF0aFNlZ21lbnRDb2xsZWN0aW9uX0NvdW50XzA9Ci0KLU9TX1BhdGhfRGF0YT0KLU9TX1BhdGhfRGF0YV8wPQotT1NfUGF0aF9EYXRhXzE9Ci0KLU9TX1BhdGhfRmlsbD0KLU9TX1BhdGhfRmlsbF8wPQotT1NfUGF0aF9GaWxsXzE9Ci0KLU9TX1BhdGhfU3RyZXRjaD0KLU9TX1BhdGhfU3RyZXRjaF8wPQotT1NfUGF0aF9TdHJldGNoXzE9Ci0KLU9TX1Blbl8xQnJ1c2hfX0k9Ci1PU19QZW5fMUJydXNoX19JXzA9Ci0KLU9TX1Blbl8xQnJ1c2hfX0lJPQotT1NfUGVuXzFCcnVzaF9fSUlfMD0KLU9TX1Blbl8xQnJ1c2hfX0lJXzE9Ci0KLU9TX1Blbl9EYXNoQ2FwPQotT1NfUGVuX0Rhc2hDYXBfMD0KLU9TX1Blbl9EYXNoQ2FwXzE9Ci0KLU9TX1Blbl9EYXNoU3R5bGU9Ci1PU19QZW5fRGFzaFN0eWxlXzA9Ci1PU19QZW5fRGFzaFN0eWxlXzE9Ci0KLU9TX1Blbl9FbmRMaW5lQ2FwPQotT1NfUGVuX0VuZExpbmVDYXBfMD0KLU9TX1Blbl9FbmRMaW5lQ2FwXzE9Ci0KLU9TX1Blbl9MaW5lSm9pbj0KLU9TX1Blbl9MaW5lSm9pbl8wPQotT1NfUGVuX0xpbmVKb2luXzE9Ci0KLU9TX1Blbl9TdGFydExpbmVDYXA9Ci1PU19QZW5fU3RhcnRMaW5lQ2FwXzA9Ci1PU19QZW5fU3RhcnRMaW5lQ2FwXzE9Ci0KLU9TX1Blbl9UaGlja25lc3M9Ci1PU19QZW5fVGhpY2tuZXNzXzA9Ci1PU19QZW5fVGhpY2tuZXNzXzE9Ci0KLU9TX1BpeGVsRm9ybWF0X0JpdHNQZXJQaXhlbD0KLU9TX1BpeGVsRm9ybWF0X0JpdHNQZXJQaXhlbF8wPQotCi1PU19QaXhlbEZvcm1hdHNfQmdyMTAxMDEwPQotCi1PU19QaXhlbEZvcm1hdHNfQmdyMjQ9Ci0KLU9TX1BpeGVsRm9ybWF0c19CZ3IzMj0KLQotT1NfUGl4ZWxGb3JtYXRzX0JncjU1NT0KLQotT1NfUGl4ZWxGb3JtYXRzX0JncjU2NT0KLQotT1NfUGl4ZWxGb3JtYXRzX0JncmEzMj0KLQotT1NfUGl4ZWxGb3JtYXRzX0JsYWNrV2hpdGU9Ci0KLU9TX1BpeGVsRm9ybWF0c19EZWZhdWx0PQotCi1PU19QaXhlbEZvcm1hdHNfSW5kZXhlZDE9Ci0KLU9TX1BpeGVsRm9ybWF0c19JbmRleGVkMj0KLQotT1NfUGl4ZWxGb3JtYXRzX0luZGV4ZWQ0PQotCi1PU19QaXhlbEZvcm1hdHNfSW5kZXhlZDg9Ci0KLU9TX1BpeGVsRm9ybWF0c19QYmdyYTMyPQotCi1PU19QaXhlbEZvcm1hdHNfUmdiMjQ9Ci0KLU9TX1BvaW50Q29sbGVjdGlvbl9BZGQ9Ci1PU19Qb2ludENvbGxlY3Rpb25fQWRkXzA9Ci1PU19Qb2ludENvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX1BvaW50X1g9Ci1PU19Qb2ludF9YXzA9Ci0KLU9TX1BvaW50X1k9Ci1PU19Qb2ludF9ZXzA9Ci0KLU9TX1ByZXNlbnRhdGlvblNvdXJjZV9Gcm9tVmlzdWFsPQotT1NfUHJlc2VudGF0aW9uU291cmNlX0Zyb21WaXN1YWxfMD0KLQotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fST0KLU9TX1Byb2dyZXNzQmFyXzFJc0luZGV0ZXJtaW5hdGVfX0lfMD0KLQotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fSVo9Ci1PU19Qcm9ncmVzc0Jhcl8xSXNJbmRldGVybWluYXRlX19JWl8wPQotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fSVpfMT0KLQotT1NfUHJvZ3Jlc3NCYXJfT3JpZW50YXRpb249Ci1PU19Qcm9ncmVzc0Jhcl9PcmllbnRhdGlvbl8wPQotT1NfUHJvZ3Jlc3NCYXJfT3JpZW50YXRpb25fMT0KLQotT1NfUmFuZ2VCYXNlXzFMYXJnZUNoYW5nZV9fST0KLU9TX1JhbmdlQmFzZV8xTGFyZ2VDaGFuZ2VfX0lfMD0KLQotT1NfUmFuZ2VCYXNlXzFMYXJnZUNoYW5nZV9fSUQ9Ci1PU19SYW5nZUJhc2VfMUxhcmdlQ2hhbmdlX19JRF8wPQotT1NfUmFuZ2VCYXNlXzFMYXJnZUNoYW5nZV9fSURfMT0KLQotT1NfUmFuZ2VCYXNlXzFNYXhpbXVtX19JPQotT1NfUmFuZ2VCYXNlXzFNYXhpbXVtX19JXzA9Ci0KLU9TX1JhbmdlQmFzZV8xTWF4aW11bV9fSUQ9Ci1PU19SYW5nZUJhc2VfMU1heGltdW1fX0lEXzA9Ci1PU19SYW5nZUJhc2VfMU1heGltdW1fX0lEXzE9Ci0KLU9TX1JhbmdlQmFzZV8xTWluaW11bV9fST0KLU9TX1JhbmdlQmFzZV8xTWluaW11bV9fSV8wPQotCi1PU19SYW5nZUJhc2VfMU1pbmltdW1fX0lEPQotT1NfUmFuZ2VCYXNlXzFNaW5pbXVtX19JRF8wPQotT1NfUmFuZ2VCYXNlXzFNaW5pbXVtX19JRF8xPQotCi1PU19SYW5nZUJhc2VfMVNtYWxsQ2hhbmdlX19JPQotT1NfUmFuZ2VCYXNlXzFTbWFsbENoYW5nZV9fSV8wPQotCi1PU19SYW5nZUJhc2VfMVNtYWxsQ2hhbmdlX19JRD0KLU9TX1JhbmdlQmFzZV8xU21hbGxDaGFuZ2VfX0lEXzA9Ci1PU19SYW5nZUJhc2VfMVNtYWxsQ2hhbmdlX19JRF8xPQotCi1PU19SYW5nZUJhc2VfMVZhbHVlX19JPQotT1NfUmFuZ2VCYXNlXzFWYWx1ZV9fSV8wPQotCi1PU19SYW5nZUJhc2VfMVZhbHVlX19JRD0KLU9TX1JhbmdlQmFzZV8xVmFsdWVfX0lEXzA9Ci1PU19SYW5nZUJhc2VfMVZhbHVlX19JRF8xPQotCi1PU19SYW5nZUJhc2VfVmFsdWVDaGFuZ2VkPQotT1NfUmFuZ2VCYXNlX1ZhbHVlQ2hhbmdlZF8wPQotT1NfUmFuZ2VCYXNlX1ZhbHVlQ2hhbmdlZF8xPQotCi1PU19SZWN0XzFIZWlnaHRfX0k9Ci1PU19SZWN0XzFIZWlnaHRfX0lfMD0KLQotT1NfUmVjdF8xSGVpZ2h0X19JRD0KLU9TX1JlY3RfMUhlaWdodF9fSURfMD0KLU9TX1JlY3RfMUhlaWdodF9fSURfMT0KLQotT1NfUmVjdF9JbnRlcnNlY3Q9Ci1PU19SZWN0X0ludGVyc2VjdF8wPQotT1NfUmVjdF9JbnRlcnNlY3RfMT0KLQotT1NfUmVjdF9Vbmlvbj0KLU9TX1JlY3RfVW5pb25fMD0KLU9TX1JlY3RfVW5pb25fMT0KLQotT1NfUmVjdF8xV2lkdGhfX0k9Ci1PU19SZWN0XzFXaWR0aF9fSV8wPQotCi1PU19SZWN0XzFXaWR0aF9fSUQ9Ci1PU19SZWN0XzFXaWR0aF9fSURfMD0KLU9TX1JlY3RfMVdpZHRoX19JRF8xPQotCi1PU19SZWN0XzFYX19JPQotT1NfUmVjdF8xWF9fSV8wPQotCi1PU19SZWN0XzFYX19JRD0KLU9TX1JlY3RfMVhfX0lEXzA9Ci1PU19SZWN0XzFYX19JRF8xPQotCi1PU19SZWN0XzFZX19JPQotT1NfUmVjdF8xWV9fSV8wPQotCi1PU19SZWN0XzFZX19JRD0KLU9TX1JlY3RfMVlfX0lEXzA9Ci1PU19SZWN0XzFZX19JRF8xPQotCi1PU19SZWdpc3RyeUtleV9HZXRTdWJLZXlOYW1lcz0KLU9TX1JlZ2lzdHJ5S2V5X0dldFN1YktleU5hbWVzXzA9Ci0KLU9TX1JlZ2lzdHJ5S2V5X0dldFZhbHVlPQotT1NfUmVnaXN0cnlLZXlfR2V0VmFsdWVfMD0KLU9TX1JlZ2lzdHJ5S2V5X0dldFZhbHVlXzE9Ci0KLU9TX1JlZ2lzdHJ5S2V5X09wZW5TdWJLZXk9Ci1PU19SZWdpc3RyeUtleV9PcGVuU3ViS2V5XzA9Ci1PU19SZWdpc3RyeUtleV9PcGVuU3ViS2V5XzE9Ci0KLU9TX1JlZ2lzdHJ5X0NsYXNzZXNSb290PQotCi1PU19SZW5kZXJPcHRpb25zX0dldEJpdG1hcFNjYWxpbmdNb2RlPQotT1NfUmVuZGVyT3B0aW9uc19HZXRCaXRtYXBTY2FsaW5nTW9kZV8wPQotCi1PU19SZW5kZXJPcHRpb25zX1NldEJpdG1hcFNjYWxpbmdNb2RlPQotT1NfUmVuZGVyT3B0aW9uc19TZXRCaXRtYXBTY2FsaW5nTW9kZV8wPQotT1NfUmVuZGVyT3B0aW9uc19TZXRCaXRtYXBTY2FsaW5nTW9kZV8xPQotCi1PU19SZW5kZXJPcHRpb25zX1NldEVkZ2VNb2RlPQotT1NfUmVuZGVyT3B0aW9uc19TZXRFZGdlTW9kZV8wPQotT1NfUmVuZGVyT3B0aW9uc19TZXRFZGdlTW9kZV8xPQotCi1PU19SZW5kZXJUYXJnZXRCaXRtYXBfUmVuZGVyPQotT1NfUmVuZGVyVGFyZ2V0Qml0bWFwX1JlbmRlcl8wPQotT1NfUmVuZGVyVGFyZ2V0Qml0bWFwX1JlbmRlcl8xPQotCi1PU19SZXBlYXRCZWhhdmlvcl9Gb3JldmVyPQotCi1PU19Sb3V0ZWRFdmVudEFyZ3NfSGFuZGxlZD0KLU9TX1JvdXRlZEV2ZW50QXJnc19IYW5kbGVkXzA9Ci1PU19Sb3V0ZWRFdmVudEFyZ3NfSGFuZGxlZF8xPQotCi1PU19Sb3V0ZWRFdmVudEFyZ3NfT3JpZ2luYWxTb3VyY2U9Ci1PU19Sb3V0ZWRFdmVudEFyZ3NfT3JpZ2luYWxTb3VyY2VfMD0KLQotT1NfUm91dGVkRXZlbnRBcmdzX1NvdXJjZT0KLU9TX1JvdXRlZEV2ZW50QXJnc19Tb3VyY2VfMD0KLQotT1NfUm91dGVkRXZlbnRBcmdzX3R5cGVpZD0KLQotT1NfUm93RGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkPQotT1NfUm93RGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkXzA9Ci1PU19Sb3dEZWZpbml0aW9uQ29sbGVjdGlvbl9BZGRfMT0KLQotT1NfUm93RGVmaW5pdGlvbl9IZWlnaHQ9Ci1PU19Sb3dEZWZpbml0aW9uX0hlaWdodF8wPQotT1NfUm93RGVmaW5pdGlvbl9IZWlnaHRfMT0KLQotT1NfUnVuX1RleHQ9Ci1PU19SdW5fVGV4dF8wPQotT1NfUnVuX1RleHRfMT0KLQotT1NfU1dUQ2FudmFzXzFWaXN1YWxfX0k9Ci1PU19TV1RDYW52YXNfMVZpc3VhbF9fSV8wPQotCi1PU19TV1RDYW52YXNfMVZpc3VhbF9fSUk9Ci1PU19TV1RDYW52YXNfMVZpc3VhbF9fSUlfMD0KLU9TX1NXVENhbnZhc18xVmlzdWFsX19JSV8xPQotCi1PU19TV1RUZXh0UnVuUHJvcGVydGllc19Gb3JlZ3JvdW5kQnJ1c2g9Ci1PU19TV1RUZXh0UnVuUHJvcGVydGllc19Gb3JlZ3JvdW5kQnJ1c2hfMD0KLU9TX1NXVFRleHRSdW5Qcm9wZXJ0aWVzX0ZvcmVncm91bmRCcnVzaF8xPQotCi1PU19TY3JvbGxCYXJfMU9yaWVudGF0aW9uX19JPQotT1NfU2Nyb2xsQmFyXzFPcmllbnRhdGlvbl9fSV8wPQotCi1PU19TY3JvbGxCYXJfMU9yaWVudGF0aW9uX19JST0KLU9TX1Njcm9sbEJhcl8xT3JpZW50YXRpb25fX0lJXzA9Ci1PU19TY3JvbGxCYXJfMU9yaWVudGF0aW9uX19JSV8xPQotCi1PU19TY3JvbGxCYXJfU2Nyb2xsPQotT1NfU2Nyb2xsQmFyX1Njcm9sbF8wPQotT1NfU2Nyb2xsQmFyX1Njcm9sbF8xPQotCi1PU19TY3JvbGxCYXJfMVZpZXdwb3J0U2l6ZV9fST0KLU9TX1Njcm9sbEJhcl8xVmlld3BvcnRTaXplX19JXzA9Ci0KLU9TX1Njcm9sbEJhcl8xVmlld3BvcnRTaXplX19JRD0KLU9TX1Njcm9sbEJhcl8xVmlld3BvcnRTaXplX19JRF8wPQotT1NfU2Nyb2xsQmFyXzFWaWV3cG9ydFNpemVfX0lEXzE9Ci0KLU9TX1Njcm9sbEJhcl90eXBlaWQ9Ci0KLU9TX1Njcm9sbEV2ZW50QXJnc19TY3JvbGxFdmVudFR5cGU9Ci1PU19TY3JvbGxFdmVudEFyZ3NfU2Nyb2xsRXZlbnRUeXBlXzA9Ci0KLU9TX1Njcm9sbFZpZXdlcl90eXBlaWQ9Ci0KLU9TX1NlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NfQWRkZWRJdGVtcz0KLU9TX1NlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NfQWRkZWRJdGVtc18wPQotCi1PU19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzX1JlbW92ZWRJdGVtcz0KLU9TX1NlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NfUmVtb3ZlZEl0ZW1zXzA9Ci0KLU9TX1NlbGVjdG9yX0lzU3luY2hyb25pemVkV2l0aEN1cnJlbnRJdGVtPQotT1NfU2VsZWN0b3JfSXNTeW5jaHJvbml6ZWRXaXRoQ3VycmVudEl0ZW1fMD0KLU9TX1NlbGVjdG9yX0lzU3luY2hyb25pemVkV2l0aEN1cnJlbnRJdGVtXzE9Ci0KLU9TX1NlbGVjdG9yXzFTZWxlY3RlZEluZGV4X19JPQotT1NfU2VsZWN0b3JfMVNlbGVjdGVkSW5kZXhfX0lfMD0KLQotT1NfU2VsZWN0b3JfMVNlbGVjdGVkSW5kZXhfX0lJPQotT1NfU2VsZWN0b3JfMVNlbGVjdGVkSW5kZXhfX0lJXzA9Ci1PU19TZWxlY3Rvcl8xU2VsZWN0ZWRJbmRleF9fSUlfMT0KLQotT1NfU2VsZWN0b3JfU2VsZWN0ZWRJdGVtPQotT1NfU2VsZWN0b3JfU2VsZWN0ZWRJdGVtXzA9Ci0KLU9TX1NlbGVjdG9yX1NlbGVjdGVkVmFsdWU9Ci1PU19TZWxlY3Rvcl9TZWxlY3RlZFZhbHVlXzA9Ci0KLU9TX1NlbGVjdG9yX1NlbGVjdGlvbkNoYW5nZWQ9Ci1PU19TZWxlY3Rvcl9TZWxlY3Rpb25DaGFuZ2VkXzA9Ci1PU19TZWxlY3Rvcl9TZWxlY3Rpb25DaGFuZ2VkXzE9Ci0KLU9TX1NldEN1cnNvclBvcz0KLU9TX1NldEN1cnNvclBvc18wPQotT1NfU2V0Q3Vyc29yUG9zXzE9Ci0KLU9TX1NldHRlckJhc2VDb2xsZWN0aW9uX0FkZD0KLU9TX1NldHRlckJhc2VDb2xsZWN0aW9uX0FkZF8wPQotT1NfU2V0dGVyQmFzZUNvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX1NoYXBlX0ZpbGw9Ci1PU19TaGFwZV9GaWxsXzA9Ci1PU19TaGFwZV9GaWxsXzE9Ci0KLU9TX1NoYXBlX1N0cm9rZT0KLU9TX1NoYXBlX1N0cm9rZV8wPQotT1NfU2hhcGVfU3Ryb2tlXzE9Ci0KLU9TX1NoYXBlX1N0cm9rZVRoaWNrbmVzcz0KLU9TX1NoYXBlX1N0cm9rZVRoaWNrbmVzc18wPQotT1NfU2hhcGVfU3Ryb2tlVGhpY2tuZXNzXzE9Ci0KLU9TX1NpemVfMUhlaWdodF9fST0KLU9TX1NpemVfMUhlaWdodF9fSV8wPQotCi1PU19TaXplXzFIZWlnaHRfX0lEPQotT1NfU2l6ZV8xSGVpZ2h0X19JRF8wPQotT1NfU2l6ZV8xSGVpZ2h0X19JRF8xPQotCi1PU19TaXplXzFXaWR0aF9fST0KLU9TX1NpemVfMVdpZHRoX19JXzA9Ci0KLU9TX1NpemVfMVdpZHRoX19JRD0KLU9TX1NpemVfMVdpZHRoX19JRF8wPQotT1NfU2l6ZV8xV2lkdGhfX0lEXzE9Ci0KLU9TX1NsaWRlcl9PcmllbnRhdGlvbj0KLU9TX1NsaWRlcl9PcmllbnRhdGlvbl8wPQotT1NfU2xpZGVyX09yaWVudGF0aW9uXzE9Ci0KLU9TX1NsaWRlcl9UaWNrRnJlcXVlbmN5PQotT1NfU2xpZGVyX1RpY2tGcmVxdWVuY3lfMD0KLU9TX1NsaWRlcl9UaWNrRnJlcXVlbmN5XzE9Ci0KLU9TX1NsaWRlcl9UaWNrUGxhY2VtZW50PQotT1NfU2xpZGVyX1RpY2tQbGFjZW1lbnRfMD0KLU9TX1NsaWRlcl9UaWNrUGxhY2VtZW50XzE9Ci0KLU9TX1N0YWNrUGFuZWxfT3JpZW50YXRpb249Ci1PU19TdGFja1BhbmVsX09yaWVudGF0aW9uXzA9Ci1PU19TdGFja1BhbmVsX09yaWVudGF0aW9uXzE9Ci0KLU9TX1N0YWNrUGFuZWxfT3JpZW50YXRpb25Qcm9wZXJ0eT0KLQotT1NfU3RhY2tQYW5lbF90eXBlaWQ9Ci0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9CZWdpbkZpZ3VyZT0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9CZWdpbkZpZ3VyZV8wPQotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0JlZ2luRmlndXJlXzE9Ci1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQmVnaW5GaWd1cmVfMj0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9CZWdpbkZpZ3VyZV8zPQotCi1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQ2xvc2U9Ci1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQ2xvc2VfMD0KLQotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0xpbmVUbz0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9MaW5lVG9fMD0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9MaW5lVG9fMT0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9MaW5lVG9fMj0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9MaW5lVG9fMz0KLQotT1NfU3RyZWFtR2VvbWV0cnlfT3Blbj0KLU9TX1N0cmVhbUdlb21ldHJ5X09wZW5fMD0KLQotT1NfU3RyaW5nX0xlbmd0aD0KLU9TX1N0cmluZ19MZW5ndGhfMD0KLQotT1NfU3RyaW5nX1RvQ2hhckFycmF5PQotT1NfU3RyaW5nX1RvQ2hhckFycmF5XzA9Ci0KLU9TX1N0eWxlX1NldHRlcnM9Ci1PU19TdHlsZV9TZXR0ZXJzXzA9Ci0KLU9TX1N5c3RlbUNvbG9yc19BY3RpdmVCb3JkZXJDb2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX0FjdGl2ZUNhcHRpb25Db2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX0FjdGl2ZUNhcHRpb25UZXh0Q29sb3I9Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sQnJ1c2g9Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sQ29sb3I9Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sRGFya0NvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfQ29udHJvbERhcmtEYXJrQ29sb3I9Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sTGlnaHRDb2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX0NvbnRyb2xUZXh0QnJ1c2g9Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sVGV4dENvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfR3JhZGllbnRBY3RpdmVDYXB0aW9uQ29sb3I9Ci0KLU9TX1N5c3RlbUNvbG9yc19HcmFkaWVudEluYWN0aXZlQ2FwdGlvbkNvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfSGlnaGxpZ2h0QnJ1c2g9Ci0KLU9TX1N5c3RlbUNvbG9yc19IaWdobGlnaHRDb2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX0hpZ2hsaWdodFRleHRDb2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX0luYWN0aXZlQ2FwdGlvbkNvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfSW5hY3RpdmVDYXB0aW9uVGV4dENvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfSW5mb0NvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfSW5mb1RleHRDb2xvcj0KLQotT1NfU3lzdGVtQ29sb3JzX1dpbmRvd0NvbG9yPQotCi1PU19TeXN0ZW1Db2xvcnNfV2luZG93VGV4dENvbG9yPQotCi1PU19TeXN0ZW1Gb250c19NZXNzYWdlRm9udEZhbWlseT0KLQotT1NfU3lzdGVtRm9udHNfTWVzc2FnZUZvbnRTaXplPQotCi1PU19TeXN0ZW1Gb250c19NZXNzYWdlRm9udFN0eWxlPQotCi1PU19TeXN0ZW1Gb250c19NZXNzYWdlRm9udFdlaWdodD0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc19IaWdoQ29udHJhc3Q9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfSG9yaXpvbnRhbFNjcm9sbEJhckJ1dHRvbldpZHRoPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX0hvcml6b250YWxTY3JvbGxCYXJIZWlnaHQ9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfUHJpbWFyeVNjcmVlbkhlaWdodD0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc19QcmltYXJ5U2NyZWVuV2lkdGg9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfVmVydGljYWxTY3JvbGxCYXJCdXR0b25IZWlnaHQ9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfVmVydGljYWxTY3JvbGxCYXJXaWR0aD0KLQotT1NfU3lzdGVtUGFyYW1ldGVyc19WaXJ0dWFsU2NyZWVuSGVpZ2h0PQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ZpcnR1YWxTY3JlZW5MZWZ0PQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ZpcnR1YWxTY3JlZW5Ub3A9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfVmlydHVhbFNjcmVlbldpZHRoPQotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1doZWVsU2Nyb2xsTGluZXM9Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfV29ya0FyZWE9Ci0KLU9TX1RhYkNvbnRyb2xfVGFiU3RyaXBQbGFjZW1lbnQ9Ci1PU19UYWJDb250cm9sX1RhYlN0cmlwUGxhY2VtZW50XzA9Ci1PU19UYWJDb250cm9sX1RhYlN0cmlwUGxhY2VtZW50XzE9Ci0KLU9TX1RhYkl0ZW1fSXNTZWxlY3RlZD0KLU9TX1RhYkl0ZW1fSXNTZWxlY3RlZF8wPQotCi1PU19UZXh0QmxvY2tfQmFja2dyb3VuZD0KLU9TX1RleHRCbG9ja19CYWNrZ3JvdW5kXzA9Ci1PU19UZXh0QmxvY2tfQmFja2dyb3VuZF8xPQotCi1PU19UZXh0QmxvY2tfQmFja2dyb3VuZFByb3BlcnR5PQotCi1PU19UZXh0QmxvY2tfRm9udEZhbWlseT0KLU9TX1RleHRCbG9ja19Gb250RmFtaWx5XzA9Ci1PU19UZXh0QmxvY2tfRm9udEZhbWlseV8xPQotCi1PU19UZXh0QmxvY2tfRm9udEZhbWlseVByb3BlcnR5PQotCi1PU19UZXh0QmxvY2tfRm9udFNpemU9Ci1PU19UZXh0QmxvY2tfRm9udFNpemVfMD0KLU9TX1RleHRCbG9ja19Gb250U2l6ZV8xPQotCi1PU19UZXh0QmxvY2tfRm9udFNpemVQcm9wZXJ0eT0KLQotT1NfVGV4dEJsb2NrX0ZvbnRTdHJldGNoPQotT1NfVGV4dEJsb2NrX0ZvbnRTdHJldGNoXzA9Ci1PU19UZXh0QmxvY2tfRm9udFN0cmV0Y2hfMT0KLQotT1NfVGV4dEJsb2NrX0ZvbnRTdHJldGNoUHJvcGVydHk9Ci0KLU9TX1RleHRCbG9ja19Gb250U3R5bGU9Ci1PU19UZXh0QmxvY2tfRm9udFN0eWxlXzA9Ci1PU19UZXh0QmxvY2tfRm9udFN0eWxlXzE9Ci0KLU9TX1RleHRCbG9ja19Gb250U3R5bGVQcm9wZXJ0eT0KLQotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHQ9Ci1PU19UZXh0QmxvY2tfRm9udFdlaWdodF8wPQotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHRfMT0KLQotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHRQcm9wZXJ0eT0KLQotT1NfVGV4dEJsb2NrX0ZvcmVncm91bmQ9Ci1PU19UZXh0QmxvY2tfRm9yZWdyb3VuZF8wPQotT1NfVGV4dEJsb2NrX0ZvcmVncm91bmRfMT0KLQotT1NfVGV4dEJsb2NrX0ZvcmVncm91bmRQcm9wZXJ0eT0KLQotT1NfVGV4dEJsb2NrX0lubGluZXM9Ci1PU19UZXh0QmxvY2tfSW5saW5lc18wPQotCi1PU19UZXh0QmxvY2tfVGV4dD0KLU9TX1RleHRCbG9ja19UZXh0XzA9Ci1PU19UZXh0QmxvY2tfVGV4dF8xPQotCi1PU19UZXh0QmxvY2tfVGV4dFByb3BlcnR5PQotCi1PU19UZXh0QmxvY2tfdHlwZWlkPQotCi1PU19UZXh0Qm91bmRzQ29sbGVjdGlvbl9DdXJyZW50PQotT1NfVGV4dEJvdW5kc0NvbGxlY3Rpb25fQ3VycmVudF8wPQotCi1PU19UZXh0Qm91bmRzQ29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yPQotT1NfVGV4dEJvdW5kc0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPQotCi1PU19UZXh0Qm91bmRzX1JlY3RhbmdsZT0KLU9TX1RleHRCb3VuZHNfUmVjdGFuZ2xlXzA9Ci0KLU9TX1RleHRCb3hCYXNlX0FjY2VwdHNSZXR1cm49Ci1PU19UZXh0Qm94QmFzZV9BY2NlcHRzUmV0dXJuXzA9Ci1PU19UZXh0Qm94QmFzZV9BY2NlcHRzUmV0dXJuXzE9Ci0KLU9TX1RleHRCb3hCYXNlX0FjY2VwdHNUYWI9Ci1PU19UZXh0Qm94QmFzZV9BY2NlcHRzVGFiXzA9Ci1PU19UZXh0Qm94QmFzZV9BY2NlcHRzVGFiXzE9Ci0KLU9TX1RleHRCb3hCYXNlX0FwcGVuZFRleHQ9Ci1PU19UZXh0Qm94QmFzZV9BcHBlbmRUZXh0XzA9Ci1PU19UZXh0Qm94QmFzZV9BcHBlbmRUZXh0XzE9Ci0KLU9TX1RleHRCb3hCYXNlX0NvcHk9Ci1PU19UZXh0Qm94QmFzZV9Db3B5XzA9Ci0KLU9TX1RleHRCb3hCYXNlX0N1dD0KLU9TX1RleHRCb3hCYXNlX0N1dF8wPQotCi1PU19UZXh0Qm94QmFzZV9Ib3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eT0KLU9TX1RleHRCb3hCYXNlX0hvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5XzA9Ci1PU19UZXh0Qm94QmFzZV9Ib3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eV8xPQotCi1PU19UZXh0Qm94QmFzZV8xSXNSZWFkT25seV9fST0KLU9TX1RleHRCb3hCYXNlXzFJc1JlYWRPbmx5X19JXzA9Ci0KLU9TX1RleHRCb3hCYXNlXzFJc1JlYWRPbmx5X19JWj0KLU9TX1RleHRCb3hCYXNlXzFJc1JlYWRPbmx5X19JWl8wPQotT1NfVGV4dEJveEJhc2VfMUlzUmVhZE9ubHlfX0laXzE9Ci0KLU9TX1RleHRCb3hCYXNlX1Bhc3RlPQotT1NfVGV4dEJveEJhc2VfUGFzdGVfMD0KLQotT1NfVGV4dEJveEJhc2VfU2Nyb2xsVG9FbmQ9Ci1PU19UZXh0Qm94QmFzZV9TY3JvbGxUb0VuZF8wPQotCi1PU19UZXh0Qm94QmFzZV9TY3JvbGxUb1ZlcnRpY2FsT2Zmc2V0PQotT1NfVGV4dEJveEJhc2VfU2Nyb2xsVG9WZXJ0aWNhbE9mZnNldF8wPQotT1NfVGV4dEJveEJhc2VfU2Nyb2xsVG9WZXJ0aWNhbE9mZnNldF8xPQotCi1PU19UZXh0Qm94QmFzZV9TZWxlY3RBbGw9Ci1PU19UZXh0Qm94QmFzZV9TZWxlY3RBbGxfMD0KLQotT1NfVGV4dEJveEJhc2VfVGV4dENoYW5nZWQ9Ci1PU19UZXh0Qm94QmFzZV9UZXh0Q2hhbmdlZF8wPQotT1NfVGV4dEJveEJhc2VfVGV4dENoYW5nZWRfMT0KLQotT1NfVGV4dEJveEJhc2VfVmVydGljYWxPZmZzZXQ9Ci1PU19UZXh0Qm94QmFzZV9WZXJ0aWNhbE9mZnNldF8wPQotCi1PU19UZXh0Qm94QmFzZV9WZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHk9Ci1PU19UZXh0Qm94QmFzZV9WZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHlfMD0KLU9TX1RleHRCb3hCYXNlX1ZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eV8xPQotCi1PU19UZXh0Qm94XzFDYXJldEluZGV4X19JPQotT1NfVGV4dEJveF8xQ2FyZXRJbmRleF9fSV8wPQotCi1PU19UZXh0Qm94XzFDYXJldEluZGV4X19JST0KLU9TX1RleHRCb3hfMUNhcmV0SW5kZXhfX0lJXzA9Ci1PU19UZXh0Qm94XzFDYXJldEluZGV4X19JSV8xPQotCi1PU19UZXh0Qm94X0dldEZpcnN0VmlzaWJsZUxpbmVJbmRleD0KLU9TX1RleHRCb3hfR2V0Rmlyc3RWaXNpYmxlTGluZUluZGV4XzA9Ci0KLU9TX1RleHRCb3hfR2V0TGluZUluZGV4RnJvbUNoYXJhY3RlckluZGV4PQotT1NfVGV4dEJveF9HZXRMaW5lSW5kZXhGcm9tQ2hhcmFjdGVySW5kZXhfMD0KLU9TX1RleHRCb3hfR2V0TGluZUluZGV4RnJvbUNoYXJhY3RlckluZGV4XzE9Ci0KLU9TX1RleHRCb3hfR2V0UmVjdEZyb21DaGFyYWN0ZXJJbmRleD0KLU9TX1RleHRCb3hfR2V0UmVjdEZyb21DaGFyYWN0ZXJJbmRleF8wPQotT1NfVGV4dEJveF9HZXRSZWN0RnJvbUNoYXJhY3RlckluZGV4XzE9Ci0KLU9TX1RleHRCb3hfTGluZUNvdW50PQotT1NfVGV4dEJveF9MaW5lQ291bnRfMD0KLQotT1NfVGV4dEJveF8xTWF4TGVuZ3RoX19JPQotT1NfVGV4dEJveF8xTWF4TGVuZ3RoX19JXzA9Ci0KLU9TX1RleHRCb3hfMU1heExlbmd0aF9fSUk9Ci1PU19UZXh0Qm94XzFNYXhMZW5ndGhfX0lJXzA9Ci1PU19UZXh0Qm94XzFNYXhMZW5ndGhfX0lJXzE9Ci0KLU9TX1RleHRCb3hfU2Nyb2xsVG9MaW5lPQotT1NfVGV4dEJveF9TY3JvbGxUb0xpbmVfMD0KLU9TX1RleHRCb3hfU2Nyb2xsVG9MaW5lXzE9Ci0KLU9TX1RleHRCb3hfU2VsZWN0PQotT1NfVGV4dEJveF9TZWxlY3RfMD0KLU9TX1RleHRCb3hfU2VsZWN0XzE9Ci1PU19UZXh0Qm94X1NlbGVjdF8yPQotCi1PU19UZXh0Qm94XzFTZWxlY3RlZFRleHRfX0k9Ci1PU19UZXh0Qm94XzFTZWxlY3RlZFRleHRfX0lfMD0KLQotT1NfVGV4dEJveF8xU2VsZWN0ZWRUZXh0X19JST0KLU9TX1RleHRCb3hfMVNlbGVjdGVkVGV4dF9fSUlfMD0KLU9TX1RleHRCb3hfMVNlbGVjdGVkVGV4dF9fSUlfMT0KLQotT1NfVGV4dEJveF8xU2VsZWN0aW9uTGVuZ3RoX19JPQotT1NfVGV4dEJveF8xU2VsZWN0aW9uTGVuZ3RoX19JXzA9Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGlvbkxlbmd0aF9fSUk9Ci1PU19UZXh0Qm94XzFTZWxlY3Rpb25MZW5ndGhfX0lJXzA9Ci1PU19UZXh0Qm94XzFTZWxlY3Rpb25MZW5ndGhfX0lJXzE9Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGlvblN0YXJ0X19JPQotT1NfVGV4dEJveF8xU2VsZWN0aW9uU3RhcnRfX0lfMD0KLQotT1NfVGV4dEJveF8xU2VsZWN0aW9uU3RhcnRfX0lJPQotT1NfVGV4dEJveF8xU2VsZWN0aW9uU3RhcnRfX0lJXzA9Ci1PU19UZXh0Qm94XzFTZWxlY3Rpb25TdGFydF9fSUlfMT0KLQotT1NfVGV4dEJveF8xVGV4dF9fST0KLU9TX1RleHRCb3hfMVRleHRfX0lfMD0KLQotT1NfVGV4dEJveF8xVGV4dF9fSUk9Ci1PU19UZXh0Qm94XzFUZXh0X19JSV8wPQotT1NfVGV4dEJveF8xVGV4dF9fSUlfMT0KLQotT1NfVGV4dEJveF9UZXh0V3JhcHBpbmc9Ci1PU19UZXh0Qm94X1RleHRXcmFwcGluZ18wPQotT1NfVGV4dEJveF9UZXh0V3JhcHBpbmdfMT0KLQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX0NvbnRyb2xUZXh0PQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX0NvbnRyb2xUZXh0XzA9Ci0KLU9TX1RleHRDb21wb3NpdGlvbkV2ZW50QXJnc19IYW5kbGVkPQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX0hhbmRsZWRfMD0KLU9TX1RleHRDb21wb3NpdGlvbkV2ZW50QXJnc19IYW5kbGVkXzE9Ci0KLU9TX1RleHRDb21wb3NpdGlvbkV2ZW50QXJnc19TeXN0ZW1UZXh0PQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX1N5c3RlbVRleHRfMD0KLQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX1RleHQ9Ci1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfVGV4dF8wPQotCi1PU19UZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25fQWRkPQotT1NfVGV4dERlY29yYXRpb25Db2xsZWN0aW9uX0FkZF8wPQotT1NfVGV4dERlY29yYXRpb25Db2xsZWN0aW9uX0FkZF8xPQotCi1PU19UZXh0RGVjb3JhdGlvbnNfU3RyaWtldGhyb3VnaD0KLQotT1NfVGV4dERlY29yYXRpb25zX1VuZGVybGluZT0KLQotT1NfVGV4dEZvcm1hdHRlcl9DcmVhdGU9Ci0KLU9TX1RleHRGb3JtYXR0ZXJfRm9ybWF0TGluZT0KLU9TX1RleHRGb3JtYXR0ZXJfRm9ybWF0TGluZV8wPQotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lXzE9Ci1PU19UZXh0Rm9ybWF0dGVyX0Zvcm1hdExpbmVfMj0KLU9TX1RleHRGb3JtYXR0ZXJfRm9ybWF0TGluZV8zPQotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lXzQ9Ci1PU19UZXh0Rm9ybWF0dGVyX0Zvcm1hdExpbmVfNT0KLQotT1NfVGV4dExpbmVfQmFzZWxpbmU9Ci1PU19UZXh0TGluZV9CYXNlbGluZV8wPQotCi1PU19UZXh0TGluZV9EcmF3PQotT1NfVGV4dExpbmVfRHJhd18wPQotT1NfVGV4dExpbmVfRHJhd18xPQotT1NfVGV4dExpbmVfRHJhd18yPQotT1NfVGV4dExpbmVfRHJhd18zPQotCi1PU19UZXh0TGluZV9HZXRDaGFyYWN0ZXJIaXRGcm9tRGlzdGFuY2U9Ci1PU19UZXh0TGluZV9HZXRDaGFyYWN0ZXJIaXRGcm9tRGlzdGFuY2VfMD0KLU9TX1RleHRMaW5lX0dldENoYXJhY3RlckhpdEZyb21EaXN0YW5jZV8xPQotCi1PU19UZXh0TGluZV9HZXREaXN0YW5jZUZyb21DaGFyYWN0ZXJIaXQ9Ci1PU19UZXh0TGluZV9HZXREaXN0YW5jZUZyb21DaGFyYWN0ZXJIaXRfMD0KLU9TX1RleHRMaW5lX0dldERpc3RhbmNlRnJvbUNoYXJhY3RlckhpdF8xPQotCi1PU19UZXh0TGluZV9HZXRJbmRleGVkR2x5cGhSdW5zPQotT1NfVGV4dExpbmVfR2V0SW5kZXhlZEdseXBoUnVuc18wPQotCi1PU19UZXh0TGluZV9HZXROZXh0Q2FyZXRDaGFyYWN0ZXJIaXQ9Ci1PU19UZXh0TGluZV9HZXROZXh0Q2FyZXRDaGFyYWN0ZXJIaXRfMD0KLU9TX1RleHRMaW5lX0dldE5leHRDYXJldENoYXJhY3RlckhpdF8xPQotCi1PU19UZXh0TGluZV9HZXRQcmV2aW91c0NhcmV0Q2hhcmFjdGVySGl0PQotT1NfVGV4dExpbmVfR2V0UHJldmlvdXNDYXJldENoYXJhY3RlckhpdF8wPQotT1NfVGV4dExpbmVfR2V0UHJldmlvdXNDYXJldENoYXJhY3RlckhpdF8xPQotCi1PU19UZXh0TGluZV9HZXRUZXh0Qm91bmRzPQotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kc18wPQotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kc18xPQotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kc18yPQotCi1PU19UZXh0TGluZV9HZXRUZXh0TGluZUJyZWFrPQotT1NfVGV4dExpbmVfR2V0VGV4dExpbmVCcmVha18wPQotCi1PU19UZXh0TGluZV9IZWlnaHQ9Ci1PU19UZXh0TGluZV9IZWlnaHRfMD0KLQotT1NfVGV4dExpbmVfTGVuZ3RoPQotT1NfVGV4dExpbmVfTGVuZ3RoXzA9Ci0KLU9TX1RleHRMaW5lX05ld2xpbmVMZW5ndGg9Ci1PU19UZXh0TGluZV9OZXdsaW5lTGVuZ3RoXzA9Ci0KLU9TX1RleHRMaW5lX1N0YXJ0PQotT1NfVGV4dExpbmVfU3RhcnRfMD0KLQotT1NfVGV4dExpbmVfV2lkdGg9Ci1PU19UZXh0TGluZV9XaWR0aF8wPQotCi1PU19UZXh0TGluZV9XaWR0aEluY2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZT0KLU9TX1RleHRMaW5lX1dpZHRoSW5jbHVkaW5nVHJhaWxpbmdXaGl0ZXNwYWNlXzA9Ci0KLU9TX1RleHRUYWJQcm9wZXJ0aWVzQ29sbGVjdGlvbl9BZGQ9Ci1PU19UZXh0VGFiUHJvcGVydGllc0NvbGxlY3Rpb25fQWRkXzA9Ci1PU19UZXh0VGFiUHJvcGVydGllc0NvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRYPQotT1NfVGlsZUJydXNoX0FsaWdubWVudFhfMD0KLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRYXzE9Ci0KLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRZPQotT1NfVGlsZUJydXNoX0FsaWdubWVudFlfMD0KLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRZXzE9Ci0KLU9TX1RpbGVCcnVzaF9TdHJldGNoPQotT1NfVGlsZUJydXNoX1N0cmV0Y2hfMD0KLU9TX1RpbGVCcnVzaF9TdHJldGNoXzE9Ci0KLU9TX1RpbGVCcnVzaF9UaWxlTW9kZT0KLU9TX1RpbGVCcnVzaF9UaWxlTW9kZV8wPQotT1NfVGlsZUJydXNoX1RpbGVNb2RlXzE9Ci0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydD0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydF8wPQotT1NfVGlsZUJydXNoX1ZpZXdwb3J0XzE9Ci0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydFVuaXRzPQotT1NfVGlsZUJydXNoX1ZpZXdwb3J0VW5pdHNfMD0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydFVuaXRzXzE9Ci0KLU9TX1RpbWVTcGFuX0Zyb21NaWxsaXNlY29uZHM9Ci1PU19UaW1lU3Bhbl9Gcm9tTWlsbGlzZWNvbmRzXzA9Ci0KLU9TX1RpbWVsaW5lX0F1dG9SZXZlcnNlPQotT1NfVGltZWxpbmVfQXV0b1JldmVyc2VfMD0KLU9TX1RpbWVsaW5lX0F1dG9SZXZlcnNlXzE9Ci0KLU9TX1RpbWVsaW5lX0R1cmF0aW9uPQotT1NfVGltZWxpbmVfRHVyYXRpb25fMD0KLU9TX1RpbWVsaW5lX0R1cmF0aW9uXzE9Ci0KLU9TX1RpbWVsaW5lX1JlcGVhdEJlaGF2aW9yPQotT1NfVGltZWxpbmVfUmVwZWF0QmVoYXZpb3JfMD0KLU9TX1RpbWVsaW5lX1JlcGVhdEJlaGF2aW9yXzE9Ci0KLU9TX1RvVW5pY29kZT0KLU9TX1RvVW5pY29kZV8wPQotT1NfVG9Vbmljb2RlXzE9Ci1PU19Ub1VuaWNvZGVfMj0KLU9TX1RvVW5pY29kZV8zPQotT1NfVG9Vbmljb2RlXzQ9Ci1PU19Ub1VuaWNvZGVfNT0KLQotT1NfVG9nZ2xlQnV0dG9uX0NoZWNrZWQ9Ci1PU19Ub2dnbGVCdXR0b25fQ2hlY2tlZF8wPQotT1NfVG9nZ2xlQnV0dG9uX0NoZWNrZWRfMT0KLQotT1NfVG9nZ2xlQnV0dG9uX0NoZWNrZWRFdmVudD0KLQotT1NfVG9nZ2xlQnV0dG9uX0luZGV0ZXJtaW5hdGVFdmVudD0KLQotT1NfVG9nZ2xlQnV0dG9uXzFJc0NoZWNrZWRfX0k9Ci1PU19Ub2dnbGVCdXR0b25fMUlzQ2hlY2tlZF9fSV8wPQotCi1PU19Ub2dnbGVCdXR0b25fMUlzQ2hlY2tlZF9fSVo9Ci1PU19Ub2dnbGVCdXR0b25fMUlzQ2hlY2tlZF9fSVpfMD0KLU9TX1RvZ2dsZUJ1dHRvbl8xSXNDaGVja2VkX19JWl8xPQotCi1PU19Ub2dnbGVCdXR0b25fSXNDaGVja2VkTnVsbFNldHRlcj0KLU9TX1RvZ2dsZUJ1dHRvbl9Jc0NoZWNrZWROdWxsU2V0dGVyXzA9Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9Jc1RocmVlU3RhdGVQcm9wZXJ0eT0KLQotT1NfVG9nZ2xlQnV0dG9uX1VuY2hlY2tlZD0KLU9TX1RvZ2dsZUJ1dHRvbl9VbmNoZWNrZWRfMD0KLU9TX1RvZ2dsZUJ1dHRvbl9VbmNoZWNrZWRfMT0KLQotT1NfVG9nZ2xlQnV0dG9uX1VuY2hlY2tlZEV2ZW50PQotCi1PU19Ub29sQmFyVHJheV9Jc0xvY2tlZD0KLU9TX1Rvb2xCYXJUcmF5X0lzTG9ja2VkXzA9Ci1PU19Ub29sQmFyVHJheV9Jc0xvY2tlZF8xPQotCi1PU19Ub29sQmFyVHJheV9PcmllbnRhdGlvbj0KLU9TX1Rvb2xCYXJUcmF5X09yaWVudGF0aW9uXzA9Ci1PU19Ub29sQmFyVHJheV9PcmllbnRhdGlvbl8xPQotCi1PU19Ub29sQmFyVHJheV9Ub29sQmFycz0KLU9TX1Rvb2xCYXJUcmF5X1Rvb2xCYXJzXzA9Ci0KLU9TX1Rvb2xCYXJfU2V0T3ZlcmZsb3dNb2RlPQotT1NfVG9vbEJhcl9TZXRPdmVyZmxvd01vZGVfMD0KLU9TX1Rvb2xCYXJfU2V0T3ZlcmZsb3dNb2RlXzE9Ci0KLU9TX1RyYW5zZm9ybUNvbGxlY3Rpb25fQWRkPQotT1NfVHJhbnNmb3JtQ29sbGVjdGlvbl9BZGRfMD0KLU9TX1RyYW5zZm9ybUNvbGxlY3Rpb25fQWRkXzE9Ci0KLU9TX1RyYW5zZm9ybUdyb3VwX0NoaWxkcmVuPQotT1NfVHJhbnNmb3JtR3JvdXBfQ2hpbGRyZW5fMD0KLQotT1NfVHJhbnNmb3JtX0Nsb25lPQotT1NfVHJhbnNmb3JtX0Nsb25lXzA9Ci0KLU9TX1RyZWVWaWV3SXRlbV9Db2xsYXBzZWRFdmVudD0KLQotT1NfVHJlZVZpZXdJdGVtX0V4cGFuZGVkRXZlbnQ9Ci0KLU9TX1RyZWVWaWV3SXRlbV8xSXNFeHBhbmRlZF9fST0KLU9TX1RyZWVWaWV3SXRlbV8xSXNFeHBhbmRlZF9fSV8wPQotCi1PU19UcmVlVmlld0l0ZW1fMUlzRXhwYW5kZWRfX0laPQotT1NfVHJlZVZpZXdJdGVtXzFJc0V4cGFuZGVkX19JWl8wPQotT1NfVHJlZVZpZXdJdGVtXzFJc0V4cGFuZGVkX19JWl8xPQotCi1PU19UcmVlVmlld0l0ZW1fSXNTZWxlY3RlZD0KLU9TX1RyZWVWaWV3SXRlbV9Jc1NlbGVjdGVkXzA9Ci1PU19UcmVlVmlld0l0ZW1fSXNTZWxlY3RlZF8xPQotCi1PU19UcmVlVmlld19TZWxlY3RlZEl0ZW09Ci1PU19UcmVlVmlld19TZWxlY3RlZEl0ZW1fMD0KLQotT1NfVHJlZVZpZXdfU2VsZWN0ZWRJdGVtQ2hhbmdlZD0KLU9TX1RyZWVWaWV3X1NlbGVjdGVkSXRlbUNoYW5nZWRfMD0KLU9TX1RyZWVWaWV3X1NlbGVjdGVkSXRlbUNoYW5nZWRfMT0KLQotT1NfVHJlZVZpZXdfdHlwZWlkPQotCi1PU19UeXBlQ29udmVydGVyX0NvbnZlcnRGcm9tU3RyaW5nPQotT1NfVHlwZUNvbnZlcnRlcl9Db252ZXJ0RnJvbVN0cmluZ18wPQotT1NfVHlwZUNvbnZlcnRlcl9Db252ZXJ0RnJvbVN0cmluZ18xPQotCi1PU19UeXBlQ29udmVydGVyX0NvbnZlcnRUb1N0cmluZz0KLU9TX1R5cGVDb252ZXJ0ZXJfQ29udmVydFRvU3RyaW5nXzA9Ci1PU19UeXBlQ29udmVydGVyX0NvbnZlcnRUb1N0cmluZ18xPQotCi1PU19UeXBlRGVzY3JpcHRvcl9HZXRDb252ZXJ0ZXI9Ci1PU19UeXBlRGVzY3JpcHRvcl9HZXRDb252ZXJ0ZXJfMD0KLQotT1NfVHlwZV9GdWxsTmFtZT0KLU9TX1R5cGVfRnVsbE5hbWVfMD0KLQotT1NfVHlwZV9Jc0luc3RhbmNlT2ZUeXBlPQotT1NfVHlwZV9Jc0luc3RhbmNlT2ZUeXBlXzA9Ci1PU19UeXBlX0lzSW5zdGFuY2VPZlR5cGVfMT0KLQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0NvdW50PQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0NvdW50XzA9Ci0KLU9TX1R5cGVmYWNlQ29sbGVjdGlvbl9DdXJyZW50PQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0N1cnJlbnRfMD0KLQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0dldEVudW1lcmF0b3I9Ci1PU19UeXBlZmFjZUNvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPQotCi1PU19UeXBlZmFjZV9Gb250RmFtaWx5PQotT1NfVHlwZWZhY2VfRm9udEZhbWlseV8wPQotCi1PU19UeXBlZmFjZV9TdHJldGNoPQotT1NfVHlwZWZhY2VfU3RyZXRjaF8wPQotCi1PU19UeXBlZmFjZV9TdHlsZT0KLU9TX1R5cGVmYWNlX1N0eWxlXzA9Ci0KLU9TX1R5cGVmYWNlX1dlaWdodD0KLU9TX1R5cGVmYWNlX1dlaWdodF8wPQotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0FkZD0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQWRkXzA9Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0FkZF8xPQotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0NvbnRhaW5zPQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9Db250YWluc18wPQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9Db250YWluc18xPQotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0NvdW50PQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9Db3VudF8wPQotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0N1cnJlbnQ9Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0N1cnJlbnRfMD0KLQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yPQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yXzA9Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5kZXhPZj0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5kZXhPZl8wPQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbmRleE9mXzE9Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5zZXJ0PQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbnNlcnRfMD0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5zZXJ0XzE9Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0luc2VydF8yPQotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX1JlbW92ZT0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fUmVtb3ZlXzA9Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX1JlbW92ZV8xPQotCi1PU19VSUVsZW1lbnRfQWRkSGFuZGxlcj0KLU9TX1VJRWxlbWVudF9BZGRIYW5kbGVyXzA9Ci1PU19VSUVsZW1lbnRfQWRkSGFuZGxlcl8xPQotT1NfVUlFbGVtZW50X0FkZEhhbmRsZXJfMj0KLQotT1NfVUlFbGVtZW50X0JlZ2luQW5pbWF0aW9uPQotT1NfVUlFbGVtZW50X0JlZ2luQW5pbWF0aW9uXzA9Ci1PU19VSUVsZW1lbnRfQmVnaW5BbmltYXRpb25fMT0KLU9TX1VJRWxlbWVudF9CZWdpbkFuaW1hdGlvbl8yPQotCi1PU19VSUVsZW1lbnRfQ2FwdHVyZU1vdXNlPQotT1NfVUlFbGVtZW50X0NhcHR1cmVNb3VzZV8wPQotCi1PU19VSUVsZW1lbnRfQ2xpcD0KLU9TX1VJRWxlbWVudF9DbGlwXzA9Ci1PU19VSUVsZW1lbnRfQ2xpcF8xPQotCi1PU19VSUVsZW1lbnRfQ2xpcFRvQm91bmRzPQotT1NfVUlFbGVtZW50X0NsaXBUb0JvdW5kc18wPQotT1NfVUlFbGVtZW50X0NsaXBUb0JvdW5kc18xPQotCi1PU19VSUVsZW1lbnRfRGVzaXJlZFNpemU9Ci1PU19VSUVsZW1lbnRfRGVzaXJlZFNpemVfMD0KLQotT1NfVUlFbGVtZW50X0ZvY3VzPQotT1NfVUlFbGVtZW50X0ZvY3VzXzA9Ci0KLU9TX1VJRWxlbWVudF9Gb2N1c2FibGU9Ci1PU19VSUVsZW1lbnRfRm9jdXNhYmxlXzA9Ci1PU19VSUVsZW1lbnRfRm9jdXNhYmxlXzE9Ci0KLU9TX1VJRWxlbWVudF9JbnB1dEhpdFRlc3Q9Ci1PU19VSUVsZW1lbnRfSW5wdXRIaXRUZXN0XzA9Ci1PU19VSUVsZW1lbnRfSW5wdXRIaXRUZXN0XzE9Ci0KLU9TX1VJRWxlbWVudF9JbnZhbGlkYXRlVmlzdWFsPQotT1NfVUlFbGVtZW50X0ludmFsaWRhdGVWaXN1YWxfMD0KLQotT1NfVUlFbGVtZW50XzFJc0VuYWJsZWRfX0k9Ci1PU19VSUVsZW1lbnRfMUlzRW5hYmxlZF9fSV8wPQotCi1PU19VSUVsZW1lbnRfMUlzRW5hYmxlZF9fSVo9Ci1PU19VSUVsZW1lbnRfMUlzRW5hYmxlZF9fSVpfMD0KLU9TX1VJRWxlbWVudF8xSXNFbmFibGVkX19JWl8xPQotCi1PU19VSUVsZW1lbnRfSXNGb2N1c2VkPQotT1NfVUlFbGVtZW50X0lzRm9jdXNlZF8wPQotCi1PU19VSUVsZW1lbnRfSXNLZXlib2FyZEZvY3VzZWQ9Ci1PU19VSUVsZW1lbnRfSXNLZXlib2FyZEZvY3VzZWRfMD0KLQotT1NfVUlFbGVtZW50X0lzTW91c2VPdmVyPQotT1NfVUlFbGVtZW50X0lzTW91c2VPdmVyXzA9Ci0KLU9TX1VJRWxlbWVudF9Jc1Zpc2libGU9Ci1PU19VSUVsZW1lbnRfSXNWaXNpYmxlXzA9Ci0KLU9TX1VJRWxlbWVudF9LZXlEb3duPQotT1NfVUlFbGVtZW50X0tleURvd25fMD0KLU9TX1VJRWxlbWVudF9LZXlEb3duXzE9Ci0KLU9TX1VJRWxlbWVudF9LZXlVcD0KLU9TX1VJRWxlbWVudF9LZXlVcF8wPQotT1NfVUlFbGVtZW50X0tleVVwXzE9Ci0KLU9TX1VJRWxlbWVudF9NZWFzdXJlPQotT1NfVUlFbGVtZW50X01lYXN1cmVfMD0KLU9TX1VJRWxlbWVudF9NZWFzdXJlXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZURvd249Ci1PU19VSUVsZW1lbnRfTW91c2VEb3duXzA9Ci1PU19VSUVsZW1lbnRfTW91c2VEb3duXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZUVudGVyPQotT1NfVUlFbGVtZW50X01vdXNlRW50ZXJfMD0KLU9TX1VJRWxlbWVudF9Nb3VzZUVudGVyXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZUxlYXZlPQotT1NfVUlFbGVtZW50X01vdXNlTGVhdmVfMD0KLU9TX1VJRWxlbWVudF9Nb3VzZUxlYXZlXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZU1vdmU9Ci1PU19VSUVsZW1lbnRfTW91c2VNb3ZlXzA9Ci1PU19VSUVsZW1lbnRfTW91c2VNb3ZlXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZVVwPQotT1NfVUlFbGVtZW50X01vdXNlVXBfMD0KLU9TX1VJRWxlbWVudF9Nb3VzZVVwXzE9Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZVdoZWVsPQotT1NfVUlFbGVtZW50X01vdXNlV2hlZWxfMD0KLU9TX1VJRWxlbWVudF9Nb3VzZVdoZWVsXzE9Ci0KLU9TX1VJRWxlbWVudF9PcGFjaXR5UHJvcGVydHk9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3R290S2V5Ym9hcmRGb2N1cz0KLU9TX1VJRWxlbWVudF9QcmV2aWV3R290S2V5Ym9hcmRGb2N1c18wPQotT1NfVUlFbGVtZW50X1ByZXZpZXdHb3RLZXlib2FyZEZvY3VzXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TG9zdEtleWJvYXJkRm9jdXM9Ci1PU19VSUVsZW1lbnRfUHJldmlld0xvc3RLZXlib2FyZEZvY3VzXzA9Ci1PU19VSUVsZW1lbnRfUHJldmlld0xvc3RLZXlib2FyZEZvY3VzXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VEb3duPQotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZURvd25fMD0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VEb3duXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VNb3ZlPQotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZU1vdmVfMD0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VNb3ZlXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VVcD0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VVcF8wPQotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZVVwXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VXaGVlbD0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VXaGVlbF8wPQotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZVdoZWVsXzE9Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3VGV4dElucHV0PQotT1NfVUlFbGVtZW50X1ByZXZpZXdUZXh0SW5wdXRfMD0KLU9TX1VJRWxlbWVudF9QcmV2aWV3VGV4dElucHV0XzE9Ci0KLU9TX1VJRWxlbWVudF9SZWxlYXNlTW91c2VDYXB0dXJlPQotT1NfVUlFbGVtZW50X1JlbGVhc2VNb3VzZUNhcHR1cmVfMD0KLQotT1NfVUlFbGVtZW50X1RleHRJbnB1dD0KLU9TX1VJRWxlbWVudF9UZXh0SW5wdXRfMD0KLU9TX1VJRWxlbWVudF9UZXh0SW5wdXRfMT0KLQotT1NfVUlFbGVtZW50X1RyYW5zbGF0ZVBvaW50PQotT1NfVUlFbGVtZW50X1RyYW5zbGF0ZVBvaW50XzA9Ci1PU19VSUVsZW1lbnRfVHJhbnNsYXRlUG9pbnRfMT0KLU9TX1VJRWxlbWVudF9UcmFuc2xhdGVQb2ludF8yPQotCi1PU19VSUVsZW1lbnRfVXBkYXRlTGF5b3V0PQotT1NfVUlFbGVtZW50X1VwZGF0ZUxheW91dF8wPQotCi1PU19VSUVsZW1lbnRfMVZpc2liaWxpdHlfX0k9Ci1PU19VSUVsZW1lbnRfMVZpc2liaWxpdHlfX0lfMD0KLQotT1NfVUlFbGVtZW50XzFWaXNpYmlsaXR5X19JQj0KLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fSUJfMD0KLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fSUJfMT0KLQotT1NfVUlFbGVtZW50X1Zpc2liaWxpdHlQcm9wZXJ0eT0KLQotT1NfVmlydHVhbGl6aW5nU3RhY2tQYW5lbF9WZXJ0aWNhbE9mZnNldD0KLU9TX1ZpcnR1YWxpemluZ1N0YWNrUGFuZWxfVmVydGljYWxPZmZzZXRfMD0KLQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZD0KLU9TX1Zpc3VhbFRyZWVIZWxwZXJfR2V0Q2hpbGRfMD0KLU9TX1Zpc3VhbFRyZWVIZWxwZXJfR2V0Q2hpbGRfMT0KLQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZHJlbkNvdW50PQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZHJlbkNvdW50XzA9Ci0KLU9TX1Zpc3VhbFRyZWVIZWxwZXJfR2V0UGFyZW50PQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRQYXJlbnRfMD0KLQotT1NfVmlzdWFsX1BvaW50RnJvbVNjcmVlbj0KLU9TX1Zpc3VhbF9Qb2ludEZyb21TY3JlZW5fMD0KLU9TX1Zpc3VhbF9Qb2ludEZyb21TY3JlZW5fMT0KLQotT1NfVmlzdWFsX1BvaW50VG9TY3JlZW49Ci1PU19WaXN1YWxfUG9pbnRUb1NjcmVlbl8wPQotT1NfVmlzdWFsX1BvaW50VG9TY3JlZW5fMT0KLQotT1NfV2luZG93Q29sbGVjdGlvbl9Db3VudD0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fQ291bnRfMD0KLQotT1NfV2luZG93Q29sbGVjdGlvbl9DdXJyZW50PQotT1NfV2luZG93Q29sbGVjdGlvbl9DdXJyZW50XzA9Ci0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcj0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPQotCi1PU19XaW5kb3dfQWN0aXZhdGU9Ci1PU19XaW5kb3dfQWN0aXZhdGVfMD0KLQotT1NfV2luZG93X0FjdGl2YXRlZD0KLU9TX1dpbmRvd19BY3RpdmF0ZWRfMD0KLU9TX1dpbmRvd19BY3RpdmF0ZWRfMT0KLQotT1NfV2luZG93X0FsbG93c1RyYW5zcGFyZW5jeT0KLU9TX1dpbmRvd19BbGxvd3NUcmFuc3BhcmVuY3lfMD0KLU9TX1dpbmRvd19BbGxvd3NUcmFuc3BhcmVuY3lfMT0KLQotT1NfV2luZG93X0Nsb3NlPQotT1NfV2luZG93X0Nsb3NlXzA9Ci0KLU9TX1dpbmRvd19DbG9zaW5nPQotT1NfV2luZG93X0Nsb3NpbmdfMD0KLU9TX1dpbmRvd19DbG9zaW5nXzE9Ci0KLU9TX1dpbmRvd19EZWFjdGl2YXRlZD0KLU9TX1dpbmRvd19EZWFjdGl2YXRlZF8wPQotT1NfV2luZG93X0RlYWN0aXZhdGVkXzE9Ci0KLU9TX1dpbmRvd19IaWRlPQotT1NfV2luZG93X0hpZGVfMD0KLQotT1NfV2luZG93X0ljb249Ci1PU19XaW5kb3dfSWNvbl8wPQotT1NfV2luZG93X0ljb25fMT0KLQotT1NfV2luZG93X0lzQWN0aXZlPQotT1NfV2luZG93X0lzQWN0aXZlXzA9Ci0KLU9TX1dpbmRvd18xTGVmdF9fST0KLU9TX1dpbmRvd18xTGVmdF9fSV8wPQotCi1PU19XaW5kb3dfMUxlZnRfX0lEPQotT1NfV2luZG93XzFMZWZ0X19JRF8wPQotT1NfV2luZG93XzFMZWZ0X19JRF8xPQotCi1PU19XaW5kb3dfTG9jYXRpb25DaGFuZ2VkPQotT1NfV2luZG93X0xvY2F0aW9uQ2hhbmdlZF8wPQotT1NfV2luZG93X0xvY2F0aW9uQ2hhbmdlZF8xPQotCi1PU19XaW5kb3dfT3duZXI9Ci1PU19XaW5kb3dfT3duZXJfMD0KLU9TX1dpbmRvd19Pd25lcl8xPQotCi1PU19XaW5kb3dfUmVzaXplTW9kZT0KLU9TX1dpbmRvd19SZXNpemVNb2RlXzA9Ci1PU19XaW5kb3dfUmVzaXplTW9kZV8xPQotCi1PU19XaW5kb3dfU2hvdz0KLU9TX1dpbmRvd19TaG93XzA9Ci0KLU9TX1dpbmRvd19TaG93SW5UYXNrYmFyPQotT1NfV2luZG93X1Nob3dJblRhc2tiYXJfMD0KLU9TX1dpbmRvd19TaG93SW5UYXNrYmFyXzE9Ci0KLU9TX1dpbmRvd18xVGl0bGVfX0k9Ci1PU19XaW5kb3dfMVRpdGxlX19JXzA9Ci0KLU9TX1dpbmRvd18xVGl0bGVfX0lJPQotT1NfV2luZG93XzFUaXRsZV9fSUlfMD0KLU9TX1dpbmRvd18xVGl0bGVfX0lJXzE9Ci0KLU9TX1dpbmRvd18xVG9wX19JPQotT1NfV2luZG93XzFUb3BfX0lfMD0KLQotT1NfV2luZG93XzFUb3BfX0lEPQotT1NfV2luZG93XzFUb3BfX0lEXzA9Ci1PU19XaW5kb3dfMVRvcF9fSURfMT0KLQotT1NfV2luZG93X1RvcG1vc3Q9Ci1PU19XaW5kb3dfVG9wbW9zdF8wPQotT1NfV2luZG93X1RvcG1vc3RfMT0KLQotT1NfV2luZG93XzFXaW5kb3dTdGF0ZV9fST0KLU9TX1dpbmRvd18xV2luZG93U3RhdGVfX0lfMD0KLQotT1NfV2luZG93XzFXaW5kb3dTdGF0ZV9fSUk9Ci1PU19XaW5kb3dfMVdpbmRvd1N0YXRlX19JSV8wPQotT1NfV2luZG93XzFXaW5kb3dTdGF0ZV9fSUlfMT0KLQotT1NfV2luZG93X1dpbmRvd1N0eWxlPQotT1NfV2luZG93X1dpbmRvd1N0eWxlXzA9Ci1PU19XaW5kb3dfV2luZG93U3R5bGVfMT0KLQotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzPQotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzXzA9Ci1PU19Xcml0ZWFibGVCaXRtYXBfV3JpdGVQaXhlbHNfMT0KLU9TX1dyaXRlYWJsZUJpdG1hcF9Xcml0ZVBpeGVsc18yPQotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzXzM9Ci1PU19Xcml0ZWFibGVCaXRtYXBfV3JpdGVQaXhlbHNfND0KLQotT1NfZ2NuZXdfQWNjZXNzVGV4dD0KLQotT1NfZ2NuZXdfQXBwbGljYXRpb249Ci0KLU9TX2djbmV3X0FyY1NlZ21lbnQ9Ci1PU19nY25ld19BcmNTZWdtZW50XzA9Ci1PU19nY25ld19BcmNTZWdtZW50XzE9Ci1PU19nY25ld19BcmNTZWdtZW50XzI9Ci1PU19nY25ld19BcmNTZWdtZW50XzM9Ci1PU19nY25ld19BcmNTZWdtZW50XzQ9Ci1PU19nY25ld19BcmNTZWdtZW50XzU9Ci0KLU9TX2djbmV3X0JlemllclNlZ21lbnQ9Ci1PU19nY25ld19CZXppZXJTZWdtZW50XzA9Ci1PU19nY25ld19CZXppZXJTZWdtZW50XzE9Ci1PU19nY25ld19CZXppZXJTZWdtZW50XzI9Ci1PU19nY25ld19CZXppZXJTZWdtZW50XzM9Ci0KLU9TX2djbmV3XzFCaW5kaW5nX189Ci0KLU9TX2djbmV3XzFCaW5kaW5nX19JPQotT1NfZ2NuZXdfMUJpbmRpbmdfX0lfMD0KLQotT1NfZ2NuZXdfQml0bWFwPQotT1NfZ2NuZXdfQml0bWFwXzA9Ci1PU19nY25ld19CaXRtYXBfMT0KLU9TX2djbmV3X0JpdG1hcF8yPQotT1NfZ2NuZXdfQml0bWFwXzM9Ci1PU19nY25ld19CaXRtYXBfND0KLQotT1NfZ2NuZXdfQml0bWFwSW1hZ2U9Ci0KLU9TX2djbmV3X0JpdG1hcFBhbGV0dGU9Ci1PU19nY25ld19CaXRtYXBQYWxldHRlXzA9Ci0KLU9TX2djbmV3X0J1dHRvbj0KLQotT1NfZ2NuZXdfQ2FuY2VsRXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfQ2FuY2VsRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19DYW5jZWxFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfQ2FudmFzPQotCi1PU19nY25ld19DaGFyYWN0ZXJIaXQ9Ci1PU19nY25ld19DaGFyYWN0ZXJIaXRfMD0KLU9TX2djbmV3X0NoYXJhY3RlckhpdF8xPQotCi1PU19nY25ld19DaGVja0JveD0KLQotT1NfZ2NuZXdfQ29sb3JEaWFsb2c9Ci0KLU9TX2djbmV3X0NvbG9yTGlzdD0KLU9TX2djbmV3X0NvbG9yTGlzdF8wPQotCi1PU19nY25ld19Db2x1bW5EZWZpbml0aW9uPQotCi1PU19nY25ld19Db21iaW5lZEdlb21ldHJ5PQotT1NfZ2NuZXdfQ29tYmluZWRHZW9tZXRyeV8wPQotT1NfZ2NuZXdfQ29tYmluZWRHZW9tZXRyeV8xPQotT1NfZ2NuZXdfQ29tYmluZWRHZW9tZXRyeV8yPQotCi1PU19nY25ld19Db21ib0JveD0KLQotT1NfZ2NuZXdfQ29tYm9Cb3hJdGVtPQotCi1PU19nY25ld19Db21wb3NpdGVDb2xsZWN0aW9uPQotCi1PU19nY25ld19Db250ZW50Q29udHJvbD0KLQotT1NfZ2NuZXdfQ29udGV4dE1lbnU9Ci0KLU9TX2djbmV3X0NvbnRleHRNZW51RXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfQ29udGV4dE1lbnVFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0NvbnRyb2xUZW1wbGF0ZT0KLQotT1NfZ2NuZXdfQ3JvcHBlZEJpdG1hcD0KLU9TX2djbmV3X0Nyb3BwZWRCaXRtYXBfMD0KLU9TX2djbmV3X0Nyb3BwZWRCaXRtYXBfMT0KLQotT1NfZ2NuZXdfRGFzaFN0eWxlPQotT1NfZ2NuZXdfRGFzaFN0eWxlXzA9Ci1PU19nY25ld19EYXNoU3R5bGVfMT0KLQotT1NfZ2NuZXdfRGF0YVRlbXBsYXRlPQotCi1PU19nY25ld19EaXNjcmV0ZURvdWJsZUtleUZyYW1lPQotT1NfZ2NuZXdfRGlzY3JldGVEb3VibGVLZXlGcmFtZV8wPQotT1NfZ2NuZXdfRGlzY3JldGVEb3VibGVLZXlGcmFtZV8xPQotCi1PU19nY25ld19EaXNwYXRjaGVyRnJhbWU9Ci0KLU9TX2djbmV3X0Rpc3BhdGNoZXJIb29rRXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfRGlzcGF0Y2hlckhvb2tFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0Rpc3BhdGNoZXJIb29rRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0Rpc3BhdGNoZXJUaW1lcj0KLQotT1NfZ2NuZXdfRG91YmxlQW5pbWF0aW9uVXNpbmdLZXlGcmFtZXM9Ci0KLU9TX2djbmV3X0RvdWJsZUNvbGxlY3Rpb249Ci1PU19nY25ld19Eb3VibGVDb2xsZWN0aW9uXzA9Ci0KLU9TX2djbmV3X0RyYXdpbmdWaXN1YWw9Ci0KLU9TX2djbmV3X0R1cmF0aW9uPQotT1NfZ2NuZXdfRHVyYXRpb25fMD0KLQotT1NfZ2NuZXdfRXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19FdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfRXhlY3V0ZWRSb3V0ZWRFdmVudEhhbmRsZXI9Ci1PU19nY25ld19FeGVjdXRlZFJvdXRlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfRXhlY3V0ZWRSb3V0ZWRFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfRXhwYW5kZXI9Ci0KLU9TX2djbmV3X0ZpbGVJbmZvPQotT1NfZ2NuZXdfRmlsZUluZm9fMD0KLQotT1NfZ2NuZXdfRm9udEZhbWlseT0KLU9TX2djbmV3X0ZvbnRGYW1pbHlfMD0KLQotT1NfZ2NuZXdfRm9ybWF0Q29udmVydGVkQml0bWFwPQotT1NfZ2NuZXdfRm9ybWF0Q29udmVydGVkQml0bWFwXzA9Ci1PU19nY25ld19Gb3JtYXRDb252ZXJ0ZWRCaXRtYXBfMT0KLU9TX2djbmV3X0Zvcm1hdENvbnZlcnRlZEJpdG1hcF8yPQotT1NfZ2NuZXdfRm9ybWF0Q29udmVydGVkQml0bWFwXzM9Ci0KLU9TX2djbmV3X0Zvcm1hdHRlZFRleHQ9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzA9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzE9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzI9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzM9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzQ9Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzU9Ci0KLU9TX2djbmV3XzFGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9fST0KLU9TX2djbmV3XzFGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9fSV8wPQotCi1PU19nY25ld18xRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfX0lJPQotT1NfZ2NuZXdfMUZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X19JSV8wPQotT1NfZ2NuZXdfMUZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X19JSV8xPQotCi1PU19nY25ld19HZW9tZXRyeUdyb3VwPQotCi1PU19nY25ld19HcmlkPQotCi1PU19nY25ld19HcmlkTGVuZ3RoPQotT1NfZ2NuZXdfR3JpZExlbmd0aF8wPQotT1NfZ2NuZXdfR3JpZExlbmd0aF8xPQotCi1PU19nY25ld19HcmlkVmlldz0KLQotT1NfZ2NuZXdfR3JpZFZpZXdDb2x1bW49Ci0KLU9TX2djbmV3X0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbj0KLQotT1NfZ2NuZXdfR3JpZFZpZXdDb2x1bW5IZWFkZXI9Ci0KLU9TX2djbmV3X0dyb3VwQm94PQotCi1PU19nY25ld19IeXBlcmxpbms9Ci1PU19nY25ld19IeXBlcmxpbmtfMD0KLQotT1NfZ2NuZXdfSW1hZ2U9Ci0KLU9TX2djbmV3X0ltYWdlQnJ1c2g9Ci1PU19nY25ld19JbWFnZUJydXNoXzA9Ci0KLU9TX2djbmV3X0ludDMyPQotT1NfZ2NuZXdfSW50MzJfMD0KLQotT1NfZ2NuZXdfSW50MzJSZWN0PQotT1NfZ2NuZXdfSW50MzJSZWN0XzA9Ci1PU19nY25ld19JbnQzMlJlY3RfMT0KLU9TX2djbmV3X0ludDMyUmVjdF8yPQotT1NfZ2NuZXdfSW50MzJSZWN0XzM9Ci0KLU9TX2djbmV3X0ludFB0cj0KLU9TX2djbmV3X0ludFB0cl8wPQotCi1PU19nY25ld19LZXlFdmVudEhhbmRsZXI9Ci1PU19nY25ld19LZXlFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0tleUV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19LZXlib2FyZEZvY3VzQ2hhbmdlZEV2ZW50SGFuZGxlcj0KLU9TX2djbmV3X0tleWJvYXJkRm9jdXNDaGFuZ2VkRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19LZXlib2FyZEZvY3VzQ2hhbmdlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19MYWJlbD0KLQotT1NfZ2NuZXdfTGluZVNlZ21lbnQ9Ci1PU19nY25ld19MaW5lU2VnbWVudF8wPQotT1NfZ2NuZXdfTGluZVNlZ21lbnRfMT0KLQotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJRD0KLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSURfMD0KLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSURfMT0KLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSURfMj0KLQotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJSUk9Ci1PU19nY25ld18xTGluZWFyR3JhZGllbnRCcnVzaF9fSUlJSV8wPQotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJSUlfMT0KLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSUlJXzI9Ci1PU19nY25ld18xTGluZWFyR3JhZGllbnRCcnVzaF9fSUlJSV8zPQotCi1PU19nY25ld19MaXN0Qm94PQotCi1PU19nY25ld19MaXN0Qm94SXRlbT0KLQotT1NfZ2NuZXdfTGlzdFZpZXc9Ci0KLU9TX2djbmV3X0xpc3RWaWV3SXRlbT0KLQotT1NfZ2NuZXdfTWF0cml4PQotT1NfZ2NuZXdfTWF0cml4XzA9Ci1PU19nY25ld19NYXRyaXhfMT0KLU9TX2djbmV3X01hdHJpeF8yPQotT1NfZ2NuZXdfTWF0cml4XzM9Ci1PU19nY25ld19NYXRyaXhfND0KLU9TX2djbmV3X01hdHJpeF81PQotCi1PU19nY25ld19NYXRyaXhUcmFuc2Zvcm09Ci1PU19nY25ld19NYXRyaXhUcmFuc2Zvcm1fMD0KLQotT1NfZ2NuZXdfTWVudT0KLQotT1NfZ2NuZXdfTWVudUl0ZW09Ci0KLU9TX2djbmV3X01vdXNlQnV0dG9uRXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfTW91c2VCdXR0b25FdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X01vdXNlQnV0dG9uRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X01vdXNlRXZlbnRIYW5kbGVyPQotT1NfZ2NuZXdfTW91c2VFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X01vdXNlRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X01vdXNlV2hlZWxFdmVudEhhbmRsZXI9Ci1PU19nY25ld19Nb3VzZVdoZWVsRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19Nb3VzZVdoZWVsRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X05vQXJnc0RlbGVnYXRlPQotCi1PU19nY25ld19PcGVuRmlsZURpYWxvZz0KLQotT1NfZ2NuZXdfUGFzc3dvcmRCb3g9Ci0KLU9TX2djbmV3X1BhdGg9Ci0KLU9TX2djbmV3X1BhdGhGaWd1cmU9Ci0KLU9TX2djbmV3X1BhdGhHZW9tZXRyeT0KLQotT1NfZ2NuZXdfUGVuPQotCi1PU19nY25ld19Qb2ludD0KLU9TX2djbmV3X1BvaW50XzA9Ci1PU19nY25ld19Qb2ludF8xPQotCi1PU19nY25ld19Qb2ludENvbGxlY3Rpb249Ci1PU19nY25ld19Qb2ludENvbGxlY3Rpb25fMD0KLQotT1NfZ2NuZXdfUG9seUxpbmVTZWdtZW50PQotT1NfZ2NuZXdfUG9seUxpbmVTZWdtZW50XzA9Ci1PU19nY25ld19Qb2x5TGluZVNlZ21lbnRfMT0KLQotT1NfZ2NuZXdfUHJvZ3Jlc3NCYXI9Ci0KLU9TX2djbmV3X1F1YWRyYXRpY0JlemllclNlZ21lbnQ9Ci1PU19nY25ld19RdWFkcmF0aWNCZXppZXJTZWdtZW50XzA9Ci1PU19nY25ld19RdWFkcmF0aWNCZXppZXJTZWdtZW50XzE9Ci1PU19nY25ld19RdWFkcmF0aWNCZXppZXJTZWdtZW50XzI9Ci0KLU9TX2djbmV3X1JhZGlvQnV0dG9uPQotCi1PU19nY25ld19SZWN0PQotT1NfZ2NuZXdfUmVjdF8wPQotT1NfZ2NuZXdfUmVjdF8xPQotT1NfZ2NuZXdfUmVjdF8yPQotT1NfZ2NuZXdfUmVjdF8zPQotCi1PU19nY25ld19SZWN0YW5nbGU9Ci0KLU9TX2djbmV3X1JlY3RhbmdsZUdlb21ldHJ5PQotT1NfZ2NuZXdfUmVjdGFuZ2xlR2VvbWV0cnlfMD0KLQotT1NfZ2NuZXdfUmVuZGVyVGFyZ2V0Qml0bWFwPQotT1NfZ2NuZXdfUmVuZGVyVGFyZ2V0Qml0bWFwXzA9Ci1PU19nY25ld19SZW5kZXJUYXJnZXRCaXRtYXBfMT0KLU9TX2djbmV3X1JlbmRlclRhcmdldEJpdG1hcF8yPQotT1NfZ2NuZXdfUmVuZGVyVGFyZ2V0Qml0bWFwXzM9Ci1PU19nY25ld19SZW5kZXJUYXJnZXRCaXRtYXBfND0KLQotT1NfZ2NuZXdfUmVwZWF0QnV0dG9uPQotCi1PU19nY25ld19Sb3V0ZWRFdmVudEhhbmRsZXI9Ci1PU19nY25ld19Sb3V0ZWRFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X1JvdXRlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXI9Ci1PU19nY25ld19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJPYmplY3Q9Ci1PU19nY25ld19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJPYmplY3RfMD0KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlck9iamVjdF8xPQotCi1PU19nY25ld19Sb3dEZWZpbml0aW9uPQotCi1PU19nY25ld19SdW49Ci0KLU9TX2djbmV3X1NXVENhbnZhcz0KLU9TX2djbmV3X1NXVENhbnZhc18wPQotCi1PU19nY25ld19TV1RDZWxsQ29udmVydGVyPQotT1NfZ2NuZXdfU1dUQ2VsbENvbnZlcnRlcl8wPQotT1NfZ2NuZXdfU1dUQ2VsbENvbnZlcnRlcl8xPQotCi1PU19nY25ld19TV1RTYWZlSGFuZGxlPQotT1NfZ2NuZXdfU1dUU2FmZUhhbmRsZV8wPQotT1NfZ2NuZXdfU1dUU2FmZUhhbmRsZV8xPQotCi1PU19nY25ld19TV1RUZXh0RW1iZWRkZWRPYmplY3Q9Ci1PU19nY25ld19TV1RUZXh0RW1iZWRkZWRPYmplY3RfMD0KLU9TX2djbmV3X1NXVFRleHRFbWJlZGRlZE9iamVjdF8xPQotT1NfZ2NuZXdfU1dUVGV4dEVtYmVkZGVkT2JqZWN0XzI9Ci1PU19nY25ld19TV1RUZXh0RW1iZWRkZWRPYmplY3RfMz0KLU9TX2djbmV3X1NXVFRleHRFbWJlZGRlZE9iamVjdF80PQotCi1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllcz0KLU9TX2djbmV3X1NXVFRleHRQYXJhZ3JhcGhQcm9wZXJ0aWVzXzA9Ci1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc18xPQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXNfMj0KLU9TX2djbmV3X1NXVFRleHRQYXJhZ3JhcGhQcm9wZXJ0aWVzXzM9Ci1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc180PQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXNfNT0KLU9TX2djbmV3X1NXVFRleHRQYXJhZ3JhcGhQcm9wZXJ0aWVzXzY9Ci1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc183PQotCi1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllcz0KLU9TX2djbmV3X1NXVFRleHRSdW5Qcm9wZXJ0aWVzXzA9Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc18xPQotT1NfZ2NuZXdfU1dUVGV4dFJ1blByb3BlcnRpZXNfMj0KLU9TX2djbmV3X1NXVFRleHRSdW5Qcm9wZXJ0aWVzXzM9Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc180PQotT1NfZ2NuZXdfU1dUVGV4dFJ1blByb3BlcnRpZXNfNT0KLU9TX2djbmV3X1NXVFRleHRSdW5Qcm9wZXJ0aWVzXzY9Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc183PQotCi1PU19nY25ld19TV1RUZXh0U291cmNlPQotT1NfZ2NuZXdfU1dUVGV4dFNvdXJjZV8wPQotCi1PU19nY25ld19TV1RUcmVlVmlld1Jvd1ByZXNlbnRlcj0KLU9TX2djbmV3X1NXVFRyZWVWaWV3Um93UHJlc2VudGVyXzA9Ci0KLU9TX2djbmV3X1NhdmVGaWxlRGlhbG9nPQotCi1PU19nY25ld19TY2FsZVRyYW5zZm9ybT0KLU9TX2djbmV3X1NjYWxlVHJhbnNmb3JtXzA9Ci1PU19nY25ld19TY2FsZVRyYW5zZm9ybV8xPQotCi1PU19nY25ld19TY3JvbGxCYXI9Ci0KLU9TX2djbmV3X1Njcm9sbEV2ZW50SGFuZGxlcj0KLU9TX2djbmV3X1Njcm9sbEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfU2Nyb2xsRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1NlbGVjdGlvbkNoYW5nZWRFdmVudEhhbmRsZXI9Ci1PU19nY25ld19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1NlcGFyYXRvcj0KLQotT1NfZ2NuZXdfU2V0dGVyPQotT1NfZ2NuZXdfU2V0dGVyXzA9Ci1PU19nY25ld19TZXR0ZXJfMT0KLQotT1NfZ2NuZXdfMVNpemVfXz0KLQotT1NfZ2NuZXdfMVNpemVfX0REPQotT1NfZ2NuZXdfMVNpemVfX0REXzA9Ci1PU19nY25ld18xU2l6ZV9fRERfMT0KLQotT1NfZ2NuZXdfU2l6ZUNoYW5nZWRFdmVudEhhbmRsZXI9Ci1PU19nY25ld19TaXplQ2hhbmdlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfU2l6ZUNoYW5nZWRFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfU2xpZGVyPQotCi1PU19nY25ld19Tb2xpZENvbG9yQnJ1c2g9Ci1PU19nY25ld19Tb2xpZENvbG9yQnJ1c2hfMD0KLQotT1NfZ2NuZXdfU3RhY2tQYW5lbD0KLQotT1NfZ2NuZXdfU3RyZWFtR2VvbWV0cnk9Ci0KLU9TX2djbmV3X1N0cmluZz0KLU9TX2djbmV3X1N0cmluZ18wPQotCi1PU19nY25ld19TdHlsZT0KLQotT1NfZ2NuZXdfVGFiQ29udHJvbD0KLQotT1NfZ2NuZXdfVGFiSXRlbT0KLQotT1NfZ2NuZXdfVGV4dEJsb2NrPQotCi1PU19nY25ld19UZXh0Qm94PQotCi1PU19nY25ld19UZXh0Q2hhbmdlZEV2ZW50SGFuZGxlcj0KLU9TX2djbmV3X1RleHRDaGFuZ2VkRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19UZXh0Q2hhbmdlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19UZXh0Q2hhcmFjdGVycz0KLU9TX2djbmV3X1RleHRDaGFyYWN0ZXJzXzA9Ci1PU19nY25ld19UZXh0Q2hhcmFjdGVyc18xPQotT1NfZ2NuZXdfVGV4dENoYXJhY3RlcnNfMj0KLU9TX2djbmV3X1RleHRDaGFyYWN0ZXJzXzM9Ci0KLU9TX2djbmV3X1RleHRDb21wb3NpdGlvbkV2ZW50SGFuZGxlcj0KLU9TX2djbmV3X1RleHRDb21wb3NpdGlvbkV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfVGV4dENvbXBvc2l0aW9uRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1RleHREZWNvcmF0aW9uQ29sbGVjdGlvbj0KLU9TX2djbmV3X1RleHREZWNvcmF0aW9uQ29sbGVjdGlvbl8wPQotCi1PU19nY25ld19UZXh0RW5kT2ZMaW5lPQotT1NfZ2NuZXdfVGV4dEVuZE9mTGluZV8wPQotT1NfZ2NuZXdfVGV4dEVuZE9mTGluZV8xPQotCi1PU19nY25ld19UZXh0RW5kT2ZQYXJhZ3JhcGg9Ci1PU19nY25ld19UZXh0RW5kT2ZQYXJhZ3JhcGhfMD0KLU9TX2djbmV3X1RleHRFbmRPZlBhcmFncmFwaF8xPQotCi1PU19nY25ld19UZXh0VGFiUHJvcGVydGllcz0KLU9TX2djbmV3X1RleHRUYWJQcm9wZXJ0aWVzXzA9Ci1PU19nY25ld19UZXh0VGFiUHJvcGVydGllc18xPQotT1NfZ2NuZXdfVGV4dFRhYlByb3BlcnRpZXNfMj0KLU9TX2djbmV3X1RleHRUYWJQcm9wZXJ0aWVzXzM9Ci0KLU9TX2djbmV3X1RleHRUYWJQcm9wZXJ0aWVzQ29sbGVjdGlvbj0KLU9TX2djbmV3X1RleHRUYWJQcm9wZXJ0aWVzQ29sbGVjdGlvbl8wPQotCi1PU19nY25ld19UaGlja25lc3M9Ci1PU19nY25ld19UaGlja25lc3NfMD0KLU9TX2djbmV3X1RoaWNrbmVzc18xPQotT1NfZ2NuZXdfVGhpY2tuZXNzXzI9Ci1PU19nY25ld19UaGlja25lc3NfMz0KLQotT1NfZ2NuZXdfVGltZVNwYW49Ci1PU19nY25ld19UaW1lU3Bhbl8wPQotCi1PU19nY25ld19UaW1lckhhbmRsZXI9Ci1PU19nY25ld19UaW1lckhhbmRsZXJfMD0KLU9TX2djbmV3X1RpbWVySGFuZGxlcl8xPQotCi1PU19nY25ld19Ub2dnbGVCdXR0b249Ci0KLU9TX2djbmV3X1Rvb2xCYXI9Ci0KLU9TX2djbmV3X1Rvb2xCYXJUcmF5PQotCi1PU19nY25ld19UcmFuc2Zvcm1Hcm91cD0KLQotT1NfZ2NuZXdfVHJhbnNsYXRlVHJhbnNmb3JtPQotT1NfZ2NuZXdfVHJhbnNsYXRlVHJhbnNmb3JtXzA9Ci1PU19nY25ld19UcmFuc2xhdGVUcmFuc2Zvcm1fMT0KLQotT1NfZ2NuZXdfVHJlZVZpZXc9Ci0KLU9TX2djbmV3X1RyZWVWaWV3SXRlbT0KLQotT1NfZ2NuZXdfVHlwZWZhY2U9Ci1PU19nY25ld19UeXBlZmFjZV8wPQotT1NfZ2NuZXdfVHlwZWZhY2VfMT0KLU9TX2djbmV3X1R5cGVmYWNlXzI9Ci1PU19nY25ld19UeXBlZmFjZV8zPQotCi1PU19nY25ld19Vcmk9Ci1PU19nY25ld19VcmlfMD0KLU9TX2djbmV3X1VyaV8xPQotCi1PU19nY25ld19XaW5kb3c9Ci0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0k9Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JXzA9Ci0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0lJRERJST0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0lJRERJSV8wPQotT1NfZ2NuZXdfMVdyaXRlYWJsZUJpdG1hcF9fSUlERElJXzE9Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JSURESUlfMj0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0lJRERJSV8zPQotT1NfZ2NuZXdfMVdyaXRlYWJsZUJpdG1hcF9fSUlERElJXzQ9Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JSURESUlfNT0KLQotT1NfZ2NuZXdfYnl0ZT0KLU9TX2djbmV3X2J5dGVfMD0KLQotT1NfbWVtbW92ZT0KLU9TX21lbW1vdmVfMD0KLU9TX21lbW1vdmVfMT0KLU9TX21lbW1vdmVfMj0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd3BmX1BPSU5UPWZsYWdzPW5vX2dlbgotUE9JTlRfeD0KLVBPSU5UX3k9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud3BmLk9TLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndwZi5PUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmNiZmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud3BmLk9TLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTczICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93cGZfQ09NPWZsYWdzPW5vX2dlbgotQ09NX09sZUluaXRpYWxpemU9Ci1DT01fT2xlSW5pdGlhbGl6ZV8wPQotCi1DT01fT2xlVW5pbml0aWFsaXplPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93cGZfSUNPTklORk89ZmxhZ3M9Y3BwCi1JQ09OSU5GT19mSWNvbj0KLUlDT05JTkZPX3hIb3RzcG90PQotSUNPTklORk9feUhvdHNwb3Q9Ci1JQ09OSU5GT19oYm1NYXNrPWNhc3Q9SEJJVE1BUAotSUNPTklORk9faGJtQ29sb3I9Y2FzdD1IQklUTUFQCi0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93cGZfT1M9ZmxhZ3M9Y3BwCi1PU19BY2Nlc3NUZXh0X0FjY2Vzc0tleT1mbGFncz1nZXR0ZXIKLU9TX0FjY2Vzc1RleHRfQWNjZXNzS2V5XzA9Y2FzdD1BY2Nlc3NUZXh0XixmbGFncz1nY29iamVjdAotCi1PU19BY2Nlc3NUZXh0X1RleHQ9ZmxhZ3M9c2V0dGVyCi1PU19BY2Nlc3NUZXh0X1RleHRfMD1jYXN0PUFjY2Vzc1RleHReLGZsYWdzPWdjb2JqZWN0Ci1PU19BY2Nlc3NUZXh0X1RleHRfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25Db21tYW5kc19DdXQ9YWNjZXNzb3I9QXBwbGljYXRpb25Db21tYW5kczo6Q3V0LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0FwcGxpY2F0aW9uQ29tbWFuZHNfUGFzdGU9YWNjZXNzb3I9QXBwbGljYXRpb25Db21tYW5kczo6UGFzdGUsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25Db21tYW5kc19SZWRvPWFjY2Vzc29yPUFwcGxpY2F0aW9uQ29tbWFuZHM6OlJlZG8sZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25Db21tYW5kc19VbmRvPWFjY2Vzc29yPUFwcGxpY2F0aW9uQ29tbWFuZHM6OlVuZG8sZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25fRGlzcGF0Y2hlcj1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0FwcGxpY2F0aW9uX0Rpc3BhdGNoZXJfMD1jYXN0PUFwcGxpY2F0aW9uIF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25fUnVuPWZsYWdzPWNwcAotT1NfQXBwbGljYXRpb25fUnVuXzA9Y2FzdD1BcHBsaWNhdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQXBwbGljYXRpb25fU2h1dGRvd249ZmxhZ3M9Y3BwCi1PU19BcHBsaWNhdGlvbl9TaHV0ZG93bl8wPWNhc3Q9QXBwbGljYXRpb25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0FwcGxpY2F0aW9uX1NodXRkb3duTW9kZT1mbGFncz1zZXR0ZXIKLU9TX0FwcGxpY2F0aW9uX1NodXRkb3duTW9kZV8wPWNhc3Q9QXBwbGljYXRpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19BcHBsaWNhdGlvbl9TaHV0ZG93bk1vZGVfMT1jYXN0PVNodXRkb3duTW9kZQotCi1PU19BcHBsaWNhdGlvbl9XaW5kb3dzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQXBwbGljYXRpb25fV2luZG93c18wPWNhc3Q9QXBwbGljYXRpb25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0FycmF5TGlzdF9DbGVhcj1mbGFncz1jcHAKLU9TX0FycmF5TGlzdF9DbGVhcl8wPWNhc3Q9QXJyYXlMaXN0XixmbGFncz1nY29iamVjdAotCi1PU19BcnJheUxpc3RfQ291bnQ9ZmxhZ3M9Z2V0dGVyCi1PU19BcnJheUxpc3RfQ291bnRfMD1jYXN0PUFycmF5TGlzdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQXJyYXlMaXN0X0luc2VydD1mbGFncz1jcHAKLU9TX0FycmF5TGlzdF9JbnNlcnRfMD1jYXN0PUFycmF5TGlzdF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0FycmF5TGlzdF9JbnNlcnRfMT0KLU9TX0FycmF5TGlzdF9JbnNlcnRfMj1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQXJyYXlMaXN0X1JlbW92ZUF0PWZsYWdzPWNwcAotT1NfQXJyYXlMaXN0X1JlbW92ZUF0XzA9Y2FzdD1BcnJheUxpc3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19BcnJheUxpc3RfUmVtb3ZlQXRfMT0KLQotT1NfQXJyYXlMaXN0XzFkZWZhdWx0X19JST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0FycmF5TGlzdF8xZGVmYXVsdF9fSUlfMD1jYXN0PUFycmF5TGlzdF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0FycmF5TGlzdF8xZGVmYXVsdF9fSUlfMT0KLQotT1NfQXJyYXlMaXN0XzFkZWZhdWx0X19JSUk9ZmxhZ3M9c2V0dGVyCi1PU19BcnJheUxpc3RfMWRlZmF1bHRfX0lJSV8wPWNhc3Q9QXJyYXlMaXN0XixmbGFncz1nY29iamVjdAotT1NfQXJyYXlMaXN0XzFkZWZhdWx0X19JSUlfMT0KLU9TX0FycmF5TGlzdF8xZGVmYXVsdF9fSUlJXzI9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpbmRpbmdFeHByZXNzaW9uX1VwZGF0ZVRhcmdldD1mbGFncz1jcHAKLU9TX0JpbmRpbmdFeHByZXNzaW9uX1VwZGF0ZVRhcmdldF8wPWNhc3Q9QmluZGluZ0V4cHJlc3Npb25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpbmRpbmdfQ29udmVydGVyPWZsYWdzPXNldHRlcgotT1NfQmluZGluZ19Db252ZXJ0ZXJfMD1jYXN0PUJpbmRpbmdeLGZsYWdzPWdjb2JqZWN0Ci1PU19CaW5kaW5nX0NvbnZlcnRlcl8xPWNhc3Q9SVZhbHVlQ29udmVydGVyXixmbGFncz1nY29iamVjdAotCi1PU19CaW5kaW5nX0NvbnZlcnRlclBhcmFtZXRlcj1mbGFncz1zZXR0ZXIKLU9TX0JpbmRpbmdfQ29udmVydGVyUGFyYW1ldGVyXzA9Y2FzdD1CaW5kaW5nXixmbGFncz1nY29iamVjdAotT1NfQmluZGluZ19Db252ZXJ0ZXJQYXJhbWV0ZXJfMT0KLQotT1NfQml0bWFwRGVjb2Rlcl9DcmVhdGU9YWNjZXNzb3I9Qml0bWFwRGVjb2Rlcjo6Q3JlYXRlLGZsYWdzPWdjb2JqZWN0Ci1PU19CaXRtYXBEZWNvZGVyX0NyZWF0ZV8wPWNhc3Q9KFN5c3RlbTo6SU86OlN0cmVhbV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19CaXRtYXBEZWNvZGVyX0NyZWF0ZV8xPWNhc3Q9Qml0bWFwQ3JlYXRlT3B0aW9ucwotT1NfQml0bWFwRGVjb2Rlcl9DcmVhdGVfMj1jYXN0PUJpdG1hcENhY2hlT3B0aW9uCi0KLU9TX0JpdG1hcERlY29kZXJfRnJhbWVzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQml0bWFwRGVjb2Rlcl9GcmFtZXNfMD1jYXN0PUJpdG1hcERlY29kZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcEVuY29kZXJfRnJhbWVzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQml0bWFwRW5jb2Rlcl9GcmFtZXNfMD1jYXN0PUJpdG1hcEVuY29kZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcEVuY29kZXJfU2F2ZT1mbGFncz1jcHAKLU9TX0JpdG1hcEVuY29kZXJfU2F2ZV8wPWNhc3Q9Qml0bWFwRW5jb2Rlcl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0JpdG1hcEVuY29kZXJfU2F2ZV8xPWNhc3Q9KFN5c3RlbTo6SU86OlN0cmVhbV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcEZyYW1lQ29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19CaXRtYXBGcmFtZUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oU3lzdGVtOjpDb2xsZWN0aW9uczo6R2VuZXJpYzo6SUxpc3Q8Qml0bWFwRnJhbWVePl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19CaXRtYXBGcmFtZUNvbGxlY3Rpb25fQWRkXzE9Y2FzdD1CaXRtYXBGcmFtZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQml0bWFwRnJhbWVDb2xsZWN0aW9uX2RlZmF1bHQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19CaXRtYXBGcmFtZUNvbGxlY3Rpb25fZGVmYXVsdF8wPWNhc3Q9KFN5c3RlbTo6Q29sbGVjdGlvbnM6OkdlbmVyaWM6OklMaXN0PEJpdG1hcEZyYW1lXj5eKSxmbGFncz1nY29iamVjdAotT1NfQml0bWFwRnJhbWVDb2xsZWN0aW9uX2RlZmF1bHRfMT0KLQotT1NfQml0bWFwRnJhbWVfQ3JlYXRlPWFjY2Vzc29yPUJpdG1hcEZyYW1lOjpDcmVhdGUsZmxhZ3M9Z2NvYmplY3QKLU9TX0JpdG1hcEZyYW1lX0NyZWF0ZV8wPWNhc3Q9Qml0bWFwU291cmNlXixmbGFncz1nY29iamVjdAotCi1PU19CaXRtYXBJbWFnZV9CZWdpbkluaXQ9ZmxhZ3M9Y3BwCi1PU19CaXRtYXBJbWFnZV9CZWdpbkluaXRfMD1jYXN0PShCaXRtYXBJbWFnZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcEltYWdlX0NyZWF0ZU9wdGlvbnM9ZmxhZ3M9c2V0dGVyCi1PU19CaXRtYXBJbWFnZV9DcmVhdGVPcHRpb25zXzA9Y2FzdD0oQml0bWFwSW1hZ2VeKSxmbGFncz1nY29iamVjdAotT1NfQml0bWFwSW1hZ2VfQ3JlYXRlT3B0aW9uc18xPWNhc3Q9Qml0bWFwQ3JlYXRlT3B0aW9ucwotCi1PU19CaXRtYXBJbWFnZV9FbmRJbml0PWZsYWdzPWNwcAotT1NfQml0bWFwSW1hZ2VfRW5kSW5pdF8wPWNhc3Q9KEJpdG1hcEltYWdlXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQml0bWFwSW1hZ2VfVXJpU291cmNlPWZsYWdzPXNldHRlcgotT1NfQml0bWFwSW1hZ2VfVXJpU291cmNlXzA9Y2FzdD0oQml0bWFwSW1hZ2VeKSxmbGFncz1nY29iamVjdAotT1NfQml0bWFwSW1hZ2VfVXJpU291cmNlXzE9Y2FzdD0oVXJpXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQml0bWFwUGFsZXR0ZV9Db2xvcnM9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19CaXRtYXBQYWxldHRlX0NvbG9yc18wPWNhc3Q9Qml0bWFwUGFsZXR0ZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQml0bWFwU291cmNlX0Nsb25lPWZsYWdzPWNwcCBnY29iamVjdAotT1NfQml0bWFwU291cmNlX0Nsb25lXzA9Y2FzdD1CaXRtYXBTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcFNvdXJjZV9Db3B5UGl4ZWxzPWZsYWdzPWNwcAotT1NfQml0bWFwU291cmNlX0NvcHlQaXhlbHNfMD1jYXN0PUJpdG1hcFNvdXJjZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0JpdG1hcFNvdXJjZV9Db3B5UGl4ZWxzXzE9Y2FzdD1JbnQzMlJlY3QsZmxhZ3M9Z2NvYmplY3QKLU9TX0JpdG1hcFNvdXJjZV9Db3B5UGl4ZWxzXzI9Y2FzdD1JbnRQdHIKLU9TX0JpdG1hcFNvdXJjZV9Db3B5UGl4ZWxzXzM9Ci1PU19CaXRtYXBTb3VyY2VfQ29weVBpeGVsc180PQotCi1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlPWFjY2Vzc29yPUJpdG1hcFNvdXJjZTo6Q3JlYXRlLGZsYWdzPWdjb2JqZWN0Ci1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlXzA9Ci1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlXzE9Ci1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlXzI9Ci1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlXzM9Ci1PU19CaXRtYXBTb3VyY2VfQ3JlYXRlXzQ9Y2FzdD1QaXhlbEZvcm1hdCxmbGFncz1nY29iamVjdAotT1NfQml0bWFwU291cmNlX0NyZWF0ZV81PWNhc3Q9Qml0bWFwUGFsZXR0ZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0JpdG1hcFNvdXJjZV9DcmVhdGVfNj1jYXN0PUludFB0cgotT1NfQml0bWFwU291cmNlX0NyZWF0ZV83PQotT1NfQml0bWFwU291cmNlX0NyZWF0ZV84PQotCi1PU19CaXRtYXBTb3VyY2VfRm9ybWF0PWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQml0bWFwU291cmNlX0Zvcm1hdF8wPWNhc3Q9KEJpdG1hcFNvdXJjZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0JpdG1hcFNvdXJjZV9QYWxldHRlPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQml0bWFwU291cmNlX1BhbGV0dGVfMD1jYXN0PShCaXRtYXBTb3VyY2VeKSxmbGFncz1nY29iamVjdAotCi1PU19CaXRtYXBTb3VyY2VfUGl4ZWxIZWlnaHQ9ZmxhZ3M9Z2V0dGVyCi1PU19CaXRtYXBTb3VyY2VfUGl4ZWxIZWlnaHRfMD1jYXN0PUJpdG1hcFNvdXJjZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQml0bWFwU291cmNlX1BpeGVsV2lkdGg9ZmxhZ3M9Z2V0dGVyCi1PU19CaXRtYXBTb3VyY2VfUGl4ZWxXaWR0aF8wPWNhc3Q9Qml0bWFwU291cmNlXixmbGFncz1nY29iamVjdAotCi1PU19CaXRtYXBfR2V0SGljb249ZmxhZ3M9bm9fZ2VuIGNwcAotT1NfQml0bWFwX0dldEhpY29uXzA9Y2FzdD0oU3lzdGVtOjpEcmF3aW5nOjpCaXRtYXBeKSxmbGFncz1nY29iamVjdAotCi1PU19Cb3JkZXJfdHlwZWlkPWFjY2Vzc29yPUJvcmRlcjo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0JydXNoX09wYWNpdHk9ZmxhZ3M9c2V0dGVyCi1PU19CcnVzaF9PcGFjaXR5XzA9Y2FzdD1CcnVzaF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0JydXNoX09wYWNpdHlfMT0KLQotT1NfQnJ1c2hlc19CbGFjaz1hY2Nlc3Nvcj1CcnVzaGVzOjpCbGFjayxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19CcnVzaGVzX0xpZ2h0U2t5Qmx1ZT1hY2Nlc3Nvcj1CcnVzaGVzOjpMaWdodFNreUJsdWUsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQnJ1c2hlc19OYXZ5PWFjY2Vzc29yPUJydXNoZXM6Ok5hdnksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQnJ1c2hlc19UcmFuc3BhcmVudD1hY2Nlc3Nvcj1CcnVzaGVzOjpUcmFuc3BhcmVudCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19CcnVzaGVzX1doaXRlPWFjY2Vzc29yPUJydXNoZXM6OldoaXRlLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0J1dHRvbkJhc2VfQ2xpY2s9ZmxhZ3M9YWRkZXIKLU9TX0J1dHRvbkJhc2VfQ2xpY2tfMD1jYXN0PUJ1dHRvbkJhc2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19CdXR0b25CYXNlX0NsaWNrXzE9Y2FzdD0oUm91dGVkRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQnV0dG9uXzFJc0RlZmF1bHRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19CdXR0b25fMUlzRGVmYXVsdF9fSV8wPWNhc3Q9KEJ1dHRvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0J1dHRvbl8xSXNEZWZhdWx0X19JWj1mbGFncz1zZXR0ZXIKLU9TX0J1dHRvbl8xSXNEZWZhdWx0X19JWl8wPWNhc3Q9KEJ1dHRvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19CdXR0b25fMUlzRGVmYXVsdF9fSVpfMT0KLQotT1NfQ2FuY2VsRXZlbnRBcmdzX0NhbmNlbD1mbGFncz1zZXR0ZXIKLU9TX0NhbmNlbEV2ZW50QXJnc19DYW5jZWxfMD1jYXN0PUNhbmNlbEV2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLU9TX0NhbmNlbEV2ZW50QXJnc19DYW5jZWxfMT0KLQotT1NfQ2FudmFzX0dldExlZnQ9YWNjZXNzb3I9Q2FudmFzOjpHZXRMZWZ0Ci1PU19DYW52YXNfR2V0TGVmdF8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NhbnZhc19HZXRUb3A9YWNjZXNzb3I9Q2FudmFzOjpHZXRUb3AKLU9TX0NhbnZhc19HZXRUb3BfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19DYW52YXNfU2V0TGVmdD1hY2Nlc3Nvcj1DYW52YXM6OlNldExlZnQKLU9TX0NhbnZhc19TZXRMZWZ0XzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NhbnZhc19TZXRMZWZ0XzE9Ci0KLU9TX0NhbnZhc19TZXRUb3A9YWNjZXNzb3I9Q2FudmFzOjpTZXRUb3AKLU9TX0NhbnZhc19TZXRUb3BfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfQ2FudmFzX1NldFRvcF8xPQotCi1PU19DaGFyYWN0ZXJIaXRfRmlyc3RDaGFyYWN0ZXJJbmRleD1mbGFncz1nZXR0ZXIKLU9TX0NoYXJhY3RlckhpdF9GaXJzdENoYXJhY3RlckluZGV4XzA9Y2FzdD0oQ2hhcmFjdGVySGl0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ2hhcmFjdGVySGl0X1RyYWlsaW5nTGVuZ3RoPWZsYWdzPWdldHRlcgotT1NfQ2hhcmFjdGVySGl0X1RyYWlsaW5nTGVuZ3RoXzA9Y2FzdD0oQ2hhcmFjdGVySGl0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ2hlY2tCb3hfdHlwZWlkPWFjY2Vzc29yPUNoZWNrQm94Ojp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ2xpcGJvYXJkX0NvbnRhaW5zRGF0YT1hY2Nlc3Nvcj1DbGlwYm9hcmQ6OkNvbnRhaW5zRGF0YQotT1NfQ2xpcGJvYXJkX0NvbnRhaW5zRGF0YV8wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19DbGlwYm9hcmRfR2V0RGF0YT1hY2Nlc3Nvcj1DbGlwYm9hcmQ6OkdldERhdGEsZmxhZ3M9Z2NvYmplY3QKLU9TX0NsaXBib2FyZF9HZXREYXRhXzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NsaXBib2FyZF9HZXRUZXh0PWFjY2Vzc29yPUNsaXBib2FyZDo6R2V0VGV4dCxmbGFncz1nY29iamVjdAotCi1PU19DbGlwYm9hcmRfU2V0RGF0YT1hY2Nlc3Nvcj1DbGlwYm9hcmQ6OlNldERhdGEKLU9TX0NsaXBib2FyZF9TZXREYXRhXzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci1PU19DbGlwYm9hcmRfU2V0RGF0YV8xPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19DbG9zZUhhbmRsZT0KLU9TX0Nsb3NlSGFuZGxlXzA9Y2FzdD1IQU5ETEUKLQotT1NfQ29sb3JEaWFsb2dfQW55Q29sb3I9ZmxhZ3M9c2V0dGVyCi1PU19Db2xvckRpYWxvZ19BbnlDb2xvcl8wPWNhc3Q9U3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6Q29sb3JEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Db2xvckRpYWxvZ19BbnlDb2xvcl8xPQotCi1PU19Db2xvckRpYWxvZ18xQ29sb3JfX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Db2xvckRpYWxvZ18xQ29sb3JfX0lfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpDb2xvckRpYWxvZ14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yRGlhbG9nXzFDb2xvcl9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19Db2xvckRpYWxvZ18xQ29sb3JfX0lJXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6Q29sb3JEaWFsb2deKSxmbGFncz1nY29iamVjdAotT1NfQ29sb3JEaWFsb2dfMUNvbG9yX19JSV8xPWNhc3Q9KFN5c3RlbTo6RHJhd2luZzo6Q29sb3IpLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yRGlhbG9nXzFDdXN0b21Db2xvcnNfX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Db2xvckRpYWxvZ18xQ3VzdG9tQ29sb3JzX19JXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6Q29sb3JEaWFsb2deKSxmbGFncz1nY29iamVjdAotCi1PU19Db2xvckRpYWxvZ18xQ3VzdG9tQ29sb3JzX19JST1mbGFncz1zZXR0ZXIKLU9TX0NvbG9yRGlhbG9nXzFDdXN0b21Db2xvcnNfX0lJXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6Q29sb3JEaWFsb2deKSxmbGFncz1nY29iamVjdAotT1NfQ29sb3JEaWFsb2dfMUN1c3RvbUNvbG9yc19fSUlfMT1jYXN0PWFycmF5PGludD5eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yTGlzdF9BZGQ9ZmxhZ3M9Y3BwCi1PU19Db2xvckxpc3RfQWRkXzA9Y2FzdD0oU3lzdGVtOjpDb2xsZWN0aW9uczo6R2VuZXJpYzo6TGlzdDxDb2xvcj5eKSxmbGFncz1nY29iamVjdAotT1NfQ29sb3JMaXN0X0FkZF8xPWNhc3Q9Q29sb3IsZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29sb3JMaXN0X0NvdW50PWZsYWdzPWdldHRlcgotT1NfQ29sb3JMaXN0X0NvdW50XzA9Y2FzdD0oU3lzdGVtOjpDb2xsZWN0aW9uczo6R2VuZXJpYzo6SUxpc3Q8Q29sb3I+XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29sb3JMaXN0X0N1cnJlbnQ9ZmxhZ3M9Z2V0dGVyIGdjb2JqZWN0Ci1PU19Db2xvckxpc3RfQ3VycmVudF8wPWNhc3Q9KFN5c3RlbTo6Q29sbGVjdGlvbnM6OkdlbmVyaWM6OklFbnVtZXJhdG9yPENvbG9yPl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yTGlzdF9HZXRFbnVtZXJhdG9yPWZsYWdzPWdjb2JqZWN0IGNwcAotT1NfQ29sb3JMaXN0X0dldEVudW1lcmF0b3JfMD1jYXN0PShTeXN0ZW06OkNvbGxlY3Rpb25zOjpHZW5lcmljOjpJRW51bWVyYWJsZTxDb2xvcj5eKSxmbGFncz1nY29iamVjdAotCi1PU19Db2xvcl9BPWZsYWdzPWdldHRlcgotT1NfQ29sb3JfQV8wPWNhc3Q9Q29sb3JeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yX0I9ZmxhZ3M9Z2V0dGVyCi1PU19Db2xvcl9CXzA9Y2FzdD0oQ29sb3JeKSxmbGFncz1nY29iamVjdAotCi1PU19Db2xvcl9Gcm9tQXJnYj1hY2Nlc3Nvcj1Db2xvcjo6RnJvbUFyZ2IsZmxhZ3M9c3RydWN0IGdjb2JqZWN0Ci1PU19Db2xvcl9Gcm9tQXJnYl8wPQotT1NfQ29sb3JfRnJvbUFyZ2JfMT0KLU9TX0NvbG9yX0Zyb21BcmdiXzI9Ci1PU19Db2xvcl9Gcm9tQXJnYl8zPQotCi1PU19Db2xvcl9HPWZsYWdzPWdldHRlcgotT1NfQ29sb3JfR18wPWNhc3Q9Q29sb3JeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbG9yX1I9ZmxhZ3M9Z2V0dGVyCi1PU19Db2xvcl9SXzA9Y2FzdD1Db2xvcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29sb3JzX0JsYWNrPWFjY2Vzc29yPUNvbG9yczo6QmxhY2ssZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX0NvbG9yc19CbHVlPWFjY2Vzc29yPUNvbG9yczo6Qmx1ZSxmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfQ29sb3JzX0N5YW49YWNjZXNzb3I9Q29sb3JzOjpDeWFuLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfRGFya0dyYXk9YWNjZXNzb3I9Q29sb3JzOjpEYXJrR3JheSxmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfQ29sb3JzX0dyZWVuPWFjY2Vzc29yPUNvbG9yczo6R3JlZW4sZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX0NvbG9yc19MaWdodFNreUJsdWU9YWNjZXNzb3I9Q29sb3JzOjpMaWdodFNreUJsdWUsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX0NvbG9yc19MaW1lPWFjY2Vzc29yPUNvbG9yczo6TGltZSxmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfQ29sb3JzX01hZ2VudGE9YWNjZXNzb3I9Q29sb3JzOjpNYWdlbnRhLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfTWFyb29uPWFjY2Vzc29yPUNvbG9yczo6TWFyb29uLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfTmF2eT1hY2Nlc3Nvcj1Db2xvcnM6Ok5hdnksZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX0NvbG9yc19PbGl2ZT1hY2Nlc3Nvcj1Db2xvcnM6Ok9saXZlLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfUHVycGxlPWFjY2Vzc29yPUNvbG9yczo6UHVycGxlLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfUmVkPWFjY2Vzc29yPUNvbG9yczo6UmVkLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfU2lsdmVyPWFjY2Vzc29yPUNvbG9yczo6U2lsdmVyLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfVGVhbD1hY2Nlc3Nvcj1Db2xvcnM6OlRlYWwsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX0NvbG9yc19UcmFuc3BhcmVudD1hY2Nlc3Nvcj1Db2xvcnM6OlRyYW5zcGFyZW50LGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19Db2xvcnNfV2hpdGU9YWNjZXNzb3I9Q29sb3JzOjpXaGl0ZSxmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfQ29sb3JzX1llbGxvdz1hY2Nlc3Nvcj1Db2xvcnM6OlllbGxvdyxmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfQ29sdW1uRGVmaW5pdGlvbkNvbGxlY3Rpb25fQWRkXzE9Y2FzdD0oQ29sdW1uRGVmaW5pdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbHVtbkRlZmluaXRpb25fV2lkdGg9ZmxhZ3M9c2V0dGVyCi1PU19Db2x1bW5EZWZpbml0aW9uX1dpZHRoXzA9Y2FzdD0oQ29sdW1uRGVmaW5pdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db2x1bW5EZWZpbml0aW9uX1dpZHRoXzE9Y2FzdD0oR3JpZExlbmd0aCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29tYm9Cb3hfMUlzRHJvcERvd25PcGVuX19JPWZsYWdzPWdldHRlcgotT1NfQ29tYm9Cb3hfMUlzRHJvcERvd25PcGVuX19JXzA9Y2FzdD0oQ29tYm9Cb3heKSxmbGFncz1nY29iamVjdAotCi1PU19Db21ib0JveF8xSXNEcm9wRG93bk9wZW5fX0laPWZsYWdzPXNldHRlcgotT1NfQ29tYm9Cb3hfMUlzRHJvcERvd25PcGVuX19JWl8wPWNhc3Q9KENvbWJvQm94XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbWJvQm94XzFJc0Ryb3BEb3duT3Blbl9fSVpfMT0KLQotT1NfQ29tYm9Cb3hfSXNFZGl0YWJsZT1mbGFncz1zZXR0ZXIKLU9TX0NvbWJvQm94X0lzRWRpdGFibGVfMD1jYXN0PShDb21ib0JveF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db21ib0JveF9Jc0VkaXRhYmxlXzE9Ci0KLU9TX0NvbWJvQm94X1NlbGVjdGlvbkJveEl0ZW09ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Db21ib0JveF9TZWxlY3Rpb25Cb3hJdGVtXzA9Y2FzdD1Db21ib0JveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29tbWFuZE1hbmFnZXJfQWRkUHJldmlld0V4ZWN1dGVkSGFuZGxlcj1hY2Nlc3Nvcj1Db21tYW5kTWFuYWdlcjo6QWRkUHJldmlld0V4ZWN1dGVkSGFuZGxlcixmbGFncz1zdHJ1Y3QKLU9TX0NvbW1hbmRNYW5hZ2VyX0FkZFByZXZpZXdFeGVjdXRlZEhhbmRsZXJfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbW1hbmRNYW5hZ2VyX0FkZFByZXZpZXdFeGVjdXRlZEhhbmRsZXJfMT1jYXN0PUV4ZWN1dGVkUm91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19Db21tb25EaWFsb2dfU2hvd0RpYWxvZz1mbGFncz1jcHAKLU9TX0NvbW1vbkRpYWxvZ19TaG93RGlhbG9nXzA9Y2FzdD1Db21tb25EaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Db21tb25EaWFsb2dfU2hvd0RpYWxvZ18xPWNhc3Q9V2luZG93XixmbGFncz1nY29iamVjdAotCi1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luZGV4T2Y9ZmxhZ3M9Y3BwCi1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luZGV4T2ZfMD1jYXN0PUNvbXBvc2l0ZUNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luZGV4T2ZfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29tcG9zaXRlQ29sbGVjdGlvbl9JbnNlcnQ9ZmxhZ3M9Y3BwCi1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luc2VydF8wPWNhc3Q9Q29tcG9zaXRlQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fSW5zZXJ0XzE9Ci1PU19Db21wb3NpdGVDb2xsZWN0aW9uX0luc2VydF8yPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19Db21wb3NpdGVDb2xsZWN0aW9uX1JlbW92ZT1mbGFncz1jcHAKLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fUmVtb3ZlXzA9Y2FzdD1Db21wb3NpdGVDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotT1NfQ29tcG9zaXRlQ29sbGVjdGlvbl9SZW1vdmVfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29tcG9zaXRlQ29sbGVjdGlvbl9SZW1vdmVBdD1mbGFncz1jcHAKLU9TX0NvbXBvc2l0ZUNvbGxlY3Rpb25fUmVtb3ZlQXRfMD1jYXN0PUNvbXBvc2l0ZUNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19Db21wb3NpdGVDb2xsZWN0aW9uX1JlbW92ZUF0XzE9Ci0KLU9TX0NvbnNvbGVfQmVlcD1hY2Nlc3Nvcj1Db25zb2xlOjpCZWVwCi0KLU9TX0NvbnRhaW5lclZpc3VhbF8xQ2xpcF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0NvbnRhaW5lclZpc3VhbF8xQ2xpcF9fSV8wPWNhc3Q9Q29udGFpbmVyVmlzdWFsXixmbGFncz1nY29iamVjdAotCi1PU19Db250YWluZXJWaXN1YWxfMUNsaXBfX0lJPWZsYWdzPXNldHRlcgotT1NfQ29udGFpbmVyVmlzdWFsXzFDbGlwX19JSV8wPWNhc3Q9Q29udGFpbmVyVmlzdWFsXixmbGFncz1nY29iamVjdAotT1NfQ29udGFpbmVyVmlzdWFsXzFDbGlwX19JSV8xPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRlbnRDb250cm9sXzFDb250ZW50X19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQ29udGVudENvbnRyb2xfMUNvbnRlbnRfX0lfMD1jYXN0PUNvbnRlbnRDb250cm9sXixmbGFncz1nY29iamVjdAotCi1PU19Db250ZW50Q29udHJvbF8xQ29udGVudF9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19Db250ZW50Q29udHJvbF8xQ29udGVudF9fSUlfMD1jYXN0PShDb250ZW50Q29udHJvbF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250ZW50Q29udHJvbF8xQ29udGVudF9fSUlfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29udGVudFByZXNlbnRlcl9Db250ZW50PWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfQ29udGVudFByZXNlbnRlcl9Db250ZW50XzA9Y2FzdD0oQ29udGVudFByZXNlbnRlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRlbnRQcmVzZW50ZXJfdHlwZWlkPWFjY2Vzc29yPUNvbnRlbnRQcmVzZW50ZXI6OnR5cGVpZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250ZXh0TWVudUV2ZW50QXJnc19DdXJzb3JMZWZ0PWZsYWdzPWdldHRlcgotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yTGVmdF8wPWNhc3Q9KENvbnRleHRNZW51RXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yVG9wPWZsYWdzPWdldHRlcgotT1NfQ29udGV4dE1lbnVFdmVudEFyZ3NfQ3Vyc29yVG9wXzA9Y2FzdD0oQ29udGV4dE1lbnVFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19Db250ZXh0TWVudV9DbG9zZWQ9ZmxhZ3M9YWRkZXIKLU9TX0NvbnRleHRNZW51X0Nsb3NlZF8wPWNhc3Q9KENvbnRleHRNZW51XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRleHRNZW51X0Nsb3NlZF8xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19Db250ZXh0TWVudV9Ib3Jpem9udGFsT2Zmc2V0PWZsYWdzPXNldHRlcgotT1NfQ29udGV4dE1lbnVfSG9yaXpvbnRhbE9mZnNldF8wPWNhc3Q9KENvbnRleHRNZW51XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRleHRNZW51X0hvcml6b250YWxPZmZzZXRfMT0KLQotT1NfQ29udGV4dE1lbnVfSXNPcGVuPWZsYWdzPXNldHRlcgotT1NfQ29udGV4dE1lbnVfSXNPcGVuXzA9Y2FzdD1Db250ZXh0TWVudV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRleHRNZW51X0lzT3Blbl8xPQotCi1PU19Db250ZXh0TWVudV9PcGVuZWQ9ZmxhZ3M9YWRkZXIKLU9TX0NvbnRleHRNZW51X09wZW5lZF8wPWNhc3Q9KENvbnRleHRNZW51XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRleHRNZW51X09wZW5lZF8xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19Db250ZXh0TWVudV9QbGFjZW1lbnQ9ZmxhZ3M9c2V0dGVyCi1PU19Db250ZXh0TWVudV9QbGFjZW1lbnRfMD1jYXN0PShDb250ZXh0TWVudV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250ZXh0TWVudV9QbGFjZW1lbnRfMT1jYXN0PVBsYWNlbWVudE1vZGUKLQotT1NfQ29udGV4dE1lbnVfVmVydGljYWxPZmZzZXQ9ZmxhZ3M9c2V0dGVyCi1PU19Db250ZXh0TWVudV9WZXJ0aWNhbE9mZnNldF8wPWNhc3Q9KENvbnRleHRNZW51XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRleHRNZW51X1ZlcnRpY2FsT2Zmc2V0XzE9Ci0KLU9TX0NvbnRyb2xfQmFja2dyb3VuZD1mbGFncz1zZXR0ZXIKLU9TX0NvbnRyb2xfQmFja2dyb3VuZF8wPWNhc3Q9Q29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRyb2xfQmFja2dyb3VuZF8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfQmFja2dyb3VuZFByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkJhY2tncm91bmRQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sX0JvcmRlckJydXNoUHJvcGVydHk9YWNjZXNzb3I9Q29udHJvbDo6Qm9yZGVyQnJ1c2hQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sX0JvcmRlclRoaWNrbmVzcz1mbGFncz1zZXR0ZXIKLU9TX0NvbnRyb2xfQm9yZGVyVGhpY2tuZXNzXzA9Y2FzdD1Db250cm9sXixmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF9Cb3JkZXJUaGlja25lc3NfMT1jYXN0PShUaGlja25lc3MpLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfQm9yZGVyVGhpY2tuZXNzUHJvcGVydHk9YWNjZXNzb3I9Q29udHJvbDo6Qm9yZGVyVGhpY2tuZXNzUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ29udHJvbF9Gb250RmFtaWx5PWZsYWdzPXNldHRlcgotT1NfQ29udHJvbF9Gb250RmFtaWx5XzA9Y2FzdD0oQ29udHJvbF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250cm9sX0ZvbnRGYW1pbHlfMT1jYXN0PUZvbnRGYW1pbHleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfRm9udEZhbWlseVByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkZvbnRGYW1pbHlQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sX0ZvbnRTaXplPWZsYWdzPXNldHRlcgotT1NfQ29udHJvbF9Gb250U2l6ZV8wPWNhc3Q9KENvbnRyb2xeKSxmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF9Gb250U2l6ZV8xPQotCi1PU19Db250cm9sX0ZvbnRTaXplUHJvcGVydHk9YWNjZXNzb3I9Q29udHJvbDo6Rm9udFNpemVQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sX0ZvbnRTdHJldGNoPWZsYWdzPXNldHRlcgotT1NfQ29udHJvbF9Gb250U3RyZXRjaF8wPWNhc3Q9KENvbnRyb2xeKSxmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF9Gb250U3RyZXRjaF8xPWNhc3Q9Rm9udFN0cmV0Y2gsZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29udHJvbF9Gb250U3RyZXRjaFByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkZvbnRTdHJldGNoUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ29udHJvbF9Gb250U3R5bGU9ZmxhZ3M9c2V0dGVyCi1PU19Db250cm9sX0ZvbnRTdHlsZV8wPWNhc3Q9KENvbnRyb2xeKSxmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF9Gb250U3R5bGVfMT1jYXN0PUZvbnRTdHlsZSxmbGFncz1nY29iamVjdAotCi1PU19Db250cm9sX0ZvbnRTdHlsZVByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkZvbnRTdHlsZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfRm9udFdlaWdodD1mbGFncz1zZXR0ZXIKLU9TX0NvbnRyb2xfRm9udFdlaWdodF8wPWNhc3Q9KENvbnRyb2xeKSxmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF9Gb250V2VpZ2h0XzE9Y2FzdD1Gb250V2VpZ2h0LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfRm9udFdlaWdodFByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkZvbnRXZWlnaHRQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sX0ZvcmVncm91bmQ9ZmxhZ3M9c2V0dGVyCi1PU19Db250cm9sX0ZvcmVncm91bmRfMD1jYXN0PUNvbnRyb2xeLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250cm9sX0ZvcmVncm91bmRfMT1jYXN0PShCcnVzaF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfRm9yZWdyb3VuZFByb3BlcnR5PWFjY2Vzc29yPUNvbnRyb2w6OkZvcmVncm91bmRQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fST1mbGFncz1nZXR0ZXIKLU9TX0NvbnRyb2xfMUhvcml6b250YWxDb250ZW50QWxpZ25tZW50X19JXzA9Y2FzdD0oQ29udHJvbCBeKSxmbGFncz1nY29iamVjdAotCi1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSUlfMD1jYXN0PShDb250cm9sIF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250cm9sXzFIb3Jpem9udGFsQ29udGVudEFsaWdubWVudF9fSUlfMT1jYXN0PShIb3Jpem9udGFsQWxpZ25tZW50KQotCi1PU19Db250cm9sX01vdXNlRG91YmxlQ2xpY2s9ZmxhZ3M9YWRkZXIKLU9TX0NvbnRyb2xfTW91c2VEb3VibGVDbGlja18wPWNhc3Q9Q29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRyb2xfTW91c2VEb3VibGVDbGlja18xPWNhc3Q9TW91c2VCdXR0b25FdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfUGFkZGluZz1mbGFncz1zZXR0ZXIKLU9TX0NvbnRyb2xfUGFkZGluZ18wPWNhc3Q9Q29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0NvbnRyb2xfUGFkZGluZ18xPWNhc3Q9KFRoaWNrbmVzcyksZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29udHJvbF8xVGVtcGxhdGVfX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Db250cm9sXzFUZW1wbGF0ZV9fSV8wPWNhc3Q9Q29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfQ29udHJvbF8xVGVtcGxhdGVfX0lJPWZsYWdzPXNldHRlcgotT1NfQ29udHJvbF8xVGVtcGxhdGVfX0lJXzA9Y2FzdD1Db250cm9sXixmbGFncz1nY29iamVjdAotT1NfQ29udHJvbF8xVGVtcGxhdGVfX0lJXzE9Y2FzdD1Db250cm9sVGVtcGxhdGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfVGVtcGxhdGVQcm9wZXJ0eT1hY2Nlc3Nvcj1Db250cm9sOjpUZW1wbGF0ZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0NvbnRyb2xfVmVydGljYWxDb250ZW50QWxpZ25tZW50PWZsYWdzPXNldHRlcgotT1NfQ29udHJvbF9WZXJ0aWNhbENvbnRlbnRBbGlnbm1lbnRfMD1jYXN0PUNvbnRyb2xeLGZsYWdzPWdjb2JqZWN0Ci1PU19Db250cm9sX1ZlcnRpY2FsQ29udGVudEFsaWdubWVudF8xPWNhc3Q9VmVydGljYWxBbGlnbm1lbnQKLQotT1NfQ3JlYXRlQ3Vyc29yPQotT1NfQ3JlYXRlQ3Vyc29yXzA9Y2FzdD0oSElOU1RBTkNFKQotT1NfQ3JlYXRlQ3Vyc29yXzE9Ci1PU19DcmVhdGVDdXJzb3JfMj0KLU9TX0NyZWF0ZUN1cnNvcl8zPQotT1NfQ3JlYXRlQ3Vyc29yXzQ9Ci1PU19DcmVhdGVDdXJzb3JfNT1jYXN0PShDT05TVCBWT0lEICopLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfQ3JlYXRlQ3Vyc29yXzY9Y2FzdD0oQ09OU1QgVk9JRCAqKSxmbGFncz1ub19vdXQgY3JpdGljYWwKLQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0PQotT1NfQ3JlYXRlSWNvbkluZGlyZWN0XzA9Ci0KLU9TX0NyZWF0ZVByb2Nlc3NXPQotT1NfQ3JlYXRlUHJvY2Vzc1dfMD1jYXN0PUxQQ1dTVFIKLU9TX0NyZWF0ZVByb2Nlc3NXXzE9Y2FzdD1MUFdTVFIKLU9TX0NyZWF0ZVByb2Nlc3NXXzI9Y2FzdD1MUFNFQ1VSSVRZX0FUVFJJQlVURVMKLU9TX0NyZWF0ZVByb2Nlc3NXXzM9Y2FzdD1MUFNFQ1VSSVRZX0FUVFJJQlVURVMKLU9TX0NyZWF0ZVByb2Nlc3NXXzQ9Ci1PU19DcmVhdGVQcm9jZXNzV181PWNhc3Q9RFdPUkQKLU9TX0NyZWF0ZVByb2Nlc3NXXzY9Y2FzdD1MUFZPSUQKLU9TX0NyZWF0ZVByb2Nlc3NXXzc9Y2FzdD1MUENXU1RSCi1PU19DcmVhdGVQcm9jZXNzV184PWNhc3Q9TFBTVEFSVFVQSU5GT1cKLU9TX0NyZWF0ZVByb2Nlc3NXXzk9Y2FzdD1MUFBST0NFU1NfSU5GT1JNQVRJT04KLQotT1NfQ3VsdHVyZUluZm9fQ3VycmVudFVJQ3VsdHVyZT1hY2Nlc3Nvcj1DdWx0dXJlSW5mbzo6Q3VycmVudFVJQ3VsdHVyZSxmbGFncz1nY29iamVjdCBjb25zdAotCi1PU19DdXJzb3JJbnRlcm9wSGVscGVyX0NyZWF0ZT1hY2Nlc3Nvcj1TeXN0ZW06OldpbmRvd3M6OkludGVyb3A6OkN1cnNvckludGVyb3BIZWxwZXI6OkNyZWF0ZSxmbGFncz1nY29iamVjdAotT1NfQ3Vyc29ySW50ZXJvcEhlbHBlcl9DcmVhdGVfMD1jYXN0PVNhZmVIYW5kbGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfQXBwU3RhcnRpbmc9YWNjZXNzb3I9Q3Vyc29yczo6QXBwU3RhcnRpbmcsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19BcnJvdz1hY2Nlc3Nvcj1DdXJzb3JzOjpBcnJvdyxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19DdXJzb3JzX0Nyb3NzPWFjY2Vzc29yPUN1cnNvcnM6OkNyb3NzLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfSGFuZD1hY2Nlc3Nvcj1DdXJzb3JzOjpIYW5kLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfSGVscD1hY2Nlc3Nvcj1DdXJzb3JzOjpIZWxwLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfSUJlYW09YWNjZXNzb3I9Q3Vyc29yczo6SUJlYW0sZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19Obz1hY2Nlc3Nvcj1DdXJzb3JzOjpObyxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19DdXJzb3JzX1Njcm9sbEU9YWNjZXNzb3I9Q3Vyc29yczo6U2Nyb2xsRSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19DdXJzb3JzX1Njcm9sbE49YWNjZXNzb3I9Q3Vyc29yczo6U2Nyb2xsTixmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19DdXJzb3JzX1Njcm9sbE5FPWFjY2Vzc29yPUN1cnNvcnM6OlNjcm9sbE5FLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfU2Nyb2xsTlc9YWNjZXNzb3I9Q3Vyc29yczo6U2Nyb2xsTlcsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19TY3JvbGxTPWFjY2Vzc29yPUN1cnNvcnM6OlNjcm9sbFMsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19TY3JvbGxTRT1hY2Nlc3Nvcj1DdXJzb3JzOjpTY3JvbGxTRSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19DdXJzb3JzX1Njcm9sbFNXPWFjY2Vzc29yPUN1cnNvcnM6OlNjcm9sbFNXLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfU2Nyb2xsVz1hY2Nlc3Nvcj1DdXJzb3JzOjpTY3JvbGxXLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfU2l6ZUFsbD1hY2Nlc3Nvcj1DdXJzb3JzOjpTaXplQWxsLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfU2l6ZU5FU1c9YWNjZXNzb3I9Q3Vyc29yczo6U2l6ZU5FU1csZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19TaXplTlM9YWNjZXNzb3I9Q3Vyc29yczo6U2l6ZU5TLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfU2l6ZU5XU0U9YWNjZXNzb3I9Q3Vyc29yczo6U2l6ZU5XU0UsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfQ3Vyc29yc19TaXplV0U9YWNjZXNzb3I9Q3Vyc29yczo6U2l6ZVdFLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfVXBBcnJvdz1hY2Nlc3Nvcj1DdXJzb3JzOjpVcEFycm93LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0N1cnNvcnNfV2FpdD1hY2Nlc3Nvcj1DdXJzb3JzOjpXYWl0LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0Rhc2hTdHlsZXNfRGFzaD1hY2Nlc3Nvcj1EYXNoU3R5bGVzOjpEYXNoLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0Rhc2hTdHlsZXNfRGFzaERvdD1hY2Nlc3Nvcj1EYXNoU3R5bGVzOjpEYXNoRG90LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0Rhc2hTdHlsZXNfRGFzaERvdERvdD1hY2Nlc3Nvcj1EYXNoU3R5bGVzOjpEYXNoRG90RG90LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0Rhc2hTdHlsZXNfRG90PWFjY2Vzc29yPURhc2hTdHlsZXM6OkRvdCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19EYXNoU3R5bGVzX1NvbGlkPWFjY2Vzc29yPURhc2hTdHlsZXM6OlNvbGlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0RhdGFGb3JtYXRzX1J0Zj1hY2Nlc3Nvcj1EYXRhRm9ybWF0czo6UnRmLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0RhdGFGb3JtYXRzX1N0cmluZ0Zvcm1hdD1hY2Nlc3Nvcj1EYXRhRm9ybWF0czo6U3RyaW5nRm9ybWF0LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0RhdGFGb3JtYXRzX1VuaWNvZGVUZXh0PWFjY2Vzc29yPURhdGFGb3JtYXRzOjpVbmljb2RlVGV4dCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19EYXRhT2JqZWN0X0dldERhdGE9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19EYXRhT2JqZWN0X0dldERhdGFfMD1jYXN0PShEYXRhT2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RhdGFPYmplY3RfR2V0RGF0YV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19EYXRhT2JqZWN0X0dldERhdGFQcmVzZW50PWZsYWdzPWNwcAotT1NfRGF0YU9iamVjdF9HZXREYXRhUHJlc2VudF8wPWNhc3Q9KERhdGFPYmplY3ReKSxmbGFncz1nY29iamVjdAotT1NfRGF0YU9iamVjdF9HZXREYXRhUHJlc2VudF8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19EYXRhT2JqZWN0X0dldEZvcm1hdHM9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19EYXRhT2JqZWN0X0dldEZvcm1hdHNfMD1jYXN0PShEYXRhT2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRGF0YU9iamVjdF9TZXREYXRhPWZsYWdzPWNwcAotT1NfRGF0YU9iamVjdF9TZXREYXRhXzA9Y2FzdD0oRGF0YU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19EYXRhT2JqZWN0X1NldERhdGFfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLU9TX0RhdGFPYmplY3RfU2V0RGF0YV8yPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19EZWxldGVHbG9iYWxSZWY9ZmxhZ3M9am5pCi1PU19EZWxldGVHbG9iYWxSZWZfMD1jYXN0PWpvYmplY3QKLQotT1NfRGVsZXRlT2JqZWN0PQotT1NfRGVsZXRlT2JqZWN0XzA9Y2FzdD0oSEdESU9CSikKLQotT1NfRGVwZW5kZW5jeU9iamVjdF9DbGVhclZhbHVlPWZsYWdzPWNwcAotT1NfRGVwZW5kZW5jeU9iamVjdF9DbGVhclZhbHVlXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19EZXBlbmRlbmN5T2JqZWN0X0NsZWFyVmFsdWVfMT1jYXN0PShEZXBlbmRlbmN5UHJvcGVydHleKSxmbGFncz1nY29iamVjdAotCi1PU19EZXBlbmRlbmN5T2JqZWN0X0dldFZhbHVlPWZsYWdzPWNwcCBnY29iamVjdAotT1NfRGVwZW5kZW5jeU9iamVjdF9HZXRWYWx1ZV8wPWNhc3Q9KERlcGVuZGVuY3lPYmplY3ReKSxmbGFncz1nY29iamVjdAotT1NfRGVwZW5kZW5jeU9iamVjdF9HZXRWYWx1ZV8xPWNhc3Q9KERlcGVuZGVuY3lQcm9wZXJ0eV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RlcGVuZGVuY3lPYmplY3RfU2V0VmFsdWU9ZmxhZ3M9Y3BwCi1PU19EZXBlbmRlbmN5T2JqZWN0X1NldFZhbHVlXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19EZXBlbmRlbmN5T2JqZWN0X1NldFZhbHVlXzE9Y2FzdD0oRGVwZW5kZW5jeVByb3BlcnR5XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RlcGVuZGVuY3lPYmplY3RfU2V0VmFsdWVfMj1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRGVzdHJveUljb249Ci1PU19EZXN0cm95SWNvbl8wPWNhc3Q9SElDT04KLQotT1NfRGlzcGF0Y2hlckZyYW1lX0NvbnRpbnVlPWZsYWdzPXNldHRlcgotT1NfRGlzcGF0Y2hlckZyYW1lX0NvbnRpbnVlXzA9Y2FzdD1EaXNwYXRjaGVyRnJhbWVeLGZsYWdzPWdjb2JqZWN0Ci1PU19EaXNwYXRjaGVyRnJhbWVfQ29udGludWVfMT0KLQotT1NfRGlzcGF0Y2hlckhvb2tFdmVudEFyZ3NfT3BlcmF0aW9uPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRGlzcGF0Y2hlckhvb2tFdmVudEFyZ3NfT3BlcmF0aW9uXzA9Y2FzdD1EaXNwYXRjaGVySG9va0V2ZW50QXJncyBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19EaXNwYXRjaGVySW5hY3RpdmU9ZmxhZ3M9YWRkZXIKLU9TX0Rpc3BhdGNoZXJIb29rc19EaXNwYXRjaGVySW5hY3RpdmVfMD1jYXN0PShEaXNwYXRjaGVySG9va3MgXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0Rpc3BhdGNoZXJIb29rc19EaXNwYXRjaGVySW5hY3RpdmVfMT1jYXN0PUV2ZW50SGFuZGxlciBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJIb29rc19PcGVyYXRpb25BYm9ydGVkPWZsYWdzPWFkZGVyCi1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQWJvcnRlZF8wPWNhc3Q9KERpc3BhdGNoZXJIb29rcyBeKSxmbGFncz1nY29iamVjdAotT1NfRGlzcGF0Y2hlckhvb2tzX09wZXJhdGlvbkFib3J0ZWRfMT1jYXN0PShEaXNwYXRjaGVySG9va0V2ZW50SGFuZGxlciBeKSxmbGFncz1nY29iamVjdAotCi1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQ29tcGxldGVkPWZsYWdzPWFkZGVyCi1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQ29tcGxldGVkXzA9Y2FzdD0oRGlzcGF0Y2hlckhvb2tzIF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19EaXNwYXRjaGVySG9va3NfT3BlcmF0aW9uQ29tcGxldGVkXzE9Y2FzdD0oRGlzcGF0Y2hlckhvb2tFdmVudEhhbmRsZXIgXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRGlzcGF0Y2hlckhvb2tzX09wZXJhdGlvblBvc3RlZD1mbGFncz1hZGRlcgotT1NfRGlzcGF0Y2hlckhvb2tzX09wZXJhdGlvblBvc3RlZF8wPWNhc3Q9KERpc3BhdGNoZXJIb29rcyBeKSxmbGFncz1nY29iamVjdAotT1NfRGlzcGF0Y2hlckhvb2tzX09wZXJhdGlvblBvc3RlZF8xPWNhc3Q9RGlzcGF0Y2hlckhvb2tFdmVudEhhbmRsZXIgXixmbGFncz1nY29iamVjdAotCi1PU19EaXNwYXRjaGVyT3BlcmF0aW9uX1ByaW9yaXR5PWZsYWdzPWdldHRlcgotT1NfRGlzcGF0Y2hlck9wZXJhdGlvbl9Qcmlvcml0eV8wPWNhc3Q9RGlzcGF0Y2hlck9wZXJhdGlvbiBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9JbnRlcnZhbD1mbGFncz1zZXR0ZXIKLU9TX0Rpc3BhdGNoZXJUaW1lcl9JbnRlcnZhbF8wPWNhc3Q9RGlzcGF0Y2hlclRpbWVyXixmbGFncz1nY29iamVjdAotT1NfRGlzcGF0Y2hlclRpbWVyX0ludGVydmFsXzE9Y2FzdD0oVGltZVNwYW4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdGFydD1mbGFncz1jcHAKLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdGFydF8wPWNhc3Q9RGlzcGF0Y2hlclRpbWVyXixmbGFncz1nY29iamVjdAotCi1PU19EaXNwYXRjaGVyVGltZXJfU3RvcD1mbGFncz1jcHAKLU9TX0Rpc3BhdGNoZXJUaW1lcl9TdG9wXzA9Y2FzdD1EaXNwYXRjaGVyVGltZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJUaW1lcl8xVGFnX19JPWZsYWdzPWdldHRlcgotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lfMD1jYXN0PURpc3BhdGNoZXJUaW1lcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lJPWZsYWdzPXNldHRlcgotT1NfRGlzcGF0Y2hlclRpbWVyXzFUYWdfX0lJXzA9Y2FzdD1EaXNwYXRjaGVyVGltZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19EaXNwYXRjaGVyVGltZXJfMVRhZ19fSUlfMT0KLQotT1NfRGlzcGF0Y2hlclRpbWVyX1RpY2s9ZmxhZ3M9YWRkZXIKLU9TX0Rpc3BhdGNoZXJUaW1lcl9UaWNrXzA9Y2FzdD1EaXNwYXRjaGVyVGltZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19EaXNwYXRjaGVyVGltZXJfVGlja18xPWNhc3Q9RXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19EaXNwYXRjaGVyX0JlZ2luSW52b2tlPWZsYWdzPWNwcCBnY29iamVjdAotT1NfRGlzcGF0Y2hlcl9CZWdpbkludm9rZV8wPWNhc3Q9KERpc3BhdGNoZXIgXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0Rpc3BhdGNoZXJfQmVnaW5JbnZva2VfMT1jYXN0PURpc3BhdGNoZXJQcmlvcml0eQotT1NfRGlzcGF0Y2hlcl9CZWdpbkludm9rZV8yPWNhc3Q9RGVsZWdhdGUgXixmbGFncz1nY29iamVjdAotCi1PU19EaXNwYXRjaGVyX0hvb2tzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRGlzcGF0Y2hlcl9Ib29rc18wPWNhc3Q9RGlzcGF0Y2hlciBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Rpc3BhdGNoZXJfUHVzaEZyYW1lPWFjY2Vzc29yPURpc3BhdGNoZXI6OlB1c2hGcmFtZQotT1NfRGlzcGF0Y2hlcl9QdXNoRnJhbWVfMD1jYXN0PURpc3BhdGNoZXJGcmFtZSBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RvY2tQYW5lbF9Eb2NrUHJvcGVydHk9YWNjZXNzb3I9RG9ja1BhbmVsOjpEb2NrUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRG9ja1BhbmVsX3R5cGVpZD1hY2Nlc3Nvcj1Eb2NrUGFuZWw6OnR5cGVpZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Eb3VibGVBbmltYXRpb25Vc2luZ0tleUZyYW1lc19LZXlGcmFtZXM9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Eb3VibGVBbmltYXRpb25Vc2luZ0tleUZyYW1lc19LZXlGcmFtZXNfMD1jYXN0PURvdWJsZUFuaW1hdGlvblVzaW5nS2V5RnJhbWVzXixmbGFncz1nY29iamVjdAotCi1PU19Eb3VibGVDb2xsZWN0aW9uX0FkZD1mbGFncz1jcHAKLU9TX0RvdWJsZUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD1Eb3VibGVDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotT1NfRG91YmxlQ29sbGVjdGlvbl9BZGRfMT0KLQotT1NfRG91YmxlS2V5RnJhbWVDb2xsZWN0aW9uX0FkZD1mbGFncz1jcHAKLU9TX0RvdWJsZUtleUZyYW1lQ29sbGVjdGlvbl9BZGRfMD1jYXN0PURvdWJsZUtleUZyYW1lQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0RvdWJsZUtleUZyYW1lQ29sbGVjdGlvbl9BZGRfMT1jYXN0PShEb3VibGVLZXlGcmFtZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYWdEcm9wX0RvRHJhZ0Ryb3A9YWNjZXNzb3I9RHJhZ0Ryb3A6OkRvRHJhZ0Ryb3AKLU9TX0RyYWdEcm9wX0RvRHJhZ0Ryb3BfMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYWdEcm9wX0RvRHJhZ0Ryb3BfMT1jYXN0PShPYmplY3ReKSxmbGFncz1nY29iamVjdAotT1NfRHJhZ0Ryb3BfRG9EcmFnRHJvcF8yPWNhc3Q9KERyYWdEcm9wRWZmZWN0cykKLQotT1NfRHJhZ0V2ZW50QXJnc19BbGxvd2VkRWZmZWN0cz1mbGFncz1nZXR0ZXIKLU9TX0RyYWdFdmVudEFyZ3NfQWxsb3dlZEVmZmVjdHNfMD1jYXN0PURyYWdFdmVudEFyZ3NeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYWdFdmVudEFyZ3NfRGF0YT1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0RyYWdFdmVudEFyZ3NfRGF0YV8wPWNhc3Q9KERyYWdFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19EcmFnRXZlbnRBcmdzXzFFZmZlY3RzX19JPWZsYWdzPWdldHRlcgotT1NfRHJhZ0V2ZW50QXJnc18xRWZmZWN0c19fSV8wPWNhc3Q9RHJhZ0V2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhZ0V2ZW50QXJnc18xRWZmZWN0c19fSUk9ZmxhZ3M9c2V0dGVyCi1PU19EcmFnRXZlbnRBcmdzXzFFZmZlY3RzX19JSV8wPWNhc3Q9RHJhZ0V2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYWdFdmVudEFyZ3NfMUVmZmVjdHNfX0lJXzE9Y2FzdD1EcmFnRHJvcEVmZmVjdHMKLQotT1NfRHJhZ0V2ZW50QXJnc19HZXRQb3NpdGlvbj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0RyYWdFdmVudEFyZ3NfR2V0UG9zaXRpb25fMD1jYXN0PURyYWdFdmVudEFyZ3NeLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmFnRXZlbnRBcmdzX0dldFBvc2l0aW9uXzE9Y2FzdD1JSW5wdXRFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19EcmFnRXZlbnRBcmdzX0tleVN0YXRlcz1mbGFncz1nZXR0ZXIKLU9TX0RyYWdFdmVudEFyZ3NfS2V5U3RhdGVzXzA9Y2FzdD1EcmFnRXZlbnRBcmdzXixmbGFncz1nY29iamVjdAotCi1PU19EcmF3aW5nQ29sb3JfRnJvbUFyZ2I9YWNjZXNzb3I9U3lzdGVtOjpEcmF3aW5nOjpDb2xvcjo6RnJvbUFyZ2IsZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb2xvcl9Gcm9tQXJnYl8wPQotT1NfRHJhd2luZ0NvbG9yX0Zyb21BcmdiXzE9Ci1PU19EcmF3aW5nQ29sb3JfRnJvbUFyZ2JfMj0KLU9TX0RyYXdpbmdDb2xvcl9Gcm9tQXJnYl8zPQotCi1PU19EcmF3aW5nQ29sb3JfVG9BcmdiPWZsYWdzPWNwcAotT1NfRHJhd2luZ0NvbG9yX1RvQXJnYl8wPWNhc3Q9U3lzdGVtOjpEcmF3aW5nOjpDb2xvcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhd2luZ0NvbnRleHRfQ2xvc2U9ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9DbG9zZV8wPWNhc3Q9RHJhd2luZ0NvbnRleHReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdFbGxpcHNlPWZsYWdzPWNwcAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0VsbGlwc2VfMD1jYXN0PShEcmF3aW5nQ29udGV4dF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3RWxsaXBzZV8xPWNhc3Q9KEJydXNoXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdFbGxpcHNlXzI9Y2FzdD1QZW5eLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3RWxsaXBzZV8zPWNhc3Q9KFBvaW50KSxmbGFncz1nY29iamVjdAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0VsbGlwc2VfND0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdFbGxpcHNlXzU9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeT1mbGFncz1jcHAKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeV8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeV8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3R2VvbWV0cnlfMj1jYXN0PVBlbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdHZW9tZXRyeV8zPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdJbWFnZT1mbGFncz1jcHAKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdJbWFnZV8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdJbWFnZV8xPWNhc3Q9SW1hZ2VTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3SW1hZ2VfMj1jYXN0PVJlY3QsZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd0xpbmU9ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9EcmF3TGluZV8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdMaW5lXzE9Y2FzdD1QZW5eLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3TGluZV8yPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdMaW5lXzM9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotCi1PU19EcmF3aW5nQ29udGV4dF9EcmF3UmVjdGFuZ2xlPWZsYWdzPWNwcAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JlY3RhbmdsZV8wPWNhc3Q9RHJhd2luZ0NvbnRleHReLGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3UmVjdGFuZ2xlXzE9Y2FzdD1CcnVzaF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMj1jYXN0PVBlbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSZWN0YW5nbGVfMz1jYXN0PShSZWN0KSxmbGFncz1nY29iamVjdAotCi1PU19EcmF3aW5nQ29udGV4dF9EcmF3Um91bmRlZFJlY3RhbmdsZT1mbGFncz1jcHAKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSb3VuZGVkUmVjdGFuZ2xlXzA9Y2FzdD0oRHJhd2luZ0NvbnRleHReKSxmbGFncz1nY29iamVjdAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGVfMT1jYXN0PUJydXNoXixmbGFncz1nY29iamVjdAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGVfMj1jYXN0PVBlbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdSb3VuZGVkUmVjdGFuZ2xlXzM9Y2FzdD1SZWN0LGZsYWdzPWdjb2JqZWN0Ci1PU19EcmF3aW5nQ29udGV4dF9EcmF3Um91bmRlZFJlY3RhbmdsZV80PQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1JvdW5kZWRSZWN0YW5nbGVfNT0KLQotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1RleHQ9ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9EcmF3VGV4dF8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X0RyYXdUZXh0XzE9Y2FzdD1Gb3JtYXR0ZWRUZXh0XixmbGFncz1nY29iamVjdAotT1NfRHJhd2luZ0NvbnRleHRfRHJhd1RleHRfMj1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYXdpbmdDb250ZXh0X1BvcD1mbGFncz1jcHAKLU9TX0RyYXdpbmdDb250ZXh0X1BvcF8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaENsaXA9ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9QdXNoQ2xpcF8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X1B1c2hDbGlwXzE9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhd2luZ0NvbnRleHRfUHVzaE9wYWNpdHk9ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9QdXNoT3BhY2l0eV8wPWNhc3Q9KERyYXdpbmdDb250ZXh0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0RyYXdpbmdDb250ZXh0X1B1c2hPcGFjaXR5XzE9Ci0KLU9TX0RyYXdpbmdDb250ZXh0X1B1c2hUcmFuc2Zvcm09ZmxhZ3M9Y3BwCi1PU19EcmF3aW5nQ29udGV4dF9QdXNoVHJhbnNmb3JtXzA9Y2FzdD0oRHJhd2luZ0NvbnRleHReKSxmbGFncz1nY29iamVjdAotT1NfRHJhd2luZ0NvbnRleHRfUHVzaFRyYW5zZm9ybV8xPWNhc3Q9VHJhbnNmb3JtXixmbGFncz1nY29iamVjdAotCi1PU19EcmF3aW5nRm9udEZhbWlseV9OYW1lPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRHJhd2luZ0ZvbnRGYW1pbHlfTmFtZV8wPWNhc3Q9KFN5c3RlbTo6RHJhd2luZzo6Rm9udEZhbWlseV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0RyYXdpbmdWaXN1YWxfUmVuZGVyT3Blbj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0RyYXdpbmdWaXN1YWxfUmVuZGVyT3Blbl8wPWNhc3Q9RHJhd2luZ1Zpc3VhbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRHJhd2luZ1Zpc3VhbF90eXBlaWQ9YWNjZXNzb3I9RHJhd2luZ1Zpc3VhbDo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0VkaXRpbmdDb21tYW5kc19CYWNrc3BhY2U9YWNjZXNzb3I9RWRpdGluZ0NvbW1hbmRzOjpCYWNrc3BhY2UsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRWRpdGluZ0NvbW1hbmRzX0RlbGV0ZT1hY2Nlc3Nvcj1FZGl0aW5nQ29tbWFuZHM6OkRlbGV0ZSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19FZGl0aW5nQ29tbWFuZHNfRGVsZXRlTmV4dFdvcmQ9YWNjZXNzb3I9RWRpdGluZ0NvbW1hbmRzOjpEZWxldGVOZXh0V29yZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19FZGl0aW5nQ29tbWFuZHNfRGVsZXRlUHJldmlvdXNXb3JkPWFjY2Vzc29yPUVkaXRpbmdDb21tYW5kczo6RGVsZXRlUHJldmlvdXNXb3JkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0VuYWJsZVdpbmRvdz0KLU9TX0VuYWJsZVdpbmRvd18wPWNhc3Q9SFdORAotT1NfRW5hYmxlV2luZG93XzE9Ci0KLU9TX0Vudmlyb25tZW50X0V4cGFuZEVudmlyb25tZW50VmFyaWFibGVzPWFjY2Vzc29yPUVudmlyb25tZW50OjpFeHBhbmRFbnZpcm9ubWVudFZhcmlhYmxlcyxmbGFncz1nY29iamVjdAotT1NfRW52aXJvbm1lbnRfRXhwYW5kRW52aXJvbm1lbnRWYXJpYWJsZXNfMD1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRXhlY3V0ZWRSb3V0ZWRFdmVudEFyZ3NfQ29tbWFuZD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0V4ZWN1dGVkUm91dGVkRXZlbnRBcmdzX0NvbW1hbmRfMD1jYXN0PUV4ZWN1dGVkUm91dGVkRXZlbnRBcmdzXixmbGFncz1nY29iamVjdAotCi1PU19FeGVjdXRlZFJvdXRlZEV2ZW50QXJnc19IYW5kbGVkPWZsYWdzPXNldHRlcgotT1NfRXhlY3V0ZWRSb3V0ZWRFdmVudEFyZ3NfSGFuZGxlZF8wPWNhc3Q9KEV4ZWN1dGVkUm91dGVkRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0V4ZWN1dGVkUm91dGVkRXZlbnRBcmdzX0hhbmRsZWRfMT0KLQotT1NfRXhwYW5kZXJfQ29sbGFwc2VkPWZsYWdzPWFkZGVyCi1PU19FeHBhbmRlcl9Db2xsYXBzZWRfMD1jYXN0PUV4cGFuZGVyXixmbGFncz1nY29iamVjdAotT1NfRXhwYW5kZXJfQ29sbGFwc2VkXzE9Y2FzdD1Sb3V0ZWRFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0V4cGFuZGVyX0V4cGFuZGVkPWZsYWdzPWFkZGVyCi1PU19FeHBhbmRlcl9FeHBhbmRlZF8wPWNhc3Q9RXhwYW5kZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19FeHBhbmRlcl9FeHBhbmRlZF8xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fST1mbGFncz1nZXR0ZXIKLU9TX0V4cGFuZGVyXzFJc0V4cGFuZGVkX19JXzA9Y2FzdD0oRXhwYW5kZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fSVo9ZmxhZ3M9c2V0dGVyCi1PU19FeHBhbmRlcl8xSXNFeHBhbmRlZF9fSVpfMD1jYXN0PUV4cGFuZGVyXixmbGFncz1nY29iamVjdAotT1NfRXhwYW5kZXJfMUlzRXhwYW5kZWRfX0laXzE9Ci0KLU9TX0V4dHJhY3RJY29uRXhXPQotT1NfRXh0cmFjdEljb25FeFdfMD1jYXN0PUxQQ1dTVFIKLU9TX0V4dHJhY3RJY29uRXhXXzE9Ci1PU19FeHRyYWN0SWNvbkV4V18yPWNhc3Q9KEhJQ09OKikKLU9TX0V4dHJhY3RJY29uRXhXXzM9Y2FzdD0oSElDT04qKQotT1NfRXh0cmFjdEljb25FeFdfND1jYXN0PVVJTlQKLQotT1NfRmlsZURpYWxvZ19GaWxlTmFtZT1mbGFncz1zZXR0ZXIKLU9TX0ZpbGVEaWFsb2dfRmlsZU5hbWVfMD1jYXN0PUZpbGVEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19GaWxlRGlhbG9nX0ZpbGVOYW1lXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZpbGVEaWFsb2dfRmlsZU5hbWVzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRmlsZURpYWxvZ19GaWxlTmFtZXNfMD1jYXN0PUZpbGVEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZpbGVEaWFsb2dfRmlsdGVyPWZsYWdzPXNldHRlcgotT1NfRmlsZURpYWxvZ19GaWx0ZXJfMD1jYXN0PUZpbGVEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19GaWxlRGlhbG9nX0ZpbHRlcl8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19GaWxlRGlhbG9nX0luaXRpYWxEaXJlY3Rvcnk9ZmxhZ3M9c2V0dGVyCi1PU19GaWxlRGlhbG9nX0luaXRpYWxEaXJlY3RvcnlfMD1jYXN0PUZpbGVEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19GaWxlRGlhbG9nX0luaXRpYWxEaXJlY3RvcnlfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRmlsZURpYWxvZ19UaXRsZT1mbGFncz1zZXR0ZXIKLU9TX0ZpbGVEaWFsb2dfVGl0bGVfMD1jYXN0PUZpbGVEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19GaWxlRGlhbG9nX1RpdGxlXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZpbGVJbmZvX0RpcmVjdG9yeU5hbWU9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19GaWxlSW5mb19EaXJlY3RvcnlOYW1lXzA9Y2FzdD0oU3lzdGVtOjpJTzo6RmlsZUluZm9eKSxmbGFncz1nY29iamVjdAotCi1PU19GaWxlSW5mb19OYW1lPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRmlsZUluZm9fTmFtZV8wPWNhc3Q9KFN5c3RlbTo6SU86OkZpbGVJbmZvXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRmlsZV9FeGlzdHM9YWNjZXNzb3I9U3lzdGVtOjpJTzo6RmlsZTo6RXhpc3RzCi1PU19GaWxlX0V4aXN0c18wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19Gb2N1c01hbmFnZXJfR2V0Rm9jdXNTY29wZT1hY2Nlc3Nvcj1Gb2N1c01hbmFnZXI6OkdldEZvY3VzU2NvcGUsZmxhZ3M9Z2NvYmplY3QKLU9TX0ZvY3VzTWFuYWdlcl9HZXRGb2N1c1Njb3BlXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvY3VzTWFuYWdlcl9HZXRGb2N1c2VkRWxlbWVudD1hY2Nlc3Nvcj1Gb2N1c01hbmFnZXI6OkdldEZvY3VzZWRFbGVtZW50LGZsYWdzPWdjb2JqZWN0Ci1PU19Gb2N1c01hbmFnZXJfR2V0Rm9jdXNlZEVsZW1lbnRfMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRm9sZGVyQnJvd3NlckRpYWxvZ19EZXNjcmlwdGlvbj1mbGFncz1zZXR0ZXIKLU9TX0ZvbGRlckJyb3dzZXJEaWFsb2dfRGVzY3JpcHRpb25fMD1jYXN0PVN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbGRlckJyb3dzZXJEaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb2xkZXJCcm93c2VyRGlhbG9nX0Rlc2NyaXB0aW9uXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvbGRlckJyb3dzZXJEaWFsb2dfMVNlbGVjdGVkUGF0aF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZvbGRlckJyb3dzZXJEaWFsb2dfMVNlbGVjdGVkUGF0aF9fSV8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbGRlckJyb3dzZXJEaWFsb2deKSxmbGFncz1nY29iamVjdAotCi1PU19Gb2xkZXJCcm93c2VyRGlhbG9nXzFTZWxlY3RlZFBhdGhfX0lJPWZsYWdzPXNldHRlcgotT1NfRm9sZGVyQnJvd3NlckRpYWxvZ18xU2VsZWN0ZWRQYXRoX19JSV8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbGRlckJyb3dzZXJEaWFsb2deKSxmbGFncz1nY29iamVjdAotT1NfRm9sZGVyQnJvd3NlckRpYWxvZ18xU2VsZWN0ZWRQYXRoX19JSV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19Gb250RGlhbG9nXzFDb2xvcl9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZvbnREaWFsb2dfMUNvbG9yX19JXzA9Y2FzdD1TeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpGb250RGlhbG9nXixmbGFncz1nY29iamVjdAotCi1PU19Gb250RGlhbG9nXzFDb2xvcl9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19Gb250RGlhbG9nXzFDb2xvcl9fSUlfMD1jYXN0PVN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbnREaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb250RGlhbG9nXzFDb2xvcl9fSUlfMT1jYXN0PVN5c3RlbTo6RHJhd2luZzo6Q29sb3IsZmxhZ3M9Z2NvYmplY3QKLQotT1NfRm9udERpYWxvZ18xRm9udF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZvbnREaWFsb2dfMUZvbnRfX0lfMD1jYXN0PVN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbnREaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvbnREaWFsb2dfMUZvbnRfX0lJPWZsYWdzPXNldHRlcgotT1NfRm9udERpYWxvZ18xRm9udF9fSUlfMD1jYXN0PVN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbnREaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb250RGlhbG9nXzFGb250X19JSV8xPWNhc3Q9KFN5c3RlbTo6RHJhd2luZzo6Rm9udF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvbnREaWFsb2dfU2hvd0NvbG9yPWZsYWdzPXNldHRlcgotT1NfRm9udERpYWxvZ19TaG93Q29sb3JfMD1jYXN0PVN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkZvbnREaWFsb2deLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb250RGlhbG9nX1Nob3dDb2xvcl8xPQotCi1PU19Gb250RmFtaWx5X0dldFR5cGVmYWNlcz1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0ZvbnRGYW1pbHlfR2V0VHlwZWZhY2VzXzA9Y2FzdD1Gb250RmFtaWx5XixmbGFncz1nY29iamVjdAotCi1PU19Gb250RmFtaWx5X1NvdXJjZT1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZvbnRGYW1pbHlfU291cmNlXzA9Y2FzdD1Gb250RmFtaWx5XixmbGFncz1nY29iamVjdAotCi1PU19Gb250U3RyZXRjaF9Gcm9tT3BlblR5cGVTdHJldGNoPWFjY2Vzc29yPUZvbnRTdHJldGNoOjpGcm9tT3BlblR5cGVTdHJldGNoLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb250U3RyZXRjaF9Gcm9tT3BlblR5cGVTdHJldGNoXzA9Ci0KLU9TX0ZvbnRTdHJldGNoX1RvT3BlblR5cGVTdHJldGNoPWZsYWdzPWNwcAotT1NfRm9udFN0cmV0Y2hfVG9PcGVuVHlwZVN0cmV0Y2hfMD1jYXN0PUZvbnRTdHJldGNoXixmbGFncz1nY29iamVjdAotCi1PU19Gb250U3RyZXRjaGVzX05vcm1hbD1hY2Nlc3Nvcj1Gb250U3RyZXRjaGVzOjpOb3JtYWwsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRm9udFN0eWxlc19JdGFsaWM9YWNjZXNzb3I9Rm9udFN0eWxlczo6SXRhbGljLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZvbnRTdHlsZXNfTm9ybWFsPWFjY2Vzc29yPUZvbnRTdHlsZXM6Ok5vcm1hbCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Gb250U3R5bGVzX09ibGlxdWU9YWNjZXNzb3I9Rm9udFN0eWxlczo6T2JsaXF1ZSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Gb250V2VpZ2h0X0Zyb21PcGVuVHlwZVdlaWdodD1hY2Nlc3Nvcj1Gb250V2VpZ2h0OjpGcm9tT3BlblR5cGVXZWlnaHQsZmxhZ3M9Z2NvYmplY3QKLU9TX0ZvbnRXZWlnaHRfRnJvbU9wZW5UeXBlV2VpZ2h0XzA9Ci0KLU9TX0ZvbnRXZWlnaHRfVG9PcGVuVHlwZVdlaWdodD1mbGFncz1jcHAKLU9TX0ZvbnRXZWlnaHRfVG9PcGVuVHlwZVdlaWdodF8wPWNhc3Q9KEZvbnRXZWlnaHReKSxmbGFncz1nY29iamVjdAotCi1PU19Gb250V2VpZ2h0c19Cb2xkPWFjY2Vzc29yPUZvbnRXZWlnaHRzOjpCb2xkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZvbnRXZWlnaHRzX05vcm1hbD1hY2Nlc3Nvcj1Gb250V2VpZ2h0czo6Tm9ybWFsLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZvbnRfRm9udEZhbWlseT1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZvbnRfRm9udEZhbWlseV8wPWNhc3Q9KFN5c3RlbTo6RHJhd2luZzo6Rm9udF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvbnRfU2l6ZT1mbGFncz1nZXR0ZXIKLU9TX0ZvbnRfU2l6ZV8wPWNhc3Q9U3lzdGVtOjpEcmF3aW5nOjpGb250XixmbGFncz1nY29iamVjdAotCi1PU19Gb250X1N0eWxlPWZsYWdzPWdldHRlcgotT1NfRm9udF9TdHlsZV8wPWNhc3Q9KFN5c3RlbTo6RHJhd2luZzo6Rm9udF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZvbnRzX0dldFR5cGVmYWNlcz1hY2Nlc3Nvcj1Gb250czo6R2V0VHlwZWZhY2VzLGZsYWdzPWdjb2JqZWN0Ci1PU19Gb250c19HZXRUeXBlZmFjZXNfMD1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRm9udHNfU3lzdGVtVHlwZWZhY2VzPWFjY2Vzc29yPUZvbnRzOjpTeXN0ZW1UeXBlZmFjZXMsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRm9ybWF0dGVkVGV4dF9CYXNlbGluZT1mbGFncz1nZXR0ZXIKLU9TX0Zvcm1hdHRlZFRleHRfQmFzZWxpbmVfMD1jYXN0PUZvcm1hdHRlZFRleHReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRHZW9tZXRyeT1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRHZW9tZXRyeV8wPWNhc3Q9Rm9ybWF0dGVkVGV4dF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0Zvcm1hdHRlZFRleHRfQnVpbGRHZW9tZXRyeV8xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLQotT1NfRm9ybWF0dGVkVGV4dF9CdWlsZEhpZ2hsaWdodEdlb21ldHJ5PWZsYWdzPWNwcCBnY29iamVjdAotT1NfRm9ybWF0dGVkVGV4dF9CdWlsZEhpZ2hsaWdodEdlb21ldHJ5XzA9Y2FzdD1Gb3JtYXR0ZWRUZXh0XixmbGFncz1nY29iamVjdAotT1NfRm9ybWF0dGVkVGV4dF9CdWlsZEhpZ2hsaWdodEdlb21ldHJ5XzE9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotCi1PU19Gb3JtYXR0ZWRUZXh0X0hlaWdodD1mbGFncz1nZXR0ZXIKLU9TX0Zvcm1hdHRlZFRleHRfSGVpZ2h0XzA9Y2FzdD1Gb3JtYXR0ZWRUZXh0XixmbGFncz1nY29iamVjdAotCi1PU19Gb3JtYXR0ZWRUZXh0X1NldFRleHREZWNvcmF0aW9ucz1mbGFncz1jcHAKLU9TX0Zvcm1hdHRlZFRleHRfU2V0VGV4dERlY29yYXRpb25zXzA9Y2FzdD1Gb3JtYXR0ZWRUZXh0XixmbGFncz1nY29iamVjdAotT1NfRm9ybWF0dGVkVGV4dF9TZXRUZXh0RGVjb3JhdGlvbnNfMT1jYXN0PShUZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfRm9ybWF0dGVkVGV4dF9TZXRUZXh0RGVjb3JhdGlvbnNfMj0KLU9TX0Zvcm1hdHRlZFRleHRfU2V0VGV4dERlY29yYXRpb25zXzM9Ci0KLU9TX0Zvcm1hdHRlZFRleHRfV2lkdGhJbmNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2U9ZmxhZ3M9Z2V0dGVyCi1PU19Gb3JtYXR0ZWRUZXh0X1dpZHRoSW5jbHVkaW5nVHJhaWxpbmdXaGl0ZXNwYWNlXzA9Y2FzdD1Gb3JtYXR0ZWRUZXh0XixmbGFncz1nY29iamVjdAotCi1PU19Gb3Jtc0NvbW1vbkRpYWxvZ19TaG93RGlhbG9nPWZsYWdzPWNwcAotT1NfRm9ybXNDb21tb25EaWFsb2dfU2hvd0RpYWxvZ18wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkNvbW1vbkRpYWxvZ14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1lX0NhbkdvQmFjaz1mbGFncz1nZXR0ZXIKLU9TX0ZyYW1lX0NhbkdvQmFja18wPWNhc3Q9RnJhbWVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1lX0NhbkdvRm9yd2FyZD1mbGFncz1nZXR0ZXIKLU9TX0ZyYW1lX0NhbkdvRm9yd2FyZF8wPWNhc3Q9KEZyYW1lXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWVfQ3VycmVudFNvdXJjZT1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZyYW1lX0N1cnJlbnRTb3VyY2VfMD1jYXN0PShGcmFtZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1lX0dvQmFjaz1mbGFncz1jcHAKLU9TX0ZyYW1lX0dvQmFja18wPWNhc3Q9KEZyYW1lXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWVfR29Gb3J3YXJkPWZsYWdzPWNwcAotT1NfRnJhbWVfR29Gb3J3YXJkXzA9Y2FzdD0oRnJhbWVeKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZV9OYXZpZ2F0ZT1mbGFncz1jcHAKLU9TX0ZyYW1lX05hdmlnYXRlXzA9Y2FzdD0oRnJhbWVeKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWVfTmF2aWdhdGVfMT1jYXN0PShVcmleKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZV9OYXZpZ2F0aW9uVUlWaXNpYmlsaXR5PWZsYWdzPXNldHRlcgotT1NfRnJhbWVfTmF2aWdhdGlvblVJVmlzaWJpbGl0eV8wPWNhc3Q9RnJhbWVeLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZV9OYXZpZ2F0aW9uVUlWaXNpYmlsaXR5XzE9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpOYXZpZ2F0aW9uOjpOYXZpZ2F0aW9uVUlWaXNpYmlsaXR5KQotCi1PU19GcmFtZV9SZWZyZXNoPWZsYWdzPWNwcAotT1NfRnJhbWVfUmVmcmVzaF8wPWNhc3Q9KEZyYW1lXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWVfMVNvdXJjZV9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZyYW1lXzFTb3VyY2VfX0lfMD1jYXN0PShGcmFtZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1lXzFTb3VyY2VfX0lJPWZsYWdzPXNldHRlcgotT1NfRnJhbWVfMVNvdXJjZV9fSUlfMD1jYXN0PShGcmFtZV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZV8xU291cmNlX19JSV8xPWNhc3Q9KFVyaV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1lX1N0b3BMb2FkaW5nPWZsYWdzPWNwcAotT1NfRnJhbWVfU3RvcExvYWRpbmdfMD1jYXN0PShGcmFtZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50X1BhcmVudD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50X1BhcmVudF8wPWNhc3Q9KEZyYW1ld29ya0NvbnRlbnRFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfMVRhZ19fST1mbGFncz1nZXR0ZXIKLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50XzFUYWdfX0lfMD1jYXN0PShGcmFtZXdvcmtDb250ZW50RWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0NvbnRlbnRFbGVtZW50XzFUYWdfX0lJPWZsYWdzPXNldHRlcgotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfMVRhZ19fSUlfMD1jYXN0PUZyYW1ld29ya0NvbnRlbnRFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfMVRhZ19fSUlfMT0KLQotT1NfRnJhbWV3b3JrQ29udGVudEVsZW1lbnRfdHlwZWlkPWFjY2Vzc29yPUZyYW1ld29ya0NvbnRlbnRFbGVtZW50Ojp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfQXBwZW5kQ2hpbGQ9ZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9BcHBlbmRDaGlsZF8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudEZhY3RvcnleLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9BcHBlbmRDaGlsZF8xPWNhc3Q9RnJhbWV3b3JrRWxlbWVudEZhY3RvcnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmc9ZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRCaW5kaW5nXzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmdfMT1jYXN0PURlcGVuZGVuY3lQcm9wZXJ0eV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldEJpbmRpbmdfMj1jYXN0PUJpbmRpbmdCYXNlXixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV8xU2V0VmFsdWVfX0lJST1mbGFncz1jcHAKLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlJXzA9Y2FzdD0oRnJhbWV3b3JrRWxlbWVudEZhY3RvcnleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSUlfMT1jYXN0PURlcGVuZGVuY3lQcm9wZXJ0eV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlJXzI9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XzFTZXRWYWx1ZV9fSUlaPWZsYWdzPWNwcAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSVpfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV8xU2V0VmFsdWVfX0lJWl8xPWNhc3Q9RGVwZW5kZW5jeVByb3BlcnR5XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfMVNldFZhbHVlX19JSVpfMj1jYXN0PShCb29sZWFuKQotCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZURvY2s9YWNjZXNzb3I9U2V0VmFsdWUsZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZURvY2tfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZURvY2tfMT1jYXN0PShEZXBlbmRlbmN5UHJvcGVydHleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVEb2NrXzI9Y2FzdD1Eb2NrCi0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlT3JpZW50YXRpb249YWNjZXNzb3I9U2V0VmFsdWUsZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZU9yaWVudGF0aW9uXzA9Y2FzdD0oRnJhbWV3b3JrRWxlbWVudEZhY3RvcnleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVPcmllbnRhdGlvbl8xPWNhc3Q9KERlcGVuZGVuY3lQcm9wZXJ0eV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZU9yaWVudGF0aW9uXzI9Y2FzdD1PcmllbnRhdGlvbgotCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVN0cmV0Y2g9YWNjZXNzb3I9U2V0VmFsdWUsZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVN0cmV0Y2hfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVN0cmV0Y2hfMT1jYXN0PShEZXBlbmRlbmN5UHJvcGVydHleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVTdHJldGNoXzI9Y2FzdD1TdHJldGNoCi0KLU9TX0ZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X1NldFZhbHVlVmVydGljYWxBbGlnbm1lbnQ9YWNjZXNzb3I9U2V0VmFsdWUsZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZlcnRpY2FsQWxpZ25tZW50XzA9Y2FzdD0oRnJhbWV3b3JrRWxlbWVudEZhY3RvcnleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVWZXJ0aWNhbEFsaWdubWVudF8xPWNhc3Q9KERlcGVuZGVuY3lQcm9wZXJ0eV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZlcnRpY2FsQWxpZ25tZW50XzI9Y2FzdD1WZXJ0aWNhbEFsaWdubWVudAotCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZpc2liaWxpdHk9YWNjZXNzb3I9U2V0VmFsdWUsZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZpc2liaWxpdHlfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9TZXRWYWx1ZVZpc2liaWxpdHlfMT1jYXN0PShEZXBlbmRlbmN5UHJvcGVydHleKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfU2V0VmFsdWVWaXNpYmlsaXR5XzI9Y2FzdD1WaXNpYmlsaXR5Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQWN0dWFsSGVpZ2h0PWZsYWdzPWdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9BY3R1YWxIZWlnaHRfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9BY3R1YWxIZWlnaHRQcm9wZXJ0eT1hY2Nlc3Nvcj1GcmFtZXdvcmtFbGVtZW50OjpBY3R1YWxIZWlnaHRQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0FjdHVhbFdpZHRoPWZsYWdzPWdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9BY3R1YWxXaWR0aF8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0FjdHVhbFdpZHRoUHJvcGVydHk9YWNjZXNzb3I9RnJhbWV3b3JrRWxlbWVudDo6QWN0dWFsV2lkdGhQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0JlZ2luSW5pdD1mbGFncz1jcHAKLU9TX0ZyYW1ld29ya0VsZW1lbnRfQmVnaW5Jbml0XzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0JyaW5nSW50b1ZpZXc9ZmxhZ3M9Y3BwCi1PU19GcmFtZXdvcmtFbGVtZW50X0JyaW5nSW50b1ZpZXdfMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ29udGV4dE1lbnU9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51XzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudV8xPWNhc3Q9Q29udGV4dE1lbnVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ29udGV4dE1lbnVDbG9zaW5nPWZsYWdzPWFkZGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51Q2xvc2luZ18wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ29udGV4dE1lbnVDbG9zaW5nXzE9Y2FzdD0oQ29udGV4dE1lbnVFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51T3BlbmluZz1mbGFncz1hZGRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9Db250ZXh0TWVudU9wZW5pbmdfMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50X0NvbnRleHRNZW51T3BlbmluZ18xPWNhc3Q9KENvbnRleHRNZW51RXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9DdXJzb3I9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X0N1cnNvcl8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ3Vyc29yXzE9Y2FzdD1DdXJzb3JeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfQ3Vyc29yUHJvcGVydHk9YWNjZXNzb3I9RnJhbWV3b3JrRWxlbWVudDo6Q3Vyc29yUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9Gb2N1c1Zpc3VhbFN0eWxlPWZsYWdzPXNldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9Gb2N1c1Zpc3VhbFN0eWxlXzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF9Gb2N1c1Zpc3VhbFN0eWxlXzE9Y2FzdD1TdHlsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9HZXRCaW5kaW5nRXhwcmVzc2lvbj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfR2V0QmluZGluZ0V4cHJlc3Npb25fMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50X0dldEJpbmRpbmdFeHByZXNzaW9uXzE9Y2FzdD1EZXBlbmRlbmN5UHJvcGVydHleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMUhlaWdodF9fST1mbGFncz1nZXR0ZXIKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMUhlaWdodF9fSV8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFIZWlnaHRfX0lEPWZsYWdzPXNldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xSGVpZ2h0X19JRF8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF8xSGVpZ2h0X19JRF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X0hlaWdodFByb3BlcnR5PWFjY2Vzc29yPUZyYW1ld29ya0VsZW1lbnQ6OkhlaWdodFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSG9yaXpvbnRhbEFsaWdubWVudD1mbGFncz1zZXR0ZXIKLU9TX0ZyYW1ld29ya0VsZW1lbnRfSG9yaXpvbnRhbEFsaWdubWVudF8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfSG9yaXpvbnRhbEFsaWdubWVudF8xPWNhc3Q9KEhvcml6b250YWxBbGlnbm1lbnQpCi0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfSXNMb2FkZWQ9ZmxhZ3M9Z2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X0lzTG9hZGVkXzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X0xvYWRlZD1mbGFncz1hZGRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9Mb2FkZWRfMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtFbGVtZW50X0xvYWRlZF8xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNYXJnaW5fX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNYXJnaW5fX0lfMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1hcmdpbl9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNYXJnaW5fX0lJXzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWFyZ2luX19JSV8xPWNhc3Q9KFRoaWNrbmVzcyksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9NYXJnaW5Qcm9wZXJ0eT1hY2Nlc3Nvcj1GcmFtZXdvcmtFbGVtZW50OjpNYXJnaW5Qcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5IZWlnaHRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5IZWlnaHRfX0lfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWluSGVpZ2h0X19JRD1mbGFncz1zZXR0ZXIKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbkhlaWdodF9fSURfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbkhlaWdodF9fSURfMT0KLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xTWluV2lkdGhfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5XaWR0aF9fSV8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5XaWR0aF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFNaW5XaWR0aF9fSURfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMU1pbldpZHRoX19JRF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X05hbWU9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X05hbWVfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9OYW1lUHJvcGVydHk9YWNjZXNzb3I9RnJhbWV3b3JrRWxlbWVudDo6TmFtZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfUGFyZW50PWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9QYXJlbnRfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xUmVzb3VyY2VzX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xUmVzb3VyY2VzX19JXzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFSZXNvdXJjZXNfX0lJPWZsYWdzPXNldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xUmVzb3VyY2VzX19JSV8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVJlc291cmNlc19fSUlfMT1jYXN0PVJlc291cmNlRGljdGlvbmFyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9TaXplQ2hhbmdlZD1mbGFncz1hZGRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF9TaXplQ2hhbmdlZF8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfU2l6ZUNoYW5nZWRfMT1jYXN0PShTaXplQ2hhbmdlZEV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVN0eWxlX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xU3R5bGVfX0lfMD1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVN0eWxlX19JST1mbGFncz1zZXR0ZXIKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVN0eWxlX19JSV8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVN0eWxlX19JSV8xPWNhc3Q9U3R5bGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfU3R5bGVQcm9wZXJ0eT1hY2Nlc3Nvcj1GcmFtZXdvcmtFbGVtZW50OjpTdHlsZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRhZ19fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRhZ19fSV8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFUYWdfX0lJPWZsYWdzPXNldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xVGFnX19JSV8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF8xVGFnX19JSV8xPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFUb29sVGlwX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfRnJhbWV3b3JrRWxlbWVudF8xVG9vbFRpcF9fSV8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xVG9vbFRpcF9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFUb29sVGlwX19JSV8wPWNhc3Q9RnJhbWV3b3JrRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVRvb2xUaXBfX0lJXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya0VsZW1lbnRfVmVydGljYWxBbGlnbm1lbnQ9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50X1ZlcnRpY2FsQWxpZ25tZW50XzA9Y2FzdD1GcmFtZXdvcmtFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrRWxlbWVudF9WZXJ0aWNhbEFsaWdubWVudF8xPWNhc3Q9VmVydGljYWxBbGlnbm1lbnQKLQotT1NfRnJhbWV3b3JrRWxlbWVudF9WZXJ0aWNhbEFsaWdubWVudFByb3BlcnR5PWFjY2Vzc29yPUZyYW1ld29ya0VsZW1lbnQ6OlZlcnRpY2FsQWxpZ25tZW50UHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRnJhbWV3b3JrRWxlbWVudF8xV2lkdGhfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSV8wPWNhc3Q9KEZyYW1ld29ya0VsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtFbGVtZW50XzFXaWR0aF9fSURfMD1jYXN0PShGcmFtZXdvcmtFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya0VsZW1lbnRfMVdpZHRoX19JRF8xPQotCi1PU19GcmFtZXdvcmtFbGVtZW50X1dpZHRoUHJvcGVydHk9YWNjZXNzb3I9RnJhbWV3b3JrRWxlbWVudDo6V2lkdGhQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19GcmFtZXdvcmtFbGVtZW50X3R5cGVpZD1hY2Nlc3Nvcj1GcmFtZXdvcmtFbGVtZW50Ojp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfRnJhbWV3b3JrVGVtcGxhdGVfRmluZE5hbWU9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19GcmFtZXdvcmtUZW1wbGF0ZV9GaW5kTmFtZV8wPWNhc3Q9RnJhbWV3b3JrVGVtcGxhdGVeLGZsYWdzPWdjb2JqZWN0Ci1PU19GcmFtZXdvcmtUZW1wbGF0ZV9GaW5kTmFtZV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotT1NfRnJhbWV3b3JrVGVtcGxhdGVfRmluZE5hbWVfMj1jYXN0PUZyYW1ld29ya0VsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ZyYW1ld29ya1RlbXBsYXRlX1Zpc3VhbFRyZWU9ZmxhZ3M9c2V0dGVyCi1PU19GcmFtZXdvcmtUZW1wbGF0ZV9WaXN1YWxUcmVlXzA9Y2FzdD1GcmFtZXdvcmtUZW1wbGF0ZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ZyYW1ld29ya1RlbXBsYXRlX1Zpc3VhbFRyZWVfMT1jYXN0PUZyYW1ld29ya0VsZW1lbnRGYWN0b3J5XixmbGFncz1nY29iamVjdAotCi1PU19GcmVlemFibGVfQ2FuRnJlZXplPWZsYWdzPWdldHRlcgotT1NfRnJlZXphYmxlX0NhbkZyZWV6ZV8wPWNhc3Q9RnJlZXphYmxlXixmbGFncz1nY29iamVjdAotCi1PU19GcmVlemFibGVfQ2xvbmU9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19GcmVlemFibGVfQ2xvbmVfMD1jYXN0PUZyZWV6YWJsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfRnJlZXphYmxlX0ZyZWV6ZT1mbGFncz1jcHAKLU9TX0ZyZWV6YWJsZV9GcmVlemVfMD1jYXN0PUZyZWV6YWJsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR0NIYW5kbGVfQWxsb2M9ZmxhZ3M9bm9fZ2VuCi1PU19HQ0hhbmRsZV9BbGxvY18wPQotCi1PU19HQ0hhbmRsZV9EdW1wPWZsYWdzPW5vX2dlbgotCi1PU19HQ0hhbmRsZV9GcmVlPWZsYWdzPW5vX2dlbgotT1NfR0NIYW5kbGVfRnJlZV8wPQotCi1PU19HQ0hhbmRsZV9Ub0hhbmRsZT1mbGFncz1ub19nZW4KLU9TX0dDSGFuZGxlX1RvSGFuZGxlXzA9Ci0KLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oR2VvbWV0cnlDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9BZGRfMT1jYXN0PUdlb21ldHJ5XixmbGFncz1nY29iamVjdAotCi1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQ2xlYXI9ZmxhZ3M9Y3BwCi1PU19HZW9tZXRyeUNvbGxlY3Rpb25fQ2xlYXJfMD1jYXN0PUdlb21ldHJ5Q29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlDb2xsZWN0aW9uX0NvdW50PWZsYWdzPWdldHRlcgotT1NfR2VvbWV0cnlDb2xsZWN0aW9uX0NvdW50XzA9Y2FzdD0oR2VvbWV0cnlDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlDb2xsZWN0aW9uX1JlbW92ZT1mbGFncz1jcHAKLU9TX0dlb21ldHJ5Q29sbGVjdGlvbl9SZW1vdmVfMD1jYXN0PShHZW9tZXRyeUNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfR2VvbWV0cnlDb2xsZWN0aW9uX1JlbW92ZV8xPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dlb21ldHJ5R3JvdXBfMUNoaWxkcmVuX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfR2VvbWV0cnlHcm91cF8xQ2hpbGRyZW5fX0lfMD1jYXN0PShHZW9tZXRyeUdyb3VwXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlHcm91cF8xQ2hpbGRyZW5fX0lJPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfR2VvbWV0cnlHcm91cF8xQ2hpbGRyZW5fX0lJXzA9Y2FzdD0oR2VvbWV0cnlHcm91cF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19HZW9tZXRyeUdyb3VwXzFDaGlsZHJlbl9fSUlfMT0KLQotT1NfR2VvbWV0cnlfQm91bmRzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfR2VvbWV0cnlfQm91bmRzXzA9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlfQ2xvbmU9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19HZW9tZXRyeV9DbG9uZV8wPWNhc3Q9KEdlb21ldHJ5XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zPWZsYWdzPWNwcAotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zXzA9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0dlb21ldHJ5X0ZpbGxDb250YWluc18xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zV2l0aERldGFpbD1mbGFncz1jcHAKLU9TX0dlb21ldHJ5X0ZpbGxDb250YWluc1dpdGhEZXRhaWxfMD1jYXN0PUdlb21ldHJ5XixmbGFncz1nY29iamVjdAotT1NfR2VvbWV0cnlfRmlsbENvbnRhaW5zV2l0aERldGFpbF8xPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dlb21ldHJ5X0dldEZsYXR0ZW5lZFBhdGhHZW9tZXRyeT1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0dlb21ldHJ5X0dldEZsYXR0ZW5lZFBhdGhHZW9tZXRyeV8wPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dlb21ldHJ5X0lzRW1wdHk9ZmxhZ3M9Y3BwCi1PU19HZW9tZXRyeV9Jc0VtcHR5XzA9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlfU3Ryb2tlQ29udGFpbnM9ZmxhZ3M9Y3BwCi1PU19HZW9tZXRyeV9TdHJva2VDb250YWluc18wPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci1PU19HZW9tZXRyeV9TdHJva2VDb250YWluc18xPWNhc3Q9UGVuXixmbGFncz1nY29iamVjdAotT1NfR2VvbWV0cnlfU3Ryb2tlQ29udGFpbnNfMj1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dlb21ldHJ5XzFUcmFuc2Zvcm1fX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19HZW9tZXRyeV8xVHJhbnNmb3JtX19JXzA9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2VvbWV0cnlfMVRyYW5zZm9ybV9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19HZW9tZXRyeV8xVHJhbnNmb3JtX19JSV8wPWNhc3Q9KEdlb21ldHJ5XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0dlb21ldHJ5XzFUcmFuc2Zvcm1fX0lJXzE9Y2FzdD1UcmFuc2Zvcm1eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dldEN1cnNvclBvcz0KLU9TX0dldEN1cnNvclBvc18wPWNhc3Q9TFBQT0lOVAotCi1PU19HZXRJY29uSW5mbz0KLU9TX0dldEljb25JbmZvXzA9Y2FzdD1ISUNPTgotT1NfR2V0SWNvbkluZm9fMT0KLQotT1NfR2V0S2V5Ym9hcmRTdGF0ZT0KLU9TX0dldEtleWJvYXJkU3RhdGVfMD1jYXN0PShQQllURSkKLQotT1NfR2V0TW9kdWxlSGFuZGxlVz0KLU9TX0dldE1vZHVsZUhhbmRsZVdfMD1jYXN0PUxQQ1dTVFIKLQotT1NfR2V0UHJvY2Vzc0hlYXA9Ci0KLU9TX0dpdmVGZWVkYmFja0V2ZW50QXJnc19FZmZlY3RzPWZsYWdzPWdldHRlcgotT1NfR2l2ZUZlZWRiYWNrRXZlbnRBcmdzX0VmZmVjdHNfMD1jYXN0PUdpdmVGZWVkYmFja0V2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR2x5cGhSdW5fQmlkaUxldmVsPWZsYWdzPWdldHRlcgotT1NfR2x5cGhSdW5fQmlkaUxldmVsXzA9Y2FzdD1HbHlwaFJ1bl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JhZGllbnRCcnVzaF9NYXBwaW5nTW9kZT1mbGFncz1zZXR0ZXIKLU9TX0dyYWRpZW50QnJ1c2hfTWFwcGluZ01vZGVfMD1jYXN0PShHcmFkaWVudEJydXNoXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0dyYWRpZW50QnJ1c2hfTWFwcGluZ01vZGVfMT1jYXN0PUJydXNoTWFwcGluZ01vZGUKLQotT1NfR3JhZGllbnRCcnVzaF9TcHJlYWRNZXRob2Q9ZmxhZ3M9c2V0dGVyCi1PU19HcmFkaWVudEJydXNoX1NwcmVhZE1ldGhvZF8wPWNhc3Q9KEdyYWRpZW50QnJ1c2heKSxmbGFncz1nY29iamVjdAotT1NfR3JhZGllbnRCcnVzaF9TcHJlYWRNZXRob2RfMT1jYXN0PUdyYWRpZW50U3ByZWFkTWV0aG9kCi0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9DbGVhcj1mbGFncz1jcHAKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9DbGVhcl8wPWNhc3Q9KEdyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9Db3VudD1mbGFncz1nZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9Db3VudF8wPWNhc3Q9KEdyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9JbmRleE9mPWZsYWdzPWNwcAotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0luZGV4T2ZfMD1jYXN0PShHcmlkVmlld0NvbHVtbkNvbGxlY3Rpb24gXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9JbmRleE9mXzE9Y2FzdD0oR3JpZFZpZXdDb2x1bW5eKSxmbGFncz1nY29iamVjdAotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5zZXJ0PWZsYWdzPWNwcAotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX0luc2VydF8wPWNhc3Q9KEdyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5zZXJ0XzE9Ci1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fSW5zZXJ0XzI9Y2FzdD1HcmlkVmlld0NvbHVtbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdDb2x1bW5Db2xsZWN0aW9uX1JlbW92ZT1mbGFncz1jcHAKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9SZW1vdmVfMD1jYXN0PUdyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9SZW1vdmVfMT1jYXN0PUdyaWRWaWV3Q29sdW1uXixmbGFncz1nY29iamVjdAotCi1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fZGVmYXVsdD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbl9kZWZhdWx0XzA9Y2FzdD1HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25fZGVmYXVsdF8xPQotCi1PU19HcmlkVmlld0NvbHVtbkhlYWRlcl9Db250ZW50PWZsYWdzPXNldHRlcgotT1NfR3JpZFZpZXdDb2x1bW5IZWFkZXJfQ29udGVudF8wPWNhc3Q9R3JpZFZpZXdDb2x1bW5IZWFkZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkVmlld0NvbHVtbkhlYWRlcl9Db250ZW50XzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uX0FjdHVhbFdpZHRoPWZsYWdzPWdldHRlcgotT1NfR3JpZFZpZXdDb2x1bW5fQWN0dWFsV2lkdGhfMD1jYXN0PUdyaWRWaWV3Q29sdW1uXixmbGFncz1nY29iamVjdAotCi1PU19HcmlkVmlld0NvbHVtbl8xQ2VsbFRlbXBsYXRlX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfR3JpZFZpZXdDb2x1bW5fMUNlbGxUZW1wbGF0ZV9fSV8wPWNhc3Q9R3JpZFZpZXdDb2x1bW5eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFDZWxsVGVtcGxhdGVfX0lJPWZsYWdzPXNldHRlcgotT1NfR3JpZFZpZXdDb2x1bW5fMUNlbGxUZW1wbGF0ZV9fSUlfMD1jYXN0PUdyaWRWaWV3Q29sdW1uXixmbGFncz1nY29iamVjdAotT1NfR3JpZFZpZXdDb2x1bW5fMUNlbGxUZW1wbGF0ZV9fSUlfMT1jYXN0PURhdGFUZW1wbGF0ZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdDb2x1bW5fMUhlYWRlcl9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0lfMD1jYXN0PUdyaWRWaWV3Q29sdW1uXixmbGFncz1nY29iamVjdAotCi1PU19HcmlkVmlld0NvbHVtbl8xSGVhZGVyX19JST1mbGFncz1zZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0lJXzA9Y2FzdD1HcmlkVmlld0NvbHVtbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJfX0lJXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fSV8wPWNhc3Q9R3JpZFZpZXdDb2x1bW5eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19HcmlkVmlld0NvbHVtbl8xSGVhZGVyVGVtcGxhdGVfX0lJXzA9Y2FzdD1HcmlkVmlld0NvbHVtbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3Q29sdW1uXzFIZWFkZXJUZW1wbGF0ZV9fSUlfMT1jYXN0PURhdGFUZW1wbGF0ZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdDb2x1bW5fMVdpZHRoX19JPWZsYWdzPWdldHRlcgotT1NfR3JpZFZpZXdDb2x1bW5fMVdpZHRoX19JXzA9Y2FzdD1HcmlkVmlld0NvbHVtbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdDb2x1bW5fMVdpZHRoX19JRD1mbGFncz1zZXR0ZXIKLU9TX0dyaWRWaWV3Q29sdW1uXzFXaWR0aF9fSURfMD1jYXN0PUdyaWRWaWV3Q29sdW1uXixmbGFncz1nY29iamVjdAotT1NfR3JpZFZpZXdDb2x1bW5fMVdpZHRoX19JRF8xPQotCi1PU19HcmlkVmlld0NvbHVtbl9XaWR0aFByb3BlcnR5PWFjY2Vzc29yPUdyaWRWaWV3Q29sdW1uOjpXaWR0aFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3SGVhZGVyUm93UHJlc2VudGVyX3R5cGVpZD1hY2Nlc3Nvcj1HcmlkVmlld0hlYWRlclJvd1ByZXNlbnRlcjo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyQmFzZV9Db2x1bW5zPWZsYWdzPXNldHRlcgotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJCYXNlX0NvbHVtbnNfMD1jYXN0PUdyaWRWaWV3Um93UHJlc2VudGVyQmFzZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyQmFzZV9Db2x1bW5zXzE9Y2FzdD1HcmlkVmlld0NvbHVtbkNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyQmFzZV9Db2x1bW5zUHJvcGVydHk9YWNjZXNzb3I9R3JpZFZpZXdSb3dQcmVzZW50ZXJCYXNlOjpDb2x1bW5zUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfMUNvbnRlbnRfX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19HcmlkVmlld1Jvd1ByZXNlbnRlcl8xQ29udGVudF9fSV8wPWNhc3Q9R3JpZFZpZXdSb3dQcmVzZW50ZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyXzFDb250ZW50X19JST1mbGFncz1zZXR0ZXIKLU9TX0dyaWRWaWV3Um93UHJlc2VudGVyXzFDb250ZW50X19JSV8wPWNhc3Q9R3JpZFZpZXdSb3dQcmVzZW50ZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkVmlld1Jvd1ByZXNlbnRlcl8xQ29udGVudF9fSUlfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdSb3dQcmVzZW50ZXJfdHlwZWlkPWFjY2Vzc29yPUdyaWRWaWV3Um93UHJlc2VudGVyOjp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfR3JpZFZpZXdfQWxsb3dzQ29sdW1uUmVvcmRlcj1mbGFncz1zZXR0ZXIKLU9TX0dyaWRWaWV3X0FsbG93c0NvbHVtblJlb3JkZXJfMD1jYXN0PUdyaWRWaWV3XixmbGFncz1nY29iamVjdAotT1NfR3JpZFZpZXdfQWxsb3dzQ29sdW1uUmVvcmRlcl8xPQotCi1PU19HcmlkVmlld19Db2x1bW5IZWFkZXJDb250YWluZXJTdHlsZT1mbGFncz1zZXR0ZXIKLU9TX0dyaWRWaWV3X0NvbHVtbkhlYWRlckNvbnRhaW5lclN0eWxlXzA9Y2FzdD1HcmlkVmlld14sZmxhZ3M9Z2NvYmplY3QKLU9TX0dyaWRWaWV3X0NvbHVtbkhlYWRlckNvbnRhaW5lclN0eWxlXzE9Y2FzdD1TdHlsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZFZpZXdfQ29sdW1ucz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0dyaWRWaWV3X0NvbHVtbnNfMD1jYXN0PUdyaWRWaWV3XixmbGFncz1nY29iamVjdAotCi1PU19HcmlkX0NvbHVtbkRlZmluaXRpb25zPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfR3JpZF9Db2x1bW5EZWZpbml0aW9uc18wPWNhc3Q9R3JpZF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfR3JpZF9Sb3dEZWZpbml0aW9ucz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0dyaWRfUm93RGVmaW5pdGlvbnNfMD1jYXN0PUdyaWReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0dyaWRfU2V0Q29sdW1uPWFjY2Vzc29yPUdyaWQ6OlNldENvbHVtbgotT1NfR3JpZF9TZXRDb2x1bW5fMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfR3JpZF9TZXRDb2x1bW5fMT0KLQotT1NfR3JpZF9TZXRDb2x1bW5TcGFuPWFjY2Vzc29yPUdyaWQ6OlNldENvbHVtblNwYW4KLU9TX0dyaWRfU2V0Q29sdW1uU3Bhbl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkX1NldENvbHVtblNwYW5fMT0KLQotT1NfR3JpZF9TZXRSb3c9YWNjZXNzb3I9R3JpZDo6U2V0Um93Ci1PU19HcmlkX1NldFJvd18wPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfR3JpZF9TZXRSb3dfMT0KLQotT1NfR3JpZF9TZXRSb3dTcGFuPWFjY2Vzc29yPUdyaWQ6OlNldFJvd1NwYW4KLU9TX0dyaWRfU2V0Um93U3Bhbl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19HcmlkX1NldFJvd1NwYW5fMT0KLQotT1NfSGVhZGVyZWRDb250ZW50Q29udHJvbF8xSGVhZGVyX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfSGVhZGVyZWRDb250ZW50Q29udHJvbF8xSGVhZGVyX19JXzA9Y2FzdD0oSGVhZGVyZWRDb250ZW50Q29udHJvbF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0hlYWRlcmVkQ29udGVudENvbnRyb2xfMUhlYWRlcl9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19IZWFkZXJlZENvbnRlbnRDb250cm9sXzFIZWFkZXJfX0lJXzA9Y2FzdD0oSGVhZGVyZWRDb250ZW50Q29udHJvbF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19IZWFkZXJlZENvbnRlbnRDb250cm9sXzFIZWFkZXJfX0lJXzE9Y2FzdD0oT2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSGVhZGVyZWRJdGVtc0NvbnRyb2xfMUhlYWRlcl9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0hlYWRlcmVkSXRlbXNDb250cm9sXzFIZWFkZXJfX0lfMD1jYXN0PUhlYWRlcmVkSXRlbXNDb250cm9sXixmbGFncz1nY29iamVjdAotCi1PU19IZWFkZXJlZEl0ZW1zQ29udHJvbF8xSGVhZGVyX19JST1mbGFncz1zZXR0ZXIKLU9TX0hlYWRlcmVkSXRlbXNDb250cm9sXzFIZWFkZXJfX0lJXzA9Y2FzdD1IZWFkZXJlZEl0ZW1zQ29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0hlYWRlcmVkSXRlbXNDb250cm9sXzFIZWFkZXJfX0lJXzE9Y2FzdD0oT2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSGVhZGVyZWRJdGVtc0NvbnRyb2xfSGVhZGVyVGVtcGxhdGVQcm9wZXJ0eT1hY2Nlc3Nvcj1IZWFkZXJlZEl0ZW1zQ29udHJvbDo6SGVhZGVyVGVtcGxhdGVQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19IZWFwQWxsb2M9Ci1PU19IZWFwQWxsb2NfMD1jYXN0PShIQU5ETEUpCi1PU19IZWFwQWxsb2NfMT0KLU9TX0hlYXBBbGxvY18yPQotCi1PU19IZWFwRnJlZT0KLU9TX0hlYXBGcmVlXzA9Y2FzdD0oSEFORExFKQotT1NfSGVhcEZyZWVfMT0KLU9TX0hlYXBGcmVlXzI9Y2FzdD0oTFBWT0lEKQotCi1PU19IdG1sRG9jdW1lbnRfSW52b2tlU2NyaXB0PWZsYWdzPWNwcCBnY29iamVjdAotT1NfSHRtbERvY3VtZW50X0ludm9rZVNjcmlwdF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6Okh0bWxEb2N1bWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19IdG1sRG9jdW1lbnRfSW52b2tlU2NyaXB0XzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0h3bmRTb3VyY2VfSGFuZGxlPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfSHduZFNvdXJjZV9IYW5kbGVfMD1jYXN0PShId25kU291cmNlXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSHlwZXJsaW5rX0NsaWNrPWZsYWdzPWFkZGVyCi1PU19IeXBlcmxpbmtfQ2xpY2tfMD1jYXN0PUh5cGVybGlua14sZmxhZ3M9Z2NvYmplY3QKLU9TX0h5cGVybGlua19DbGlja18xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19JQ29sbGVjdGlvbl9Db3VudD1mbGFncz1nZXR0ZXIKLU9TX0lDb2xsZWN0aW9uX0NvdW50XzA9Y2FzdD1JQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lFbnVtZXJhYmxlX0dldEVudW1lcmF0b3I9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19JRW51bWVyYWJsZV9HZXRFbnVtZXJhdG9yXzA9Y2FzdD1JRW51bWVyYWJsZSBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lFbnVtZXJhdG9yX0N1cnJlbnQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19JRW51bWVyYXRvcl9DdXJyZW50XzA9Y2FzdD1JRW51bWVyYXRvcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSUVudW1lcmF0b3JfTW92ZU5leHQ9ZmxhZ3M9Y3BwCi1PU19JRW51bWVyYXRvcl9Nb3ZlTmV4dF8wPWNhc3Q9SUVudW1lcmF0b3JeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lMaXN0X0FkZD1mbGFncz1jcHAKLU9TX0lMaXN0X0FkZF8wPWNhc3Q9SUxpc3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19JTGlzdF9BZGRfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSUxpc3RfR2V0RW51bWVyYXRvcj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX0lMaXN0X0dldEVudW1lcmF0b3JfMD1jYXN0PUlMaXN0XixmbGFncz1nY29iamVjdAotCi1PU19JTGlzdF9JbmRleE9mPWZsYWdzPWNwcAotT1NfSUxpc3RfSW5kZXhPZl8wPWNhc3Q9SUxpc3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19JTGlzdF9JbmRleE9mXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lMaXN0X0luc2VydD1mbGFncz1jcHAKLU9TX0lMaXN0X0luc2VydF8wPWNhc3Q9SUxpc3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19JTGlzdF9JbnNlcnRfMT0KLU9TX0lMaXN0X0luc2VydF8yPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19JTGlzdF9SZW1vdmU9ZmxhZ3M9Y3BwCi1PU19JTGlzdF9SZW1vdmVfMD1jYXN0PUlMaXN0XixmbGFncz1nY29iamVjdAotT1NfSUxpc3RfUmVtb3ZlXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lMaXN0X2RlZmF1bHQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19JTGlzdF9kZWZhdWx0XzA9Y2FzdD1JTGlzdF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0lMaXN0X2RlZmF1bHRfMT0KLQotT1NfSW1hZ2VTb3VyY2VfdHlwZWlkPWFjY2Vzc29yPUltYWdlU291cmNlOjp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfSW1hZ2VfU291cmNlPWZsYWdzPXNldHRlcgotT1NfSW1hZ2VfU291cmNlXzA9Y2FzdD1JbWFnZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX0ltYWdlX1NvdXJjZV8xPWNhc3Q9SW1hZ2VTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0ltYWdlX1NvdXJjZVByb3BlcnR5PWFjY2Vzc29yPUltYWdlOjpTb3VyY2VQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19JbWFnZV9TdHJldGNoPWZsYWdzPXNldHRlcgotT1NfSW1hZ2VfU3RyZXRjaF8wPWNhc3Q9SW1hZ2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19JbWFnZV9TdHJldGNoXzE9Y2FzdD1TdHJldGNoCi0KLU9TX0ltYWdlX1N0cmV0Y2hQcm9wZXJ0eT1hY2Nlc3Nvcj1JbWFnZTo6U3RyZXRjaFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ltYWdlX3R5cGVpZD1hY2Nlc3Nvcj1JbWFnZTo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0ltYWdpbmdfQ3JlYXRlQml0bWFwU291cmNlRnJvbUhJY29uPWFjY2Vzc29yPVN5c3RlbTo6V2luZG93czo6SW50ZXJvcDo6SW1hZ2luZzo6Q3JlYXRlQml0bWFwU291cmNlRnJvbUhJY29uLGZsYWdzPWdjb2JqZWN0Ci1PU19JbWFnaW5nX0NyZWF0ZUJpdG1hcFNvdXJjZUZyb21ISWNvbl8wPWNhc3Q9SW50UHRyCi1PU19JbWFnaW5nX0NyZWF0ZUJpdG1hcFNvdXJjZUZyb21ISWNvbl8xPWNhc3Q9SW50MzJSZWN0LGZsYWdzPWdjb2JqZWN0Ci1PU19JbWFnaW5nX0NyZWF0ZUJpdG1hcFNvdXJjZUZyb21ISWNvbl8yPWNhc3Q9Qml0bWFwU2l6ZU9wdGlvbnNeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0luZGV4ZWRHbHlwaFJ1bkNvbGxlY3Rpb25fQ3VycmVudD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0luZGV4ZWRHbHlwaFJ1bkNvbGxlY3Rpb25fQ3VycmVudF8wPWNhc3Q9KElFbnVtZXJhdG9yXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSW5kZXhlZEdseXBoUnVuQ29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yPWZsYWdzPWNwcCBnY29iamVjdAotT1NfSW5kZXhlZEdseXBoUnVuQ29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yXzA9Y2FzdD1JRW51bWVyYWJsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSW5kZXhlZEdseXBoUnVuX0dseXBoUnVuPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfSW5kZXhlZEdseXBoUnVuX0dseXBoUnVuXzA9Y2FzdD1JbmRleGVkR2x5cGhSdW5eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0luZGV4ZWRHbHlwaFJ1bl9UZXh0U291cmNlQ2hhcmFjdGVySW5kZXg9ZmxhZ3M9Z2V0dGVyCi1PU19JbmRleGVkR2x5cGhSdW5fVGV4dFNvdXJjZUNoYXJhY3RlckluZGV4XzA9Y2FzdD1JbmRleGVkR2x5cGhSdW5eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0luZGV4ZWRHbHlwaFJ1bl9UZXh0U291cmNlTGVuZ3RoPWZsYWdzPWdldHRlcgotT1NfSW5kZXhlZEdseXBoUnVuX1RleHRTb3VyY2VMZW5ndGhfMD1jYXN0PUluZGV4ZWRHbHlwaFJ1bl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSW5saW5lQ29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19JbmxpbmVDb2xsZWN0aW9uX0FkZF8wPWNhc3Q9SW5saW5lQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0lubGluZUNvbGxlY3Rpb25fQWRkXzE9Y2FzdD1JbmxpbmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0lubGluZUNvbGxlY3Rpb25fQ2xlYXI9ZmxhZ3M9Y3BwCi1PU19JbmxpbmVDb2xsZWN0aW9uX0NsZWFyXzA9Y2FzdD1JbmxpbmVDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotCi1PU19JbnB1dEV2ZW50QXJnc19UaW1lc3RhbXA9ZmxhZ3M9Z2V0dGVyCi1PU19JbnB1dEV2ZW50QXJnc19UaW1lc3RhbXBfMD1jYXN0PUlucHV0RXZlbnRBcmdzXixmbGFncz1nY29iamVjdAotCi1PU19JbnQzMlJlY3RfRW1wdHk9YWNjZXNzb3I9SW50MzJSZWN0OjpFbXB0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19JbnRQdHJfVG9JbnQzMj1mbGFncz1jcHAKLU9TX0ludFB0cl9Ub0ludDMyXzA9Y2FzdD0oSW50UHRyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfSXRlbUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oSXRlbUNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfSXRlbUNvbGxlY3Rpb25fQWRkXzE9Y2FzdD0oT2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fQ2xlYXI9ZmxhZ3M9Y3BwCi1PU19JdGVtQ29sbGVjdGlvbl9DbGVhcl8wPWNhc3Q9KEl0ZW1Db2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fQ291bnQ9ZmxhZ3M9Z2V0dGVyCi1PU19JdGVtQ29sbGVjdGlvbl9Db3VudF8wPWNhc3Q9KEl0ZW1Db2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fQ3VycmVudEl0ZW09ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19JdGVtQ29sbGVjdGlvbl9DdXJyZW50SXRlbV8wPWNhc3Q9KEl0ZW1Db2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fQ3VycmVudFBvc2l0aW9uPWZsYWdzPWdldHRlcgotT1NfSXRlbUNvbGxlY3Rpb25fQ3VycmVudFBvc2l0aW9uXzA9Y2FzdD1JdGVtQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fR2V0SXRlbUF0PWZsYWdzPWNwcCBnY29iamVjdAotT1NfSXRlbUNvbGxlY3Rpb25fR2V0SXRlbUF0XzA9Y2FzdD0oSXRlbUNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfSXRlbUNvbGxlY3Rpb25fR2V0SXRlbUF0XzE9Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX0luZGV4T2Y9ZmxhZ3M9Y3BwCi1PU19JdGVtQ29sbGVjdGlvbl9JbmRleE9mXzA9Y2FzdD1JdGVtQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX0l0ZW1Db2xsZWN0aW9uX0luZGV4T2ZfMT1jYXN0PShPYmplY3ReKSxmbGFncz1nY29iamVjdAotCi1PU19JdGVtQ29sbGVjdGlvbl9JbnNlcnQ9ZmxhZ3M9Y3BwCi1PU19JdGVtQ29sbGVjdGlvbl9JbnNlcnRfMD1jYXN0PShJdGVtQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19JdGVtQ29sbGVjdGlvbl9JbnNlcnRfMT0KLU9TX0l0ZW1Db2xsZWN0aW9uX0luc2VydF8yPWNhc3Q9KE9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZT1mbGFncz1jcHAKLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZV8wPWNhc3Q9SXRlbUNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19JdGVtQ29sbGVjdGlvbl9SZW1vdmVfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfSXRlbUNvbGxlY3Rpb25fUmVtb3ZlQXQ9ZmxhZ3M9Y3BwCi1PU19JdGVtQ29sbGVjdGlvbl9SZW1vdmVBdF8wPWNhc3Q9KEl0ZW1Db2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX0l0ZW1Db2xsZWN0aW9uX1JlbW92ZUF0XzE9Ci0KLU9TX0l0ZW1zQ29udHJvbF9IYXNJdGVtcz1mbGFncz1nZXR0ZXIKLU9TX0l0ZW1zQ29udHJvbF9IYXNJdGVtc18wPWNhc3Q9SXRlbXNDb250cm9sXixmbGFncz1nY29iamVjdAotCi1PU19JdGVtc0NvbnRyb2xfSXNUZXh0U2VhcmNoRW5hYmxlZD1mbGFncz1zZXR0ZXIKLU9TX0l0ZW1zQ29udHJvbF9Jc1RleHRTZWFyY2hFbmFibGVkXzA9Y2FzdD1JdGVtc0NvbnRyb2xeLGZsYWdzPWdjb2JqZWN0Ci1PU19JdGVtc0NvbnRyb2xfSXNUZXh0U2VhcmNoRW5hYmxlZF8xPQotCi1PU19JdGVtc0NvbnRyb2xfSXRlbXM9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19JdGVtc0NvbnRyb2xfSXRlbXNfMD1jYXN0PShJdGVtc0NvbnRyb2xeKSxmbGFncz1nY29iamVjdAotCi1PU19JdGVtc0NvbnRyb2xfSXRlbXNTb3VyY2U9ZmxhZ3M9c2V0dGVyCi1PU19JdGVtc0NvbnRyb2xfSXRlbXNTb3VyY2VfMD1jYXN0PUl0ZW1zQ29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX0l0ZW1zQ29udHJvbF9JdGVtc1NvdXJjZV8xPWNhc3Q9SUVudW1lcmFibGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0l0ZW1zUHJlc2VudGVyX3R5cGVpZD1hY2Nlc3Nvcj1JdGVtc1ByZXNlbnRlcjo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0pOSUdldE9iamVjdD1mbGFncz1ub19nZW4KLU9TX0pOSUdldE9iamVjdF8wPQotCi1PU19LZXlFdmVudEFyZ3NfSXNEb3duPWZsYWdzPWdldHRlcgotT1NfS2V5RXZlbnRBcmdzX0lzRG93bl8wPWNhc3Q9KEtleUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0tleUV2ZW50QXJnc19Jc1JlcGVhdD1mbGFncz1nZXR0ZXIKLU9TX0tleUV2ZW50QXJnc19Jc1JlcGVhdF8wPWNhc3Q9KEtleUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0tleUV2ZW50QXJnc19Jc1RvZ2dsZWQ9ZmxhZ3M9Z2V0dGVyCi1PU19LZXlFdmVudEFyZ3NfSXNUb2dnbGVkXzA9Y2FzdD0oS2V5RXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfS2V5RXZlbnRBcmdzX0tleT1mbGFncz1nZXR0ZXIKLU9TX0tleUV2ZW50QXJnc19LZXlfMD1jYXN0PShLZXlFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19LZXlFdmVudEFyZ3NfU3lzdGVtS2V5PWZsYWdzPWdldHRlcgotT1NfS2V5RXZlbnRBcmdzX1N5c3RlbUtleV8wPWNhc3Q9KEtleUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0tleUludGVyb3BfVmlydHVhbEtleUZyb21LZXk9YWNjZXNzb3I9S2V5SW50ZXJvcDo6VmlydHVhbEtleUZyb21LZXkKLU9TX0tleUludGVyb3BfVmlydHVhbEtleUZyb21LZXlfMD1jYXN0PUtleQotCi1PU19LZXlUaW1lX1VuaWZvcm09YWNjZXNzb3I9S2V5VGltZTo6VW5pZm9ybSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19LZXlib2FyZERldmljZV9Nb2RpZmllcnM9ZmxhZ3M9Z2V0dGVyCi1PU19LZXlib2FyZERldmljZV9Nb2RpZmllcnNfMD1jYXN0PShLZXlib2FyZERldmljZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0tleWJvYXJkRXZlbnRBcmdzX0tleWJvYXJkRGV2aWNlPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfS2V5Ym9hcmRFdmVudEFyZ3NfS2V5Ym9hcmREZXZpY2VfMD1jYXN0PUtleWJvYXJkRXZlbnRBcmdzXixmbGFncz1nY29iamVjdAotCi1PU19LZXlib2FyZE5hdmlnYXRpb25fR2V0SXNUYWJTdG9wPWFjY2Vzc29yPUtleWJvYXJkTmF2aWdhdGlvbjo6R2V0SXNUYWJTdG9wCi1PU19LZXlib2FyZE5hdmlnYXRpb25fR2V0SXNUYWJTdG9wXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXRDb250cm9sVGFiTmF2aWdhdGlvbj1hY2Nlc3Nvcj1LZXlib2FyZE5hdmlnYXRpb246OlNldENvbnRyb2xUYWJOYXZpZ2F0aW9uCi1PU19LZXlib2FyZE5hdmlnYXRpb25fU2V0Q29udHJvbFRhYk5hdmlnYXRpb25fMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXRDb250cm9sVGFiTmF2aWdhdGlvbl8xPWNhc3Q9KEtleWJvYXJkTmF2aWdhdGlvbk1vZGUpCi0KLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXREaXJlY3Rpb25hbE5hdmlnYXRpb249YWNjZXNzb3I9S2V5Ym9hcmROYXZpZ2F0aW9uOjpTZXREaXJlY3Rpb25hbE5hdmlnYXRpb24KLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXREaXJlY3Rpb25hbE5hdmlnYXRpb25fMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXREaXJlY3Rpb25hbE5hdmlnYXRpb25fMT1jYXN0PShLZXlib2FyZE5hdmlnYXRpb25Nb2RlKQotCi1PU19LZXlib2FyZE5hdmlnYXRpb25fU2V0SXNUYWJTdG9wPWFjY2Vzc29yPUtleWJvYXJkTmF2aWdhdGlvbjo6U2V0SXNUYWJTdG9wCi1PU19LZXlib2FyZE5hdmlnYXRpb25fU2V0SXNUYWJTdG9wXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19LZXlib2FyZE5hdmlnYXRpb25fU2V0SXNUYWJTdG9wXzE9Ci0KLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXRUYWJOYXZpZ2F0aW9uPWFjY2Vzc29yPUtleWJvYXJkTmF2aWdhdGlvbjo6U2V0VGFiTmF2aWdhdGlvbgotT1NfS2V5Ym9hcmROYXZpZ2F0aW9uX1NldFRhYk5hdmlnYXRpb25fMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX0tleWJvYXJkTmF2aWdhdGlvbl9TZXRUYWJOYXZpZ2F0aW9uXzE9Y2FzdD0oS2V5Ym9hcmROYXZpZ2F0aW9uTW9kZSkKLQotT1NfS2V5Ym9hcmRfRm9jdXM9YWNjZXNzb3I9S2V5Ym9hcmQ6OkZvY3VzLGZsYWdzPWdjb2JqZWN0Ci1PU19LZXlib2FyZF9Gb2N1c18wPWNhc3Q9SUlucHV0RWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfS2V5Ym9hcmRfRm9jdXNlZEVsZW1lbnQ9YWNjZXNzb3I9S2V5Ym9hcmQ6OkZvY3VzZWRFbGVtZW50LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX0tleWJvYXJkX01vZGlmaWVycz1hY2Nlc3Nvcj1LZXlib2FyZDo6TW9kaWZpZXJzLGZsYWdzPWNvbnN0Ci0KLU9TX0xpc3RCb3hJdGVtXzFJc1NlbGVjdGVkX19JPWZsYWdzPWdldHRlcgotT1NfTGlzdEJveEl0ZW1fMUlzU2VsZWN0ZWRfX0lfMD1jYXN0PUxpc3RCb3hJdGVtXixmbGFncz1nY29iamVjdAotCi1PU19MaXN0Qm94SXRlbV8xSXNTZWxlY3RlZF9fSVo9ZmxhZ3M9c2V0dGVyCi1PU19MaXN0Qm94SXRlbV8xSXNTZWxlY3RlZF9fSVpfMD1jYXN0PUxpc3RCb3hJdGVtXixmbGFncz1nY29iamVjdAotT1NfTGlzdEJveEl0ZW1fMUlzU2VsZWN0ZWRfX0laXzE9Ci0KLU9TX0xpc3RCb3hfU2Nyb2xsSW50b1ZpZXc9ZmxhZ3M9Y3BwCi1PU19MaXN0Qm94X1Njcm9sbEludG9WaWV3XzA9Y2FzdD1MaXN0Qm94XixmbGFncz1nY29iamVjdAotT1NfTGlzdEJveF9TY3JvbGxJbnRvVmlld18xPWNhc3Q9KE9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0xpc3RCb3hfU2VsZWN0QWxsPWZsYWdzPWNwcAotT1NfTGlzdEJveF9TZWxlY3RBbGxfMD1jYXN0PUxpc3RCb3heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0xpc3RCb3hfU2VsZWN0ZWRJdGVtcz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX0xpc3RCb3hfU2VsZWN0ZWRJdGVtc18wPWNhc3Q9TGlzdEJveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfTGlzdEJveF9TZWxlY3Rpb25Nb2RlPWZsYWdzPXNldHRlcgotT1NfTGlzdEJveF9TZWxlY3Rpb25Nb2RlXzA9Y2FzdD0oTGlzdEJveF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19MaXN0Qm94X1NlbGVjdGlvbk1vZGVfMT1jYXN0PShTZWxlY3Rpb25Nb2RlKQotCi1PU19MaXN0Qm94X1Vuc2VsZWN0QWxsPWZsYWdzPWNwcAotT1NfTGlzdEJveF9VbnNlbGVjdEFsbF8wPWNhc3Q9TGlzdEJveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfTGlzdFZpZXdfVmlldz1mbGFncz1zZXR0ZXIKLU9TX0xpc3RWaWV3X1ZpZXdfMD1jYXN0PUxpc3RWaWV3XixmbGFncz1nY29iamVjdAotT1NfTGlzdFZpZXdfVmlld18xPWNhc3Q9Vmlld0Jhc2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX0xvYWRJbWFnZT0KLU9TX0xvYWRJbWFnZV8wPWNhc3Q9SElOU1RBTkNFCi1PU19Mb2FkSW1hZ2VfMT1jYXN0PUxQQ1RTVFIKLU9TX0xvYWRJbWFnZV8yPWNhc3Q9VUlOVAotT1NfTG9hZEltYWdlXzM9Ci1PU19Mb2FkSW1hZ2VfND0KLU9TX0xvYWRJbWFnZV81PWNhc3Q9VUlOVAotCi1PU19NYXBWaXJ0dWFsS2V5Vz0KLU9TX01hcFZpcnR1YWxLZXlXXzA9Ci1PU19NYXBWaXJ0dWFsS2V5V18xPQotCi1PU19NYXRyaXhUcmFuc2Zvcm1fMU1hdHJpeF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX01hdHJpeFRyYW5zZm9ybV8xTWF0cml4X19JXzA9Y2FzdD0oTWF0cml4VHJhbnNmb3JtXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWF0cml4VHJhbnNmb3JtXzFNYXRyaXhfX0lJPWZsYWdzPXNldHRlcgotT1NfTWF0cml4VHJhbnNmb3JtXzFNYXRyaXhfX0lJXzA9Y2FzdD0oTWF0cml4VHJhbnNmb3JtXiksZmxhZ3M9Z2NvYmplY3QKLU9TX01hdHJpeFRyYW5zZm9ybV8xTWF0cml4X19JSV8xPWNhc3Q9KE1hdHJpeCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWF0cml4X0ludmVydD1mbGFncz1jcHAKLU9TX01hdHJpeF9JbnZlcnRfMD1jYXN0PShNYXRyaXheKSxmbGFncz1nY29iamVjdAotCi1PU19NYXRyaXhfSXNJZGVudGl0eT1mbGFncz1nZXR0ZXIKLU9TX01hdHJpeF9Jc0lkZW50aXR5XzA9Y2FzdD0oTWF0cml4XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWF0cml4XzFNMTFfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19NYXRyaXhfMU0xMV9fSV8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01hdHJpeF8xTTExX19JRD1mbGFncz1zZXR0ZXIKLU9TX01hdHJpeF8xTTExX19JRF8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfMU0xMV9fSURfMT0KLQotT1NfTWF0cml4XzFNMTJfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19NYXRyaXhfMU0xMl9fSV8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01hdHJpeF8xTTEyX19JRD1mbGFncz1zZXR0ZXIKLU9TX01hdHJpeF8xTTEyX19JRF8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfMU0xMl9fSURfMT0KLQotT1NfTWF0cml4XzFNMjFfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19NYXRyaXhfMU0yMV9fSV8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01hdHJpeF8xTTIxX19JRD1mbGFncz1zZXR0ZXIKLU9TX01hdHJpeF8xTTIxX19JRF8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfMU0yMV9fSURfMT0KLQotT1NfTWF0cml4XzFNMjJfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19NYXRyaXhfMU0yMl9fSV8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01hdHJpeF8xTTIyX19JRD1mbGFncz1zZXR0ZXIKLU9TX01hdHJpeF8xTTIyX19JRF8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfMU0yMl9fSURfMT0KLQotT1NfTWF0cml4X011bHRpcGx5PWFjY2Vzc29yPU1hdHJpeDo6TXVsdGlwbHksZmxhZ3M9Z2NvYmplY3QKLU9TX01hdHJpeF9NdWx0aXBseV8wPWNhc3Q9KE1hdHJpeCksZmxhZ3M9Z2NvYmplY3QKLU9TX01hdHJpeF9NdWx0aXBseV8xPWNhc3Q9KE1hdHJpeCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWF0cml4XzFPZmZzZXRYX19JPWZsYWdzPWdldHRlcgotT1NfTWF0cml4XzFPZmZzZXRYX19JXzA9Y2FzdD0oTWF0cml4XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWF0cml4XzFPZmZzZXRYX19JRD1mbGFncz1zZXR0ZXIKLU9TX01hdHJpeF8xT2Zmc2V0WF9fSURfMD1jYXN0PShNYXRyaXheKSxmbGFncz1nY29iamVjdAotT1NfTWF0cml4XzFPZmZzZXRYX19JRF8xPQotCi1PU19NYXRyaXhfMU9mZnNldFlfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19NYXRyaXhfMU9mZnNldFlfX0lfMD1jYXN0PShNYXRyaXheKSxmbGFncz1nY29iamVjdAotCi1PU19NYXRyaXhfMU9mZnNldFlfX0lEPWZsYWdzPXNldHRlcgotT1NfTWF0cml4XzFPZmZzZXRZX19JRF8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfMU9mZnNldFlfX0lEXzE9Ci0KLU9TX01hdHJpeF9Sb3RhdGVQcmVwZW5kPWZsYWdzPWNwcAotT1NfTWF0cml4X1JvdGF0ZVByZXBlbmRfMD1jYXN0PShNYXRyaXheKSxmbGFncz1nY29iamVjdAotT1NfTWF0cml4X1JvdGF0ZVByZXBlbmRfMT0KLQotT1NfTWF0cml4X1NjYWxlUHJlcGVuZD1mbGFncz1jcHAKLU9TX01hdHJpeF9TY2FsZVByZXBlbmRfMD1jYXN0PShNYXRyaXheKSxmbGFncz1nY29iamVjdAotT1NfTWF0cml4X1NjYWxlUHJlcGVuZF8xPQotT1NfTWF0cml4X1NjYWxlUHJlcGVuZF8yPQotCi1PU19NYXRyaXhfVHJhbnNmb3JtPWZsYWdzPWNwcCBnY29iamVjdAotT1NfTWF0cml4X1RyYW5zZm9ybV8wPWNhc3Q9KE1hdHJpeF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19NYXRyaXhfVHJhbnNmb3JtXzE9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotCi1PU19NYXRyaXhfVHJhbnNsYXRlUHJlcGVuZD1mbGFncz1jcHAKLU9TX01hdHJpeF9UcmFuc2xhdGVQcmVwZW5kXzA9Y2FzdD0oTWF0cml4XiksZmxhZ3M9Z2NvYmplY3QKLU9TX01hdHJpeF9UcmFuc2xhdGVQcmVwZW5kXzE9Ci1PU19NYXRyaXhfVHJhbnNsYXRlUHJlcGVuZF8yPQotCi1PU19NZW51SXRlbV9DbGljaz1mbGFncz1hZGRlcgotT1NfTWVudUl0ZW1fQ2xpY2tfMD1jYXN0PU1lbnVJdGVtXixmbGFncz1nY29iamVjdAotT1NfTWVudUl0ZW1fQ2xpY2tfMT1jYXN0PVJvdXRlZEV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWVudUl0ZW1fSWNvbj1mbGFncz1zZXR0ZXIKLU9TX01lbnVJdGVtX0ljb25fMD1jYXN0PU1lbnVJdGVtXixmbGFncz1nY29iamVjdAotT1NfTWVudUl0ZW1fSWNvbl8xPWNhc3Q9SW1hZ2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01lbnVJdGVtX0lucHV0R2VzdHVyZVRleHQ9ZmxhZ3M9c2V0dGVyCi1PU19NZW51SXRlbV9JbnB1dEdlc3R1cmVUZXh0XzA9Y2FzdD1NZW51SXRlbV4sZmxhZ3M9Z2NvYmplY3QKLU9TX01lbnVJdGVtX0lucHV0R2VzdHVyZVRleHRfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfTWVudUl0ZW1fSXNDaGVja2FibGU9ZmxhZ3M9c2V0dGVyCi1PU19NZW51SXRlbV9Jc0NoZWNrYWJsZV8wPWNhc3Q9TWVudUl0ZW1eLGZsYWdzPWdjb2JqZWN0Ci1PU19NZW51SXRlbV9Jc0NoZWNrYWJsZV8xPQotCi1PU19NZW51SXRlbV8xSXNDaGVja2VkX19JPWZsYWdzPWdldHRlcgotT1NfTWVudUl0ZW1fMUlzQ2hlY2tlZF9fSV8wPWNhc3Q9TWVudUl0ZW1eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01lbnVJdGVtXzFJc0NoZWNrZWRfX0laPWZsYWdzPXNldHRlcgotT1NfTWVudUl0ZW1fMUlzQ2hlY2tlZF9fSVpfMD1jYXN0PU1lbnVJdGVtXixmbGFncz1nY29iamVjdAotT1NfTWVudUl0ZW1fMUlzQ2hlY2tlZF9fSVpfMT0KLQotT1NfTWVudUl0ZW1fU3VibWVudUNsb3NlZD1mbGFncz1hZGRlcgotT1NfTWVudUl0ZW1fU3VibWVudUNsb3NlZF8wPWNhc3Q9TWVudUl0ZW1eLGZsYWdzPWdjb2JqZWN0Ci1PU19NZW51SXRlbV9TdWJtZW51Q2xvc2VkXzE9Y2FzdD1Sb3V0ZWRFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01lbnVJdGVtX1N1Ym1lbnVPcGVuZWQ9ZmxhZ3M9YWRkZXIKLU9TX01lbnVJdGVtX1N1Ym1lbnVPcGVuZWRfMD1jYXN0PU1lbnVJdGVtXixmbGFncz1nY29iamVjdAotT1NfTWVudUl0ZW1fU3VibWVudU9wZW5lZF8xPWNhc3Q9Um91dGVkRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19NZW51X0lzTWFpbk1lbnU9ZmxhZ3M9c2V0dGVyCi1PU19NZW51X0lzTWFpbk1lbnVfMD1jYXN0PU1lbnVeLGZsYWdzPWdjb2JqZWN0Ci1PU19NZW51X0lzTWFpbk1lbnVfMT0KLQotT1NfTWVzc2FnZUJveF9TaG93PWFjY2Vzc29yPU1lc3NhZ2VCb3g6OlNob3cKLU9TX01lc3NhZ2VCb3hfU2hvd18wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotT1NfTWVzc2FnZUJveF9TaG93XzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci1PU19NZXNzYWdlQm94X1Nob3dfMj1jYXN0PU1lc3NhZ2VCb3hCdXR0b24KLU9TX01lc3NhZ2VCb3hfU2hvd18zPWNhc3Q9TWVzc2FnZUJveEltYWdlCi1PU19NZXNzYWdlQm94X1Nob3dfND1jYXN0PU1lc3NhZ2VCb3hSZXN1bHQKLQotT1NfTW91c2VCdXR0b25FdmVudEFyZ3NfQnV0dG9uU3RhdGU9ZmxhZ3M9Z2V0dGVyCi1PU19Nb3VzZUJ1dHRvbkV2ZW50QXJnc19CdXR0b25TdGF0ZV8wPWNhc3Q9KE1vdXNlQnV0dG9uRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfTW91c2VCdXR0b25FdmVudEFyZ3NfQ2hhbmdlZEJ1dHRvbj1mbGFncz1nZXR0ZXIKLU9TX01vdXNlQnV0dG9uRXZlbnRBcmdzX0NoYW5nZWRCdXR0b25fMD1jYXN0PShNb3VzZUJ1dHRvbkV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlQnV0dG9uRXZlbnRBcmdzX0NsaWNrQ291bnQ9ZmxhZ3M9Z2V0dGVyCi1PU19Nb3VzZUJ1dHRvbkV2ZW50QXJnc19DbGlja0NvdW50XzA9Y2FzdD0oTW91c2VCdXR0b25FdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19Nb3VzZUV2ZW50QXJnc19HZXRQb3NpdGlvbj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX01vdXNlRXZlbnRBcmdzX0dldFBvc2l0aW9uXzA9Y2FzdD1Nb3VzZUV2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLU9TX01vdXNlRXZlbnRBcmdzX0dldFBvc2l0aW9uXzE9Y2FzdD0oSUlucHV0RWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlRXZlbnRBcmdzX0xlZnRCdXR0b249ZmxhZ3M9Z2V0dGVyCi1PU19Nb3VzZUV2ZW50QXJnc19MZWZ0QnV0dG9uXzA9Y2FzdD0oTW91c2VFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19Nb3VzZUV2ZW50QXJnc19NaWRkbGVCdXR0b249ZmxhZ3M9Z2V0dGVyCi1PU19Nb3VzZUV2ZW50QXJnc19NaWRkbGVCdXR0b25fMD1jYXN0PShNb3VzZUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlRXZlbnRBcmdzX1JpZ2h0QnV0dG9uPWZsYWdzPWdldHRlcgotT1NfTW91c2VFdmVudEFyZ3NfUmlnaHRCdXR0b25fMD1jYXN0PShNb3VzZUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlRXZlbnRBcmdzX1hCdXR0b24xPWZsYWdzPWdldHRlcgotT1NfTW91c2VFdmVudEFyZ3NfWEJ1dHRvbjFfMD1jYXN0PShNb3VzZUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlRXZlbnRBcmdzX1hCdXR0b24yPWZsYWdzPWdldHRlcgotT1NfTW91c2VFdmVudEFyZ3NfWEJ1dHRvbjJfMD1jYXN0PShNb3VzZUV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX01vdXNlV2hlZWxFdmVudEFyZ3NfRGVsdGE9ZmxhZ3M9Z2V0dGVyCi1PU19Nb3VzZVdoZWVsRXZlbnRBcmdzX0RlbHRhXzA9Y2FzdD1Nb3VzZVdoZWVsRXZlbnRBcmdzXixmbGFncz1nY29iamVjdAotCi1PU19Nb3VzZV9DYXB0dXJlZD1hY2Nlc3Nvcj1Nb3VzZTo6Q2FwdHVyZWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfTW91c2VfRGlyZWN0bHlPdmVyPWFjY2Vzc29yPU1vdXNlOjpEaXJlY3RseU92ZXIsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfTW91c2VfR2V0UG9zaXRpb249YWNjZXNzb3I9TW91c2U6OkdldFBvc2l0aW9uLGZsYWdzPWdjb2JqZWN0Ci1PU19Nb3VzZV9HZXRQb3NpdGlvbl8wPWNhc3Q9SUlucHV0RWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfTW91c2VfTGVmdEJ1dHRvbj1hY2Nlc3Nvcj1Nb3VzZTo6TGVmdEJ1dHRvbixmbGFncz1jb25zdAotCi1PU19Nb3VzZV9NaWRkbGVCdXR0b249YWNjZXNzb3I9TW91c2U6Ok1pZGRsZUJ1dHRvbixmbGFncz1jb25zdAotCi1PU19Nb3VzZV9SaWdodEJ1dHRvbj1hY2Nlc3Nvcj1Nb3VzZTo6UmlnaHRCdXR0b24sZmxhZ3M9Y29uc3QKLQotT1NfTW91c2VfU2V0Q3Vyc29yPWFjY2Vzc29yPU1vdXNlOjpTZXRDdXJzb3IKLU9TX01vdXNlX1NldEN1cnNvcl8wPWNhc3Q9Q3Vyc29yXixmbGFncz1nY29iamVjdAotCi1PU19Nb3VzZV9YQnV0dG9uMT1hY2Nlc3Nvcj1Nb3VzZTo6WEJ1dHRvbjEsZmxhZ3M9Y29uc3QKLQotT1NfTW91c2VfWEJ1dHRvbjI9YWNjZXNzb3I9TW91c2U6OlhCdXR0b24yLGZsYWdzPWNvbnN0Ci0KLU9TX01vdmVNZW1vcnk9Ci1PU19Nb3ZlTWVtb3J5XzA9Y2FzdD1QVk9JRAotT1NfTW92ZU1lbW9yeV8xPWNhc3Q9Q09OU1QgVk9JRCAqLGZsYWdzPW5vX291dCBjcml0aWNhbAotT1NfTW92ZU1lbW9yeV8yPQotCi1PU19OZXdHbG9iYWxSZWY9ZmxhZ3M9am5pCi1PU19OZXdHbG9iYWxSZWZfMD0KLQotT1NfT2JqZWN0X0VxdWFscz1mbGFncz1jcHAKLU9TX09iamVjdF9FcXVhbHNfMD1jYXN0PU9iamVjdCBeLGZsYWdzPWdjb2JqZWN0Ci1PU19PYmplY3RfRXF1YWxzXzE9Y2FzdD1PYmplY3QgXixmbGFncz1nY29iamVjdAotCi1PU19PYmplY3RfR2V0VHlwZT1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX09iamVjdF9HZXRUeXBlXzA9Y2FzdD0oT2JqZWN0IF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX09iamVjdF9Ub1N0cmluZz1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX09iamVjdF9Ub1N0cmluZ18wPWNhc3Q9KE9iamVjdCBeKSxmbGFncz1nY29iamVjdAotCi1PU19PcGVuRmlsZURpYWxvZ19NdWx0aXNlbGVjdD1mbGFncz1zZXR0ZXIKLU9TX09wZW5GaWxlRGlhbG9nX011bHRpc2VsZWN0XzA9Y2FzdD1PcGVuRmlsZURpYWxvZ14sZmxhZ3M9Z2NvYmplY3QKLU9TX09wZW5GaWxlRGlhbG9nX011bHRpc2VsZWN0XzE9Ci0KLU9TX1BST0NFU1NfSU5GT1JNQVRJT05fc2l6ZW9mPQotCi1PU19QYW5lbF8xQmFja2dyb3VuZF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1BhbmVsXzFCYWNrZ3JvdW5kX19JXzA9Y2FzdD1QYW5lbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGFuZWxfMUJhY2tncm91bmRfX0lJPWZsYWdzPXNldHRlcgotT1NfUGFuZWxfMUJhY2tncm91bmRfX0lJXzA9Y2FzdD1QYW5lbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1BhbmVsXzFCYWNrZ3JvdW5kX19JSV8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhbmVsX0JhY2tncm91bmRQcm9wZXJ0eT1hY2Nlc3Nvcj1QYW5lbDo6QmFja2dyb3VuZFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BhbmVsX0NoaWxkcmVuPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfUGFuZWxfQ2hpbGRyZW5fMD1jYXN0PShQYW5lbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGFuZWxfR2V0WkluZGV4PWFjY2Vzc29yPVBhbmVsOjpHZXRaSW5kZXgKLU9TX1BhbmVsX0dldFpJbmRleF8wPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19QYW5lbF9TZXRaSW5kZXg9YWNjZXNzb3I9UGFuZWw6OlNldFpJbmRleAotT1NfUGFuZWxfU2V0WkluZGV4XzA9Y2FzdD1VSUVsZW1lbnQgXixmbGFncz1nY29iamVjdAotT1NfUGFuZWxfU2V0WkluZGV4XzE9Ci0KLU9TX1Bhc3N3b3JkQm94XzFNYXhMZW5ndGhfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19QYXNzd29yZEJveF8xTWF4TGVuZ3RoX19JXzA9Y2FzdD0oUGFzc3dvcmRCb3heKSxmbGFncz1nY29iamVjdAotCi1PU19QYXNzd29yZEJveF8xTWF4TGVuZ3RoX19JST1mbGFncz1zZXR0ZXIKLU9TX1Bhc3N3b3JkQm94XzFNYXhMZW5ndGhfX0lJXzA9Y2FzdD0oUGFzc3dvcmRCb3heKSxmbGFncz1nY29iamVjdAotT1NfUGFzc3dvcmRCb3hfMU1heExlbmd0aF9fSUlfMT0KLQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkX19JXzA9Y2FzdD0oUGFzc3dvcmRCb3heKSxmbGFncz1nY29iamVjdAotCi1PU19QYXNzd29yZEJveF8xUGFzc3dvcmRfX0lJPWZsYWdzPXNldHRlcgotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkX19JSV8wPWNhc3Q9KFBhc3N3b3JkQm94XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZF9fSUlfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGFzc3dvcmRCb3hfUGFzc3dvcmRDaGFuZ2VkPWZsYWdzPWFkZGVyCi1PU19QYXNzd29yZEJveF9QYXNzd29yZENoYW5nZWRfMD1jYXN0PShQYXNzd29yZEJveF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19QYXNzd29yZEJveF9QYXNzd29yZENoYW5nZWRfMT1jYXN0PVJvdXRlZEV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fST1mbGFncz1nZXR0ZXIKLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZENoYXJfX0lfMD1jYXN0PShQYXNzd29yZEJveF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Bhc3N3b3JkQm94XzFQYXNzd29yZENoYXJfX0lDPWZsYWdzPXNldHRlcgotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fSUNfMD1jYXN0PVBhc3N3b3JkQm94XixmbGFncz1nY29iamVjdAotT1NfUGFzc3dvcmRCb3hfMVBhc3N3b3JkQ2hhcl9fSUNfMT0KLQotT1NfUGFzc3dvcmRCb3hfUGFzdGU9ZmxhZ3M9Y3BwCi1PU19QYXNzd29yZEJveF9QYXN0ZV8wPWNhc3Q9KFBhc3N3b3JkQm94XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGF0aEZpZ3VyZUNvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfUGF0aEZpZ3VyZUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oUGF0aEZpZ3VyZUNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfUGF0aEZpZ3VyZUNvbGxlY3Rpb25fQWRkXzE9Y2FzdD1QYXRoRmlndXJlXixmbGFncz1nY29iamVjdAotCi1PU19QYXRoRmlndXJlQ29sbGVjdGlvbl9Db3VudD1mbGFncz1nZXR0ZXIKLU9TX1BhdGhGaWd1cmVDb2xsZWN0aW9uX0NvdW50XzA9Y2FzdD1QYXRoRmlndXJlQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19QYXRoRmlndXJlXzFJc0Nsb3NlZF9fSV8wPWNhc3Q9UGF0aEZpZ3VyZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0laPWZsYWdzPXNldHRlcgotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0laXzA9Y2FzdD1QYXRoRmlndXJlXixmbGFncz1nY29iamVjdAotT1NfUGF0aEZpZ3VyZV8xSXNDbG9zZWRfX0laXzE9Ci0KLU9TX1BhdGhGaWd1cmVfMVNlZ21lbnRzX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfUGF0aEZpZ3VyZV8xU2VnbWVudHNfX0lfMD1jYXN0PVBhdGhGaWd1cmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhdGhGaWd1cmVfMVNlZ21lbnRzX19JST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1BhdGhGaWd1cmVfMVNlZ21lbnRzX19JSV8wPWNhc3Q9UGF0aEZpZ3VyZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1BhdGhGaWd1cmVfMVNlZ21lbnRzX19JSV8xPQotCi1PU19QYXRoRmlndXJlX1N0YXJ0UG9pbnQ9ZmxhZ3M9c2V0dGVyCi1PU19QYXRoRmlndXJlX1N0YXJ0UG9pbnRfMD1jYXN0PVBhdGhGaWd1cmVeLGZsYWdzPWdjb2JqZWN0Ci1PU19QYXRoRmlndXJlX1N0YXJ0UG9pbnRfMT1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhdGhHZW9tZXRyeV9BZGRHZW9tZXRyeT1mbGFncz1jcHAKLU9TX1BhdGhHZW9tZXRyeV9BZGRHZW9tZXRyeV8wPWNhc3Q9UGF0aEdlb21ldHJ5XixmbGFncz1nY29iamVjdAotT1NfUGF0aEdlb21ldHJ5X0FkZEdlb21ldHJ5XzE9Y2FzdD1HZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGF0aEdlb21ldHJ5X0JvdW5kcz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1BhdGhHZW9tZXRyeV9Cb3VuZHNfMD1jYXN0PVBhdGhHZW9tZXRyeV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGF0aEdlb21ldHJ5XzFGaWd1cmVzX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfUGF0aEdlb21ldHJ5XzFGaWd1cmVzX19JXzA9Y2FzdD1QYXRoR2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhdGhHZW9tZXRyeV8xRmlndXJlc19fSUk9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19QYXRoR2VvbWV0cnlfMUZpZ3VyZXNfX0lJXzA9Y2FzdD1QYXRoR2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci1PU19QYXRoR2VvbWV0cnlfMUZpZ3VyZXNfX0lJXzE9Ci0KLU9TX1BhdGhHZW9tZXRyeV9GaWxsUnVsZT1mbGFncz1zZXR0ZXIKLU9TX1BhdGhHZW9tZXRyeV9GaWxsUnVsZV8wPWNhc3Q9UGF0aEdlb21ldHJ5XixmbGFncz1nY29iamVjdAotT1NfUGF0aEdlb21ldHJ5X0ZpbGxSdWxlXzE9Y2FzdD1GaWxsUnVsZQotCi1PU19QYXRoU2VnbWVudENvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfUGF0aFNlZ21lbnRDb2xsZWN0aW9uX0FkZF8wPWNhc3Q9UGF0aFNlZ21lbnRDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotT1NfUGF0aFNlZ21lbnRDb2xsZWN0aW9uX0FkZF8xPWNhc3Q9UGF0aFNlZ21lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhdGhTZWdtZW50Q29sbGVjdGlvbl9Db3VudD1mbGFncz1nZXR0ZXIKLU9TX1BhdGhTZWdtZW50Q29sbGVjdGlvbl9Db3VudF8wPWNhc3Q9UGF0aFNlZ21lbnRDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotCi1PU19QYXRoX0RhdGE9ZmxhZ3M9c2V0dGVyCi1PU19QYXRoX0RhdGFfMD1jYXN0PVBhdGheLGZsYWdzPWdjb2JqZWN0Ci1PU19QYXRoX0RhdGFfMT1jYXN0PUdlb21ldHJ5XixmbGFncz1nY29iamVjdAotCi1PU19QYXRoX0ZpbGw9ZmxhZ3M9c2V0dGVyCi1PU19QYXRoX0ZpbGxfMD1jYXN0PVBhdGheLGZsYWdzPWdjb2JqZWN0Ci1PU19QYXRoX0ZpbGxfMT1jYXN0PShCcnVzaF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BhdGhfU3RyZXRjaD1mbGFncz1zZXR0ZXIKLU9TX1BhdGhfU3RyZXRjaF8wPWNhc3Q9UGF0aF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1BhdGhfU3RyZXRjaF8xPWNhc3Q9U3RyZXRjaAotCi1PU19QZW5fMUJydXNoX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfUGVuXzFCcnVzaF9fSV8wPWNhc3Q9KFBlbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Blbl8xQnJ1c2hfX0lJPWZsYWdzPXNldHRlcgotT1NfUGVuXzFCcnVzaF9fSUlfMD1jYXN0PShQZW5eKSxmbGFncz1nY29iamVjdAotT1NfUGVuXzFCcnVzaF9fSUlfMT1jYXN0PUJydXNoXixmbGFncz1nY29iamVjdAotCi1PU19QZW5fRGFzaENhcD1mbGFncz1zZXR0ZXIKLU9TX1Blbl9EYXNoQ2FwXzA9Y2FzdD0oUGVuXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Blbl9EYXNoQ2FwXzE9Y2FzdD1QZW5MaW5lQ2FwCi0KLU9TX1Blbl9EYXNoU3R5bGU9ZmxhZ3M9c2V0dGVyCi1PU19QZW5fRGFzaFN0eWxlXzA9Y2FzdD0oUGVuXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Blbl9EYXNoU3R5bGVfMT1jYXN0PURhc2hTdHlsZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGVuX0VuZExpbmVDYXA9ZmxhZ3M9c2V0dGVyCi1PU19QZW5fRW5kTGluZUNhcF8wPWNhc3Q9KFBlbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19QZW5fRW5kTGluZUNhcF8xPWNhc3Q9KFBlbkxpbmVDYXAKLQotT1NfUGVuX0xpbmVKb2luPWZsYWdzPXNldHRlcgotT1NfUGVuX0xpbmVKb2luXzA9Y2FzdD0oUGVuXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Blbl9MaW5lSm9pbl8xPWNhc3Q9KFBlbkxpbmVKb2luKQotCi1PU19QZW5fTWl0ZXJMaW1pdD1mbGFncz1zZXR0ZXIKLU9TX1Blbl9NaXRlckxpbWl0XzA9Y2FzdD0oUGVuXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Blbl9NaXRlckxpbWl0XzE9Ci0KLU9TX1Blbl9TdGFydExpbmVDYXA9ZmxhZ3M9c2V0dGVyCi1PU19QZW5fU3RhcnRMaW5lQ2FwXzA9Y2FzdD0oUGVuXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Blbl9TdGFydExpbmVDYXBfMT1jYXN0PShQZW5MaW5lQ2FwKQotCi1PU19QZW5fVGhpY2tuZXNzPWZsYWdzPXNldHRlcgotT1NfUGVuX1RoaWNrbmVzc18wPWNhc3Q9KFBlbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19QZW5fVGhpY2tuZXNzXzE9Ci0KLU9TX1BpeGVsRm9ybWF0X0JpdHNQZXJQaXhlbD1mbGFncz1nZXR0ZXIKLU9TX1BpeGVsRm9ybWF0X0JpdHNQZXJQaXhlbF8wPWNhc3Q9KFBpeGVsRm9ybWF0XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUGl4ZWxGb3JtYXRzX0JncjEwMTAxMD1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkJncjEwMTAxMCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19QaXhlbEZvcm1hdHNfQmdyMjQ9YWNjZXNzb3I9UGl4ZWxGb3JtYXRzOjpCZ3IyNCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19QaXhlbEZvcm1hdHNfQmdyMzI9YWNjZXNzb3I9UGl4ZWxGb3JtYXRzOjpCZ3IzMixmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19QaXhlbEZvcm1hdHNfQmdyNTU1PWFjY2Vzc29yPVBpeGVsRm9ybWF0czo6QmdyNTU1LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19CZ3I1NjU9YWNjZXNzb3I9UGl4ZWxGb3JtYXRzOjpCZ3I1NjUsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfUGl4ZWxGb3JtYXRzX0JncmEzMj1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkJncmEzMixmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19QaXhlbEZvcm1hdHNfQmxhY2tXaGl0ZT1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkJsYWNrV2hpdGUsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfUGl4ZWxGb3JtYXRzX0RlZmF1bHQ9YWNjZXNzb3I9UGl4ZWxGb3JtYXRzOjpEZWZhdWx0LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19JbmRleGVkMT1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkluZGV4ZWQxLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19JbmRleGVkMj1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkluZGV4ZWQyLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19JbmRleGVkND1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkluZGV4ZWQ0LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19JbmRleGVkOD1hY2Nlc3Nvcj1QaXhlbEZvcm1hdHM6OkluZGV4ZWQ4LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1BpeGVsRm9ybWF0c19QYmdyYTMyPWFjY2Vzc29yPVBpeGVsRm9ybWF0czo6UGJncmEzMixmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19QaXhlbEZvcm1hdHNfUmdiMjQ9YWNjZXNzb3I9UGl4ZWxGb3JtYXRzOjpSZ2IyNCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Qb2ludENvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfUG9pbnRDb2xsZWN0aW9uX0FkZF8wPWNhc3Q9UG9pbnRDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotT1NfUG9pbnRDb2xsZWN0aW9uX0FkZF8xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLQotT1NfUG9pbnRfWD1mbGFncz1nZXR0ZXIKLU9TX1BvaW50X1hfMD1jYXN0PVBvaW50XixmbGFncz1nY29iamVjdAotCi1PU19Qb2ludF9ZPWZsYWdzPWdldHRlcgotT1NfUG9pbnRfWV8wPWNhc3Q9UG9pbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BvcHVwX0FsbG93c1RyYW5zcGFyZW5jeT1mbGFncz1zZXR0ZXIKLU9TX1BvcHVwX0FsbG93c1RyYW5zcGFyZW5jeV8wPWNhc3Q9UG9wdXBeLGZsYWdzPWdjb2JqZWN0Ci1PU19Qb3B1cF9BbGxvd3NUcmFuc3BhcmVuY3lfMT0KLQotT1NfUG9wdXBfMUNoaWxkX19JPWZsYWdzPWdldHRlciBnY29iamVjdAotT1NfUG9wdXBfMUNoaWxkX19JXzA9Y2FzdD1Qb3B1cF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUG9wdXBfMUNoaWxkX19JST1mbGFncz1zZXR0ZXIKLU9TX1BvcHVwXzFDaGlsZF9fSUlfMD1jYXN0PVBvcHVwXixmbGFncz1nY29iamVjdAotT1NfUG9wdXBfMUNoaWxkX19JSV8xPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19Qb3B1cF9DbG9zZWQ9ZmxhZ3M9YWRkZXIKLU9TX1BvcHVwX0Nsb3NlZF8wPWNhc3Q9UG9wdXBeLGZsYWdzPWdjb2JqZWN0Ci1PU19Qb3B1cF9DbG9zZWRfMT1jYXN0PUV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUG9wdXBfMUhvcml6b250YWxPZmZzZXRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19Qb3B1cF8xSG9yaXpvbnRhbE9mZnNldF9fSV8wPWNhc3Q9UG9wdXBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1BvcHVwXzFIb3Jpem9udGFsT2Zmc2V0X19JRD1mbGFncz1zZXR0ZXIKLU9TX1BvcHVwXzFIb3Jpem9udGFsT2Zmc2V0X19JRF8wPWNhc3Q9UG9wdXBeLGZsYWdzPWdjb2JqZWN0Ci1PU19Qb3B1cF8xSG9yaXpvbnRhbE9mZnNldF9fSURfMT0KLQotT1NfUG9wdXBfMUlzT3Blbl9fST1mbGFncz1nZXR0ZXIKLU9TX1BvcHVwXzFJc09wZW5fX0lfMD1jYXN0PVBvcHVwXixmbGFncz1nY29iamVjdAotCi1PU19Qb3B1cF8xSXNPcGVuX19JWj1mbGFncz1zZXR0ZXIKLU9TX1BvcHVwXzFJc09wZW5fX0laXzA9Y2FzdD1Qb3B1cF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1BvcHVwXzFJc09wZW5fX0laXzE9Ci0KLU9TX1BvcHVwX09wZW5lZD1mbGFncz1hZGRlcgotT1NfUG9wdXBfT3BlbmVkXzA9Y2FzdD1Qb3B1cF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1BvcHVwX09wZW5lZF8xPWNhc3Q9RXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19Qb3B1cF8xVmVydGljYWxPZmZzZXRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19Qb3B1cF8xVmVydGljYWxPZmZzZXRfX0lfMD1jYXN0PVBvcHVwXixmbGFncz1nY29iamVjdAotCi1PU19Qb3B1cF8xVmVydGljYWxPZmZzZXRfX0lEPWZsYWdzPXNldHRlcgotT1NfUG9wdXBfMVZlcnRpY2FsT2Zmc2V0X19JRF8wPWNhc3Q9UG9wdXBeLGZsYWdzPWdjb2JqZWN0Ci1PU19Qb3B1cF8xVmVydGljYWxPZmZzZXRfX0lEXzE9Ci0KLU9TX1ByZXNlbnRhdGlvblNvdXJjZV9DdXJyZW50U291cmNlcz1hY2Nlc3Nvcj1QcmVzZW50YXRpb25Tb3VyY2U6OkN1cnJlbnRTb3VyY2VzLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1ByZXNlbnRhdGlvblNvdXJjZV9Gcm9tVmlzdWFsPWFjY2Vzc29yPVByZXNlbnRhdGlvblNvdXJjZTo6RnJvbVZpc3VhbCxmbGFncz1nY29iamVjdAotT1NfUHJlc2VudGF0aW9uU291cmNlX0Zyb21WaXN1YWxfMD1jYXN0PVZpc3VhbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUHJlc2VudGF0aW9uU291cmNlX1Jvb3RWaXN1YWw9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19QcmVzZW50YXRpb25Tb3VyY2VfUm9vdFZpc3VhbF8wPWNhc3Q9UHJlc2VudGF0aW9uU291cmNlXixmbGFncz1nY29iamVjdAotCi1PU19Qcm9ncmVzc0Jhcl8xSXNJbmRldGVybWluYXRlX19JPWZsYWdzPWdldHRlcgotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fSV8wPWNhc3Q9KFByb2dyZXNzQmFyIF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Byb2dyZXNzQmFyXzFJc0luZGV0ZXJtaW5hdGVfX0laPWZsYWdzPXNldHRlcgotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fSVpfMD1jYXN0PShQcm9ncmVzc0JhciBeKSxmbGFncz1nY29iamVjdAotT1NfUHJvZ3Jlc3NCYXJfMUlzSW5kZXRlcm1pbmF0ZV9fSVpfMT0KLQotT1NfUHJvZ3Jlc3NCYXJfT3JpZW50YXRpb249ZmxhZ3M9c2V0dGVyCi1PU19Qcm9ncmVzc0Jhcl9PcmllbnRhdGlvbl8wPWNhc3Q9KFByb2dyZXNzQmFyIF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Qcm9ncmVzc0Jhcl9PcmllbnRhdGlvbl8xPWNhc3Q9KE9yaWVudGF0aW9uKQotCi1PU19Qcm9wZXJ0eUluZm9fU2V0VmFsdWU9ZmxhZ3M9Y3BwCi1PU19Qcm9wZXJ0eUluZm9fU2V0VmFsdWVfMD1jYXN0PShQcm9wZXJ0eUluZm9eKSxmbGFncz1nY29iamVjdAotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19Qcm9wZXJ0eUluZm9fU2V0VmFsdWVfMj1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1Byb3BlcnR5SW5mb19TZXRWYWx1ZV8zPWNhc3Q9KGFycmF5PE9iamVjdF4+XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlQm9vbGVhbj1hY2Nlc3Nvcj1Qcm9wZXJ0eUluZm86OlNldFZhbHVlLGZsYWdzPWNwcAotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlQm9vbGVhbl8wPWNhc3Q9UHJvcGVydHlJbmZvXixmbGFncz1nY29iamVjdAotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlQm9vbGVhbl8xPWNhc3Q9T2JqZWN0XixmbGFncz1nY29iamVjdAotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlQm9vbGVhbl8yPWNhc3Q9Ym9vbAotT1NfUHJvcGVydHlJbmZvX1NldFZhbHVlQm9vbGVhbl8zPWNhc3Q9KGFycmF5PE9iamVjdF4+XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUXVlcnlDb250aW51ZURyYWdFdmVudEFyZ3NfQWN0aW9uPWZsYWdzPXNldHRlcgotT1NfUXVlcnlDb250aW51ZURyYWdFdmVudEFyZ3NfQWN0aW9uXzA9Y2FzdD1RdWVyeUNvbnRpbnVlRHJhZ0V2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLU9TX1F1ZXJ5Q29udGludWVEcmFnRXZlbnRBcmdzX0FjdGlvbl8xPWNhc3Q9KERyYWdBY3Rpb24pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1F1ZXJ5Q29udGludWVEcmFnRXZlbnRBcmdzX0VzY2FwZVByZXNzZWQ9ZmxhZ3M9Z2V0dGVyCi1PU19RdWVyeUNvbnRpbnVlRHJhZ0V2ZW50QXJnc19Fc2NhcGVQcmVzc2VkXzA9Y2FzdD1RdWVyeUNvbnRpbnVlRHJhZ0V2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmFuZ2VCYXNlXzFMYXJnZUNoYW5nZV9fST1mbGFncz1nZXR0ZXIKLU9TX1JhbmdlQmFzZV8xTGFyZ2VDaGFuZ2VfX0lfMD1jYXN0PVJhbmdlQmFzZSBeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JhbmdlQmFzZV8xTGFyZ2VDaGFuZ2VfX0lEPWZsYWdzPXNldHRlcgotT1NfUmFuZ2VCYXNlXzFMYXJnZUNoYW5nZV9fSURfMD1jYXN0PVJhbmdlQmFzZSBeLGZsYWdzPWdjb2JqZWN0Ci1PU19SYW5nZUJhc2VfMUxhcmdlQ2hhbmdlX19JRF8xPQotCi1PU19SYW5nZUJhc2VfMU1heGltdW1fX0k9ZmxhZ3M9Z2V0dGVyCi1PU19SYW5nZUJhc2VfMU1heGltdW1fX0lfMD1jYXN0PShSYW5nZUJhc2UgXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmFuZ2VCYXNlXzFNYXhpbXVtX19JRD1mbGFncz1zZXR0ZXIKLU9TX1JhbmdlQmFzZV8xTWF4aW11bV9fSURfMD1jYXN0PShSYW5nZUJhc2UgXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1JhbmdlQmFzZV8xTWF4aW11bV9fSURfMT0KLQotT1NfUmFuZ2VCYXNlXzFNaW5pbXVtX19JPWZsYWdzPWdldHRlcgotT1NfUmFuZ2VCYXNlXzFNaW5pbXVtX19JXzA9Y2FzdD0oUmFuZ2VCYXNlIF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JhbmdlQmFzZV8xTWluaW11bV9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19SYW5nZUJhc2VfMU1pbmltdW1fX0lEXzA9Y2FzdD0oUmFuZ2VCYXNlIF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19SYW5nZUJhc2VfMU1pbmltdW1fX0lEXzE9Ci0KLU9TX1JhbmdlQmFzZV8xU21hbGxDaGFuZ2VfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19SYW5nZUJhc2VfMVNtYWxsQ2hhbmdlX19JXzA9Y2FzdD1SYW5nZUJhc2UgXixmbGFncz1nY29iamVjdAotCi1PU19SYW5nZUJhc2VfMVNtYWxsQ2hhbmdlX19JRD1mbGFncz1zZXR0ZXIKLU9TX1JhbmdlQmFzZV8xU21hbGxDaGFuZ2VfX0lEXzA9Y2FzdD1SYW5nZUJhc2UgXixmbGFncz1nY29iamVjdAotT1NfUmFuZ2VCYXNlXzFTbWFsbENoYW5nZV9fSURfMT0KLQotT1NfUmFuZ2VCYXNlXzFWYWx1ZV9fST1mbGFncz1nZXR0ZXIKLU9TX1JhbmdlQmFzZV8xVmFsdWVfX0lfMD1jYXN0PShSYW5nZUJhc2UgXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmFuZ2VCYXNlXzFWYWx1ZV9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19SYW5nZUJhc2VfMVZhbHVlX19JRF8wPWNhc3Q9KFJhbmdlQmFzZSBeKSxmbGFncz1nY29iamVjdAotT1NfUmFuZ2VCYXNlXzFWYWx1ZV9fSURfMT0KLQotT1NfUmFuZ2VCYXNlX1ZhbHVlQ2hhbmdlZD1mbGFncz1hZGRlcgotT1NfUmFuZ2VCYXNlX1ZhbHVlQ2hhbmdlZF8wPWNhc3Q9KFJhbmdlQmFzZSBeKSxmbGFncz1nY29iamVjdAotT1NfUmFuZ2VCYXNlX1ZhbHVlQ2hhbmdlZF8xPWNhc3Q9KFJvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlcjxkb3VibGU+IF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JlY3RfQ29udGFpbnM9ZmxhZ3M9Y3BwCi1PU19SZWN0X0NvbnRhaW5zXzA9Y2FzdD1SZWN0XixmbGFncz1nY29iamVjdAotT1NfUmVjdF9Db250YWluc18xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmVjdF8xSGVpZ2h0X19JPWZsYWdzPWdldHRlcgotT1NfUmVjdF8xSGVpZ2h0X19JXzA9Y2FzdD0oUmVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JlY3RfMUhlaWdodF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19SZWN0XzFIZWlnaHRfX0lEXzA9Y2FzdD0oUmVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWN0XzFIZWlnaHRfX0lEXzE9Ci0KLU9TX1JlY3RfSW50ZXJzZWN0PWZsYWdzPWNwcAotT1NfUmVjdF9JbnRlcnNlY3RfMD1jYXN0PShSZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1JlY3RfSW50ZXJzZWN0XzE9Y2FzdD1SZWN0LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JlY3RfVW5pb249ZmxhZ3M9Y3BwCi1PU19SZWN0X1VuaW9uXzA9Y2FzdD0oUmVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWN0X1VuaW9uXzE9Y2FzdD0oUmVjdCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmVjdF8xV2lkdGhfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19SZWN0XzFXaWR0aF9fSV8wPWNhc3Q9KFJlY3ReKSxmbGFncz1nY29iamVjdAotCi1PU19SZWN0XzFXaWR0aF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19SZWN0XzFXaWR0aF9fSURfMD1jYXN0PShSZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1JlY3RfMVdpZHRoX19JRF8xPQotCi1PU19SZWN0XzFYX19JPWZsYWdzPWdldHRlcgotT1NfUmVjdF8xWF9fSV8wPWNhc3Q9KFJlY3ReKSxmbGFncz1nY29iamVjdAotCi1PU19SZWN0XzFYX19JRD1mbGFncz1zZXR0ZXIKLU9TX1JlY3RfMVhfX0lEXzA9Y2FzdD0oUmVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWN0XzFYX19JRF8xPQotCi1PU19SZWN0XzFZX19JPWZsYWdzPWdldHRlcgotT1NfUmVjdF8xWV9fSV8wPWNhc3Q9KFJlY3ReKSxmbGFncz1nY29iamVjdAotCi1PU19SZWN0XzFZX19JRD1mbGFncz1zZXR0ZXIKLU9TX1JlY3RfMVlfX0lEXzA9Y2FzdD0oUmVjdF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWN0XzFZX19JRF8xPQotCi1PU19SZWdpc3RyeUtleV9HZXRTdWJLZXlOYW1lcz1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX1JlZ2lzdHJ5S2V5X0dldFN1YktleU5hbWVzXzA9Y2FzdD1SZWdpc3RyeUtleV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfUmVnaXN0cnlLZXlfR2V0VmFsdWU9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19SZWdpc3RyeUtleV9HZXRWYWx1ZV8wPWNhc3Q9UmVnaXN0cnlLZXleLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWdpc3RyeUtleV9HZXRWYWx1ZV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19SZWdpc3RyeUtleV9PcGVuU3ViS2V5PWZsYWdzPWNwcCBnY29iamVjdAotT1NfUmVnaXN0cnlLZXlfT3BlblN1YktleV8wPWNhc3Q9UmVnaXN0cnlLZXleLGZsYWdzPWdjb2JqZWN0Ci1PU19SZWdpc3RyeUtleV9PcGVuU3ViS2V5XzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JlZ2lzdHJ5X0NsYXNzZXNSb290PWFjY2Vzc29yPVJlZ2lzdHJ5OjpDbGFzc2VzUm9vdCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19SZW5kZXJPcHRpb25zX0dldEJpdG1hcFNjYWxpbmdNb2RlPWFjY2Vzc29yPVJlbmRlck9wdGlvbnM6OkdldEJpdG1hcFNjYWxpbmdNb2RlCi1PU19SZW5kZXJPcHRpb25zX0dldEJpdG1hcFNjYWxpbmdNb2RlXzA9Y2FzdD0oRGVwZW5kZW5jeU9iamVjdF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JlbmRlck9wdGlvbnNfU2V0Qml0bWFwU2NhbGluZ01vZGU9YWNjZXNzb3I9UmVuZGVyT3B0aW9uczo6U2V0Qml0bWFwU2NhbGluZ01vZGUKLU9TX1JlbmRlck9wdGlvbnNfU2V0Qml0bWFwU2NhbGluZ01vZGVfMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1JlbmRlck9wdGlvbnNfU2V0Qml0bWFwU2NhbGluZ01vZGVfMT1jYXN0PShCaXRtYXBTY2FsaW5nTW9kZSkKLQotT1NfUmVuZGVyT3B0aW9uc19TZXRFZGdlTW9kZT1hY2Nlc3Nvcj1SZW5kZXJPcHRpb25zOjpTZXRFZGdlTW9kZQotT1NfUmVuZGVyT3B0aW9uc19TZXRFZGdlTW9kZV8wPWNhc3Q9KERlcGVuZGVuY3lPYmplY3ReKSxmbGFncz1nY29iamVjdAotT1NfUmVuZGVyT3B0aW9uc19TZXRFZGdlTW9kZV8xPWNhc3Q9KEVkZ2VNb2RlKQotCi1PU19SZW5kZXJUYXJnZXRCaXRtYXBfUmVuZGVyPWZsYWdzPWNwcAotT1NfUmVuZGVyVGFyZ2V0Qml0bWFwX1JlbmRlcl8wPWNhc3Q9UmVuZGVyVGFyZ2V0Qml0bWFwXixmbGFncz1nY29iamVjdAotT1NfUmVuZGVyVGFyZ2V0Qml0bWFwX1JlbmRlcl8xPWNhc3Q9VmlzdWFsXixmbGFncz1nY29iamVjdAotCi1PU19SZXBlYXRCZWhhdmlvcl9Gb3JldmVyPWFjY2Vzc29yPVJlcGVhdEJlaGF2aW9yOjpGb3JldmVyLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1Jlc291cmNlRGljdGlvbmFyeV9Tb3VyY2U9ZmxhZ3M9c2V0dGVyCi1PU19SZXNvdXJjZURpY3Rpb25hcnlfU291cmNlXzA9Y2FzdD1SZXNvdXJjZURpY3Rpb25hcnleLGZsYWdzPWdjb2JqZWN0Ci1PU19SZXNvdXJjZURpY3Rpb25hcnlfU291cmNlXzE9Y2FzdD1VcmleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JvdXRlZEV2ZW50QXJnc19IYW5kbGVkPWZsYWdzPXNldHRlcgotT1NfUm91dGVkRXZlbnRBcmdzX0hhbmRsZWRfMD1jYXN0PVJvdXRlZEV2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLU9TX1JvdXRlZEV2ZW50QXJnc19IYW5kbGVkXzE9Ci0KLU9TX1JvdXRlZEV2ZW50QXJnc19PcmlnaW5hbFNvdXJjZT1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1JvdXRlZEV2ZW50QXJnc19PcmlnaW5hbFNvdXJjZV8wPWNhc3Q9KFJvdXRlZEV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1JvdXRlZEV2ZW50QXJnc19Tb3VyY2U9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Sb3V0ZWRFdmVudEFyZ3NfU291cmNlXzA9Y2FzdD0oUm91dGVkRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfUm91dGVkRXZlbnRBcmdzX3R5cGVpZD1hY2Nlc3Nvcj1Sb3V0ZWRFdmVudEFyZ3M6OnR5cGVpZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3NfTmV3VmFsdWU9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3NfTmV3VmFsdWVfMD1jYXN0PShSb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3M8T2JqZWN0Xj5eKSxmbGFncz1nY29iamVjdAotCi1PU19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3NfT2xkVmFsdWU9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19Sb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3NfT2xkVmFsdWVfMD1jYXN0PShSb3V0ZWRQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3M8T2JqZWN0Xj5eKSxmbGFncz1nY29iamVjdAotCi1PU19Sb3dEZWZpbml0aW9uQ29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19Sb3dEZWZpbml0aW9uQ29sbGVjdGlvbl9BZGRfMD1jYXN0PShSb3dEZWZpbml0aW9uQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19Sb3dEZWZpbml0aW9uQ29sbGVjdGlvbl9BZGRfMT1jYXN0PVJvd0RlZmluaXRpb25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Jvd0RlZmluaXRpb25fSGVpZ2h0PWZsYWdzPXNldHRlcgotT1NfUm93RGVmaW5pdGlvbl9IZWlnaHRfMD1jYXN0PVJvd0RlZmluaXRpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19Sb3dEZWZpbml0aW9uX0hlaWdodF8xPWNhc3Q9KEdyaWRMZW5ndGgpLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1J1bl9UZXh0PWZsYWdzPXNldHRlcgotT1NfUnVuX1RleHRfMD1jYXN0PVJ1bl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1J1bl9UZXh0XzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NIRUxMRVhFQ1VURUlORk9XX3NpemVvZj0KLQotT1NfU1RBUlRVUElORk9XX3NpemVvZj0KLQotT1NfU1dUQ2FudmFzXzFWaXN1YWxfX0k9ZmxhZ3M9Z2V0dGVyIG5vX2dlbiBnY29iamVjdAotT1NfU1dUQ2FudmFzXzFWaXN1YWxfX0lfMD1jYXN0PShTV1RDYW52YXNeKSxmbGFncz1nY29iamVjdAotCi1PU19TV1RDYW52YXNfMVZpc3VhbF9fSUk9ZmxhZ3M9bm9fZ2VuIHNldHRlcgotT1NfU1dUQ2FudmFzXzFWaXN1YWxfX0lJXzA9Y2FzdD1TV1RDYW52YXNeLGZsYWdzPWdjb2JqZWN0Ci1PU19TV1RDYW52YXNfMVZpc3VhbF9fSUlfMT1jYXN0PURyYXdpbmdWaXN1YWxeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NXVFJvd19Ob3RpZnlQcm9wZXJ0eUNoYW5nZWQ9ZmxhZ3M9bm9fZ2VuCi1PU19TV1RSb3dfTm90aWZ5UHJvcGVydHlDaGFuZ2VkXzA9Ci1PU19TV1RSb3dfTm90aWZ5UHJvcGVydHlDaGFuZ2VkXzE9Ci0KLU9TX1NXVFRleHRSdW5Qcm9wZXJ0aWVzX0ZvcmVncm91bmRCcnVzaD1mbGFncz1ub19nZW4gc2V0dGVyCi1PU19TV1RUZXh0UnVuUHJvcGVydGllc19Gb3JlZ3JvdW5kQnJ1c2hfMD1jYXN0PVNXVFRleHRSdW5Qcm9wZXJ0aWVzXixmbGFncz1nY29iamVjdAotT1NfU1dUVGV4dFJ1blByb3BlcnRpZXNfRm9yZWdyb3VuZEJydXNoXzE9Y2FzdD1CcnVzaF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2Nyb2xsQmFyXzFPcmllbnRhdGlvbl9fST1mbGFncz1nZXR0ZXIKLU9TX1Njcm9sbEJhcl8xT3JpZW50YXRpb25fX0lfMD1jYXN0PShTY3JvbGxCYXJeKSxmbGFncz1nY29iamVjdAotCi1PU19TY3JvbGxCYXJfMU9yaWVudGF0aW9uX19JST1mbGFncz1zZXR0ZXIKLU9TX1Njcm9sbEJhcl8xT3JpZW50YXRpb25fX0lJXzA9Y2FzdD0oU2Nyb2xsQmFyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Njcm9sbEJhcl8xT3JpZW50YXRpb25fX0lJXzE9Y2FzdD1PcmllbnRhdGlvbgotCi1PU19TY3JvbGxCYXJfU2Nyb2xsPWZsYWdzPWFkZGVyCi1PU19TY3JvbGxCYXJfU2Nyb2xsXzA9Y2FzdD0oU2Nyb2xsQmFyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Njcm9sbEJhcl9TY3JvbGxfMT1jYXN0PShTY3JvbGxFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19TY3JvbGxCYXJfMVZpZXdwb3J0U2l6ZV9fST1mbGFncz1nZXR0ZXIKLU9TX1Njcm9sbEJhcl8xVmlld3BvcnRTaXplX19JXzA9Y2FzdD0oU2Nyb2xsQmFyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2Nyb2xsQmFyXzFWaWV3cG9ydFNpemVfX0lEPWZsYWdzPXNldHRlcgotT1NfU2Nyb2xsQmFyXzFWaWV3cG9ydFNpemVfX0lEXzA9Y2FzdD0oU2Nyb2xsQmFyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Njcm9sbEJhcl8xVmlld3BvcnRTaXplX19JRF8xPQotCi1PU19TY3JvbGxCYXJfdHlwZWlkPWFjY2Vzc29yPVNjcm9sbEJhcjo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1Njcm9sbEV2ZW50QXJnc19TY3JvbGxFdmVudFR5cGU9ZmxhZ3M9Z2V0dGVyCi1PU19TY3JvbGxFdmVudEFyZ3NfU2Nyb2xsRXZlbnRUeXBlXzA9Y2FzdD1TY3JvbGxFdmVudEFyZ3NeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Njcm9sbFZpZXdlcl9TZXRIb3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eT1hY2Nlc3Nvcj1TY3JvbGxWaWV3ZXI6OlNldEhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5Ci1PU19TY3JvbGxWaWV3ZXJfU2V0SG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHlfMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Njcm9sbFZpZXdlcl9TZXRIb3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eV8xPWNhc3Q9KFNjcm9sbEJhclZpc2liaWxpdHkpCi0KLU9TX1Njcm9sbFZpZXdlcl9TZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHk9YWNjZXNzb3I9U2Nyb2xsVmlld2VyOjpTZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkKLU9TX1Njcm9sbFZpZXdlcl9TZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHlfMD1jYXN0PShEZXBlbmRlbmN5T2JqZWN0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1Njcm9sbFZpZXdlcl9TZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHlfMT1jYXN0PShTY3JvbGxCYXJWaXNpYmlsaXR5KQotCi1PU19TY3JvbGxWaWV3ZXJfdHlwZWlkPWFjY2Vzc29yPVNjcm9sbFZpZXdlcjo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1NlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NfQWRkZWRJdGVtcz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1NlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NfQWRkZWRJdGVtc18wPWNhc3Q9U2VsZWN0aW9uQ2hhbmdlZEV2ZW50QXJnc14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2VsZWN0aW9uQ2hhbmdlZEV2ZW50QXJnc19SZW1vdmVkSXRlbXM9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRBcmdzX1JlbW92ZWRJdGVtc18wPWNhc3Q9KFNlbGVjdGlvbkNoYW5nZWRFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19TZWxlY3Rvcl9Jc1N5bmNocm9uaXplZFdpdGhDdXJyZW50SXRlbT1mbGFncz1zZXR0ZXIKLU9TX1NlbGVjdG9yX0lzU3luY2hyb25pemVkV2l0aEN1cnJlbnRJdGVtXzA9Y2FzdD1TZWxlY3Rvcl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1NlbGVjdG9yX0lzU3luY2hyb25pemVkV2l0aEN1cnJlbnRJdGVtXzE9Ci0KLU9TX1NlbGVjdG9yXzFTZWxlY3RlZEluZGV4X19JPWZsYWdzPWdldHRlcgotT1NfU2VsZWN0b3JfMVNlbGVjdGVkSW5kZXhfX0lfMD1jYXN0PShTZWxlY3Rvcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NlbGVjdG9yXzFTZWxlY3RlZEluZGV4X19JST1mbGFncz1zZXR0ZXIKLU9TX1NlbGVjdG9yXzFTZWxlY3RlZEluZGV4X19JSV8wPWNhc3Q9KFNlbGVjdG9yXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1NlbGVjdG9yXzFTZWxlY3RlZEluZGV4X19JSV8xPQotCi1PU19TZWxlY3Rvcl9TZWxlY3RlZEl0ZW09ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19TZWxlY3Rvcl9TZWxlY3RlZEl0ZW1fMD1jYXN0PShTZWxlY3Rvcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NlbGVjdG9yX1NlbGVjdGVkVmFsdWU9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19TZWxlY3Rvcl9TZWxlY3RlZFZhbHVlXzA9Y2FzdD0oU2VsZWN0b3JeKSxmbGFncz1nY29iamVjdAotCi1PU19TZWxlY3Rvcl9TZWxlY3Rpb25DaGFuZ2VkPWZsYWdzPWFkZGVyCi1PU19TZWxlY3Rvcl9TZWxlY3Rpb25DaGFuZ2VkXzA9Y2FzdD1TZWxlY3Rvcl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1NlbGVjdG9yX1NlbGVjdGlvbkNoYW5nZWRfMT1jYXN0PShTZWxlY3Rpb25DaGFuZ2VkRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2V0Q3Vyc29yUG9zPQotT1NfU2V0Q3Vyc29yUG9zXzA9Ci1PU19TZXRDdXJzb3JQb3NfMT0KLQotT1NfU2V0dGVyQmFzZUNvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfU2V0dGVyQmFzZUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD1TZXR0ZXJCYXNlQ29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1NldHRlckJhc2VDb2xsZWN0aW9uX0FkZF8xPWNhc3Q9U2V0dGVyQmFzZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2hhcGVfRmlsbD1mbGFncz1zZXR0ZXIKLU9TX1NoYXBlX0ZpbGxfMD1jYXN0PVNoYXBlXixmbGFncz1nY29iamVjdAotT1NfU2hhcGVfRmlsbF8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NoYXBlX1N0cm9rZT1mbGFncz1zZXR0ZXIKLU9TX1NoYXBlX1N0cm9rZV8wPWNhc3Q9KFNoYXBlXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1NoYXBlX1N0cm9rZV8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1NoYXBlX1N0cm9rZVRoaWNrbmVzcz1mbGFncz1zZXR0ZXIKLU9TX1NoYXBlX1N0cm9rZVRoaWNrbmVzc18wPWNhc3Q9KFNoYXBlXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1NoYXBlX1N0cm9rZVRoaWNrbmVzc18xPQotCi1PU19TaGVsbEV4ZWN1dGVFeFc9Ci1PU19TaGVsbEV4ZWN1dGVFeFdfMD1jYXN0PShMUFNIRUxMRVhFQ1VURUlORk9XKQotCi1PU19TaXplQ2hhbmdlZEV2ZW50QXJnc19OZXdTaXplPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfU2l6ZUNoYW5nZWRFdmVudEFyZ3NfTmV3U2l6ZV8wPWNhc3Q9KFNpemVDaGFuZ2VkRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfU2l6ZUNoYW5nZWRFdmVudEFyZ3NfUHJldmlvdXNTaXplPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfU2l6ZUNoYW5nZWRFdmVudEFyZ3NfUHJldmlvdXNTaXplXzA9Y2FzdD0oU2l6ZUNoYW5nZWRFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19TaXplXzFIZWlnaHRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19TaXplXzFIZWlnaHRfX0lfMD1jYXN0PVNpemUgXixmbGFncz1nY29iamVjdAotCi1PU19TaXplXzFIZWlnaHRfX0lEPWZsYWdzPXNldHRlcgotT1NfU2l6ZV8xSGVpZ2h0X19JRF8wPWNhc3Q9U2l6ZSBeLGZsYWdzPWdjb2JqZWN0Ci1PU19TaXplXzFIZWlnaHRfX0lEXzE9Ci0KLU9TX1NpemVfMVdpZHRoX19JPWZsYWdzPWdldHRlcgotT1NfU2l6ZV8xV2lkdGhfX0lfMD1jYXN0PVNpemUgXixmbGFncz1nY29iamVjdAotCi1PU19TaXplXzFXaWR0aF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19TaXplXzFXaWR0aF9fSURfMD1jYXN0PVNpemUgXixmbGFncz1nY29iamVjdAotT1NfU2l6ZV8xV2lkdGhfX0lEXzE9Ci0KLU9TX1NsaWRlcl9PcmllbnRhdGlvbj1mbGFncz1zZXR0ZXIKLU9TX1NsaWRlcl9PcmllbnRhdGlvbl8wPWNhc3Q9KFNsaWRlciBeKSxmbGFncz1nY29iamVjdAotT1NfU2xpZGVyX09yaWVudGF0aW9uXzE9Y2FzdD1PcmllbnRhdGlvbgotCi1PU19TbGlkZXJfVGlja0ZyZXF1ZW5jeT1mbGFncz1zZXR0ZXIKLU9TX1NsaWRlcl9UaWNrRnJlcXVlbmN5XzA9Y2FzdD1TbGlkZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19TbGlkZXJfVGlja0ZyZXF1ZW5jeV8xPQotCi1PU19TbGlkZXJfVGlja1BsYWNlbWVudD1mbGFncz1zZXR0ZXIKLU9TX1NsaWRlcl9UaWNrUGxhY2VtZW50XzA9Y2FzdD1TbGlkZXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19TbGlkZXJfVGlja1BsYWNlbWVudF8xPWNhc3Q9VGlja1BsYWNlbWVudAotCi1PU19TdGFja1BhbmVsX09yaWVudGF0aW9uPWZsYWdzPXNldHRlcgotT1NfU3RhY2tQYW5lbF9PcmllbnRhdGlvbl8wPWNhc3Q9U3RhY2tQYW5lbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1N0YWNrUGFuZWxfT3JpZW50YXRpb25fMT1jYXN0PU9yaWVudGF0aW9uCi0KLU9TX1N0YWNrUGFuZWxfT3JpZW50YXRpb25Qcm9wZXJ0eT1hY2Nlc3Nvcj1TdGFja1BhbmVsOjpPcmllbnRhdGlvblByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1N0YWNrUGFuZWxfdHlwZWlkPWFjY2Vzc29yPVN0YWNrUGFuZWw6OnR5cGVpZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQmVnaW5GaWd1cmU9ZmxhZ3M9Y3BwCi1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQmVnaW5GaWd1cmVfMD1jYXN0PShTdHJlYW1HZW9tZXRyeUNvbnRleHReKSxmbGFncz1nY29iamVjdAotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0JlZ2luRmlndXJlXzE9Y2FzdD0oUG9pbnQpLGZsYWdzPWdjb2JqZWN0Ci1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQmVnaW5GaWd1cmVfMj0KLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9CZWdpbkZpZ3VyZV8zPQotCi1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQ2xvc2U9ZmxhZ3M9Y3BwCi1PU19TdHJlYW1HZW9tZXRyeUNvbnRleHRfQ2xvc2VfMD1jYXN0PVN0cmVhbUdlb21ldHJ5Q29udGV4dF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0xpbmVUbz1mbGFncz1jcHAKLU9TX1N0cmVhbUdlb21ldHJ5Q29udGV4dF9MaW5lVG9fMD1jYXN0PShTdHJlYW1HZW9tZXRyeUNvbnRleHReKSxmbGFncz1nY29iamVjdAotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0xpbmVUb18xPWNhc3Q9KFBvaW50KSxmbGFncz1nY29iamVjdAotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0xpbmVUb18yPQotT1NfU3RyZWFtR2VvbWV0cnlDb250ZXh0X0xpbmVUb18zPQotCi1PU19TdHJlYW1HZW9tZXRyeV9PcGVuPWZsYWdzPWNwcCBnY29iamVjdAotT1NfU3RyZWFtR2VvbWV0cnlfT3Blbl8wPWNhc3Q9U3RyZWFtR2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1N0cmluZ19MZW5ndGg9ZmxhZ3M9Z2V0dGVyCi1PU19TdHJpbmdfTGVuZ3RoXzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1N0cmluZ19Ub0NoYXJBcnJheT1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX1N0cmluZ19Ub0NoYXJBcnJheV8wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19TdHlsZV9TZXR0ZXJzPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfU3R5bGVfU2V0dGVyc18wPWNhc3Q9U3R5bGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19BY3RpdmVCb3JkZXJCcnVzaD1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkFjdGl2ZUJvcmRlckJydXNoLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19BY3RpdmVCb3JkZXJDb2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkFjdGl2ZUJvcmRlckNvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfQWN0aXZlQ2FwdGlvbkNvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6QWN0aXZlQ2FwdGlvbkNvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfQWN0aXZlQ2FwdGlvblRleHRDb2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkFjdGl2ZUNhcHRpb25UZXh0Q29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sQnJ1c2g9YWNjZXNzb3I9U3lzdGVtQ29sb3JzOjpDb250cm9sQnJ1c2gsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0NvbnRyb2xDb2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkNvbnRyb2xDb2xvcixmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0NvbnRyb2xEYXJrQ29sb3I9YWNjZXNzb3I9U3lzdGVtQ29sb3JzOjpDb250cm9sRGFya0NvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfQ29udHJvbERhcmtEYXJrQ29sb3I9YWNjZXNzb3I9U3lzdGVtQ29sb3JzOjpDb250cm9sRGFya0RhcmtDb2xvcixmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0NvbnRyb2xMaWdodENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6Q29udHJvbExpZ2h0Q29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sTGlnaHRMaWdodENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6Q29udHJvbExpZ2h0TGlnaHRDb2xvcixmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0NvbnRyb2xUZXh0QnJ1c2g9YWNjZXNzb3I9U3lzdGVtQ29sb3JzOjpDb250cm9sVGV4dEJydXNoLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19Db250cm9sVGV4dENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6Q29udHJvbFRleHRDb2xvcixmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0dyYWRpZW50QWN0aXZlQ2FwdGlvbkNvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6R3JhZGllbnRBY3RpdmVDYXB0aW9uQ29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19HcmFkaWVudEluYWN0aXZlQ2FwdGlvbkNvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6R3JhZGllbnRJbmFjdGl2ZUNhcHRpb25Db2xvcixmbGFncz1jb25zdCBzdHJ1Y3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0hpZ2hsaWdodEJydXNoPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6SGlnaGxpZ2h0QnJ1c2gsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtQ29sb3JzX0hpZ2hsaWdodENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6SGlnaGxpZ2h0Q29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19IaWdobGlnaHRUZXh0Q29sb3I9YWNjZXNzb3I9U3lzdGVtQ29sb3JzOjpIaWdobGlnaHRUZXh0Q29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19JbmFjdGl2ZUNhcHRpb25Db2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkluYWN0aXZlQ2FwdGlvbkNvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfSW5hY3RpdmVDYXB0aW9uVGV4dENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6SW5hY3RpdmVDYXB0aW9uVGV4dENvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfSW5mb0NvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6SW5mb0NvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfSW5mb1RleHRDb2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OkluZm9UZXh0Q29sb3IsZmxhZ3M9Y29uc3Qgc3RydWN0IGdjb2JqZWN0Ci0KLU9TX1N5c3RlbUNvbG9yc19XaW5kb3dDb2xvcj1hY2Nlc3Nvcj1TeXN0ZW1Db2xvcnM6OldpbmRvd0NvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Db2xvcnNfV2luZG93VGV4dENvbG9yPWFjY2Vzc29yPVN5c3RlbUNvbG9yczo6V2luZG93VGV4dENvbG9yLGZsYWdzPWNvbnN0IHN0cnVjdCBnY29iamVjdAotCi1PU19TeXN0ZW1Gb250c19NZXNzYWdlRm9udEZhbWlseT1hY2Nlc3Nvcj1TeXN0ZW1Gb250czo6TWVzc2FnZUZvbnRGYW1pbHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtRm9udHNfTWVzc2FnZUZvbnRTaXplPWFjY2Vzc29yPVN5c3RlbUZvbnRzOjpNZXNzYWdlRm9udFNpemUsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtRm9udHNfTWVzc2FnZUZvbnRTdHlsZT1hY2Nlc3Nvcj1TeXN0ZW1Gb250czo6TWVzc2FnZUZvbnRTdHlsZSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19TeXN0ZW1Gb250c19NZXNzYWdlRm9udFdlaWdodD1hY2Nlc3Nvcj1TeXN0ZW1Gb250czo6TWVzc2FnZUZvbnRXZWlnaHQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19IaWdoQ29udHJhc3Q9YWNjZXNzb3I9U3lzdGVtUGFyYW1ldGVyczo6SGlnaENvbnRyYXN0LGZsYWdzPWNvbnN0Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfSG9yaXpvbnRhbFNjcm9sbEJhckJ1dHRvbldpZHRoPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6Okhvcml6b250YWxTY3JvbGxCYXJCdXR0b25XaWR0aCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX0hvcml6b250YWxTY3JvbGxCYXJIZWlnaHQ9YWNjZXNzb3I9U3lzdGVtUGFyYW1ldGVyczo6SG9yaXpvbnRhbFNjcm9sbEJhckhlaWdodCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX01pbmltdW1Ib3Jpem9udGFsRHJhZ0Rpc3RhbmNlPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6Ok1pbmltdW1Ib3Jpem9udGFsRHJhZ0Rpc3RhbmNlLGZsYWdzPWNvbnN0Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfTWluaW11bVZlcnRpY2FsRHJhZ0Rpc3RhbmNlPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6Ok1pbmltdW1WZXJ0aWNhbERyYWdEaXN0YW5jZSxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ByaW1hcnlTY3JlZW5IZWlnaHQ9YWNjZXNzb3I9U3lzdGVtUGFyYW1ldGVyczo6UHJpbWFyeVNjcmVlbkhlaWdodCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ByaW1hcnlTY3JlZW5XaWR0aD1hY2Nlc3Nvcj1TeXN0ZW1QYXJhbWV0ZXJzOjpQcmltYXJ5U2NyZWVuV2lkdGgsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19UaGluSG9yaXpvbnRhbEJvcmRlckhlaWdodD1hY2Nlc3Nvcj1TeXN0ZW1QYXJhbWV0ZXJzOjpUaGluSG9yaXpvbnRhbEJvcmRlckhlaWdodCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1RoaW5WZXJ0aWNhbEJvcmRlcldpZHRoPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6OlRoaW5WZXJ0aWNhbEJvcmRlcldpZHRoLGZsYWdzPWNvbnN0Ci0KLU9TX1N5c3RlbVBhcmFtZXRlcnNfVmVydGljYWxTY3JvbGxCYXJCdXR0b25IZWlnaHQ9YWNjZXNzb3I9U3lzdGVtUGFyYW1ldGVyczo6VmVydGljYWxTY3JvbGxCYXJCdXR0b25IZWlnaHQsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19WZXJ0aWNhbFNjcm9sbEJhcldpZHRoPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6OlZlcnRpY2FsU2Nyb2xsQmFyV2lkdGgsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19WaXJ0dWFsU2NyZWVuSGVpZ2h0PWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6OlZpcnR1YWxTY3JlZW5IZWlnaHQsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19WaXJ0dWFsU2NyZWVuTGVmdD1hY2Nlc3Nvcj1TeXN0ZW1QYXJhbWV0ZXJzOjpWaXJ0dWFsU2NyZWVuTGVmdCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ZpcnR1YWxTY3JlZW5Ub3A9YWNjZXNzb3I9U3lzdGVtUGFyYW1ldGVyczo6VmlydHVhbFNjcmVlblRvcCxmbGFncz1jb25zdAotCi1PU19TeXN0ZW1QYXJhbWV0ZXJzX1ZpcnR1YWxTY3JlZW5XaWR0aD1hY2Nlc3Nvcj1TeXN0ZW1QYXJhbWV0ZXJzOjpWaXJ0dWFsU2NyZWVuV2lkdGgsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19XaGVlbFNjcm9sbExpbmVzPWFjY2Vzc29yPVN5c3RlbVBhcmFtZXRlcnM6OldoZWVsU2Nyb2xsTGluZXMsZmxhZ3M9Y29uc3QKLQotT1NfU3lzdGVtUGFyYW1ldGVyc19Xb3JrQXJlYT1hY2Nlc3Nvcj1TeXN0ZW1QYXJhbWV0ZXJzOjpXb3JrQXJlYSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UYWJDb250cm9sX1RhYlN0cmlwUGxhY2VtZW50PWZsYWdzPXNldHRlcgotT1NfVGFiQ29udHJvbF9UYWJTdHJpcFBsYWNlbWVudF8wPWNhc3Q9VGFiQ29udHJvbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RhYkNvbnRyb2xfVGFiU3RyaXBQbGFjZW1lbnRfMT1jYXN0PURvY2sKLQotT1NfVGFiSXRlbV9Jc1NlbGVjdGVkPWZsYWdzPWdldHRlcgotT1NfVGFiSXRlbV9Jc1NlbGVjdGVkXzA9Y2FzdD1UYWJJdGVtXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0QmxvY2tfQmFja2dyb3VuZD1mbGFncz1zZXR0ZXIKLU9TX1RleHRCbG9ja19CYWNrZ3JvdW5kXzA9Y2FzdD1UZXh0QmxvY2teLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0QmxvY2tfQmFja2dyb3VuZF8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCbG9ja19CYWNrZ3JvdW5kUHJvcGVydHk9YWNjZXNzb3I9VGV4dEJsb2NrOjpCYWNrZ3JvdW5kUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVGV4dEJsb2NrX0ZvbnRGYW1pbHk9ZmxhZ3M9c2V0dGVyCi1PU19UZXh0QmxvY2tfRm9udEZhbWlseV8wPWNhc3Q9KFRleHRCbG9ja14pLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0QmxvY2tfRm9udEZhbWlseV8xPWNhc3Q9Rm9udEZhbWlseV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJsb2NrX0ZvbnRGYW1pbHlQcm9wZXJ0eT1hY2Nlc3Nvcj1UZXh0QmxvY2s6OkZvbnRGYW1pbHlQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UZXh0QmxvY2tfRm9udFNpemU9ZmxhZ3M9c2V0dGVyCi1PU19UZXh0QmxvY2tfRm9udFNpemVfMD1jYXN0PShUZXh0QmxvY2teKSxmbGFncz1nY29iamVjdAotT1NfVGV4dEJsb2NrX0ZvbnRTaXplXzE9Ci0KLU9TX1RleHRCbG9ja19Gb250U2l6ZVByb3BlcnR5PWFjY2Vzc29yPVRleHRCbG9jazo6Rm9udFNpemVQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UZXh0QmxvY2tfRm9udFN0cmV0Y2g9ZmxhZ3M9c2V0dGVyCi1PU19UZXh0QmxvY2tfRm9udFN0cmV0Y2hfMD1jYXN0PShUZXh0QmxvY2teKSxmbGFncz1nY29iamVjdAotT1NfVGV4dEJsb2NrX0ZvbnRTdHJldGNoXzE9Y2FzdD1Gb250U3RyZXRjaCxmbGFncz1nY29iamVjdAotCi1PU19UZXh0QmxvY2tfRm9udFN0cmV0Y2hQcm9wZXJ0eT1hY2Nlc3Nvcj1UZXh0QmxvY2s6OkZvbnRTdHJldGNoUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVGV4dEJsb2NrX0ZvbnRTdHlsZT1mbGFncz1zZXR0ZXIKLU9TX1RleHRCbG9ja19Gb250U3R5bGVfMD1jYXN0PShUZXh0QmxvY2teKSxmbGFncz1nY29iamVjdAotT1NfVGV4dEJsb2NrX0ZvbnRTdHlsZV8xPWNhc3Q9Rm9udFN0eWxlLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCbG9ja19Gb250U3R5bGVQcm9wZXJ0eT1hY2Nlc3Nvcj1UZXh0QmxvY2s6OkZvbnRTdHlsZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1RleHRCbG9ja19Gb250V2VpZ2h0PWZsYWdzPXNldHRlcgotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHRfMD1jYXN0PShUZXh0QmxvY2teKSxmbGFncz1nY29iamVjdAotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHRfMT1jYXN0PUZvbnRXZWlnaHQsZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJsb2NrX0ZvbnRXZWlnaHRQcm9wZXJ0eT1hY2Nlc3Nvcj1UZXh0QmxvY2s6OkZvbnRXZWlnaHRQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UZXh0QmxvY2tfRm9yZWdyb3VuZD1mbGFncz1zZXR0ZXIKLU9TX1RleHRCbG9ja19Gb3JlZ3JvdW5kXzA9Y2FzdD1UZXh0QmxvY2teLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0QmxvY2tfRm9yZWdyb3VuZF8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCbG9ja19Gb3JlZ3JvdW5kUHJvcGVydHk9YWNjZXNzb3I9VGV4dEJsb2NrOjpGb3JlZ3JvdW5kUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVGV4dEJsb2NrX0lubGluZXM9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19UZXh0QmxvY2tfSW5saW5lc18wPWNhc3Q9VGV4dEJsb2NrXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0QmxvY2tfVGV4dD1mbGFncz1zZXR0ZXIKLU9TX1RleHRCbG9ja19UZXh0XzA9Y2FzdD1UZXh0QmxvY2teLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0QmxvY2tfVGV4dF8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0QmxvY2tfVGV4dFByb3BlcnR5PWFjY2Vzc29yPVRleHRCbG9jazo6VGV4dFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1RleHRCbG9ja190eXBlaWQ9YWNjZXNzb3I9VGV4dEJsb2NrOjp0eXBlaWQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVGV4dEJvdW5kc0NvbGxlY3Rpb25fQ3VycmVudD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1RleHRCb3VuZHNDb2xsZWN0aW9uX0N1cnJlbnRfMD1jYXN0PUlFbnVtZXJhdG9yXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm91bmRzQ29sbGVjdGlvbl9HZXRFbnVtZXJhdG9yPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVGV4dEJvdW5kc0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPWNhc3Q9SUVudW1lcmFibGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3VuZHNfUmVjdGFuZ2xlPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfVGV4dEJvdW5kc19SZWN0YW5nbGVfMD1jYXN0PVRleHRCb3VuZHNeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hCYXNlX0FjY2VwdHNSZXR1cm49ZmxhZ3M9c2V0dGVyCi1PU19UZXh0Qm94QmFzZV9BY2NlcHRzUmV0dXJuXzA9Y2FzdD1UZXh0Qm94QmFzZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHRCb3hCYXNlX0FjY2VwdHNSZXR1cm5fMT0KLQotT1NfVGV4dEJveEJhc2VfQWNjZXB0c1RhYj1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hCYXNlX0FjY2VwdHNUYWJfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveEJhc2VfQWNjZXB0c1RhYl8xPQotCi1PU19UZXh0Qm94QmFzZV9BcHBlbmRUZXh0PWZsYWdzPWNwcAotT1NfVGV4dEJveEJhc2VfQXBwZW5kVGV4dF8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94QmFzZV9BcHBlbmRUZXh0XzE9Y2FzdD0oU3RyaW5nXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJveEJhc2VfQ29weT1mbGFncz1jcHAKLU9TX1RleHRCb3hCYXNlX0NvcHlfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94QmFzZV9DdXQ9ZmxhZ3M9Y3BwCi1PU19UZXh0Qm94QmFzZV9DdXRfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94QmFzZV9Ib3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eT1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hCYXNlX0hvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5XzA9Y2FzdD1UZXh0Qm94QmFzZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHRCb3hCYXNlX0hvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5XzE9Y2FzdD0oU2Nyb2xsQmFyVmlzaWJpbGl0eSkKLQotT1NfVGV4dEJveEJhc2VfMUlzUmVhZE9ubHlfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19UZXh0Qm94QmFzZV8xSXNSZWFkT25seV9fSV8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hCYXNlXzFJc1JlYWRPbmx5X19JWj1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hCYXNlXzFJc1JlYWRPbmx5X19JWl8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94QmFzZV8xSXNSZWFkT25seV9fSVpfMT0KLQotT1NfVGV4dEJveEJhc2VfUGFzdGU9ZmxhZ3M9Y3BwCi1PU19UZXh0Qm94QmFzZV9QYXN0ZV8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hCYXNlX1Njcm9sbFRvRW5kPWZsYWdzPWNwcAotT1NfVGV4dEJveEJhc2VfU2Nyb2xsVG9FbmRfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94QmFzZV9TY3JvbGxUb1ZlcnRpY2FsT2Zmc2V0PWZsYWdzPWNwcAotT1NfVGV4dEJveEJhc2VfU2Nyb2xsVG9WZXJ0aWNhbE9mZnNldF8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94QmFzZV9TY3JvbGxUb1ZlcnRpY2FsT2Zmc2V0XzE9Ci0KLU9TX1RleHRCb3hCYXNlX1NlbGVjdEFsbD1mbGFncz1jcHAKLU9TX1RleHRCb3hCYXNlX1NlbGVjdEFsbF8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hCYXNlX1RleHRDaGFuZ2VkPWZsYWdzPWFkZGVyCi1PU19UZXh0Qm94QmFzZV9UZXh0Q2hhbmdlZF8wPWNhc3Q9VGV4dEJveEJhc2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94QmFzZV9UZXh0Q2hhbmdlZF8xPWNhc3Q9VGV4dENoYW5nZWRFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hCYXNlX1ZlcnRpY2FsT2Zmc2V0PWZsYWdzPWdldHRlcgotT1NfVGV4dEJveEJhc2VfVmVydGljYWxPZmZzZXRfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94QmFzZV9WZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHk9ZmxhZ3M9c2V0dGVyCi1PU19UZXh0Qm94QmFzZV9WZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHlfMD1jYXN0PVRleHRCb3hCYXNlXixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveEJhc2VfVmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5XzE9Y2FzdD0oU2Nyb2xsQmFyVmlzaWJpbGl0eSkKLQotT1NfVGV4dEJveF8xQ2FyZXRJbmRleF9fST1mbGFncz1nZXR0ZXIKLU9TX1RleHRCb3hfMUNhcmV0SW5kZXhfX0lfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hfMUNhcmV0SW5kZXhfX0lJPWZsYWdzPXNldHRlcgotT1NfVGV4dEJveF8xQ2FyZXRJbmRleF9fSUlfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94XzFDYXJldEluZGV4X19JSV8xPQotCi1PU19UZXh0Qm94X0dldEZpcnN0VmlzaWJsZUxpbmVJbmRleD1mbGFncz1jcHAKLU9TX1RleHRCb3hfR2V0Rmlyc3RWaXNpYmxlTGluZUluZGV4XzA9Y2FzdD1UZXh0Qm94XixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94X0dldExpbmVJbmRleEZyb21DaGFyYWN0ZXJJbmRleD1mbGFncz1jcHAKLU9TX1RleHRCb3hfR2V0TGluZUluZGV4RnJvbUNoYXJhY3RlckluZGV4XzA9Y2FzdD1UZXh0Qm94XixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveF9HZXRMaW5lSW5kZXhGcm9tQ2hhcmFjdGVySW5kZXhfMT0KLQotT1NfVGV4dEJveF9HZXRSZWN0RnJvbUNoYXJhY3RlckluZGV4PWZsYWdzPWNwcCBnY29iamVjdAotT1NfVGV4dEJveF9HZXRSZWN0RnJvbUNoYXJhY3RlckluZGV4XzA9Y2FzdD1UZXh0Qm94XixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveF9HZXRSZWN0RnJvbUNoYXJhY3RlckluZGV4XzE9Ci0KLU9TX1RleHRCb3hfTGluZUNvdW50PWZsYWdzPWdldHRlcgotT1NfVGV4dEJveF9MaW5lQ291bnRfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hfMU1heExlbmd0aF9fST1mbGFncz1nZXR0ZXIKLU9TX1RleHRCb3hfMU1heExlbmd0aF9fSV8wPWNhc3Q9VGV4dEJveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJveF8xTWF4TGVuZ3RoX19JST1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfMU1heExlbmd0aF9fSUlfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94XzFNYXhMZW5ndGhfX0lJXzE9Ci0KLU9TX1RleHRCb3hfU2Nyb2xsVG9MaW5lPWZsYWdzPWNwcAotT1NfVGV4dEJveF9TY3JvbGxUb0xpbmVfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94X1Njcm9sbFRvTGluZV8xPQotCi1PU19UZXh0Qm94X1NlbGVjdD1mbGFncz1jcHAKLU9TX1RleHRCb3hfU2VsZWN0XzA9Y2FzdD1UZXh0Qm94XixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveF9TZWxlY3RfMT0KLU9TX1RleHRCb3hfU2VsZWN0XzI9Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGVkVGV4dF9fST1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1RleHRCb3hfMVNlbGVjdGVkVGV4dF9fSV8wPWNhc3Q9VGV4dEJveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJveF8xU2VsZWN0ZWRUZXh0X19JST1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfMVNlbGVjdGVkVGV4dF9fSUlfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94XzFTZWxlY3RlZFRleHRfX0lJXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGlvbkxlbmd0aF9fST1mbGFncz1nZXR0ZXIKLU9TX1RleHRCb3hfMVNlbGVjdGlvbkxlbmd0aF9fSV8wPWNhc3Q9VGV4dEJveF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEJveF8xU2VsZWN0aW9uTGVuZ3RoX19JST1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfMVNlbGVjdGlvbkxlbmd0aF9fSUlfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94XzFTZWxlY3Rpb25MZW5ndGhfX0lJXzE9Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGlvblN0YXJ0X19JPWZsYWdzPWdldHRlcgotT1NfVGV4dEJveF8xU2VsZWN0aW9uU3RhcnRfX0lfMD1jYXN0PVRleHRCb3heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRCb3hfMVNlbGVjdGlvblN0YXJ0X19JST1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfMVNlbGVjdGlvblN0YXJ0X19JSV8wPWNhc3Q9VGV4dEJveF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHRCb3hfMVNlbGVjdGlvblN0YXJ0X19JSV8xPQotCi1PU19UZXh0Qm94XzFUZXh0X19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfVGV4dEJveF8xVGV4dF9fSV8wPWNhc3Q9KFRleHRCb3heKSxmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94XzFUZXh0X19JST1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfMVRleHRfX0lJXzA9Y2FzdD0oVGV4dEJveF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Qm94XzFUZXh0X19JSV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0Qm94X1RleHRXcmFwcGluZz1mbGFncz1zZXR0ZXIKLU9TX1RleHRCb3hfVGV4dFdyYXBwaW5nXzA9Y2FzdD1UZXh0Qm94XixmbGFncz1nY29iamVjdAotT1NfVGV4dEJveF9UZXh0V3JhcHBpbmdfMT1jYXN0PVRleHRXcmFwcGluZwotCi1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfQ29udHJvbFRleHQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfQ29udHJvbFRleHRfMD1jYXN0PShUZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfSGFuZGxlZD1mbGFncz1zZXR0ZXIKLU9TX1RleHRDb21wb3NpdGlvbkV2ZW50QXJnc19IYW5kbGVkXzA9Y2FzdD1UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfSGFuZGxlZF8xPQotCi1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfU3lzdGVtVGV4dD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1RleHRDb21wb3NpdGlvbkV2ZW50QXJnc19TeXN0ZW1UZXh0XzA9Y2FzdD0oVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dENvbXBvc2l0aW9uRXZlbnRBcmdzX1RleHQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19UZXh0Q29tcG9zaXRpb25FdmVudEFyZ3NfVGV4dF8wPWNhc3Q9KFRleHRDb21wb3NpdGlvbkV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHREZWNvcmF0aW9uQ29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19UZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oVGV4dERlY29yYXRpb25Db2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHREZWNvcmF0aW9uQ29sbGVjdGlvbl9BZGRfMT1jYXN0PShUZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotCi1PU19UZXh0RGVjb3JhdGlvbnNfU3RyaWtldGhyb3VnaD1hY2Nlc3Nvcj1UZXh0RGVjb3JhdGlvbnM6OlN0cmlrZXRocm91Z2gsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVGV4dERlY29yYXRpb25zX1VuZGVybGluZT1hY2Nlc3Nvcj1UZXh0RGVjb3JhdGlvbnM6OlVuZGVybGluZSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UZXh0Rm9ybWF0dGVyX0NyZWF0ZT1hY2Nlc3Nvcj1UZXh0Rm9ybWF0dGVyOjpDcmVhdGUsZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lXzA9Y2FzdD1UZXh0Rm9ybWF0dGVyXixmbGFncz1nY29iamVjdAotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lXzE9Y2FzdD1UZXh0U291cmNlXixmbGFncz1nY29iamVjdAotT1NfVGV4dEZvcm1hdHRlcl9Gb3JtYXRMaW5lXzI9Ci1PU19UZXh0Rm9ybWF0dGVyX0Zvcm1hdExpbmVfMz0KLU9TX1RleHRGb3JtYXR0ZXJfRm9ybWF0TGluZV80PWNhc3Q9VGV4dFBhcmFncmFwaFByb3BlcnRpZXNeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0Rm9ybWF0dGVyX0Zvcm1hdExpbmVfNT1jYXN0PVRleHRMaW5lQnJlYWteLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX0Jhc2VsaW5lPWZsYWdzPWdldHRlcgotT1NfVGV4dExpbmVfQmFzZWxpbmVfMD1jYXN0PVRleHRMaW5lXixmbGFncz1nY29iamVjdAotCi1PU19UZXh0TGluZV9EcmF3PWZsYWdzPWNwcAotT1NfVGV4dExpbmVfRHJhd18wPWNhc3Q9VGV4dExpbmVeLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0TGluZV9EcmF3XzE9Y2FzdD0oRHJhd2luZ0NvbnRleHReKSxmbGFncz1nY29iamVjdAotT1NfVGV4dExpbmVfRHJhd18yPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHRMaW5lX0RyYXdfMz1jYXN0PUludmVydEF4ZXMKLQotT1NfVGV4dExpbmVfR2V0Q2hhcmFjdGVySGl0RnJvbURpc3RhbmNlPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVGV4dExpbmVfR2V0Q2hhcmFjdGVySGl0RnJvbURpc3RhbmNlXzA9Y2FzdD1UZXh0TGluZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RleHRMaW5lX0dldENoYXJhY3RlckhpdEZyb21EaXN0YW5jZV8xPQotCi1PU19UZXh0TGluZV9HZXREaXN0YW5jZUZyb21DaGFyYWN0ZXJIaXQ9ZmxhZ3M9Y3BwCi1PU19UZXh0TGluZV9HZXREaXN0YW5jZUZyb21DaGFyYWN0ZXJIaXRfMD1jYXN0PShUZXh0TGluZV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0TGluZV9HZXREaXN0YW5jZUZyb21DaGFyYWN0ZXJIaXRfMT1jYXN0PShDaGFyYWN0ZXJIaXQpLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX0dldEluZGV4ZWRHbHlwaFJ1bnM9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19UZXh0TGluZV9HZXRJbmRleGVkR2x5cGhSdW5zXzA9Y2FzdD0oVGV4dExpbmVeKSxmbGFncz1nY29iamVjdAotCi1PU19UZXh0TGluZV9HZXROZXh0Q2FyZXRDaGFyYWN0ZXJIaXQ9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19UZXh0TGluZV9HZXROZXh0Q2FyZXRDaGFyYWN0ZXJIaXRfMD1jYXN0PShUZXh0TGluZV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UZXh0TGluZV9HZXROZXh0Q2FyZXRDaGFyYWN0ZXJIaXRfMT1jYXN0PShDaGFyYWN0ZXJIaXQpLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX0dldFByZXZpb3VzQ2FyZXRDaGFyYWN0ZXJIaXQ9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19UZXh0TGluZV9HZXRQcmV2aW91c0NhcmV0Q2hhcmFjdGVySGl0XzA9Y2FzdD0oVGV4dExpbmVeKSxmbGFncz1nY29iamVjdAotT1NfVGV4dExpbmVfR2V0UHJldmlvdXNDYXJldENoYXJhY3RlckhpdF8xPWNhc3Q9KENoYXJhY3RlckhpdCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kcz1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX1RleHRMaW5lX0dldFRleHRCb3VuZHNfMD1jYXN0PVRleHRMaW5lXixmbGFncz1nY29iamVjdAotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kc18xPQotT1NfVGV4dExpbmVfR2V0VGV4dEJvdW5kc18yPQotCi1PU19UZXh0TGluZV9HZXRUZXh0TGluZUJyZWFrPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVGV4dExpbmVfR2V0VGV4dExpbmVCcmVha18wPWNhc3Q9VGV4dExpbmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX0hlaWdodD1mbGFncz1nZXR0ZXIKLU9TX1RleHRMaW5lX0hlaWdodF8wPWNhc3Q9VGV4dExpbmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX0xlbmd0aD1mbGFncz1nZXR0ZXIKLU9TX1RleHRMaW5lX0xlbmd0aF8wPWNhc3Q9VGV4dExpbmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRMaW5lX05ld2xpbmVMZW5ndGg9ZmxhZ3M9Z2V0dGVyCi1PU19UZXh0TGluZV9OZXdsaW5lTGVuZ3RoXzA9Y2FzdD1UZXh0TGluZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dExpbmVfU3RhcnQ9ZmxhZ3M9Z2V0dGVyCi1PU19UZXh0TGluZV9TdGFydF8wPWNhc3Q9KFRleHRMaW5lXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dExpbmVfV2lkdGg9ZmxhZ3M9Z2V0dGVyCi1PU19UZXh0TGluZV9XaWR0aF8wPWNhc3Q9KFRleHRMaW5lXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGV4dExpbmVfV2lkdGhJbmNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2U9ZmxhZ3M9Z2V0dGVyCi1PU19UZXh0TGluZV9XaWR0aEluY2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZV8wPWNhc3Q9VGV4dExpbmVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RleHRUYWJQcm9wZXJ0aWVzQ29sbGVjdGlvbl9BZGQ9ZmxhZ3M9Y3BwCi1PU19UZXh0VGFiUHJvcGVydGllc0NvbGxlY3Rpb25fQWRkXzA9Y2FzdD1TeXN0ZW06OkNvbGxlY3Rpb25zOjpHZW5lcmljOjpJTGlzdDxUZXh0VGFiUHJvcGVydGllc14+XixmbGFncz1nY29iamVjdAotT1NfVGV4dFRhYlByb3BlcnRpZXNDb2xsZWN0aW9uX0FkZF8xPWNhc3Q9VGV4dFRhYlByb3BlcnRpZXNeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RoaWNrbmVzc19Cb3R0b209ZmxhZ3M9Z2V0dGVyCi1PU19UaGlja25lc3NfQm90dG9tXzA9Y2FzdD0oVGhpY2tuZXNzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGhpY2tuZXNzX0xlZnQ9ZmxhZ3M9Z2V0dGVyCi1PU19UaGlja25lc3NfTGVmdF8wPWNhc3Q9KFRoaWNrbmVzc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RoaWNrbmVzc19SaWdodD1mbGFncz1nZXR0ZXIKLU9TX1RoaWNrbmVzc19SaWdodF8wPWNhc3Q9KFRoaWNrbmVzc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RoaWNrbmVzc19Ub3A9ZmxhZ3M9Z2V0dGVyCi1PU19UaGlja25lc3NfVG9wXzA9Y2FzdD0oVGhpY2tuZXNzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGlsZUJydXNoX0FsaWdubWVudFg9ZmxhZ3M9c2V0dGVyCi1PU19UaWxlQnJ1c2hfQWxpZ25tZW50WF8wPWNhc3Q9KFRpbGVCcnVzaF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UaWxlQnJ1c2hfQWxpZ25tZW50WF8xPWNhc3Q9QWxpZ25tZW50WAotCi1PU19UaWxlQnJ1c2hfQWxpZ25tZW50WT1mbGFncz1zZXR0ZXIKLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRZXzA9Y2FzdD0oVGlsZUJydXNoXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1RpbGVCcnVzaF9BbGlnbm1lbnRZXzE9Y2FzdD1BbGlnbm1lbnRZCi0KLU9TX1RpbGVCcnVzaF9TdHJldGNoPWZsYWdzPXNldHRlcgotT1NfVGlsZUJydXNoX1N0cmV0Y2hfMD1jYXN0PShUaWxlQnJ1c2heKSxmbGFncz1nY29iamVjdAotT1NfVGlsZUJydXNoX1N0cmV0Y2hfMT1jYXN0PShTdHJldGNoKQotCi1PU19UaWxlQnJ1c2hfVGlsZU1vZGU9ZmxhZ3M9c2V0dGVyCi1PU19UaWxlQnJ1c2hfVGlsZU1vZGVfMD1jYXN0PShUaWxlQnJ1c2heKSxmbGFncz1nY29iamVjdAotT1NfVGlsZUJydXNoX1RpbGVNb2RlXzE9Y2FzdD0oVGlsZU1vZGUpCi0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydD1mbGFncz1zZXR0ZXIKLU9TX1RpbGVCcnVzaF9WaWV3cG9ydF8wPWNhc3Q9VGlsZUJydXNoXixmbGFncz1nY29iamVjdAotT1NfVGlsZUJydXNoX1ZpZXdwb3J0XzE9Y2FzdD1SZWN0LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RpbGVCcnVzaF9WaWV3cG9ydFVuaXRzPWZsYWdzPXNldHRlcgotT1NfVGlsZUJydXNoX1ZpZXdwb3J0VW5pdHNfMD1jYXN0PShUaWxlQnJ1c2heKSxmbGFncz1nY29iamVjdAotT1NfVGlsZUJydXNoX1ZpZXdwb3J0VW5pdHNfMT1jYXN0PUJydXNoTWFwcGluZ01vZGUKLQotT1NfVGltZVNwYW5fRnJvbU1pbGxpc2Vjb25kcz1hY2Nlc3Nvcj1UaW1lU3Bhbjo6RnJvbU1pbGxpc2Vjb25kcyhhcmcwKSxmbGFncz1jb25zdCBnY29iamVjdAotT1NfVGltZVNwYW5fRnJvbU1pbGxpc2Vjb25kc18wPQotCi1PU19UaW1lbGluZV9BdXRvUmV2ZXJzZT1mbGFncz1zZXR0ZXIKLU9TX1RpbWVsaW5lX0F1dG9SZXZlcnNlXzA9Y2FzdD1UaW1lbGluZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RpbWVsaW5lX0F1dG9SZXZlcnNlXzE9Ci0KLU9TX1RpbWVsaW5lX0R1cmF0aW9uPWZsYWdzPXNldHRlcgotT1NfVGltZWxpbmVfRHVyYXRpb25fMD1jYXN0PVRpbWVsaW5lXixmbGFncz1nY29iamVjdAotT1NfVGltZWxpbmVfRHVyYXRpb25fMT1jYXN0PShEdXJhdGlvbiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVGltZWxpbmVfUmVwZWF0QmVoYXZpb3I9ZmxhZ3M9c2V0dGVyCi1PU19UaW1lbGluZV9SZXBlYXRCZWhhdmlvcl8wPWNhc3Q9VGltZWxpbmVeLGZsYWdzPWdjb2JqZWN0Ci1PU19UaW1lbGluZV9SZXBlYXRCZWhhdmlvcl8xPWNhc3Q9KFJlcGVhdEJlaGF2aW9yKSxmbGFncz1nY29iamVjdAotCi1PU19Ub1VuaWNvZGU9Ci1PU19Ub1VuaWNvZGVfMD0KLU9TX1RvVW5pY29kZV8xPQotT1NfVG9Vbmljb2RlXzI9Y2FzdD0oUEJZVEUpCi1PU19Ub1VuaWNvZGVfMz1jYXN0PShMUFdTVFIpCi1PU19Ub1VuaWNvZGVfND0KLU9TX1RvVW5pY29kZV81PQotCi1PU19Ub2dnbGVCdXR0b25fQ2hlY2tlZD1mbGFncz1hZGRlcgotT1NfVG9nZ2xlQnV0dG9uX0NoZWNrZWRfMD1jYXN0PVRvZ2dsZUJ1dHRvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RvZ2dsZUJ1dHRvbl9DaGVja2VkXzE9Y2FzdD1Sb3V0ZWRFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9DaGVja2VkRXZlbnQ9YWNjZXNzb3I9VG9nZ2xlQnV0dG9uOjpDaGVja2VkRXZlbnQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVG9nZ2xlQnV0dG9uX0luZGV0ZXJtaW5hdGVFdmVudD1hY2Nlc3Nvcj1Ub2dnbGVCdXR0b246OkluZGV0ZXJtaW5hdGVFdmVudCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19Ub2dnbGVCdXR0b25fMUlzQ2hlY2tlZF9fST1mbGFncz1nZXR0ZXIKLU9TX1RvZ2dsZUJ1dHRvbl8xSXNDaGVja2VkX19JXzA9Y2FzdD0oVG9nZ2xlQnV0dG9uIF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RvZ2dsZUJ1dHRvbl8xSXNDaGVja2VkX19JWj1mbGFncz1zZXR0ZXIKLU9TX1RvZ2dsZUJ1dHRvbl8xSXNDaGVja2VkX19JWl8wPWNhc3Q9KFRvZ2dsZUJ1dHRvbiBeKSxmbGFncz1nY29iamVjdAotT1NfVG9nZ2xlQnV0dG9uXzFJc0NoZWNrZWRfX0laXzE9Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9Jc0NoZWNrZWROdWxsU2V0dGVyPWZsYWdzPW5vX2dlbiBzZXR0ZXIKLU9TX1RvZ2dsZUJ1dHRvbl9Jc0NoZWNrZWROdWxsU2V0dGVyXzA9Y2FzdD1Ub2dnbGVCdXR0b25eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9Jc0NoZWNrZWRQcm9wZXJ0eT1hY2Nlc3Nvcj1Ub2dnbGVCdXR0b246OklzQ2hlY2tlZFByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9Jc1RocmVlU3RhdGVQcm9wZXJ0eT1hY2Nlc3Nvcj1Ub2dnbGVCdXR0b246OklzVGhyZWVTdGF0ZVByb3BlcnR5LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1RvZ2dsZUJ1dHRvbl9VbmNoZWNrZWQ9ZmxhZ3M9YWRkZXIKLU9TX1RvZ2dsZUJ1dHRvbl9VbmNoZWNrZWRfMD1jYXN0PVRvZ2dsZUJ1dHRvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX1RvZ2dsZUJ1dHRvbl9VbmNoZWNrZWRfMT1jYXN0PVJvdXRlZEV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVG9nZ2xlQnV0dG9uX1VuY2hlY2tlZEV2ZW50PWFjY2Vzc29yPVRvZ2dsZUJ1dHRvbjo6VW5jaGVja2VkRXZlbnQsZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVG9vbEJhclRyYXlfQmFja2dyb3VuZD1mbGFncz1zZXR0ZXIKLU9TX1Rvb2xCYXJUcmF5X0JhY2tncm91bmRfMD1jYXN0PVRvb2xCYXJUcmF5XixmbGFncz1nY29iamVjdAotT1NfVG9vbEJhclRyYXlfQmFja2dyb3VuZF8xPWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Rvb2xCYXJUcmF5XzFJc0xvY2tlZF9fST1mbGFncz1nZXR0ZXIKLU9TX1Rvb2xCYXJUcmF5XzFJc0xvY2tlZF9fSV8wPWNhc3Q9VG9vbEJhclRyYXleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Rvb2xCYXJUcmF5XzFJc0xvY2tlZF9fSVo9ZmxhZ3M9c2V0dGVyCi1PU19Ub29sQmFyVHJheV8xSXNMb2NrZWRfX0laXzA9Y2FzdD1Ub29sQmFyVHJheV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1Rvb2xCYXJUcmF5XzFJc0xvY2tlZF9fSVpfMT0KLQotT1NfVG9vbEJhclRyYXlfT3JpZW50YXRpb249ZmxhZ3M9c2V0dGVyCi1PU19Ub29sQmFyVHJheV9PcmllbnRhdGlvbl8wPWNhc3Q9VG9vbEJhclRyYXleLGZsYWdzPWdjb2JqZWN0Ci1PU19Ub29sQmFyVHJheV9PcmllbnRhdGlvbl8xPWNhc3Q9KE9yaWVudGF0aW9uKQotCi1PU19Ub29sQmFyVHJheV9Ub29sQmFycz1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1Rvb2xCYXJUcmF5X1Rvb2xCYXJzXzA9Y2FzdD1Ub29sQmFyVHJheV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVG9vbEJhcl8xQmFuZF9fST1mbGFncz1nZXR0ZXIKLU9TX1Rvb2xCYXJfMUJhbmRfX0lfMD1jYXN0PVRvb2xCYXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Rvb2xCYXJfMUJhbmRfX0lJPWZsYWdzPXNldHRlcgotT1NfVG9vbEJhcl8xQmFuZF9fSUlfMD1jYXN0PVRvb2xCYXJeLGZsYWdzPWdjb2JqZWN0Ci1PU19Ub29sQmFyXzFCYW5kX19JSV8xPQotCi1PU19Ub29sQmFyXzFCYW5kSW5kZXhfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19Ub29sQmFyXzFCYW5kSW5kZXhfX0lfMD1jYXN0PVRvb2xCYXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Rvb2xCYXJfMUJhbmRJbmRleF9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19Ub29sQmFyXzFCYW5kSW5kZXhfX0lJXzA9Y2FzdD1Ub29sQmFyXixmbGFncz1nY29iamVjdAotT1NfVG9vbEJhcl8xQmFuZEluZGV4X19JSV8xPQotCi1PU19Ub29sQmFyX0hhc092ZXJmbG93SXRlbXM9ZmxhZ3M9Z2V0dGVyCi1PU19Ub29sQmFyX0hhc092ZXJmbG93SXRlbXNfMD1jYXN0PVRvb2xCYXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Rvb2xCYXJfU2V0T3ZlcmZsb3dNb2RlPWFjY2Vzc29yPVRvb2xCYXI6OlNldE92ZXJmbG93TW9kZQotT1NfVG9vbEJhcl9TZXRPdmVyZmxvd01vZGVfMD1jYXN0PURlcGVuZGVuY3lPYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci1PU19Ub29sQmFyX1NldE92ZXJmbG93TW9kZV8xPWNhc3Q9T3ZlcmZsb3dNb2RlCi0KLU9TX1Rvb2xCYXJfdHlwZWlkPWFjY2Vzc29yPVRvb2xCYXI6OnR5cGVpZCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UcmFuc2Zvcm1Db2xsZWN0aW9uX0FkZD1mbGFncz1jcHAKLU9TX1RyYW5zZm9ybUNvbGxlY3Rpb25fQWRkXzA9Y2FzdD0oVHJhbnNmb3JtQ29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UcmFuc2Zvcm1Db2xsZWN0aW9uX0FkZF8xPWNhc3Q9VHJhbnNmb3JtXixmbGFncz1nY29iamVjdAotCi1PU19UcmFuc2Zvcm1Hcm91cF9DaGlsZHJlbj1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1RyYW5zZm9ybUdyb3VwX0NoaWxkcmVuXzA9Y2FzdD1UcmFuc2Zvcm1Hcm91cF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVHJhbnNmb3JtX0Nsb25lPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVHJhbnNmb3JtX0Nsb25lXzA9Y2FzdD1UcmFuc2Zvcm1eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RyZWVWaWV3SXRlbV9Db2xsYXBzZWRFdmVudD1hY2Nlc3Nvcj1UcmVlVmlld0l0ZW06OkNvbGxhcHNlZEV2ZW50LGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1RyZWVWaWV3SXRlbV9FeHBhbmRlZEV2ZW50PWFjY2Vzc29yPVRyZWVWaWV3SXRlbTo6RXhwYW5kZWRFdmVudCxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19UcmVlVmlld0l0ZW1fMUhlYWRlclRlbXBsYXRlX19JPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfVHJlZVZpZXdJdGVtXzFIZWFkZXJUZW1wbGF0ZV9fSV8wPWNhc3Q9VHJlZVZpZXdJdGVtXixmbGFncz1nY29iamVjdAotCi1PU19UcmVlVmlld0l0ZW1fMUhlYWRlclRlbXBsYXRlX19JST1mbGFncz1zZXR0ZXIKLU9TX1RyZWVWaWV3SXRlbV8xSGVhZGVyVGVtcGxhdGVfX0lJXzA9Y2FzdD1UcmVlVmlld0l0ZW1eLGZsYWdzPWdjb2JqZWN0Ci1PU19UcmVlVmlld0l0ZW1fMUhlYWRlclRlbXBsYXRlX19JSV8xPWNhc3Q9RGF0YVRlbXBsYXRlXixmbGFncz1nY29iamVjdAotCi1PU19UcmVlVmlld0l0ZW1fSGVhZGVyVGVtcGxhdGVQcm9wZXJ0eT1hY2Nlc3Nvcj1UcmVlVmlld0l0ZW06OkhlYWRlclRlbXBsYXRlUHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVHJlZVZpZXdJdGVtXzFJc0V4cGFuZGVkX19JPWZsYWdzPWdldHRlcgotT1NfVHJlZVZpZXdJdGVtXzFJc0V4cGFuZGVkX19JXzA9Y2FzdD1UcmVlVmlld0l0ZW1eLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RyZWVWaWV3SXRlbV8xSXNFeHBhbmRlZF9fSVo9ZmxhZ3M9c2V0dGVyCi1PU19UcmVlVmlld0l0ZW1fMUlzRXhwYW5kZWRfX0laXzA9Y2FzdD1UcmVlVmlld0l0ZW1eLGZsYWdzPWdjb2JqZWN0Ci1PU19UcmVlVmlld0l0ZW1fMUlzRXhwYW5kZWRfX0laXzE9Ci0KLU9TX1RyZWVWaWV3SXRlbV8xSXNTZWxlY3RlZF9fST1mbGFncz1nZXR0ZXIKLU9TX1RyZWVWaWV3SXRlbV8xSXNTZWxlY3RlZF9fSV8wPWNhc3Q9VHJlZVZpZXdJdGVtXixmbGFncz1nY29iamVjdAotCi1PU19UcmVlVmlld0l0ZW1fMUlzU2VsZWN0ZWRfX0laPWZsYWdzPXNldHRlcgotT1NfVHJlZVZpZXdJdGVtXzFJc1NlbGVjdGVkX19JWl8wPWNhc3Q9VHJlZVZpZXdJdGVtXixmbGFncz1nY29iamVjdAotT1NfVHJlZVZpZXdJdGVtXzFJc1NlbGVjdGVkX19JWl8xPQotCi1PU19UcmVlVmlld19TZWxlY3RlZEl0ZW09ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19UcmVlVmlld19TZWxlY3RlZEl0ZW1fMD1jYXN0PShUcmVlVmlld14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RyZWVWaWV3X1NlbGVjdGVkSXRlbUNoYW5nZWQ9ZmxhZ3M9YWRkZXIKLU9TX1RyZWVWaWV3X1NlbGVjdGVkSXRlbUNoYW5nZWRfMD1jYXN0PVRyZWVWaWV3XixmbGFncz1nY29iamVjdAotT1NfVHJlZVZpZXdfU2VsZWN0ZWRJdGVtQ2hhbmdlZF8xPWNhc3Q9KFJvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlcjxPYmplY3RePl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1RyZWVWaWV3X3R5cGVpZD1hY2Nlc3Nvcj1UcmVlVmlldzo6dHlwZWlkLGZsYWdzPWNvbnN0IGdjb2JqZWN0Ci0KLU9TX1R5cGVDb252ZXJ0ZXJfQ29udmVydEZyb21TdHJpbmc9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19UeXBlQ29udmVydGVyX0NvbnZlcnRGcm9tU3RyaW5nXzA9Y2FzdD0oVHlwZUNvbnZlcnRlcl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19UeXBlQ29udmVydGVyX0NvbnZlcnRGcm9tU3RyaW5nXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1R5cGVDb252ZXJ0ZXJfQ29udmVydFRvU3RyaW5nPWZsYWdzPWNwcCBnY29iamVjdAotT1NfVHlwZUNvbnZlcnRlcl9Db252ZXJ0VG9TdHJpbmdfMD1jYXN0PShUeXBlQ29udmVydGVyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1R5cGVDb252ZXJ0ZXJfQ29udmVydFRvU3RyaW5nXzE9Y2FzdD1PYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1R5cGVEZXNjcmlwdG9yX0dldENvbnZlcnRlcj1hY2Nlc3Nvcj1UeXBlRGVzY3JpcHRvcjo6R2V0Q29udmVydGVyLGZsYWdzPWdjb2JqZWN0Ci1PU19UeXBlRGVzY3JpcHRvcl9HZXRDb252ZXJ0ZXJfMD1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVHlwZV9GdWxsTmFtZT1mbGFncz1zdHJ1Y3QgZ2NvYmplY3QgZ2V0dGVyCi1PU19UeXBlX0Z1bGxOYW1lXzA9Y2FzdD1UeXBlXixmbGFncz1nY29iamVjdAotCi1PU19UeXBlX0dldFByb3BlcnR5PWZsYWdzPWNwcCBnY29iamVjdAotT1NfVHlwZV9HZXRQcm9wZXJ0eV8wPWNhc3Q9VHlwZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX1R5cGVfR2V0UHJvcGVydHlfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLU9TX1R5cGVfR2V0UHJvcGVydHlfMj1jYXN0PUJpbmRpbmdGbGFncwotCi1PU19UeXBlX0lzSW5zdGFuY2VPZlR5cGU9ZmxhZ3M9Y3BwCi1PU19UeXBlX0lzSW5zdGFuY2VPZlR5cGVfMD1jYXN0PVR5cGVeLGZsYWdzPWdjb2JqZWN0Ci1PU19UeXBlX0lzSW5zdGFuY2VPZlR5cGVfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0NvdW50PWZsYWdzPWdldHRlcgotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0NvdW50XzA9Y2FzdD0oU3lzdGVtOjpDb2xsZWN0aW9uczo6R2VuZXJpYzo6SUNvbGxlY3Rpb248VHlwZWZhY2VePl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1R5cGVmYWNlQ29sbGVjdGlvbl9DdXJyZW50PWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0N1cnJlbnRfMD1jYXN0PShTeXN0ZW06OkNvbGxlY3Rpb25zOjpHZW5lcmljOjpJRW51bWVyYXRvcjxUeXBlZmFjZV4+XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVHlwZWZhY2VDb2xsZWN0aW9uX0dldEVudW1lcmF0b3I9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19UeXBlZmFjZUNvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPWNhc3Q9KFN5c3RlbTo6Q29sbGVjdGlvbnM6OkdlbmVyaWM6OklFbnVtZXJhYmxlPFR5cGVmYWNlXj5eKSxmbGFncz1nY29iamVjdAotCi1PU19UeXBlZmFjZV9Gb250RmFtaWx5PWZsYWdzPXN0cnVjdCBnY29iamVjdCBnZXR0ZXIKLU9TX1R5cGVmYWNlX0ZvbnRGYW1pbHlfMD1jYXN0PShUeXBlZmFjZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1R5cGVmYWNlX1N0cmV0Y2g9ZmxhZ3M9c3RydWN0IGdjb2JqZWN0IGdldHRlcgotT1NfVHlwZWZhY2VfU3RyZXRjaF8wPWNhc3Q9KFR5cGVmYWNlXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVHlwZWZhY2VfU3R5bGU9ZmxhZ3M9c3RydWN0IGdjb2JqZWN0IGdldHRlcgotT1NfVHlwZWZhY2VfU3R5bGVfMD1jYXN0PShUeXBlZmFjZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1R5cGVmYWNlX1dlaWdodD1mbGFncz1zdHJ1Y3QgZ2NvYmplY3QgZ2V0dGVyCi1PU19UeXBlZmFjZV9XZWlnaHRfMD1jYXN0PShUeXBlZmFjZV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQWRkPWZsYWdzPWNwcAotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9BZGRfMD1jYXN0PShVSUVsZW1lbnRDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQWRkXzE9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9DbGVhcj1mbGFncz1jcHAKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQ2xlYXJfMD1jYXN0PShVSUVsZW1lbnRDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9Db250YWlucz1mbGFncz1jcHAKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQ29udGFpbnNfMD1jYXN0PShVSUVsZW1lbnRDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fQ29udGFpbnNfMT1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0NvdW50PWZsYWdzPWdldHRlcgotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9Db3VudF8wPWNhc3Q9KFVJRWxlbWVudENvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0N1cnJlbnQ9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0N1cnJlbnRfMD1jYXN0PShJRW51bWVyYXRvcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fR2V0RW51bWVyYXRvcj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPWNhc3Q9KElFbnVtZXJhYmxlXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbmRleE9mPWZsYWdzPWNwcAotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbmRleE9mXzA9Y2FzdD1VSUVsZW1lbnRDb2xsZWN0aW9uXixmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbmRleE9mXzE9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5zZXJ0PWZsYWdzPWNwcAotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9JbnNlcnRfMD1jYXN0PShVSUVsZW1lbnRDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fSW5zZXJ0XzE9Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX0luc2VydF8yPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX1JlbW92ZT1mbGFncz1jcHAKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fUmVtb3ZlXzA9Y2FzdD0oVUlFbGVtZW50Q29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRDb2xsZWN0aW9uX1JlbW92ZV8xPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fZGVmYXVsdD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1VJRWxlbWVudENvbGxlY3Rpb25fZGVmYXVsdF8wPWNhc3Q9KFVJRWxlbWVudENvbGxlY3Rpb25eKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50Q29sbGVjdGlvbl9kZWZhdWx0XzE9Ci0KLU9TX1VJRWxlbWVudF9BZGRIYW5kbGVyPWZsYWdzPWNwcAotT1NfVUlFbGVtZW50X0FkZEhhbmRsZXJfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9BZGRIYW5kbGVyXzE9Y2FzdD1Sb3V0ZWRFdmVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9BZGRIYW5kbGVyXzI9Y2FzdD1EZWxlZ2F0ZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X0FsbG93RHJvcD1mbGFncz1zZXR0ZXIKLU9TX1VJRWxlbWVudF9BbGxvd0Ryb3BfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X0FsbG93RHJvcF8xPQotCi1PU19VSUVsZW1lbnRfQmVnaW5BbmltYXRpb249ZmxhZ3M9Y3BwCi1PU19VSUVsZW1lbnRfQmVnaW5BbmltYXRpb25fMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X0JlZ2luQW5pbWF0aW9uXzE9Y2FzdD1EZXBlbmRlbmN5UHJvcGVydHleLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfQmVnaW5BbmltYXRpb25fMj1jYXN0PUFuaW1hdGlvblRpbWVsaW5lXixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfQ2FwdHVyZU1vdXNlPWZsYWdzPWNwcAotT1NfVUlFbGVtZW50X0NhcHR1cmVNb3VzZV8wPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfQ2xpcD1mbGFncz1zZXR0ZXIKLU9TX1VJRWxlbWVudF9DbGlwXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfQ2xpcF8xPWNhc3Q9R2VvbWV0cnleLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9DbGlwVG9Cb3VuZHM9ZmxhZ3M9c2V0dGVyCi1PU19VSUVsZW1lbnRfQ2xpcFRvQm91bmRzXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfQ2xpcFRvQm91bmRzXzE9Ci0KLU9TX1VJRWxlbWVudF9EZXNpcmVkU2l6ZT1mbGFncz1zdHJ1Y3QgZ2NvYmplY3QgZ2V0dGVyCi1PU19VSUVsZW1lbnRfRGVzaXJlZFNpemVfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X0RyYWdFbnRlcj1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X0RyYWdFbnRlcl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfRHJhZ0VudGVyXzE9Y2FzdD0oRHJhZ0V2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9EcmFnTGVhdmU9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9EcmFnTGVhdmVfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X0RyYWdMZWF2ZV8xPWNhc3Q9KERyYWdFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfRHJhZ092ZXI9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9EcmFnT3Zlcl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfRHJhZ092ZXJfMT1jYXN0PShEcmFnRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X0Ryb3A9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9Ecm9wXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9Ecm9wXzE9Y2FzdD0oRHJhZ0V2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9Gb2N1cz1mbGFncz1jcHAKLU9TX1VJRWxlbWVudF9Gb2N1c18wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9Gb2N1c2FibGU9ZmxhZ3M9c2V0dGVyCi1PU19VSUVsZW1lbnRfRm9jdXNhYmxlXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9Gb2N1c2FibGVfMT0KLQotT1NfVUlFbGVtZW50X0dpdmVGZWVkYmFjaz1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X0dpdmVGZWVkYmFja18wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfR2l2ZUZlZWRiYWNrXzE9Y2FzdD1HaXZlRmVlZGJhY2tFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9JbnB1dEhpdFRlc3Q9ZmxhZ3M9Y3BwIGdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfSW5wdXRIaXRUZXN0XzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfSW5wdXRIaXRUZXN0XzE9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfSW52YWxpZGF0ZVZpc3VhbD1mbGFncz1jcHAKLU9TX1VJRWxlbWVudF9JbnZhbGlkYXRlVmlzdWFsXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50XzFJc0VuYWJsZWRfX0k9ZmxhZ3M9Z2V0dGVyCi1PU19VSUVsZW1lbnRfMUlzRW5hYmxlZF9fSV8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF8xSXNFbmFibGVkX19JWj1mbGFncz1zZXR0ZXIKLU9TX1VJRWxlbWVudF8xSXNFbmFibGVkX19JWl8wPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50XzFJc0VuYWJsZWRfX0laXzE9Ci0KLU9TX1VJRWxlbWVudF9Jc0ZvY3VzZWQ9ZmxhZ3M9Z2V0dGVyCi1PU19VSUVsZW1lbnRfSXNGb2N1c2VkXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X0lzSGl0VGVzdFZpc2libGU9ZmxhZ3M9c2V0dGVyCi1PU19VSUVsZW1lbnRfSXNIaXRUZXN0VmlzaWJsZV8wPWNhc3Q9VUlFbGVtZW50XixmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X0lzSGl0VGVzdFZpc2libGVfMT0KLQotT1NfVUlFbGVtZW50X0lzS2V5Ym9hcmRGb2N1c1dpdGhpbj1mbGFncz1nZXR0ZXIKLU9TX1VJRWxlbWVudF9Jc0tleWJvYXJkRm9jdXNXaXRoaW5fMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfSXNLZXlib2FyZEZvY3VzZWQ9ZmxhZ3M9Z2V0dGVyCi1PU19VSUVsZW1lbnRfSXNLZXlib2FyZEZvY3VzZWRfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfSXNNZWFzdXJlVmFsaWQ9ZmxhZ3M9Z2V0dGVyCi1PU19VSUVsZW1lbnRfSXNNZWFzdXJlVmFsaWRfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X0lzTW91c2VPdmVyPWZsYWdzPWdldHRlcgotT1NfVUlFbGVtZW50X0lzTW91c2VPdmVyXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9Jc1Zpc2libGU9ZmxhZ3M9Z2V0dGVyCi1PU19VSUVsZW1lbnRfSXNWaXNpYmxlXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9LZXlEb3duPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfS2V5RG93bl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfS2V5RG93bl8xPWNhc3Q9KEtleUV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9LZXlVcD1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X0tleVVwXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9LZXlVcF8xPWNhc3Q9S2V5RXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfTG9zdEtleWJvYXJkRm9jdXM9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9Mb3N0S2V5Ym9hcmRGb2N1c18wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfTG9zdEtleWJvYXJkRm9jdXNfMT1jYXN0PShLZXlib2FyZEZvY3VzQ2hhbmdlZEV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9NZWFzdXJlPWZsYWdzPWNwcAotT1NfVUlFbGVtZW50X01lYXN1cmVfMD1jYXN0PShVSUVsZW1lbnQgXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9NZWFzdXJlXzE9Y2FzdD0oU2l6ZSksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X01vdXNlRG93bj1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X01vdXNlRG93bl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfTW91c2VEb3duXzE9Y2FzdD0oTW91c2VCdXR0b25FdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfTW91c2VFbnRlcj1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X01vdXNlRW50ZXJfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9Nb3VzZUVudGVyXzE9Y2FzdD1Nb3VzZUV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X01vdXNlTGVhdmU9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9Nb3VzZUxlYXZlXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfTW91c2VMZWF2ZV8xPWNhc3Q9TW91c2VFdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9Nb3VzZU1vdmU9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9Nb3VzZU1vdmVfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X01vdXNlTW92ZV8xPWNhc3Q9KE1vdXNlRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X01vdXNlVXA9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9Nb3VzZVVwXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9Nb3VzZVVwXzE9Y2FzdD0oTW91c2VCdXR0b25FdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfTW91c2VXaGVlbD1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X01vdXNlV2hlZWxfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X01vdXNlV2hlZWxfMT1jYXN0PShNb3VzZVdoZWVsRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X01vdmVGb2N1cz1mbGFncz1jcHAKLU9TX1VJRWxlbWVudF9Nb3ZlRm9jdXNfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9Nb3ZlRm9jdXNfMT1jYXN0PVRyYXZlcnNhbFJlcXVlc3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9PcGFjaXR5PWZsYWdzPXNldHRlcgotT1NfVUlFbGVtZW50X09wYWNpdHlfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9PcGFjaXR5XzE9Ci0KLU9TX1VJRWxlbWVudF9PcGFjaXR5UHJvcGVydHk9YWNjZXNzb3I9VUlFbGVtZW50OjpPcGFjaXR5UHJvcGVydHksZmxhZ3M9Y29uc3QgZ2NvYmplY3QKLQotT1NfVUlFbGVtZW50X1ByZXZpZXdHb3RLZXlib2FyZEZvY3VzPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfUHJldmlld0dvdEtleWJvYXJkRm9jdXNfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X1ByZXZpZXdHb3RLZXlib2FyZEZvY3VzXzE9Y2FzdD0oS2V5Ym9hcmRGb2N1c0NoYW5nZWRFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfUHJldmlld0tleURvd249ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9QcmV2aWV3S2V5RG93bl8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfUHJldmlld0tleURvd25fMT1jYXN0PShLZXlFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfUHJldmlld0tleVVwPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfUHJldmlld0tleVVwXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9QcmV2aWV3S2V5VXBfMT1jYXN0PShLZXlFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfUHJldmlld0xvc3RLZXlib2FyZEZvY3VzPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfUHJldmlld0xvc3RLZXlib2FyZEZvY3VzXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9QcmV2aWV3TG9zdEtleWJvYXJkRm9jdXNfMT1jYXN0PShLZXlib2FyZEZvY3VzQ2hhbmdlZEV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VEb3duPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfUHJldmlld01vdXNlRG93bl8wPWNhc3Q9KFVJRWxlbWVudCBeKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZURvd25fMT1jYXN0PShNb3VzZUJ1dHRvbkV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VNb3ZlPWZsYWdzPWFkZGVyCi1PU19VSUVsZW1lbnRfUHJldmlld01vdXNlTW92ZV8wPWNhc3Q9KFVJRWxlbWVudCBeKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZU1vdmVfMT1jYXN0PShNb3VzZUV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VVcD1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZVVwXzA9Y2FzdD0oVUlFbGVtZW50IF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfUHJldmlld01vdXNlVXBfMT1jYXN0PShNb3VzZUJ1dHRvbkV2ZW50SGFuZGxlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9QcmV2aWV3TW91c2VXaGVlbD1mbGFncz1hZGRlcgotT1NfVUlFbGVtZW50X1ByZXZpZXdNb3VzZVdoZWVsXzA9Y2FzdD0oVUlFbGVtZW50IF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfUHJldmlld01vdXNlV2hlZWxfMT1jYXN0PShNb3VzZVdoZWVsRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfVUlFbGVtZW50X1ByZXZpZXdUZXh0SW5wdXQ9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9QcmV2aWV3VGV4dElucHV0XzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfUHJldmlld1RleHRJbnB1dF8xPWNhc3Q9VGV4dENvbXBvc2l0aW9uRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfUXVlcnlDb250aW51ZURyYWc9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9RdWVyeUNvbnRpbnVlRHJhZ18wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci1PU19VSUVsZW1lbnRfUXVlcnlDb250aW51ZURyYWdfMT1jYXN0PVF1ZXJ5Q29udGludWVEcmFnRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfUmVsZWFzZU1vdXNlQ2FwdHVyZT1mbGFncz1jcHAKLU9TX1VJRWxlbWVudF9SZWxlYXNlTW91c2VDYXB0dXJlXzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9TbmFwc1RvRGV2aWNlUGl4ZWxzPWZsYWdzPXNldHRlcgotT1NfVUlFbGVtZW50X1NuYXBzVG9EZXZpY2VQaXhlbHNfMD1jYXN0PVVJRWxlbWVudF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9TbmFwc1RvRGV2aWNlUGl4ZWxzXzE9Ci0KLU9TX1VJRWxlbWVudF9UZXh0SW5wdXQ9ZmxhZ3M9YWRkZXIKLU9TX1VJRWxlbWVudF9UZXh0SW5wdXRfMD1jYXN0PShVSUVsZW1lbnReKSxmbGFncz1nY29iamVjdAotT1NfVUlFbGVtZW50X1RleHRJbnB1dF8xPWNhc3Q9VGV4dENvbXBvc2l0aW9uRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19VSUVsZW1lbnRfVHJhbnNsYXRlUG9pbnQ9ZmxhZ3M9c3RydWN0IGNwcCBnY29iamVjdAotT1NfVUlFbGVtZW50X1RyYW5zbGF0ZVBvaW50XzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9UcmFuc2xhdGVQb2ludF8xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF9UcmFuc2xhdGVQb2ludF8yPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF9VcGRhdGVMYXlvdXQ9ZmxhZ3M9Y3BwCi1PU19VSUVsZW1lbnRfVXBkYXRlTGF5b3V0XzA9Y2FzdD1VSUVsZW1lbnReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fST1mbGFncz1nZXR0ZXIKLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fSV8wPWNhc3Q9KFVJRWxlbWVudF4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fSUI9ZmxhZ3M9c2V0dGVyCi1PU19VSUVsZW1lbnRfMVZpc2liaWxpdHlfX0lCXzA9Y2FzdD0oVUlFbGVtZW50XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1VJRWxlbWVudF8xVmlzaWJpbGl0eV9fSUJfMT1jYXN0PVZpc2liaWxpdHkKLQotT1NfVUlFbGVtZW50X1Zpc2liaWxpdHlQcm9wZXJ0eT1hY2Nlc3Nvcj1VSUVsZW1lbnQ6OlZpc2liaWxpdHlQcm9wZXJ0eSxmbGFncz1jb25zdCBnY29iamVjdAotCi1PU19WaXJ0dWFsaXppbmdTdGFja1BhbmVsX1ZlcnRpY2FsT2Zmc2V0PWZsYWdzPWdldHRlcgotT1NfVmlydHVhbGl6aW5nU3RhY2tQYW5lbF9WZXJ0aWNhbE9mZnNldF8wPWNhc3Q9VmlydHVhbGl6aW5nU3RhY2tQYW5lbF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZD1hY2Nlc3Nvcj1WaXN1YWxUcmVlSGVscGVyOjpHZXRDaGlsZCxmbGFncz1nY29iamVjdAotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZF8wPWNhc3Q9RGVwZW5kZW5jeU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1Zpc3VhbFRyZWVIZWxwZXJfR2V0Q2hpbGRfMT0KLQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRDaGlsZHJlbkNvdW50PWFjY2Vzc29yPVZpc3VhbFRyZWVIZWxwZXI6OkdldENoaWxkcmVuQ291bnQKLU9TX1Zpc3VhbFRyZWVIZWxwZXJfR2V0Q2hpbGRyZW5Db3VudF8wPWNhc3Q9RGVwZW5kZW5jeU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVmlzdWFsVHJlZUhlbHBlcl9HZXRQYXJlbnQ9YWNjZXNzb3I9VmlzdWFsVHJlZUhlbHBlcjo6R2V0UGFyZW50LGZsYWdzPWdjb2JqZWN0Ci1PU19WaXN1YWxUcmVlSGVscGVyX0dldFBhcmVudF8wPWNhc3Q9RGVwZW5kZW5jeU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfVmlzdWFsX0lzQW5jZXN0b3JPZj1mbGFncz1jcHAKLU9TX1Zpc3VhbF9Jc0FuY2VzdG9yT2ZfMD1jYXN0PVZpc3VhbF4sZmxhZ3M9Z2NvYmplY3QKLU9TX1Zpc3VhbF9Jc0FuY2VzdG9yT2ZfMT1jYXN0PURlcGVuZGVuY3lPYmplY3ReLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1Zpc3VhbF9Jc0Rlc2NlbmRhbnRPZj1mbGFncz1jcHAKLU9TX1Zpc3VhbF9Jc0Rlc2NlbmRhbnRPZl8wPWNhc3Q9VmlzdWFsXixmbGFncz1nY29iamVjdAotT1NfVmlzdWFsX0lzRGVzY2VuZGFudE9mXzE9Y2FzdD1EZXBlbmRlbmN5T2JqZWN0XixmbGFncz1nY29iamVjdAotCi1PU19WaXN1YWxfUG9pbnRGcm9tU2NyZWVuPWZsYWdzPXN0cnVjdCBjcHAgZ2NvYmplY3QKLU9TX1Zpc3VhbF9Qb2ludEZyb21TY3JlZW5fMD1jYXN0PShWaXN1YWxeKSxmbGFncz1nY29iamVjdAotT1NfVmlzdWFsX1BvaW50RnJvbVNjcmVlbl8xPWNhc3Q9KFBvaW50KSxmbGFncz1nY29iamVjdAotCi1PU19WaXN1YWxfUG9pbnRUb1NjcmVlbj1mbGFncz1zdHJ1Y3QgY3BwIGdjb2JqZWN0Ci1PU19WaXN1YWxfUG9pbnRUb1NjcmVlbl8wPWNhc3Q9VmlzdWFsXixmbGFncz1nY29iamVjdAotT1NfVmlzdWFsX1BvaW50VG9TY3JlZW5fMT1jYXN0PShQb2ludCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3NlckRvY3VtZW50Q29tcGxldGVkRXZlbnRBcmdzX1VybD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dlYkJyb3dzZXJEb2N1bWVudENvbXBsZXRlZEV2ZW50QXJnc19VcmxfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyRG9jdW1lbnRDb21wbGV0ZWRFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyTmF2aWdhdGVkRXZlbnRBcmdzX1VybD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dlYkJyb3dzZXJOYXZpZ2F0ZWRFdmVudEFyZ3NfVXJsXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlck5hdmlnYXRlZEV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJOYXZpZ2F0aW5nRXZlbnRBcmdzX1VybD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dlYkJyb3dzZXJOYXZpZ2F0aW5nRXZlbnRBcmdzX1VybF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJOYXZpZ2F0aW5nRXZlbnRBcmdzXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3NlclByb2dyZXNzQ2hhbmdlZEV2ZW50QXJnc19DdXJyZW50UHJvZ3Jlc3M9ZmxhZ3M9Z2V0dGVyCi1PU19XZWJCcm93c2VyUHJvZ3Jlc3NDaGFuZ2VkRXZlbnRBcmdzX0N1cnJlbnRQcm9ncmVzc18wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJQcm9ncmVzc0NoYW5nZWRFdmVudEFyZ3NeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyUHJvZ3Jlc3NDaGFuZ2VkRXZlbnRBcmdzX01heGltdW1Qcm9ncmVzcz1mbGFncz1nZXR0ZXIKLU9TX1dlYkJyb3dzZXJQcm9ncmVzc0NoYW5nZWRFdmVudEFyZ3NfTWF4aW11bVByb2dyZXNzXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3NlclByb2dyZXNzQ2hhbmdlZEV2ZW50QXJnc14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfQ2FuR29CYWNrPWZsYWdzPWdldHRlcgotT1NfV2ViQnJvd3Nlcl9DYW5Hb0JhY2tfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9DYW5Hb0ZvcndhcmQ9ZmxhZ3M9Z2V0dGVyCi1PU19XZWJCcm93c2VyX0NhbkdvRm9yd2FyZF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX0RvY3VtZW50PWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfV2ViQnJvd3Nlcl9Eb2N1bWVudF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX0RvY3VtZW50Q29tcGxldGVkPWZsYWdzPWFkZGVyCi1PU19XZWJCcm93c2VyX0RvY3VtZW50Q29tcGxldGVkXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19XZWJCcm93c2VyX0RvY3VtZW50Q29tcGxldGVkXzE9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3NlckRvY3VtZW50Q29tcGxldGVkRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9Eb2N1bWVudFRleHQ9ZmxhZ3M9c2V0dGVyCi1PU19XZWJCcm93c2VyX0RvY3VtZW50VGV4dF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotT1NfV2ViQnJvd3Nlcl9Eb2N1bWVudFRleHRfMT1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9Eb2N1bWVudFRpdGxlPWZsYWdzPWdjb2JqZWN0IGdldHRlcgotT1NfV2ViQnJvd3Nlcl9Eb2N1bWVudFRpdGxlXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfRG9jdW1lbnRUaXRsZUNoYW5nZWQ9ZmxhZ3M9YWRkZXIKLU9TX1dlYkJyb3dzZXJfRG9jdW1lbnRUaXRsZUNoYW5nZWRfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dlYkJyb3dzZXJfRG9jdW1lbnRUaXRsZUNoYW5nZWRfMT1jYXN0PUV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9Hb0JhY2s9ZmxhZ3M9Y3BwCi1PU19XZWJCcm93c2VyX0dvQmFja18wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX0dvRm9yd2FyZD1mbGFncz1jcHAKLU9TX1dlYkJyb3dzZXJfR29Gb3J3YXJkXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfTmF2aWdhdGU9ZmxhZ3M9Y3BwCi1PU19XZWJCcm93c2VyX05hdmlnYXRlXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19XZWJCcm93c2VyX05hdmlnYXRlXzE9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfTmF2aWdhdGVkPWZsYWdzPWFkZGVyCi1PU19XZWJCcm93c2VyX05hdmlnYXRlZF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotT1NfV2ViQnJvd3Nlcl9OYXZpZ2F0ZWRfMT1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyTmF2aWdhdGVkRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9OYXZpZ2F0aW5nPWZsYWdzPWFkZGVyCi1PU19XZWJCcm93c2VyX05hdmlnYXRpbmdfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyXiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dlYkJyb3dzZXJfTmF2aWdhdGluZ18xPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJOYXZpZ2F0aW5nRXZlbnRIYW5kbGVyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9Qcm9ncmVzc0NoYW5nZWQ9ZmxhZ3M9YWRkZXIKLU9TX1dlYkJyb3dzZXJfUHJvZ3Jlc3NDaGFuZ2VkXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19XZWJCcm93c2VyX1Byb2dyZXNzQ2hhbmdlZF8xPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJQcm9ncmVzc0NoYW5nZWRFdmVudEhhbmRsZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX1JlYWR5U3RhdGU9ZmxhZ3M9Z2V0dGVyCi1PU19XZWJCcm93c2VyX1JlYWR5U3RhdGVfMD1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpXZWJCcm93c2VyXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2ViQnJvd3Nlcl9SZWZyZXNoPWZsYWdzPWNwcAotT1NfV2ViQnJvd3Nlcl9SZWZyZXNoXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfU2NyaXB0RXJyb3JzU3VwcHJlc3NlZD1mbGFncz1zZXR0ZXIKLU9TX1dlYkJyb3dzZXJfU2NyaXB0RXJyb3JzU3VwcHJlc3NlZF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotT1NfV2ViQnJvd3Nlcl9TY3JpcHRFcnJvcnNTdXBwcmVzc2VkXzE9Ci0KLU9TX1dlYkJyb3dzZXJfU3RhdHVzVGV4dD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dlYkJyb3dzZXJfU3RhdHVzVGV4dF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX1N0YXR1c1RleHRDaGFuZ2VkPWZsYWdzPWFkZGVyCi1PU19XZWJCcm93c2VyX1N0YXR1c1RleHRDaGFuZ2VkXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci1PU19XZWJCcm93c2VyX1N0YXR1c1RleHRDaGFuZ2VkXzE9Y2FzdD1FdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dlYkJyb3dzZXJfU3RvcD1mbGFncz1jcHAKLU9TX1dlYkJyb3dzZXJfU3RvcF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OldlYkJyb3dzZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19XZWJCcm93c2VyX1VybD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dlYkJyb3dzZXJfVXJsXzA9Y2FzdD0oU3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3Nlcl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fQ291bnQ9ZmxhZ3M9Z2V0dGVyCi1PU19XaW5kb3dDb2xsZWN0aW9uX0NvdW50XzA9Y2FzdD0oV2luZG93Q29sbGVjdGlvbl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fQ3VycmVudD1mbGFncz1nY29iamVjdCBnZXR0ZXIKLU9TX1dpbmRvd0NvbGxlY3Rpb25fQ3VycmVudF8wPWNhc3Q9SUVudW1lcmF0b3JeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcj1mbGFncz1jcHAgZ2NvYmplY3QKLU9TX1dpbmRvd0NvbGxlY3Rpb25fR2V0RW51bWVyYXRvcl8wPWNhc3Q9SUVudW1lcmFibGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd19BY3RpdmF0ZT1mbGFncz1jcHAKLU9TX1dpbmRvd19BY3RpdmF0ZV8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd19BY3RpdmF0ZWQ9ZmxhZ3M9YWRkZXIKLU9TX1dpbmRvd19BY3RpdmF0ZWRfMD1jYXN0PShXaW5kb3deKSxmbGFncz1nY29iamVjdAotT1NfV2luZG93X0FjdGl2YXRlZF8xPWNhc3Q9RXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfQWxsb3dzVHJhbnNwYXJlbmN5PWZsYWdzPXNldHRlcgotT1NfV2luZG93X0FsbG93c1RyYW5zcGFyZW5jeV8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfQWxsb3dzVHJhbnNwYXJlbmN5XzE9Ci0KLU9TX1dpbmRvd19DbG9zZT1mbGFncz1jcHAKLU9TX1dpbmRvd19DbG9zZV8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd19DbG9zaW5nPWZsYWdzPWFkZGVyCi1PU19XaW5kb3dfQ2xvc2luZ18wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfQ2xvc2luZ18xPWNhc3Q9Q2FuY2VsRXZlbnRIYW5kbGVyXixmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfRGVhY3RpdmF0ZWQ9ZmxhZ3M9YWRkZXIKLU9TX1dpbmRvd19EZWFjdGl2YXRlZF8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfRGVhY3RpdmF0ZWRfMT1jYXN0PUV2ZW50SGFuZGxlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2luZG93X0dldFdpbmRvdz1hY2Nlc3Nvcj1XaW5kb3c6OkdldFdpbmRvdyxmbGFncz1nY29iamVjdAotT1NfV2luZG93X0dldFdpbmRvd18wPWNhc3Q9KERlcGVuZGVuY3lPYmplY3ReKSxmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfSGlkZT1mbGFncz1jcHAKLU9TX1dpbmRvd19IaWRlXzA9Y2FzdD0oV2luZG93XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2luZG93X0ljb249ZmxhZ3M9c2V0dGVyCi1PU19XaW5kb3dfSWNvbl8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfSWNvbl8xPWNhc3Q9SW1hZ2VTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd19Jc0FjdGl2ZT1mbGFncz1nZXR0ZXIKLU9TX1dpbmRvd19Jc0FjdGl2ZV8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd18xTGVmdF9fST1mbGFncz1nZXR0ZXIKLU9TX1dpbmRvd18xTGVmdF9fSV8wPWNhc3Q9V2luZG93XixmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfMUxlZnRfX0lEPWZsYWdzPXNldHRlcgotT1NfV2luZG93XzFMZWZ0X19JRF8wPWNhc3Q9V2luZG93XixmbGFncz1nY29iamVjdAotT1NfV2luZG93XzFMZWZ0X19JRF8xPQotCi1PU19XaW5kb3dfTG9jYXRpb25DaGFuZ2VkPWZsYWdzPWFkZGVyCi1PU19XaW5kb3dfTG9jYXRpb25DaGFuZ2VkXzA9Y2FzdD1XaW5kb3deLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfTG9jYXRpb25DaGFuZ2VkXzE9Y2FzdD1FdmVudEhhbmRsZXJeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX1dpbmRvd19Pd25lcj1mbGFncz1zZXR0ZXIKLU9TX1dpbmRvd19Pd25lcl8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfT3duZXJfMT1jYXN0PShXaW5kb3deKSxmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfUmVzaXplTW9kZT1mbGFncz1zZXR0ZXIKLU9TX1dpbmRvd19SZXNpemVNb2RlXzA9Y2FzdD0oV2luZG93XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dpbmRvd19SZXNpemVNb2RlXzE9Y2FzdD1SZXNpemVNb2RlCi0KLU9TX1dpbmRvd19TaG93PWZsYWdzPWNwcAotT1NfV2luZG93X1Nob3dfMD1jYXN0PShXaW5kb3deKSxmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfU2hvd0luVGFza2Jhcj1mbGFncz1zZXR0ZXIKLU9TX1dpbmRvd19TaG93SW5UYXNrYmFyXzA9Y2FzdD0oV2luZG93XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dpbmRvd19TaG93SW5UYXNrYmFyXzE9Ci0KLU9TX1dpbmRvd18xVGl0bGVfX0k9ZmxhZ3M9Z2NvYmplY3QgZ2V0dGVyCi1PU19XaW5kb3dfMVRpdGxlX19JXzA9Y2FzdD0oV2luZG93XiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV2luZG93XzFUaXRsZV9fSUk9ZmxhZ3M9c2V0dGVyCi1PU19XaW5kb3dfMVRpdGxlX19JSV8wPWNhc3Q9KFdpbmRvd14pLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfMVRpdGxlX19JSV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfMVRvcF9fST1mbGFncz1nZXR0ZXIKLU9TX1dpbmRvd18xVG9wX19JXzA9Y2FzdD1XaW5kb3cgXixmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfMVRvcF9fSUQ9ZmxhZ3M9c2V0dGVyCi1PU19XaW5kb3dfMVRvcF9fSURfMD1jYXN0PVdpbmRvdyBeLGZsYWdzPWdjb2JqZWN0Ci1PU19XaW5kb3dfMVRvcF9fSURfMT0KLQotT1NfV2luZG93X1RvcG1vc3Q9ZmxhZ3M9c2V0dGVyCi1PU19XaW5kb3dfVG9wbW9zdF8wPWNhc3Q9V2luZG93XixmbGFncz1nY29iamVjdAotT1NfV2luZG93X1RvcG1vc3RfMT0KLQotT1NfV2luZG93XzFXaW5kb3dTdGF0ZV9fST1mbGFncz1nZXR0ZXIKLU9TX1dpbmRvd18xV2luZG93U3RhdGVfX0lfMD1jYXN0PShXaW5kb3deKSxmbGFncz1nY29iamVjdAotCi1PU19XaW5kb3dfMVdpbmRvd1N0YXRlX19JST1mbGFncz1zZXR0ZXIKLU9TX1dpbmRvd18xV2luZG93U3RhdGVfX0lJXzA9Y2FzdD0oV2luZG93XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dpbmRvd18xV2luZG93U3RhdGVfX0lJXzE9Y2FzdD1XaW5kb3dTdGF0ZQotCi1PU19XaW5kb3dfV2luZG93U3R5bGU9ZmxhZ3M9c2V0dGVyCi1PU19XaW5kb3dfV2luZG93U3R5bGVfMD1jYXN0PShXaW5kb3deKSxmbGFncz1nY29iamVjdAotT1NfV2luZG93X1dpbmRvd1N0eWxlXzE9Y2FzdD1XaW5kb3dTdHlsZQotCi1PU19XaW5kb3dzRm9ybXNIb3N0X0NoaWxkPWZsYWdzPXNldHRlcgotT1NfV2luZG93c0Zvcm1zSG9zdF9DaGlsZF8wPWNhc3Q9KFN5c3RlbTo6V2luZG93czo6Rm9ybXM6OkludGVncmF0aW9uOjpXaW5kb3dzRm9ybXNIb3N0XiksZmxhZ3M9Z2NvYmplY3QKLU9TX1dpbmRvd3NGb3Jtc0hvc3RfQ2hpbGRfMT1jYXN0PShTeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpDb250cm9sXiksZmxhZ3M9Z2NvYmplY3QKLQotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzPWZsYWdzPWNwcAotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzXzA9Y2FzdD1Xcml0ZWFibGVCaXRtYXBeLGZsYWdzPWdjb2JqZWN0Ci1PU19Xcml0ZWFibGVCaXRtYXBfV3JpdGVQaXhlbHNfMT1jYXN0PUludDMyUmVjdCxmbGFncz1nY29iamVjdAotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzXzI9Y2FzdD1JbnRQdHIKLU9TX1dyaXRlYWJsZUJpdG1hcF9Xcml0ZVBpeGVsc18zPQotT1NfV3JpdGVhYmxlQml0bWFwX1dyaXRlUGl4ZWxzXzQ9Ci0KLU9TX1hhbWxSZWFkZXJfTG9hZD1hY2Nlc3Nvcj1YYW1sUmVhZGVyOjpMb2FkLGZsYWdzPWdjb2JqZWN0Ci1PU19YYW1sUmVhZGVyX0xvYWRfMD1jYXN0PVhtbFJlYWRlcl4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfWG1sUmVhZGVyX0NyZWF0ZT1hY2Nlc3Nvcj1YbWxSZWFkZXI6OkNyZWF0ZSxmbGFncz1nY29iamVjdAotT1NfWG1sUmVhZGVyX0NyZWF0ZV8wPWNhc3Q9KFN5c3RlbTo6SU86OlRleHRSZWFkZXJeKSxmbGFncz1nY29iamVjdAotCi1PU19nY25ld19BY2Nlc3NUZXh0PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0FwcGxpY2F0aW9uPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0FyY1NlZ21lbnQ9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0FyY1NlZ21lbnRfMD1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19BcmNTZWdtZW50XzE9Y2FzdD1TaXplLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19BcmNTZWdtZW50XzI9Ci1PU19nY25ld19BcmNTZWdtZW50XzM9Ci1PU19nY25ld19BcmNTZWdtZW50XzQ9Y2FzdD0oU3dlZXBEaXJlY3Rpb24pCi1PU19nY25ld19BcmNTZWdtZW50XzU9Ci0KLU9TX2djbmV3X0FycmF5TGlzdD1mbGFncz1nY25ldwotT1NfZ2NuZXdfQXJyYXlMaXN0XzA9Ci0KLU9TX2djbmV3X0JlemllclNlZ21lbnQ9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0JlemllclNlZ21lbnRfMD1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19CZXppZXJTZWdtZW50XzE9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfQmV6aWVyU2VnbWVudF8yPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0JlemllclNlZ21lbnRfMz0KLQotT1NfZ2NuZXdfMUJpbmRpbmdfXz1mbGFncz1nY25ldwotCi1PU19nY25ld18xQmluZGluZ19fST1mbGFncz1nY25ldwotT1NfZ2NuZXdfMUJpbmRpbmdfX0lfMD1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfQml0bWFwPWFjY2Vzc29yPVN5c3RlbTo6RHJhd2luZzo6Qml0bWFwLGZsYWdzPWdjbmV3Ci1PU19nY25ld19CaXRtYXBfMD0KLU9TX2djbmV3X0JpdG1hcF8xPQotT1NfZ2NuZXdfQml0bWFwXzI9Ci1PU19nY25ld19CaXRtYXBfMz1jYXN0PShTeXN0ZW06OkRyYXdpbmc6OkltYWdpbmc6OlBpeGVsRm9ybWF0KQotT1NfZ2NuZXdfQml0bWFwXzQ9Y2FzdD1JbnRQdHIKLQotT1NfZ2NuZXdfQml0bWFwSW1hZ2U9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfQml0bWFwUGFsZXR0ZT1mbGFncz1nY25ldwotT1NfZ2NuZXdfQml0bWFwUGFsZXR0ZV8wPWNhc3Q9KFN5c3RlbTo6Q29sbGVjdGlvbnM6OkdlbmVyaWM6OklMaXN0PENvbG9yPl4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0J1dHRvbj1mbGFncz1nY25ldwotCi1PU19nY25ld19DYW5jZWxFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19DYW5jZWxFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0NhbmNlbEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19DYW52YXM9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfQ2hhcmFjdGVySGl0PWZsYWdzPWdjbmV3Ci1PU19nY25ld19DaGFyYWN0ZXJIaXRfMD0KLU9TX2djbmV3X0NoYXJhY3RlckhpdF8xPQotCi1PU19nY25ld19DaGVja0JveD1mbGFncz1nY25ldwotCi1PU19nY25ld19Db2xvckRpYWxvZz1hY2Nlc3Nvcj1TeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpDb2xvckRpYWxvZyxmbGFncz1nY25ldwotCi1PU19nY25ld19Db2xvckxpc3Q9YWNjZXNzb3I9U3lzdGVtOjpDb2xsZWN0aW9uczo6R2VuZXJpYzo6TGlzdDxDb2xvcj4sZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0NvbG9yTGlzdF8wPQotCi1PU19nY25ld19Db2x1bW5EZWZpbml0aW9uPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0NvbWJpbmVkR2VvbWV0cnk9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0NvbWJpbmVkR2VvbWV0cnlfMD1jYXN0PShHZW9tZXRyeUNvbWJpbmVNb2RlKQotT1NfZ2NuZXdfQ29tYmluZWRHZW9tZXRyeV8xPWNhc3Q9KEdlb21ldHJ5XiksZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0NvbWJpbmVkR2VvbWV0cnlfMj1jYXN0PShHZW9tZXRyeV4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0NvbWJvQm94PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0NvbWJvQm94SXRlbT1mbGFncz1nY25ldwotCi1PU19nY25ld19Db21wb3NpdGVDb2xsZWN0aW9uPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0NvbnRlbnRDb250cm9sPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0NvbnRleHRNZW51PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0NvbnRleHRNZW51RXZlbnRIYW5kbGVyPWZsYWdzPWdjbmV3IG5vX2dlbgotT1NfZ2NuZXdfQ29udGV4dE1lbnVFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0NvbnRyb2xUZW1wbGF0ZT1mbGFncz1nY25ldwotCi1PU19nY25ld19Dcm9wcGVkQml0bWFwPWZsYWdzPWdjbmV3Ci1PU19nY25ld19Dcm9wcGVkQml0bWFwXzA9Y2FzdD1CaXRtYXBTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19Dcm9wcGVkQml0bWFwXzE9Y2FzdD1JbnQzMlJlY3QsZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfRGFzaFN0eWxlPWZsYWdzPWdjbmV3Ci1PU19nY25ld19EYXNoU3R5bGVfMD1jYXN0PShEb3VibGVDb2xsZWN0aW9uXiksZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0Rhc2hTdHlsZV8xPQotCi1PU19nY25ld19EYXRhT2JqZWN0PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0RhdGFUZW1wbGF0ZT1mbGFncz1nY25ldwotCi1PU19nY25ld19EaXNjcmV0ZURvdWJsZUtleUZyYW1lPWZsYWdzPWdjbmV3Ci1PU19nY25ld19EaXNjcmV0ZURvdWJsZUtleUZyYW1lXzA9Ci1PU19nY25ld19EaXNjcmV0ZURvdWJsZUtleUZyYW1lXzE9Y2FzdD0oS2V5VGltZSksZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfRGlzcGF0Y2hlckZyYW1lPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0Rpc3BhdGNoZXJIb29rRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfRGlzcGF0Y2hlckhvb2tFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0Rpc3BhdGNoZXJIb29rRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0Rpc3BhdGNoZXJUaW1lcj1mbGFncz1nY25ldwotCi1PU19nY25ld19Eb3VibGVBbmltYXRpb25Vc2luZ0tleUZyYW1lcz1mbGFncz1nY25ldwotCi1PU19nY25ld19Eb3VibGVDb2xsZWN0aW9uPWZsYWdzPWdjbmV3Ci1PU19nY25ld19Eb3VibGVDb2xsZWN0aW9uXzA9Ci0KLU9TX2djbmV3X0RyYWdFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19EcmFnRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19EcmFnRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0RyYXdpbmdWaXN1YWw9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfRHVyYXRpb249ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0R1cmF0aW9uXzA9Y2FzdD0oVGltZVNwYW4pLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0VsbGlwc2VHZW9tZXRyeT1mbGFncz1nY25ldwotT1NfZ2NuZXdfRWxsaXBzZUdlb21ldHJ5XzA9Y2FzdD0oUmVjdCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19FdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfRXhlY3V0ZWRSb3V0ZWRFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19FeGVjdXRlZFJvdXRlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfRXhlY3V0ZWRSb3V0ZWRFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfRXhwYW5kZXI9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfRmlsZUluZm89YWNjZXNzb3I9U3lzdGVtOjpJTzo6RmlsZUluZm8sZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0ZpbGVJbmZvXzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0ZvbGRlckJyb3dzZXJEaWFsb2c9YWNjZXNzb3I9U3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6Rm9sZGVyQnJvd3NlckRpYWxvZyxmbGFncz1nY25ldwotCi1PU19nY25ld19Gb250PWFjY2Vzc29yPVN5c3RlbTo6RHJhd2luZzo6Rm9udCxmbGFncz1nY25ldwotT1NfZ2NuZXdfRm9udF8wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfRm9udF8xPQotT1NfZ2NuZXdfRm9udF8yPWNhc3Q9U3lzdGVtOjpEcmF3aW5nOjpGb250U3R5bGUKLQotT1NfZ2NuZXdfRm9udERpYWxvZz1hY2Nlc3Nvcj1TeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpGb250RGlhbG9nLGZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0ZvbnRGYW1pbHk9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0ZvbnRGYW1pbHlfMD1jYXN0PVN0cmluZ14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfRm9ybWF0Q29udmVydGVkQml0bWFwPWZsYWdzPWdjbmV3Ci1PU19nY25ld19Gb3JtYXRDb252ZXJ0ZWRCaXRtYXBfMD1jYXN0PUJpdG1hcFNvdXJjZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0Zvcm1hdENvbnZlcnRlZEJpdG1hcF8xPWNhc3Q9UGl4ZWxGb3JtYXQsZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0Zvcm1hdENvbnZlcnRlZEJpdG1hcF8yPWNhc3Q9Qml0bWFwUGFsZXR0ZV4sZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0Zvcm1hdENvbnZlcnRlZEJpdG1hcF8zPQotCi1PU19nY25ld19Gb3JtYXR0ZWRUZXh0PWZsYWdzPWdjbmV3Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19Gb3JtYXR0ZWRUZXh0XzE9Y2FzdD1DdWx0dXJlSW5mb14sZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0Zvcm1hdHRlZFRleHRfMj1jYXN0PUZsb3dEaXJlY3Rpb24KLU9TX2djbmV3X0Zvcm1hdHRlZFRleHRfMz1jYXN0PVR5cGVmYWNlXixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfRm9ybWF0dGVkVGV4dF80PQotT1NfZ2NuZXdfRm9ybWF0dGVkVGV4dF81PWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0ZyYW1lPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3XzFGcmFtZXdvcmtFbGVtZW50RmFjdG9yeV9fST1mbGFncz1nY25ldwotT1NfZ2NuZXdfMUZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X19JXzA9Y2FzdD1UeXBlXixmbGFncz1nY29iamVjdAotCi1PU19nY25ld18xRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfX0lJPWZsYWdzPWdjbmV3Ci1PU19nY25ld18xRnJhbWV3b3JrRWxlbWVudEZhY3RvcnlfX0lJXzA9Y2FzdD1UeXBlXixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfMUZyYW1ld29ya0VsZW1lbnRGYWN0b3J5X19JSV8xPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19nY25ld19HZW9tZXRyeUdyb3VwPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0dpdmVGZWVkYmFja0V2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X0dpdmVGZWVkYmFja0V2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfR2l2ZUZlZWRiYWNrRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0dyaWQ9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfR3JpZExlbmd0aD1mbGFncz1nY25ldwotT1NfZ2NuZXdfR3JpZExlbmd0aF8wPQotT1NfZ2NuZXdfR3JpZExlbmd0aF8xPWNhc3Q9R3JpZFVuaXRUeXBlCi0KLU9TX2djbmV3X0dyaWRWaWV3PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0dyaWRWaWV3Q29sdW1uPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0dyaWRWaWV3Q29sdW1uQ29sbGVjdGlvbj1mbGFncz1nY25ldwotCi1PU19nY25ld19HcmlkVmlld0NvbHVtbkhlYWRlcj1mbGFncz1nY25ldwotCi1PU19nY25ld19Hcm91cEJveD1mbGFncz1nY25ldwotCi1PU19nY25ld19IeXBlcmxpbms9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0h5cGVybGlua18wPWNhc3Q9SW5saW5lXixmbGFncz1nY29iamVjdAotCi1PU19nY25ld19JbWFnZT1mbGFncz1nY25ldwotCi1PU19nY25ld19JbWFnZUJydXNoPWZsYWdzPWdjbmV3Ci1PU19nY25ld19JbWFnZUJydXNoXzA9Y2FzdD1JbWFnZVNvdXJjZV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfSW50MzI9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X0ludDMyXzA9Ci0KLU9TX2djbmV3X0ludDMyUmVjdD1mbGFncz1nY25ldwotT1NfZ2NuZXdfSW50MzJSZWN0XzA9Ci1PU19nY25ld19JbnQzMlJlY3RfMT0KLU9TX2djbmV3X0ludDMyUmVjdF8yPQotT1NfZ2NuZXdfSW50MzJSZWN0XzM9Ci0KLU9TX2djbmV3X0ludFB0cj1mbGFncz1nY25ldwotT1NfZ2NuZXdfSW50UHRyXzA9Ci0KLU9TX2djbmV3X0tleUV2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X0tleUV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfS2V5RXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0tleWJvYXJkRm9jdXNDaGFuZ2VkRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfS2V5Ym9hcmRGb2N1c0NoYW5nZWRFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X0tleWJvYXJkRm9jdXNDaGFuZ2VkRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X0xhYmVsPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X0xpbmVTZWdtZW50PWZsYWdzPWdjbmV3Ci1PU19nY25ld19MaW5lU2VnbWVudF8wPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X0xpbmVTZWdtZW50XzE9Ci0KLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSUQ9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSURfMD1jYXN0PUNvbG9yLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld18xTGluZWFyR3JhZGllbnRCcnVzaF9fSUlEXzE9Y2FzdD1Db2xvcixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJRF8yPQotCi1PU19nY25ld18xTGluZWFyR3JhZGllbnRCcnVzaF9fSUlJST1mbGFncz1nY25ldwotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJSUlfMD1jYXN0PUNvbG9yLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld18xTGluZWFyR3JhZGllbnRCcnVzaF9fSUlJSV8xPWNhc3Q9Q29sb3IsZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3XzFMaW5lYXJHcmFkaWVudEJydXNoX19JSUlJXzI9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfMUxpbmVhckdyYWRpZW50QnJ1c2hfX0lJSUlfMz1jYXN0PVBvaW50LGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X0xpc3RCb3g9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfTGlzdEJveEl0ZW09ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfTGlzdFZpZXc9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfTGlzdFZpZXdJdGVtPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X01hdHJpeD1mbGFncz1nY25ldwotT1NfZ2NuZXdfTWF0cml4XzA9Ci1PU19nY25ld19NYXRyaXhfMT0KLU9TX2djbmV3X01hdHJpeF8yPQotT1NfZ2NuZXdfTWF0cml4XzM9Ci1PU19nY25ld19NYXRyaXhfND0KLU9TX2djbmV3X01hdHJpeF81PQotCi1PU19nY25ld19NYXRyaXhUcmFuc2Zvcm09ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X01hdHJpeFRyYW5zZm9ybV8wPWNhc3Q9KE1hdHJpeCksZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfTWVtb3J5U3RyZWFtPWFjY2Vzc29yPVN5c3RlbTo6SU86Ok1lbW9yeVN0cmVhbSxmbGFncz1nY25ldwotCi1PU19nY25ld19NZW51PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X01lbnVJdGVtPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X01vdXNlQnV0dG9uRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfTW91c2VCdXR0b25FdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X01vdXNlQnV0dG9uRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X01vdXNlRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfTW91c2VFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X01vdXNlRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X01vdXNlV2hlZWxFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19Nb3VzZVdoZWVsRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19Nb3VzZVdoZWVsRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X05vQXJnc0RlbGVnYXRlPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfTm9BcmdzRGVsZWdhdGVfMD0KLU9TX2djbmV3X05vQXJnc0RlbGVnYXRlXzE9Ci0KLU9TX2djbmV3X09wZW5GaWxlRGlhbG9nPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1Bhc3N3b3JkQm94PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1BhdGg9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfUGF0aEZpZ3VyZT1mbGFncz1nY25ldwotCi1PU19nY25ld19QYXRoR2VvbWV0cnk9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfUGVuPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1BvaW50PWZsYWdzPWdjbmV3Ci1PU19nY25ld19Qb2ludF8wPQotT1NfZ2NuZXdfUG9pbnRfMT0KLQotT1NfZ2NuZXdfUG9pbnRDb2xsZWN0aW9uPWZsYWdzPWdjbmV3Ci1PU19nY25ld19Qb2ludENvbGxlY3Rpb25fMD0KLQotT1NfZ2NuZXdfUG9seUxpbmVTZWdtZW50PWZsYWdzPWdjbmV3Ci1PU19nY25ld19Qb2x5TGluZVNlZ21lbnRfMD1jYXN0PVBvaW50Q29sbGVjdGlvbl4sZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X1BvbHlMaW5lU2VnbWVudF8xPQotCi1PU19nY25ld19Qb3B1cD1mbGFncz1nY25ldwotCi1PU19nY25ld19Qcm9ncmVzc0Jhcj1mbGFncz1nY25ldwotCi1PU19nY25ld19RdWFkcmF0aWNCZXppZXJTZWdtZW50PWZsYWdzPWdjbmV3Ci1PU19nY25ld19RdWFkcmF0aWNCZXppZXJTZWdtZW50XzA9Y2FzdD1Qb2ludCxmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfUXVhZHJhdGljQmV6aWVyU2VnbWVudF8xPWNhc3Q9UG9pbnQsZmxhZ3M9Z2NvYmplY3QKLU9TX2djbmV3X1F1YWRyYXRpY0JlemllclNlZ21lbnRfMj0KLQotT1NfZ2NuZXdfUXVlcnlDb250aW51ZURyYWdFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19RdWVyeUNvbnRpbnVlRHJhZ0V2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfUXVlcnlDb250aW51ZURyYWdFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfUmFkaW9CdXR0b249ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfUmVjdD1mbGFncz1nY25ldwotT1NfZ2NuZXdfUmVjdF8wPQotT1NfZ2NuZXdfUmVjdF8xPQotT1NfZ2NuZXdfUmVjdF8yPQotT1NfZ2NuZXdfUmVjdF8zPQotCi1PU19nY25ld19SZWN0YW5nbGU9YWNjZXNzb3I9U3lzdGVtOjpXaW5kb3dzOjpTaGFwZXM6OlJlY3RhbmdsZSxmbGFncz1nY25ldwotCi1PU19nY25ld19SZWN0YW5nbGVHZW9tZXRyeT1mbGFncz1nY25ldwotT1NfZ2NuZXdfUmVjdGFuZ2xlR2VvbWV0cnlfMD1jYXN0PVJlY3QsZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfUmVuZGVyVGFyZ2V0Qml0bWFwPWZsYWdzPWdjbmV3Ci1PU19nY25ld19SZW5kZXJUYXJnZXRCaXRtYXBfMD0KLU9TX2djbmV3X1JlbmRlclRhcmdldEJpdG1hcF8xPQotT1NfZ2NuZXdfUmVuZGVyVGFyZ2V0Qml0bWFwXzI9Ci1PU19nY25ld19SZW5kZXJUYXJnZXRCaXRtYXBfMz0KLU9TX2djbmV3X1JlbmRlclRhcmdldEJpdG1hcF80PWNhc3Q9KFBpeGVsRm9ybWF0KSxmbGFncz1nY29iamVjdAotCi1PU19nY25ld19SZXBlYXRCdXR0b249ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfUmVzb3VyY2VEaWN0aW9uYXJ5PWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1JvdXRlZEV2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X1JvdXRlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfUm91dGVkRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfUm91dGVkUHJvcGVydHlDaGFuZ2VkRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlck9iamVjdD1mbGFncz1ub19nZW4KLU9TX2djbmV3X1JvdXRlZFByb3BlcnR5Q2hhbmdlZEV2ZW50SGFuZGxlck9iamVjdF8wPQotT1NfZ2NuZXdfUm91dGVkUHJvcGVydHlDaGFuZ2VkRXZlbnRIYW5kbGVyT2JqZWN0XzE9Ci0KLU9TX2djbmV3X1Jvd0RlZmluaXRpb249ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfUnVuPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1NXVENhbnZhcz1mbGFncz1ub19nZW4KLU9TX2djbmV3X1NXVENhbnZhc18wPQotCi1PU19nY25ld19TV1RDZWxsQ29udmVydGVyPWZsYWdzPW5vX2dlbgotCi1PU19nY25ld19TV1RSb3c9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19TV1RSb3dfMD0KLU9TX2djbmV3X1NXVFJvd18xPQotCi1PU19nY25ld19TV1RTYWZlSGFuZGxlPWZsYWdzPW5vX2dlbiBnY25ldwotT1NfZ2NuZXdfU1dUU2FmZUhhbmRsZV8wPWNhc3Q9SW50UHRyCi1PU19nY25ld19TV1RTYWZlSGFuZGxlXzE9Ci0KLU9TX2djbmV3X1NXVFRleHRFbWJlZGRlZE9iamVjdD1mbGFncz1ub19nZW4gZ2NuZXcKLU9TX2djbmV3X1NXVFRleHRFbWJlZGRlZE9iamVjdF8wPWNhc3Q9VGV4dFJ1blByb3BlcnRpZXNeLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TV1RUZXh0RW1iZWRkZWRPYmplY3RfMT0KLU9TX2djbmV3X1NXVFRleHRFbWJlZGRlZE9iamVjdF8yPQotT1NfZ2NuZXdfU1dUVGV4dEVtYmVkZGVkT2JqZWN0XzM9Ci1PU19nY25ld19TV1RUZXh0RW1iZWRkZWRPYmplY3RfND0KLQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXM9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc18wPQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXNfMT0KLU9TX2djbmV3X1NXVFRleHRQYXJhZ3JhcGhQcm9wZXJ0aWVzXzI9Ci1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc18zPQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXNfND0KLU9TX2djbmV3X1NXVFRleHRQYXJhZ3JhcGhQcm9wZXJ0aWVzXzU9Ci1PU19nY25ld19TV1RUZXh0UGFyYWdyYXBoUHJvcGVydGllc182PQotT1NfZ2NuZXdfU1dUVGV4dFBhcmFncmFwaFByb3BlcnRpZXNfNz0KLQotT1NfZ2NuZXdfU1dUVGV4dFJ1blByb3BlcnRpZXM9ZmxhZ3M9bm9fZ2VuIGdjbmV3Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc18wPWNhc3Q9VHlwZWZhY2VeLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc18xPQotT1NfZ2NuZXdfU1dUVGV4dFJ1blByb3BlcnRpZXNfMj0KLU9TX2djbmV3X1NXVFRleHRSdW5Qcm9wZXJ0aWVzXzM9Y2FzdD1UZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25eLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc180PWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc181PWNhc3Q9QnJ1c2heLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TV1RUZXh0UnVuUHJvcGVydGllc182PWNhc3Q9QmFzZWxpbmVBbGlnbm1lbnQKLU9TX2djbmV3X1NXVFRleHRSdW5Qcm9wZXJ0aWVzXzc9Y2FzdD1DdWx0dXJlSW5mb14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfU1dUVGV4dFNvdXJjZT1mbGFncz1ub19nZW4gZ2NuZXcKLU9TX2djbmV3X1NXVFRleHRTb3VyY2VfMD0KLQotT1NfZ2NuZXdfU1dUVHJlZVZpZXc9ZmxhZ3M9bm9fZ2VuIGdjbmV3Ci1PU19nY25ld19TV1RUcmVlVmlld18wPQotCi1PU19nY25ld19TV1RUcmVlVmlld1Jvd1ByZXNlbnRlcj1mbGFncz1ub19nZW4gZ2NuZXcKLU9TX2djbmV3X1NXVFRyZWVWaWV3Um93UHJlc2VudGVyXzA9Y2FzdD1UcmVlVmlld14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfU2F2ZUZpbGVEaWFsb2c9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfU2NhbGVUcmFuc2Zvcm09ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1NjYWxlVHJhbnNmb3JtXzA9Ci1PU19nY25ld19TY2FsZVRyYW5zZm9ybV8xPQotCi1PU19nY25ld19TY3JvbGxCYXI9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfU2Nyb2xsRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfU2Nyb2xsRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19TY3JvbGxFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfU2Nyb2xsVmlld2VyPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1NlbGVjdGlvbkNoYW5nZWRFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19TZWxlY3Rpb25DaGFuZ2VkRXZlbnRIYW5kbGVyXzE9Ci0KLU9TX2djbmV3X1NlcGFyYXRvcj1mbGFncz1nY25ldwotCi1PU19nY25ld19TZXR0ZXI9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1NldHRlcl8wPWNhc3Q9KERlcGVuZGVuY3lQcm9wZXJ0eV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TZXR0ZXJfMT1jYXN0PU9iamVjdF4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfU2V0dGVyVmlzaWJpbGl0eT1hY2Nlc3Nvcj1TeXN0ZW06OldpbmRvd3M6OlNldHRlcixmbGFncz1nY25ldwotT1NfZ2NuZXdfU2V0dGVyVmlzaWJpbGl0eV8wPWNhc3Q9KERlcGVuZGVuY3lQcm9wZXJ0eV4pLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19TZXR0ZXJWaXNpYmlsaXR5XzE9Y2FzdD1WaXNpYmlsaXR5Ci0KLU9TX2djbmV3XzFTaXplX189ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfMVNpemVfX0REPWZsYWdzPWdjbmV3Ci1PU19nY25ld18xU2l6ZV9fRERfMD0KLU9TX2djbmV3XzFTaXplX19ERF8xPQotCi1PU19nY25ld19TaXplQ2hhbmdlZEV2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X1NpemVDaGFuZ2VkRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19TaXplQ2hhbmdlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19TbGlkZXI9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfU29saWRDb2xvckJydXNoPWZsYWdzPWdjbmV3Ci1PU19nY25ld19Tb2xpZENvbG9yQnJ1c2hfMD1jYXN0PShDb2xvciksZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfU3RhY2tQYW5lbD1mbGFncz1nY25ldwotCi1PU19nY25ld19TdHJlYW1HZW9tZXRyeT1mbGFncz1nY25ldwotCi1PU19nY25ld19TdHJpbmc9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1N0cmluZ18wPWNhc3Q9Y29uc3Qgd2NoYXJfdCAqCi0KLU9TX2djbmV3X1N0cmluZ1JlYWRlcj1hY2Nlc3Nvcj1TeXN0ZW06OklPOjpTdHJpbmdSZWFkZXIsZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1N0cmluZ1JlYWRlcl8wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotCi1PU19nY25ld19TdHlsZT1mbGFncz1nY25ldwotCi1PU19nY25ld19UYWJDb250cm9sPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1RhYkl0ZW09ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfVGVtcGxhdGVCaW5kaW5nRXh0ZW5zaW9uPWZsYWdzPWdjbmV3Ci1PU19nY25ld19UZW1wbGF0ZUJpbmRpbmdFeHRlbnNpb25fMD1jYXN0PURlcGVuZGVuY3lQcm9wZXJ0eV4sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfVGV4dEJsb2NrPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1RleHRCb3g9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfVGV4dENoYW5nZWRFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19UZXh0Q2hhbmdlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfVGV4dENoYW5nZWRFdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfVGV4dENoYXJhY3RlcnM9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1RleHRDaGFyYWN0ZXJzXzA9Y2FzdD1TdHJpbmdeLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19UZXh0Q2hhcmFjdGVyc18xPQotT1NfZ2NuZXdfVGV4dENoYXJhY3RlcnNfMj0KLU9TX2djbmV3X1RleHRDaGFyYWN0ZXJzXzM9Y2FzdD1UZXh0UnVuUHJvcGVydGllc14sZmxhZ3M9Z2NvYmplY3QKLQotT1NfZ2NuZXdfVGV4dENvbXBvc2l0aW9uRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbiBnY25ldwotT1NfZ2NuZXdfVGV4dENvbXBvc2l0aW9uRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19UZXh0Q29tcG9zaXRpb25FdmVudEhhbmRsZXJfMT0KLQotT1NfZ2NuZXdfVGV4dERlY29yYXRpb25Db2xsZWN0aW9uPWZsYWdzPWdjbmV3Ci1PU19nY25ld19UZXh0RGVjb3JhdGlvbkNvbGxlY3Rpb25fMD0KLQotT1NfZ2NuZXdfVGV4dEVuZE9mTGluZT1mbGFncz1nY25ldwotT1NfZ2NuZXdfVGV4dEVuZE9mTGluZV8wPQotT1NfZ2NuZXdfVGV4dEVuZE9mTGluZV8xPWNhc3Q9VGV4dFJ1blByb3BlcnRpZXNeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3X1RleHRFbmRPZlBhcmFncmFwaD1mbGFncz1nY25ldwotT1NfZ2NuZXdfVGV4dEVuZE9mUGFyYWdyYXBoXzA9Ci1PU19nY25ld19UZXh0RW5kT2ZQYXJhZ3JhcGhfMT1jYXN0PVRleHRSdW5Qcm9wZXJ0aWVzXixmbGFncz1nY29iamVjdAotCi1PU19nY25ld19UZXh0VGFiUHJvcGVydGllcz1mbGFncz1nY25ldwotT1NfZ2NuZXdfVGV4dFRhYlByb3BlcnRpZXNfMD1jYXN0PVRleHRUYWJBbGlnbm1lbnQKLU9TX2djbmV3X1RleHRUYWJQcm9wZXJ0aWVzXzE9Ci1PU19nY25ld19UZXh0VGFiUHJvcGVydGllc18yPQotT1NfZ2NuZXdfVGV4dFRhYlByb3BlcnRpZXNfMz0KLQotT1NfZ2NuZXdfVGV4dFRhYlByb3BlcnRpZXNDb2xsZWN0aW9uPWFjY2Vzc29yPVN5c3RlbTo6Q29sbGVjdGlvbnM6OkdlbmVyaWM6Okxpc3Q8VGV4dFRhYlByb3BlcnRpZXNePixmbGFncz1nY25ldwotT1NfZ2NuZXdfVGV4dFRhYlByb3BlcnRpZXNDb2xsZWN0aW9uXzA9Ci0KLU9TX2djbmV3X1RoaWNrbmVzcz1mbGFncz1nY25ldwotT1NfZ2NuZXdfVGhpY2tuZXNzXzA9Ci1PU19nY25ld19UaGlja25lc3NfMT0KLU9TX2djbmV3X1RoaWNrbmVzc18yPQotT1NfZ2NuZXdfVGhpY2tuZXNzXzM9Ci0KLU9TX2djbmV3X1RpZmZCaXRtYXBFbmNvZGVyPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1RpbWVTcGFuPWZsYWdzPWdjbmV3Ci1PU19nY25ld19UaW1lU3Bhbl8wPQotCi1PU19nY25ld19UaW1lckhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19UaW1lckhhbmRsZXJfMD0KLU9TX2djbmV3X1RpbWVySGFuZGxlcl8xPQotCi1PU19nY25ld19Ub2dnbGVCdXR0b249ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfVG9vbEJhcj1mbGFncz1nY25ldwotCi1PU19nY25ld19Ub29sQmFyVHJheT1mbGFncz1nY25ldwotCi1PU19nY25ld19UcmFuc2Zvcm1Hcm91cD1mbGFncz1nY25ldwotCi1PU19nY25ld19UcmFuc2xhdGVUcmFuc2Zvcm09ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1RyYW5zbGF0ZVRyYW5zZm9ybV8wPQotT1NfZ2NuZXdfVHJhbnNsYXRlVHJhbnNmb3JtXzE9Ci0KLU9TX2djbmV3X1RyYXZlcnNhbFJlcXVlc3Q9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1RyYXZlcnNhbFJlcXVlc3RfMD1jYXN0PUZvY3VzTmF2aWdhdGlvbkRpcmVjdGlvbgotCi1PU19nY25ld19UcmVlVmlldz1mbGFncz1nY25ldwotCi1PU19nY25ld19UcmVlVmlld0l0ZW09ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfVHlwZWZhY2U9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1R5cGVmYWNlXzA9Y2FzdD1Gb250RmFtaWx5XixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfVHlwZWZhY2VfMT1jYXN0PShGb250U3R5bGUpLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19UeXBlZmFjZV8yPWNhc3Q9KEZvbnRXZWlnaHQpLGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld19UeXBlZmFjZV8zPWNhc3Q9KEZvbnRTdHJldGNoKSxmbGFncz1nY29iamVjdAotCi1PU19nY25ld19Vcmk9ZmxhZ3M9Z2NuZXcKLU9TX2djbmV3X1VyaV8wPWNhc3Q9U3RyaW5nXixmbGFncz1nY29iamVjdAotT1NfZ2NuZXdfVXJpXzE9Y2FzdD1VcmlLaW5kCi0KLU9TX2djbmV3X1VzZXJDb250cm9sPWZsYWdzPWdjbmV3Ci0KLU9TX2djbmV3X1dlYkJyb3dzZXI9YWNjZXNzb3I9U3lzdGVtOjpXaW5kb3dzOjpGb3Jtczo6V2ViQnJvd3NlcixmbGFncz1nY25ldwotCi1PU19nY25ld19XZWJCcm93c2VyRG9jdW1lbnRDb21wbGV0ZWRFdmVudEhhbmRsZXI9ZmxhZ3M9bm9fZ2VuCi1PU19nY25ld19XZWJCcm93c2VyRG9jdW1lbnRDb21wbGV0ZWRFdmVudEhhbmRsZXJfMD0KLU9TX2djbmV3X1dlYkJyb3dzZXJEb2N1bWVudENvbXBsZXRlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19XZWJCcm93c2VyTmF2aWdhdGVkRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfV2ViQnJvd3Nlck5hdmlnYXRlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfV2ViQnJvd3Nlck5hdmlnYXRlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19XZWJCcm93c2VyTmF2aWdhdGluZ0V2ZW50SGFuZGxlcj1mbGFncz1ub19nZW4KLU9TX2djbmV3X1dlYkJyb3dzZXJOYXZpZ2F0aW5nRXZlbnRIYW5kbGVyXzA9Ci1PU19nY25ld19XZWJCcm93c2VyTmF2aWdhdGluZ0V2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19XZWJCcm93c2VyUHJvZ3Jlc3NDaGFuZ2VkRXZlbnRIYW5kbGVyPWZsYWdzPW5vX2dlbgotT1NfZ2NuZXdfV2ViQnJvd3NlclByb2dyZXNzQ2hhbmdlZEV2ZW50SGFuZGxlcl8wPQotT1NfZ2NuZXdfV2ViQnJvd3NlclByb2dyZXNzQ2hhbmdlZEV2ZW50SGFuZGxlcl8xPQotCi1PU19nY25ld19XaW5kb3c9ZmxhZ3M9Z2NuZXcKLQotT1NfZ2NuZXdfV2luZG93c0Zvcm1zSG9zdD1hY2Nlc3Nvcj1TeXN0ZW06OldpbmRvd3M6OkZvcm1zOjpJbnRlZ3JhdGlvbjo6V2luZG93c0Zvcm1zSG9zdCxmbGFncz1nY25ldwotCi1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JPWZsYWdzPWdjbmV3Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JXzA9Y2FzdD1CaXRtYXBTb3VyY2VeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0lJRERJST1mbGFncz1nY25ldwotT1NfZ2NuZXdfMVdyaXRlYWJsZUJpdG1hcF9fSUlERElJXzA9Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JSURESUlfMT0KLU9TX2djbmV3XzFXcml0ZWFibGVCaXRtYXBfX0lJRERJSV8yPQotT1NfZ2NuZXdfMVdyaXRlYWJsZUJpdG1hcF9fSUlERElJXzM9Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JSURESUlfND1jYXN0PVBpeGVsRm9ybWF0LGZsYWdzPWdjb2JqZWN0Ci1PU19nY25ld18xV3JpdGVhYmxlQml0bWFwX19JSURESUlfNT1jYXN0PUJpdG1hcFBhbGV0dGVeLGZsYWdzPWdjb2JqZWN0Ci0KLU9TX21lbWNweT1mbGFncz1ub19nZW4KLU9TX21lbWNweV8wPQotT1NfbWVtY3B5XzE9Ci1PU19tZW1jcHlfMj0KLQotCi1vcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd3BmX1BPSU5UPQotUE9JTlRfeD0KLVBPSU5UX3k9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93cGZfUFJPQ0VTU18xSU5GT1JNQVRJT049ZmxhZ3M9Y3BwCi1QUk9DRVNTX0lORk9STUFUSU9OX2hQcm9jZXNzPWNhc3Q9SEFORExFCi1QUk9DRVNTX0lORk9STUFUSU9OX2hUaHJlYWQ9Y2FzdD1IQU5ETEUKLVBST0NFU1NfSU5GT1JNQVRJT05fZHdQcm9jZXNzSWQ9Ci1QUk9DRVNTX0lORk9STUFUSU9OX2R3VGhyZWFkSWQ9Ci0KLW9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93cGZfU0hFTExFWEVDVVRFSU5GT1c9ZmxhZ3M9Y3BwCi1TSEVMTEVYRUNVVEVJTkZPV19jYlNpemU9Ci1TSEVMTEVYRUNVVEVJTkZPV19mTWFzaz0KLVNIRUxMRVhFQ1VURUlORk9XX2h3bmQ9Y2FzdD1IV05ECi1TSEVMTEVYRUNVVEVJTkZPV19scFZlcmI9Y2FzdD0oTFBXU1RSKQotU0hFTExFWEVDVVRFSU5GT1dfbHBGaWxlPWNhc3Q9KExQV1NUUikKLVNIRUxMRVhFQ1VURUlORk9XX2xwUGFyYW1ldGVycz1jYXN0PShMUFdTVFIpCi1TSEVMTEVYRUNVVEVJTkZPV19scERpcmVjdG9yeT1jYXN0PShMUFdTVFIpCi1TSEVMTEVYRUNVVEVJTkZPV19uU2hvdz0KLVNIRUxMRVhFQ1VURUlORk9XX2hJbnN0QXBwPWNhc3Q9KEhJTlNUQU5DRSkKLVNIRUxMRVhFQ1VURUlORk9XX2xwSURMaXN0PWNhc3Q9KExQVk9JRCkKLVNIRUxMRVhFQ1VURUlORk9XX2xwQ2xhc3M9Y2FzdD0oTFBXU1RSKQotU0hFTExFWEVDVVRFSU5GT1dfaGtleUNsYXNzPWNhc3Q9SEtFWQotU0hFTExFWEVDVVRFSU5GT1dfZHdIb3RLZXk9Ci1TSEVMTEVYRUNVVEVJTkZPV19oSWNvbj1jYXN0PUhBTkRMRQotU0hFTExFWEVDVVRFSU5GT1dfaFByb2Nlc3M9Y2FzdD1IQU5ETEUKLQotb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dwZl9TVEFSVFVQSU5GT1c9ZmxhZ3M9Y3BwCi1TVEFSVFVQSU5GT1dfY2I9Ci1TVEFSVFVQSU5GT1dfbHBSZXNlcnZlZD1jYXN0PUxQV1NUUgotU1RBUlRVUElORk9XX2xwRGVza3RvcD1jYXN0PUxQV1NUUgotU1RBUlRVUElORk9XX2xwVGl0bGU9Y2FzdD1MUFdTVFIKLVNUQVJUVVBJTkZPV19kd1g9Ci1TVEFSVFVQSU5GT1dfZHdZPQotU1RBUlRVUElORk9XX2R3WFNpemU9Ci1TVEFSVFVQSU5GT1dfZHdZU2l6ZT0KLVNUQVJUVVBJTkZPV19kd1hDb3VudENoYXJzPQotU1RBUlRVUElORk9XX2R3WUNvdW50Q2hhcnM9Ci1TVEFSVFVQSU5GT1dfZHdGaWxsQXR0cmlidXRlPQotU1RBUlRVUElORk9XX2R3RmxhZ3M9Ci1TVEFSVFVQSU5GT1dfd1Nob3dXaW5kb3c9Ci1TVEFSVFVQSU5GT1dfY2JSZXNlcnZlZDI9Ci1TVEFSVFVQSU5GT1dfbHBSZXNlcnZlZDI9Y2FzdD1MUEJZVEUKLVNUQVJUVVBJTkZPV19oU3RkSW5wdXQ9Y2FzdD0oSEFORExFKQotU1RBUlRVUElORk9XX2hTdGRPdXRwdXQ9Y2FzdD0oSEFORExFKQotU1RBUlRVUElORk9XX2hTdGRFcnJvcj1jYXN0PShIQU5ETEUpCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGUyN2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0w9Ci1HTF9nbEFjY3VtPQotR0xfZ2xBY2N1bV8wPQotR0xfZ2xBY2N1bV8xPQotCi1HTF9nbEFscGhhRnVuYz0KLUdMX2dsQWxwaGFGdW5jXzA9Ci1HTF9nbEFscGhhRnVuY18xPQotCi1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnQ9Ci1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMD0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8xPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xBcnJheUVsZW1lbnQ9Ci1HTF9nbEFycmF5RWxlbWVudF8wPQotCi1HTF9nbEJlZ2luPQotR0xfZ2xCZWdpbl8wPQotCi1HTF9nbEJpbmRUZXh0dXJlPQotR0xfZ2xCaW5kVGV4dHVyZV8wPQotR0xfZ2xCaW5kVGV4dHVyZV8xPQotCi1HTF9nbEJpdG1hcD0KLUdMX2dsQml0bWFwXzA9Ci1HTF9nbEJpdG1hcF8xPQotR0xfZ2xCaXRtYXBfMj0KLUdMX2dsQml0bWFwXzM9Ci1HTF9nbEJpdG1hcF80PQotR0xfZ2xCaXRtYXBfNT0KLUdMX2dsQml0bWFwXzY9Y2FzdD0oY29uc3QgR0x1Ynl0ZSAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbEJsZW5kRnVuYz0KLUdMX2dsQmxlbmRGdW5jXzA9Ci1HTF9nbEJsZW5kRnVuY18xPQotCi1HTF9nbENhbGxMaXN0PQotR0xfZ2xDYWxsTGlzdF8wPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0I9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzI9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQz0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMj0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8yPQotCi1HTF9nbENsZWFyPQotR0xfZ2xDbGVhcl8wPQotCi1HTF9nbENsZWFyQWNjdW09Ci1HTF9nbENsZWFyQWNjdW1fMD0KLUdMX2dsQ2xlYXJBY2N1bV8xPQotR0xfZ2xDbGVhckFjY3VtXzI9Ci1HTF9nbENsZWFyQWNjdW1fMz0KLQotR0xfZ2xDbGVhckNvbG9yPQotR0xfZ2xDbGVhckNvbG9yXzA9Ci1HTF9nbENsZWFyQ29sb3JfMT0KLUdMX2dsQ2xlYXJDb2xvcl8yPQotR0xfZ2xDbGVhckNvbG9yXzM9Ci0KLUdMX2dsQ2xlYXJEZXB0aD0KLUdMX2dsQ2xlYXJEZXB0aF8wPQotCi1HTF9nbENsZWFySW5kZXg9Ci1HTF9nbENsZWFySW5kZXhfMD0KLQotR0xfZ2xDbGVhclN0ZW5jaWw9Ci1HTF9nbENsZWFyU3RlbmNpbF8wPQotCi1HTF9nbENsaXBQbGFuZT0KLUdMX2dsQ2xpcFBsYW5lXzA9Ci1HTF9nbENsaXBQbGFuZV8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzYj0KLUdMX2dsQ29sb3IzYl8wPQotR0xfZ2xDb2xvcjNiXzE9Ci1HTF9nbENvbG9yM2JfMj0KLQotR0xfZ2xDb2xvcjNidj0KLUdMX2dsQ29sb3IzYnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM2Q9Ci1HTF9nbENvbG9yM2RfMD0KLUdMX2dsQ29sb3IzZF8xPQotR0xfZ2xDb2xvcjNkXzI9Ci0KLUdMX2dsQ29sb3IzZHY9Ci1HTF9nbENvbG9yM2R2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjNmPQotR0xfZ2xDb2xvcjNmXzA9Ci1HTF9nbENvbG9yM2ZfMT0KLUdMX2dsQ29sb3IzZl8yPQotCi1HTF9nbENvbG9yM2Z2PQotR0xfZ2xDb2xvcjNmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsQ29sb3IzaT0KLUdMX2dsQ29sb3IzaV8wPQotR0xfZ2xDb2xvcjNpXzE9Ci1HTF9nbENvbG9yM2lfMj0KLQotR0xfZ2xDb2xvcjNpdj0KLUdMX2dsQ29sb3IzaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM3M9Ci1HTF9nbENvbG9yM3NfMD0KLUdMX2dsQ29sb3Izc18xPQotR0xfZ2xDb2xvcjNzXzI9Ci0KLUdMX2dsQ29sb3Izc3Y9Ci1HTF9nbENvbG9yM3N2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjN1Yj0KLUdMX2dsQ29sb3IzdWJfMD0KLUdMX2dsQ29sb3IzdWJfMT0KLUdMX2dsQ29sb3IzdWJfMj0KLQotR0xfZ2xDb2xvcjN1YnY9Ci1HTF9nbENvbG9yM3Vidl8wPWNhc3Q9KGNvbnN0IEdMdWJ5dGUgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjN1aT0KLUdMX2dsQ29sb3IzdWlfMD0KLUdMX2dsQ29sb3IzdWlfMT0KLUdMX2dsQ29sb3IzdWlfMj0KLQotR0xfZ2xDb2xvcjN1aXY9Ci1HTF9nbENvbG9yM3Vpdl8wPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yM3VzPQotR0xfZ2xDb2xvcjN1c18wPQotR0xfZ2xDb2xvcjN1c18xPQotR0xfZ2xDb2xvcjN1c18yPQotCi1HTF9nbENvbG9yM3Vzdj0KLUdMX2dsQ29sb3IzdXN2XzA9Y2FzdD0oY29uc3QgR0x1c2hvcnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjRiPQotR0xfZ2xDb2xvcjRiXzA9Ci1HTF9nbENvbG9yNGJfMT0KLUdMX2dsQ29sb3I0Yl8yPQotR0xfZ2xDb2xvcjRiXzM9Ci0KLUdMX2dsQ29sb3I0YnY9Ci1HTF9nbENvbG9yNGJ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjRkPQotR0xfZ2xDb2xvcjRkXzA9Ci1HTF9nbENvbG9yNGRfMT0KLUdMX2dsQ29sb3I0ZF8yPQotR0xfZ2xDb2xvcjRkXzM9Ci0KLUdMX2dsQ29sb3I0ZHY9Ci1HTF9nbENvbG9yNGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjRmPQotR0xfZ2xDb2xvcjRmXzA9Ci1HTF9nbENvbG9yNGZfMT0KLUdMX2dsQ29sb3I0Zl8yPQotR0xfZ2xDb2xvcjRmXzM9Ci0KLUdMX2dsQ29sb3I0ZnY9Ci1HTF9nbENvbG9yNGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjRpPQotR0xfZ2xDb2xvcjRpXzA9Ci1HTF9nbENvbG9yNGlfMT0KLUdMX2dsQ29sb3I0aV8yPQotR0xfZ2xDb2xvcjRpXzM9Ci0KLUdMX2dsQ29sb3I0aXY9Ci1HTF9nbENvbG9yNGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvcjRzPQotR0xfZ2xDb2xvcjRzXzA9Ci1HTF9nbENvbG9yNHNfMT0KLUdMX2dsQ29sb3I0c18yPQotR0xfZ2xDb2xvcjRzXzM9Ci0KLUdMX2dsQ29sb3I0dWI9Ci1HTF9nbENvbG9yNHViXzA9Ci1HTF9nbENvbG9yNHViXzE9Ci1HTF9nbENvbG9yNHViXzI9Ci1HTF9nbENvbG9yNHViXzM9Ci0KLUdMX2dsQ29sb3I0dWJ2PQotR0xfZ2xDb2xvcjR1YnZfMD0KLQotR0xfZ2xDb2xvcjR1aT0KLUdMX2dsQ29sb3I0dWlfMD0KLUdMX2dsQ29sb3I0dWlfMT0KLUdMX2dsQ29sb3I0dWlfMj0KLUdMX2dsQ29sb3I0dWlfMz0KLQotR0xfZ2xDb2xvcjR1aXY9Ci1HTF9nbENvbG9yNHVpdl8wPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbENvbG9yNHVzPQotR0xfZ2xDb2xvcjR1c18wPQotR0xfZ2xDb2xvcjR1c18xPQotR0xfZ2xDb2xvcjR1c18yPQotR0xfZ2xDb2xvcjR1c18zPQotCi1HTF9nbENvbG9yNHVzdj0KLUdMX2dsQ29sb3I0dXN2XzA9Y2FzdD0oY29uc3QgR0x1c2hvcnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb2xvck1hc2s9Ci1HTF9nbENvbG9yTWFza18wPQotR0xfZ2xDb2xvck1hc2tfMT0KLUdMX2dsQ29sb3JNYXNrXzI9Ci1HTF9nbENvbG9yTWFza18zPQotCi1HTF9nbENvbG9yTWF0ZXJpYWw9Ci1HTF9nbENvbG9yTWF0ZXJpYWxfMD0KLUdMX2dsQ29sb3JNYXRlcmlhbF8xPQotCi1HTF9nbENvbG9yUG9pbnRlcj0KLUdMX2dsQ29sb3JQb2ludGVyXzA9Ci1HTF9nbENvbG9yUG9pbnRlcl8xPQotR0xfZ2xDb2xvclBvaW50ZXJfMj0KLUdMX2dsQ29sb3JQb2ludGVyXzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xDb3B5UGl4ZWxzPQotR0xfZ2xDb3B5UGl4ZWxzXzA9Ci1HTF9nbENvcHlQaXhlbHNfMT0KLUdMX2dsQ29weVBpeGVsc18yPQotR0xfZ2xDb3B5UGl4ZWxzXzM9Ci1HTF9nbENvcHlQaXhlbHNfND0KLQotR0xfZ2xDb3B5VGV4SW1hZ2UxRD0KLUdMX2dsQ29weVRleEltYWdlMURfMD0KLUdMX2dsQ29weVRleEltYWdlMURfMT0KLUdMX2dsQ29weVRleEltYWdlMURfMj0KLUdMX2dsQ29weVRleEltYWdlMURfMz0KLUdMX2dsQ29weVRleEltYWdlMURfND0KLUdMX2dsQ29weVRleEltYWdlMURfNT0KLUdMX2dsQ29weVRleEltYWdlMURfNj0KLQotR0xfZ2xDb3B5VGV4SW1hZ2UyRD0KLUdMX2dsQ29weVRleEltYWdlMkRfMD0KLUdMX2dsQ29weVRleEltYWdlMkRfMT0KLUdMX2dsQ29weVRleEltYWdlMkRfMj0KLUdMX2dsQ29weVRleEltYWdlMkRfMz0KLUdMX2dsQ29weVRleEltYWdlMkRfND0KLUdMX2dsQ29weVRleEltYWdlMkRfNT0KLUdMX2dsQ29weVRleEltYWdlMkRfNj0KLUdMX2dsQ29weVRleEltYWdlMkRfNz0KLQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRD0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMD0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMT0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMj0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfMz0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfND0KLUdMX2dsQ29weVRleFN1YkltYWdlMURfNT0KLQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRD0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMD0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMT0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMj0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfMz0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfND0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNT0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNj0KLUdMX2dsQ29weVRleFN1YkltYWdlMkRfNz0KLQotR0xfZ2xDdWxsRmFjZT0KLUdMX2dsQ3VsbEZhY2VfMD0KLQotR0xfZ2xEZWxldGVMaXN0cz0KLUdMX2dsRGVsZXRlTGlzdHNfMD0KLUdMX2dsRGVsZXRlTGlzdHNfMT0KLQotR0xfZ2xEZWxldGVUZXh0dXJlcz0KLUdMX2dsRGVsZXRlVGV4dHVyZXNfMD0KLUdMX2dsRGVsZXRlVGV4dHVyZXNfMT1jYXN0PShjb25zdCBHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xEZXB0aEZ1bmM9Ci1HTF9nbERlcHRoRnVuY18wPQotCi1HTF9nbERlcHRoTWFzaz0KLUdMX2dsRGVwdGhNYXNrXzA9Ci0KLUdMX2dsRGVwdGhSYW5nZT0KLUdMX2dsRGVwdGhSYW5nZV8wPQotR0xfZ2xEZXB0aFJhbmdlXzE9Ci0KLUdMX2dsRGlzYWJsZT0KLUdMX2dsRGlzYWJsZV8wPQotCi1HTF9nbERpc2FibGVDbGllbnRTdGF0ZT0KLUdMX2dsRGlzYWJsZUNsaWVudFN0YXRlXzA9Ci0KLUdMX2dsRHJhd0FycmF5cz0KLUdMX2dsRHJhd0FycmF5c18wPQotR0xfZ2xEcmF3QXJyYXlzXzE9Ci1HTF9nbERyYXdBcnJheXNfMj0KLQotR0xfZ2xEcmF3QnVmZmVyPQotR0xfZ2xEcmF3QnVmZmVyXzA9Ci0KLUdMX2dsRHJhd0VsZW1lbnRzPQotR0xfZ2xEcmF3RWxlbWVudHNfMD0KLUdMX2dsRHJhd0VsZW1lbnRzXzE9Ci1HTF9nbERyYXdFbGVtZW50c18yPQotR0xfZ2xEcmF3RWxlbWVudHNfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbERyYXdQaXhlbHM9Ci1HTF9nbERyYXdQaXhlbHNfMD0KLUdMX2dsRHJhd1BpeGVsc18xPQotR0xfZ2xEcmF3UGl4ZWxzXzI9Ci1HTF9nbERyYXdQaXhlbHNfMz0KLUdMX2dsRHJhd1BpeGVsc180PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRWRnZUZsYWc9Ci1HTF9nbEVkZ2VGbGFnXzA9Ci0KLUdMX2dsRWRnZUZsYWdQb2ludGVyPQotR0xfZ2xFZGdlRmxhZ1BvaW50ZXJfMD0KLUdMX2dsRWRnZUZsYWdQb2ludGVyXzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFZGdlRmxhZ3Y9Ci1HTF9nbEVkZ2VGbGFndl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRW5hYmxlPQotR0xfZ2xFbmFibGVfMD0KLQotR0xfZ2xFbmFibGVDbGllbnRTdGF0ZT0KLUdMX2dsRW5hYmxlQ2xpZW50U3RhdGVfMD0KLQotR0xfZ2xFbmQ9Ci0KLUdMX2dsRW5kTGlzdD0KLQotR0xfZ2xFdmFsQ29vcmQxZD0KLUdMX2dsRXZhbENvb3JkMWRfMD0KLQotR0xfZ2xFdmFsQ29vcmQxZHY9Ci1HTF9nbEV2YWxDb29yZDFkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRXZhbENvb3JkMWY9Ci1HTF9nbEV2YWxDb29yZDFmXzA9Ci0KLUdMX2dsRXZhbENvb3JkMWZ2PQotR0xfZ2xFdmFsQ29vcmQxZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEV2YWxDb29yZDJkPQotR0xfZ2xFdmFsQ29vcmQyZF8wPQotR0xfZ2xFdmFsQ29vcmQyZF8xPQotCi1HTF9nbEV2YWxDb29yZDJkdj0KLUdMX2dsRXZhbENvb3JkMmR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xFdmFsQ29vcmQyZj0KLUdMX2dsRXZhbENvb3JkMmZfMD0KLUdMX2dsRXZhbENvb3JkMmZfMT0KLQotR0xfZ2xFdmFsQ29vcmQyZnY9Ci1HTF9nbEV2YWxDb29yZDJmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRXZhbE1lc2gxPQotR0xfZ2xFdmFsTWVzaDFfMD0KLUdMX2dsRXZhbE1lc2gxXzE9Ci1HTF9nbEV2YWxNZXNoMV8yPQotCi1HTF9nbEV2YWxNZXNoMj0KLUdMX2dsRXZhbE1lc2gyXzA9Ci1HTF9nbEV2YWxNZXNoMl8xPQotR0xfZ2xFdmFsTWVzaDJfMj0KLUdMX2dsRXZhbE1lc2gyXzM9Ci1HTF9nbEV2YWxNZXNoMl80PQotCi1HTF9nbEV2YWxQb2ludDE9Ci1HTF9nbEV2YWxQb2ludDFfMD0KLQotR0xfZ2xFdmFsUG9pbnQyPQotR0xfZ2xFdmFsUG9pbnQyXzA9Ci1HTF9nbEV2YWxQb2ludDJfMT0KLQotR0xfZ2xGZWVkYmFja0J1ZmZlcj0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMD0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMT0KLUdMX2dsRmVlZGJhY2tCdWZmZXJfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEZpbmlzaD0KLQotR0xfZ2xGbHVzaD0KLQotR0xfZ2xGb2dmPQotR0xfZ2xGb2dmXzA9Ci1HTF9nbEZvZ2ZfMT0KLQotR0xfZ2xGb2dmdj0KLUdMX2dsRm9nZnZfMD0KLUdMX2dsRm9nZnZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEZvZ2k9Ci1HTF9nbEZvZ2lfMD0KLUdMX2dsRm9naV8xPQotCi1HTF9nbEZvZ2l2PQotR0xfZ2xGb2dpdl8wPQotR0xfZ2xGb2dpdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsRnJvbnRGYWNlPQotR0xfZ2xGcm9udEZhY2VfMD0KLQotR0xfZ2xGcnVzdHVtPQotR0xfZ2xGcnVzdHVtXzA9Ci1HTF9nbEZydXN0dW1fMT0KLUdMX2dsRnJ1c3R1bV8yPQotR0xfZ2xGcnVzdHVtXzM9Ci1HTF9nbEZydXN0dW1fND0KLUdMX2dsRnJ1c3R1bV81PQotCi1HTF9nbEdlbkxpc3RzPQotR0xfZ2xHZW5MaXN0c18wPQotCi1HTF9nbEdlblRleHR1cmVzPQotR0xfZ2xHZW5UZXh0dXJlc18wPQotR0xfZ2xHZW5UZXh0dXJlc18xPWNhc3Q9KEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbEdldEJvb2xlYW52PQotR0xfZ2xHZXRCb29sZWFudl8wPQotR0xfZ2xHZXRCb29sZWFudl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0Q2xpcFBsYW5lPQotR0xfZ2xHZXRDbGlwUGxhbmVfMD0KLUdMX2dsR2V0Q2xpcFBsYW5lXzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXREb3VibGV2PQotR0xfZ2xHZXREb3VibGV2XzA9Ci1HTF9nbEdldERvdWJsZXZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldEVycm9yPQotCi1HTF9nbEdldEZsb2F0dj0KLUdMX2dsR2V0RmxvYXR2XzA9Ci1HTF9nbEdldEZsb2F0dl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0SW50ZWdlcnY9Ci1HTF9nbEdldEludGVnZXJ2XzA9Ci1HTF9nbEdldEludGVnZXJ2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRMaWdodGZ2PQotR0xfZ2xHZXRMaWdodGZ2XzA9Ci1HTF9nbEdldExpZ2h0ZnZfMT0KLUdMX2dsR2V0TGlnaHRmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TGlnaHRpdj0KLUdMX2dsR2V0TGlnaHRpdl8wPQotR0xfZ2xHZXRMaWdodGl2XzE9Ci1HTF9nbEdldExpZ2h0aXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldE1hcGR2PQotR0xfZ2xHZXRNYXBkdl8wPQotR0xfZ2xHZXRNYXBkdl8xPQotR0xfZ2xHZXRNYXBkdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0TWFwZnY9Ci1HTF9nbEdldE1hcGZ2XzA9Ci1HTF9nbEdldE1hcGZ2XzE9Ci1HTF9nbEdldE1hcGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRNYXBpdj0KLUdMX2dsR2V0TWFwaXZfMD0KLUdMX2dsR2V0TWFwaXZfMT0KLUdMX2dsR2V0TWFwaXZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldE1hdGVyaWFsZnY9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMD0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8xPQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRNYXRlcmlhbGl2PQotR0xfZ2xHZXRNYXRlcmlhbGl2XzA9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMT0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0UGl4ZWxNYXBmdj0KLUdMX2dsR2V0UGl4ZWxNYXBmdl8wPQotR0xfZ2xHZXRQaXhlbE1hcGZ2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRQaXhlbE1hcHVpdj0KLUdMX2dsR2V0UGl4ZWxNYXB1aXZfMD0KLUdMX2dsR2V0UGl4ZWxNYXB1aXZfMT1jYXN0PShHTHVpbnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRQaXhlbE1hcHVzdj0KLUdMX2dsR2V0UGl4ZWxNYXB1c3ZfMD0KLUdMX2dsR2V0UGl4ZWxNYXB1c3ZfMT1jYXN0PShHTHVzaG9ydCAqKSxmbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFBvaW50ZXJ2PQotR0xfZ2xHZXRQb2ludGVydl8wPQotR0xfZ2xHZXRQb2ludGVydl8xPWNhc3Q9KEdMdm9pZCAqKikKLQotR0xfZ2xHZXRQb2x5Z29uU3RpcHBsZT0KLUdMX2dsR2V0UG9seWdvblN0aXBwbGVfMD1jYXN0PShHTHVieXRlICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0U3RyaW5nPQotR0xfZ2xHZXRTdHJpbmdfMD0KLQotR0xfZ2xHZXRUZXhFbnZmdj0KLUdMX2dsR2V0VGV4RW52ZnZfMD0KLUdMX2dsR2V0VGV4RW52ZnZfMT0KLUdMX2dsR2V0VGV4RW52ZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleEVudml2PQotR0xfZ2xHZXRUZXhFbnZpdl8wPQotR0xfZ2xHZXRUZXhFbnZpdl8xPQotR0xfZ2xHZXRUZXhFbnZpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4R2VuZHY9Ci1HTF9nbEdldFRleEdlbmR2XzA9Ci1HTF9nbEdldFRleEdlbmR2XzE9Ci1HTF9nbEdldFRleEdlbmR2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhHZW5mdj0KLUdMX2dsR2V0VGV4R2VuZnZfMD0KLUdMX2dsR2V0VGV4R2VuZnZfMT0KLUdMX2dsR2V0VGV4R2VuZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleEdlbml2PQotR0xfZ2xHZXRUZXhHZW5pdl8wPQotR0xfZ2xHZXRUZXhHZW5pdl8xPQotR0xfZ2xHZXRUZXhHZW5pdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsR2V0VGV4SW1hZ2U9Ci1HTF9nbEdldFRleEltYWdlXzA9Ci1HTF9nbEdldFRleEltYWdlXzE9Ci1HTF9nbEdldFRleEltYWdlXzI9Ci1HTF9nbEdldFRleEltYWdlXzM9Ci1HTF9nbEdldFRleEltYWdlXzQ9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2PQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzA9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMT0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8yPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2PQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzA9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMT0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8yPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdj0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMD0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMT0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbEdldFRleFBhcmFtZXRlcml2PQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8wPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8xPQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSGludD0KLUdMX2dsSGludF8wPQotR0xfZ2xIaW50XzE9Ci0KLUdMX2dsSW5kZXhNYXNrPQotR0xfZ2xJbmRleE1hc2tfMD0KLQotR0xfZ2xJbmRleFBvaW50ZXI9Ci1HTF9nbEluZGV4UG9pbnRlcl8wPQotR0xfZ2xJbmRleFBvaW50ZXJfMT0KLUdMX2dsSW5kZXhQb2ludGVyXzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJbmRleGQ9Ci1HTF9nbEluZGV4ZF8wPQotCi1HTF9nbEluZGV4ZHY9Ci1HTF9nbEluZGV4ZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEluZGV4Zj0KLUdMX2dsSW5kZXhmXzA9Ci0KLUdMX2dsSW5kZXhmdj0KLUdMX2dsSW5kZXhmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsSW5kZXhpPQotR0xfZ2xJbmRleGlfMD0KLQotR0xfZ2xJbmRleGl2PQotR0xfZ2xJbmRleGl2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xJbmRleHM9Ci1HTF9nbEluZGV4c18wPQotCi1HTF9nbEluZGV4c3Y9Ci1HTF9nbEluZGV4c3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbEluaXROYW1lcz0KLQotR0xfZ2xJbnRlcmxlYXZlZEFycmF5cz0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMD0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMT0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXNfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbElzRW5hYmxlZD0KLUdMX2dsSXNFbmFibGVkXzA9Ci0KLUdMX2dsSXNMaXN0PQotR0xfZ2xJc0xpc3RfMD0KLQotR0xfZ2xJc1RleHR1cmU9Ci1HTF9nbElzVGV4dHVyZV8wPQotCi1HTF9nbExpZ2h0TW9kZWxmPQotR0xfZ2xMaWdodE1vZGVsZl8wPQotR0xfZ2xMaWdodE1vZGVsZl8xPQotCi1HTF9nbExpZ2h0TW9kZWxmdj0KLUdMX2dsTGlnaHRNb2RlbGZ2XzA9Ci1HTF9nbExpZ2h0TW9kZWxmdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTGlnaHRNb2RlbGk9Ci1HTF9nbExpZ2h0TW9kZWxpXzA9Ci1HTF9nbExpZ2h0TW9kZWxpXzE9Ci0KLUdMX2dsTGlnaHRNb2RlbGl2PQotR0xfZ2xMaWdodE1vZGVsaXZfMD0KLUdMX2dsTGlnaHRNb2RlbGl2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMaWdodGY9Ci1HTF9nbExpZ2h0Zl8wPQotR0xfZ2xMaWdodGZfMT0KLUdMX2dsTGlnaHRmXzI9Ci0KLUdMX2dsTGlnaHRmdj0KLUdMX2dsTGlnaHRmdl8wPQotR0xfZ2xMaWdodGZ2XzE9Ci1HTF9nbExpZ2h0ZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbExpZ2h0aT0KLUdMX2dsTGlnaHRpXzA9Ci1HTF9nbExpZ2h0aV8xPQotR0xfZ2xMaWdodGlfMj0KLQotR0xfZ2xMaWdodGl2PQotR0xfZ2xMaWdodGl2XzA9Ci1HTF9nbExpZ2h0aXZfMT0KLUdMX2dsTGlnaHRpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTGluZVN0aXBwbGU9Ci1HTF9nbExpbmVTdGlwcGxlXzA9Ci1HTF9nbExpbmVTdGlwcGxlXzE9Ci0KLUdMX2dsTGluZVdpZHRoPQotR0xfZ2xMaW5lV2lkdGhfMD0KLQotR0xfZ2xMaXN0QmFzZT0KLUdMX2dsTGlzdEJhc2VfMD0KLQotR0xfZ2xMb2FkSWRlbnRpdHk9Ci0KLUdMX2dsTG9hZE1hdHJpeGQ9Ci1HTF9nbExvYWRNYXRyaXhkXzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xMb2FkTWF0cml4Zj0KLUdMX2dsTG9hZE1hdHJpeGZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbExvYWROYW1lPQotR0xfZ2xMb2FkTmFtZV8wPQotCi1HTF9nbExvZ2ljT3A9Ci1HTF9nbExvZ2ljT3BfMD0KLQotR0xfZ2xNYXAxZD0KLUdMX2dsTWFwMWRfMD0KLUdMX2dsTWFwMWRfMT0KLUdMX2dsTWFwMWRfMj0KLUdMX2dsTWFwMWRfMz0KLUdMX2dsTWFwMWRfND0KLUdMX2dsTWFwMWRfNT1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hcDFmPQotR0xfZ2xNYXAxZl8wPQotR0xfZ2xNYXAxZl8xPQotR0xfZ2xNYXAxZl8yPQotR0xfZ2xNYXAxZl8zPQotR0xfZ2xNYXAxZl80PQotR0xfZ2xNYXAxZl81PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWFwMmQ9Ci1HTF9nbE1hcDJkXzA9Ci1HTF9nbE1hcDJkXzE9Ci1HTF9nbE1hcDJkXzI9Ci1HTF9nbE1hcDJkXzM9Ci1HTF9nbE1hcDJkXzQ9Ci1HTF9nbE1hcDJkXzU9Ci1HTF9nbE1hcDJkXzY9Ci1HTF9nbE1hcDJkXzc9Ci1HTF9nbE1hcDJkXzg9Ci1HTF9nbE1hcDJkXzk9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xNYXAyZj0KLUdMX2dsTWFwMmZfMD0KLUdMX2dsTWFwMmZfMT0KLUdMX2dsTWFwMmZfMj0KLUdMX2dsTWFwMmZfMz0KLUdMX2dsTWFwMmZfND0KLUdMX2dsTWFwMmZfNT0KLUdMX2dsTWFwMmZfNj0KLUdMX2dsTWFwMmZfNz0KLUdMX2dsTWFwMmZfOD0KLUdMX2dsTWFwMmZfOT1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hcEdyaWQxZD0KLUdMX2dsTWFwR3JpZDFkXzA9Ci1HTF9nbE1hcEdyaWQxZF8xPQotR0xfZ2xNYXBHcmlkMWRfMj0KLQotR0xfZ2xNYXBHcmlkMWY9Ci1HTF9nbE1hcEdyaWQxZl8wPQotR0xfZ2xNYXBHcmlkMWZfMT0KLUdMX2dsTWFwR3JpZDFmXzI9Ci0KLUdMX2dsTWFwR3JpZDJkPQotR0xfZ2xNYXBHcmlkMmRfMD0KLUdMX2dsTWFwR3JpZDJkXzE9Ci1HTF9nbE1hcEdyaWQyZF8yPQotR0xfZ2xNYXBHcmlkMmRfMz0KLUdMX2dsTWFwR3JpZDJkXzQ9Ci1HTF9nbE1hcEdyaWQyZF81PQotCi1HTF9nbE1hcEdyaWQyZj0KLUdMX2dsTWFwR3JpZDJmXzA9Ci1HTF9nbE1hcEdyaWQyZl8xPQotR0xfZ2xNYXBHcmlkMmZfMj0KLUdMX2dsTWFwR3JpZDJmXzM9Ci1HTF9nbE1hcEdyaWQyZl80PQotR0xfZ2xNYXBHcmlkMmZfNT0KLQotR0xfZ2xNYXRlcmlhbGY9Ci1HTF9nbE1hdGVyaWFsZl8wPQotR0xfZ2xNYXRlcmlhbGZfMT0KLUdMX2dsTWF0ZXJpYWxmXzI9Ci0KLUdMX2dsTWF0ZXJpYWxmdj0KLUdMX2dsTWF0ZXJpYWxmdl8wPQotR0xfZ2xNYXRlcmlhbGZ2XzE9Ci1HTF9nbE1hdGVyaWFsZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbE1hdGVyaWFsaT0KLUdMX2dsTWF0ZXJpYWxpXzA9Ci1HTF9nbE1hdGVyaWFsaV8xPQotR0xfZ2xNYXRlcmlhbGlfMj0KLQotR0xfZ2xNYXRlcmlhbGl2PQotR0xfZ2xNYXRlcmlhbGl2XzA9Ci1HTF9nbE1hdGVyaWFsaXZfMT0KLUdMX2dsTWF0ZXJpYWxpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTWF0cml4TW9kZT0KLUdMX2dsTWF0cml4TW9kZV8wPQotCi1HTF9nbE11bHRNYXRyaXhkPQotR0xfZ2xNdWx0TWF0cml4ZF8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTXVsdE1hdHJpeGY9Ci1HTF9nbE11bHRNYXRyaXhmXzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOZXdMaXN0PQotR0xfZ2xOZXdMaXN0XzA9Ci1HTF9nbE5ld0xpc3RfMT0KLQotR0xfZ2xOb3JtYWwzYj0KLUdMX2dsTm9ybWFsM2JfMD0KLUdMX2dsTm9ybWFsM2JfMT0KLUdMX2dsTm9ybWFsM2JfMj0KLQotR0xfZ2xOb3JtYWwzYnY9Ci1HTF9nbE5vcm1hbDNidl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTm9ybWFsM2Q9Ci1HTF9nbE5vcm1hbDNkXzA9Ci1HTF9nbE5vcm1hbDNkXzE9Ci1HTF9nbE5vcm1hbDNkXzI9Ci0KLUdMX2dsTm9ybWFsM2R2PQotR0xfZ2xOb3JtYWwzZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5vcm1hbDNmPQotR0xfZ2xOb3JtYWwzZl8wPQotR0xfZ2xOb3JtYWwzZl8xPQotR0xfZ2xOb3JtYWwzZl8yPQotCi1HTF9nbE5vcm1hbDNmdj0KLUdMX2dsTm9ybWFsM2Z2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xOb3JtYWwzaT0KLUdMX2dsTm9ybWFsM2lfMD0KLUdMX2dsTm9ybWFsM2lfMT0KLUdMX2dsTm9ybWFsM2lfMj0KLQotR0xfZ2xOb3JtYWwzaXY9Ci1HTF9nbE5vcm1hbDNpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsTm9ybWFsM3M9Ci1HTF9nbE5vcm1hbDNzXzA9Ci1HTF9nbE5vcm1hbDNzXzE9Ci1HTF9nbE5vcm1hbDNzXzI9Ci0KLUdMX2dsTm9ybWFsM3N2PQotR0xfZ2xOb3JtYWwzc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbE5vcm1hbFBvaW50ZXI9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMD0KLUdMX2dsTm9ybWFsUG9pbnRlcl8xPQotR0xfZ2xOb3JtYWxQb2ludGVyXzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xPcnRobz0KLUdMX2dsT3J0aG9fMD0KLUdMX2dsT3J0aG9fMT0KLUdMX2dsT3J0aG9fMj0KLUdMX2dsT3J0aG9fMz0KLUdMX2dsT3J0aG9fND0KLUdMX2dsT3J0aG9fNT0KLQotR0xfZ2xQYXNzVGhyb3VnaD0KLUdMX2dsUGFzc1Rocm91Z2hfMD0KLQotR0xfZ2xQaXhlbE1hcGZ2PQotR0xfZ2xQaXhlbE1hcGZ2XzA9Ci1HTF9nbFBpeGVsTWFwZnZfMT0KLUdMX2dsUGl4ZWxNYXBmdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUGl4ZWxNYXB1aXY9Ci1HTF9nbFBpeGVsTWFwdWl2XzA9Ci1HTF9nbFBpeGVsTWFwdWl2XzE9Ci1HTF9nbFBpeGVsTWFwdWl2XzI9Y2FzdD0oY29uc3QgR0x1aW50ICopLGZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUGl4ZWxNYXB1c3Y9Ci1HTF9nbFBpeGVsTWFwdXN2XzA9Ci1HTF9nbFBpeGVsTWFwdXN2XzE9Ci1HTF9nbFBpeGVsTWFwdXN2XzI9Y2FzdD0oY29uc3QgR0x1c2hvcnQgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xQaXhlbFN0b3JlZj0KLUdMX2dsUGl4ZWxTdG9yZWZfMD0KLUdMX2dsUGl4ZWxTdG9yZWZfMT0KLQotR0xfZ2xQaXhlbFN0b3JlaT0KLUdMX2dsUGl4ZWxTdG9yZWlfMD0KLUdMX2dsUGl4ZWxTdG9yZWlfMT0KLQotR0xfZ2xQaXhlbFRyYW5zZmVyZj0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmZfMD0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmZfMT0KLQotR0xfZ2xQaXhlbFRyYW5zZmVyaT0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmlfMD0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmlfMT0KLQotR0xfZ2xQaXhlbFpvb209Ci1HTF9nbFBpeGVsWm9vbV8wPQotR0xfZ2xQaXhlbFpvb21fMT0KLQotR0xfZ2xQb2ludFNpemU9Ci1HTF9nbFBvaW50U2l6ZV8wPQotCi1HTF9nbFBvbHlnb25Nb2RlPQotR0xfZ2xQb2x5Z29uTW9kZV8wPQotR0xfZ2xQb2x5Z29uTW9kZV8xPQotCi1HTF9nbFBvbHlnb25PZmZzZXQ9Ci1HTF9nbFBvbHlnb25PZmZzZXRfMD0KLUdMX2dsUG9seWdvbk9mZnNldF8xPQotCi1HTF9nbFBvbHlnb25TdGlwcGxlPQotR0xfZ2xQb2x5Z29uU3RpcHBsZV8wPWNhc3Q9KEdMdWJ5dGUgKiksZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xQb3BBdHRyaWI9Ci0KLUdMX2dsUG9wQ2xpZW50QXR0cmliPQotCi1HTF9nbFBvcE1hdHJpeD0KLQotR0xfZ2xQb3BOYW1lPQotCi1HTF9nbFByaW9yaXRpemVUZXh0dXJlcz0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzA9Ci1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18xPWNhc3Q9KGNvbnN0IEdMdWludCAqKSxmbGFncz1jcml0aWNhbAotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFB1c2hBdHRyaWI9Ci1HTF9nbFB1c2hBdHRyaWJfMD0KLQotR0xfZ2xQdXNoQ2xpZW50QXR0cmliPQotR0xfZ2xQdXNoQ2xpZW50QXR0cmliXzA9Ci0KLUdMX2dsUHVzaE1hdHJpeD0KLQotR0xfZ2xQdXNoTmFtZT0KLUdMX2dsUHVzaE5hbWVfMD0KLQotR0xfZ2xSYXN0ZXJQb3MyZD0KLUdMX2dsUmFzdGVyUG9zMmRfMD0KLUdMX2dsUmFzdGVyUG9zMmRfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyZHY9Ci1HTF9nbFJhc3RlclBvczJkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zMmY9Ci1HTF9nbFJhc3RlclBvczJmXzA9Ci1HTF9nbFJhc3RlclBvczJmXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMmZ2PQotR0xfZ2xSYXN0ZXJQb3MyZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczJpPQotR0xfZ2xSYXN0ZXJQb3MyaV8wPQotR0xfZ2xSYXN0ZXJQb3MyaV8xPQotCi1HTF9nbFJhc3RlclBvczJpdj0KLUdMX2dsUmFzdGVyUG9zMml2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3Mycz0KLUdMX2dsUmFzdGVyUG9zMnNfMD0KLUdMX2dsUmFzdGVyUG9zMnNfMT0KLQotR0xfZ2xSYXN0ZXJQb3Myc3Y9Ci1HTF9nbFJhc3RlclBvczJzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zM2Q9Ci1HTF9nbFJhc3RlclBvczNkXzA9Ci1HTF9nbFJhc3RlclBvczNkXzE9Ci1HTF9nbFJhc3RlclBvczNkXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2R2PQotR0xfZ2xSYXN0ZXJQb3MzZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczNmPQotR0xfZ2xSYXN0ZXJQb3MzZl8wPQotR0xfZ2xSYXN0ZXJQb3MzZl8xPQotR0xfZ2xSYXN0ZXJQb3MzZl8yPQotCi1HTF9nbFJhc3RlclBvczNmdj0KLUdMX2dsUmFzdGVyUG9zM2Z2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3MzaT0KLUdMX2dsUmFzdGVyUG9zM2lfMD0KLUdMX2dsUmFzdGVyUG9zM2lfMT0KLUdMX2dsUmFzdGVyUG9zM2lfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzaXY9Ci1HTF9nbFJhc3RlclBvczNpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zM3M9Ci1HTF9nbFJhc3RlclBvczNzXzA9Ci1HTF9nbFJhc3RlclBvczNzXzE9Ci1HTF9nbFJhc3RlclBvczNzXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM3N2PQotR0xfZ2xSYXN0ZXJQb3Mzc3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczRkPQotR0xfZ2xSYXN0ZXJQb3M0ZF8wPQotR0xfZ2xSYXN0ZXJQb3M0ZF8xPQotR0xfZ2xSYXN0ZXJQb3M0ZF8yPQotR0xfZ2xSYXN0ZXJQb3M0ZF8zPQotCi1HTF9nbFJhc3RlclBvczRkdj0KLUdMX2dsUmFzdGVyUG9zNGR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSYXN0ZXJQb3M0Zj0KLUdMX2dsUmFzdGVyUG9zNGZfMD0KLUdMX2dsUmFzdGVyUG9zNGZfMT0KLUdMX2dsUmFzdGVyUG9zNGZfMj0KLUdMX2dsUmFzdGVyUG9zNGZfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0ZnY9Ci1HTF9nbFJhc3RlclBvczRmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmFzdGVyUG9zNGk9Ci1HTF9nbFJhc3RlclBvczRpXzA9Ci1HTF9nbFJhc3RlclBvczRpXzE9Ci1HTF9nbFJhc3RlclBvczRpXzI9Ci1HTF9nbFJhc3RlclBvczRpXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGl2PQotR0xfZ2xSYXN0ZXJQb3M0aXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJhc3RlclBvczRzPQotR0xfZ2xSYXN0ZXJQb3M0c18wPQotR0xfZ2xSYXN0ZXJQb3M0c18xPQotR0xfZ2xSYXN0ZXJQb3M0c18yPQotR0xfZ2xSYXN0ZXJQb3M0c18zPQotCi1HTF9nbFJhc3RlclBvczRzdj0KLUdMX2dsUmFzdGVyUG9zNHN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZWFkQnVmZmVyPQotR0xfZ2xSZWFkQnVmZmVyXzA9Ci0KLUdMX2dsUmVhZFBpeGVscz0KLUdMX2dsUmVhZFBpeGVsc18wPQotR0xfZ2xSZWFkUGl4ZWxzXzE9Ci1HTF9nbFJlYWRQaXhlbHNfMj0KLUdMX2dsUmVhZFBpeGVsc18zPQotR0xfZ2xSZWFkUGl4ZWxzXzQ9Ci1HTF9nbFJlYWRQaXhlbHNfNT0KLUdMX2dsUmVhZFBpeGVsc182PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVjdGQ9Ci1HTF9nbFJlY3RkXzA9Ci1HTF9nbFJlY3RkXzE9Ci1HTF9nbFJlY3RkXzI9Ci1HTF9nbFJlY3RkXzM9Ci0KLUdMX2dsUmVjdGR2PQotR0xfZ2xSZWN0ZHZfMD1mbGFncz1jcml0aWNhbAotR0xfZ2xSZWN0ZHZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlY3RmPQotR0xfZ2xSZWN0Zl8wPQotR0xfZ2xSZWN0Zl8xPQotR0xfZ2xSZWN0Zl8yPQotR0xfZ2xSZWN0Zl8zPQotCi1HTF9nbFJlY3Rmdj0KLUdMX2dsUmVjdGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLUdMX2dsUmVjdGZ2XzE9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xSZWN0aT0KLUdMX2dsUmVjdGlfMD0KLUdMX2dsUmVjdGlfMT0KLUdMX2dsUmVjdGlfMj0KLUdMX2dsUmVjdGlfMz0KLQotR0xfZ2xSZWN0aXY9Ci1HTF9nbFJlY3Rpdl8wPWZsYWdzPWNyaXRpY2FsCi1HTF9nbFJlY3Rpdl8xPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsUmVjdHM9Ci1HTF9nbFJlY3RzXzA9Ci1HTF9nbFJlY3RzXzE9Ci1HTF9nbFJlY3RzXzI9Ci1HTF9nbFJlY3RzXzM9Ci0KLUdMX2dsUmVjdHN2PQotR0xfZ2xSZWN0c3ZfMD1mbGFncz1jcml0aWNhbAotR0xfZ2xSZWN0c3ZfMT1mbGFncz1jcml0aWNhbAotCi1HTF9nbFJlbmRlck1vZGU9Ci1HTF9nbFJlbmRlck1vZGVfMD0KLQotR0xfZ2xSb3RhdGVkPQotR0xfZ2xSb3RhdGVkXzA9Ci1HTF9nbFJvdGF0ZWRfMT0KLUdMX2dsUm90YXRlZF8yPQotR0xfZ2xSb3RhdGVkXzM9Ci0KLUdMX2dsUm90YXRlZj0KLUdMX2dsUm90YXRlZl8wPQotR0xfZ2xSb3RhdGVmXzE9Ci1HTF9nbFJvdGF0ZWZfMj0KLUdMX2dsUm90YXRlZl8zPQotCi1HTF9nbFNjYWxlZD0KLUdMX2dsU2NhbGVkXzA9Ci1HTF9nbFNjYWxlZF8xPQotR0xfZ2xTY2FsZWRfMj0KLQotR0xfZ2xTY2FsZWY9Ci1HTF9nbFNjYWxlZl8wPQotR0xfZ2xTY2FsZWZfMT0KLUdMX2dsU2NhbGVmXzI9Ci0KLUdMX2dsU2Npc3Nvcj0KLUdMX2dsU2Npc3Nvcl8wPQotR0xfZ2xTY2lzc29yXzE9Ci1HTF9nbFNjaXNzb3JfMj0KLUdMX2dsU2Npc3Nvcl8zPQotCi1HTF9nbFNlbGVjdEJ1ZmZlcj0KLUdMX2dsU2VsZWN0QnVmZmVyXzA9Ci1HTF9nbFNlbGVjdEJ1ZmZlcl8xPWNhc3Q9KEdMdWludCAqKQotCi1HTF9nbFNoYWRlTW9kZWw9Ci1HTF9nbFNoYWRlTW9kZWxfMD0KLQotR0xfZ2xTdGVuY2lsRnVuYz0KLUdMX2dsU3RlbmNpbEZ1bmNfMD0KLUdMX2dsU3RlbmNpbEZ1bmNfMT0KLUdMX2dsU3RlbmNpbEZ1bmNfMj0KLQotR0xfZ2xTdGVuY2lsTWFzaz0KLUdMX2dsU3RlbmNpbE1hc2tfMD0KLQotR0xfZ2xTdGVuY2lsT3A9Ci1HTF9nbFN0ZW5jaWxPcF8wPQotR0xfZ2xTdGVuY2lsT3BfMT0KLUdMX2dsU3RlbmNpbE9wXzI9Ci0KLUdMX2dsVGV4Q29vcmQxZD0KLUdMX2dsVGV4Q29vcmQxZF8wPQotCi1HTF9nbFRleENvb3JkMWR2PQotR0xfZ2xUZXhDb29yZDFkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQxZj0KLUdMX2dsVGV4Q29vcmQxZl8wPQotCi1HTF9nbFRleENvb3JkMWZ2PQotR0xfZ2xUZXhDb29yZDFmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQxaT0KLUdMX2dsVGV4Q29vcmQxaV8wPQotCi1HTF9nbFRleENvb3JkMWl2PQotR0xfZ2xUZXhDb29yZDFpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQxcz0KLUdMX2dsVGV4Q29vcmQxc18wPQotCi1HTF9nbFRleENvb3JkMXN2PQotR0xfZ2xUZXhDb29yZDFzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQyZD0KLUdMX2dsVGV4Q29vcmQyZF8wPQotR0xfZ2xUZXhDb29yZDJkXzE9Ci0KLUdMX2dsVGV4Q29vcmQyZHY9Ci1HTF9nbFRleENvb3JkMmR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDJmPQotR0xfZ2xUZXhDb29yZDJmXzA9Ci1HTF9nbFRleENvb3JkMmZfMT0KLQotR0xfZ2xUZXhDb29yZDJmdj0KLUdMX2dsVGV4Q29vcmQyZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkMmk9Ci1HTF9nbFRleENvb3JkMmlfMD0KLUdMX2dsVGV4Q29vcmQyaV8xPQotCi1HTF9nbFRleENvb3JkMml2PQotR0xfZ2xUZXhDb29yZDJpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQycz0KLUdMX2dsVGV4Q29vcmQyc18wPQotR0xfZ2xUZXhDb29yZDJzXzE9Ci0KLUdMX2dsVGV4Q29vcmQyc3Y9Ci1HTF9nbFRleENvb3JkMnN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDNkPQotR0xfZ2xUZXhDb29yZDNkXzA9Ci1HTF9nbFRleENvb3JkM2RfMT0KLUdMX2dsVGV4Q29vcmQzZF8yPQotCi1HTF9nbFRleENvb3JkM2R2PQotR0xfZ2xUZXhDb29yZDNkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQzZj0KLUdMX2dsVGV4Q29vcmQzZl8wPQotR0xfZ2xUZXhDb29yZDNmXzE9Ci1HTF9nbFRleENvb3JkM2ZfMj0KLQotR0xfZ2xUZXhDb29yZDNmdj0KLUdMX2dsVGV4Q29vcmQzZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleENvb3JkM2k9Ci1HTF9nbFRleENvb3JkM2lfMD0KLUdMX2dsVGV4Q29vcmQzaV8xPQotR0xfZ2xUZXhDb29yZDNpXzI9Ci0KLUdMX2dsVGV4Q29vcmQzaXY9Ci1HTF9nbFRleENvb3JkM2l2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhDb29yZDNzPQotR0xfZ2xUZXhDb29yZDNzXzA9Ci1HTF9nbFRleENvb3JkM3NfMT0KLUdMX2dsVGV4Q29vcmQzc18yPQotCi1HTF9nbFRleENvb3JkM3N2PQotR0xfZ2xUZXhDb29yZDNzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQ0ZD0KLUdMX2dsVGV4Q29vcmQ0ZF8wPQotR0xfZ2xUZXhDb29yZDRkXzE9Ci1HTF9nbFRleENvb3JkNGRfMj0KLUdMX2dsVGV4Q29vcmQ0ZF8zPQotCi1HTF9nbFRleENvb3JkNGR2PQotR0xfZ2xUZXhDb29yZDRkdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQ0Zj0KLUdMX2dsVGV4Q29vcmQ0Zl8wPQotR0xfZ2xUZXhDb29yZDRmXzE9Ci1HTF9nbFRleENvb3JkNGZfMj0KLUdMX2dsVGV4Q29vcmQ0Zl8zPQotCi1HTF9nbFRleENvb3JkNGZ2PQotR0xfZ2xUZXhDb29yZDRmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQ0aT0KLUdMX2dsVGV4Q29vcmQ0aV8wPQotR0xfZ2xUZXhDb29yZDRpXzE9Ci1HTF9nbFRleENvb3JkNGlfMj0KLUdMX2dsVGV4Q29vcmQ0aV8zPQotCi1HTF9nbFRleENvb3JkNGl2PQotR0xfZ2xUZXhDb29yZDRpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmQ0cz0KLUdMX2dsVGV4Q29vcmQ0c18wPQotR0xfZ2xUZXhDb29yZDRzXzE9Ci1HTF9nbFRleENvb3JkNHNfMj0KLUdMX2dsVGV4Q29vcmQ0c18zPQotCi1HTF9nbFRleENvb3JkNHN2PQotR0xfZ2xUZXhDb29yZDRzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4Q29vcmRQb2ludGVyPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMD0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzE9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8yPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEVudmY9Ci1HTF9nbFRleEVudmZfMD0KLUdMX2dsVGV4RW52Zl8xPQotR0xfZ2xUZXhFbnZmXzI9Ci0KLUdMX2dsVGV4RW52ZnY9Ci1HTF9nbFRleEVudmZ2XzA9Ci1HTF9nbFRleEVudmZ2XzE9Ci1HTF9nbFRleEVudmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhFbnZpPQotR0xfZ2xUZXhFbnZpXzA9Ci1HTF9nbFRleEVudmlfMT0KLUdMX2dsVGV4RW52aV8yPQotCi1HTF9nbFRleEVudml2PQotR0xfZ2xUZXhFbnZpdl8wPQotR0xfZ2xUZXhFbnZpdl8xPQotR0xfZ2xUZXhFbnZpdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4R2VuZD0KLUdMX2dsVGV4R2VuZF8wPQotR0xfZ2xUZXhHZW5kXzE9Ci1HTF9nbFRleEdlbmRfMj0KLQotR0xfZ2xUZXhHZW5kdj0KLUdMX2dsVGV4R2VuZHZfMD0KLUdMX2dsVGV4R2VuZHZfMT0KLUdMX2dsVGV4R2VuZHZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleEdlbmY9Ci1HTF9nbFRleEdlbmZfMD0KLUdMX2dsVGV4R2VuZl8xPQotR0xfZ2xUZXhHZW5mXzI9Ci0KLUdMX2dsVGV4R2VuZnY9Ci1HTF9nbFRleEdlbmZ2XzA9Ci1HTF9nbFRleEdlbmZ2XzE9Ci1HTF9nbFRleEdlbmZ2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhHZW5pPQotR0xfZ2xUZXhHZW5pXzA9Ci1HTF9nbFRleEdlbmlfMT0KLUdMX2dsVGV4R2VuaV8yPQotCi1HTF9nbFRleEdlbml2PQotR0xfZ2xUZXhHZW5pdl8wPQotR0xfZ2xUZXhHZW5pdl8xPQotR0xfZ2xUZXhHZW5pdl8yPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4SW1hZ2UxRD0KLUdMX2dsVGV4SW1hZ2UxRF8wPQotR0xfZ2xUZXhJbWFnZTFEXzE9Ci1HTF9nbFRleEltYWdlMURfMj0KLUdMX2dsVGV4SW1hZ2UxRF8zPQotR0xfZ2xUZXhJbWFnZTFEXzQ9Ci1HTF9nbFRleEltYWdlMURfNT0KLUdMX2dsVGV4SW1hZ2UxRF82PQotR0xfZ2xUZXhJbWFnZTFEXzc9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhJbWFnZTJEPQotR0xfZ2xUZXhJbWFnZTJEXzA9Ci1HTF9nbFRleEltYWdlMkRfMT0KLUdMX2dsVGV4SW1hZ2UyRF8yPQotR0xfZ2xUZXhJbWFnZTJEXzM9Ci1HTF9nbFRleEltYWdlMkRfND0KLUdMX2dsVGV4SW1hZ2UyRF81PQotR0xfZ2xUZXhJbWFnZTJEXzY9Ci1HTF9nbFRleEltYWdlMkRfNz0KLUdMX2dsVGV4SW1hZ2UyRF84PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVGV4UGFyYW1ldGVyZj0KLUdMX2dsVGV4UGFyYW1ldGVyZl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzE9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMj0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJmdj0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMj1mbGFncz1jcml0aWNhbAotCi1HTF9nbFRleFBhcmFtZXRlcmk9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMD0KLUdMX2dsVGV4UGFyYW1ldGVyaV8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzI9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyaXY9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzA9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzE9Ci1HTF9nbFRleFBhcmFtZXRlcml2XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhTdWJJbWFnZTFEPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzA9Ci1HTF9nbFRleFN1YkltYWdlMURfMT0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8yPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzM9Ci1HTF9nbFRleFN1YkltYWdlMURfND0KLUdMX2dsVGV4U3ViSW1hZ2UxRF81PQotR0xfZ2xUZXhTdWJJbWFnZTFEXzY9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xUZXhTdWJJbWFnZTJEPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzA9Ci1HTF9nbFRleFN1YkltYWdlMkRfMT0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8yPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzM9Ci1HTF9nbFRleFN1YkltYWdlMkRfND0KLUdMX2dsVGV4U3ViSW1hZ2UyRF81PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzY9Ci1HTF9nbFRleFN1YkltYWdlMkRfNz0KLUdMX2dsVGV4U3ViSW1hZ2UyRF84PWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVHJhbnNsYXRlZD0KLUdMX2dsVHJhbnNsYXRlZF8wPQotR0xfZ2xUcmFuc2xhdGVkXzE9Ci1HTF9nbFRyYW5zbGF0ZWRfMj0KLQotR0xfZ2xUcmFuc2xhdGVmPQotR0xfZ2xUcmFuc2xhdGVmXzA9Ci1HTF9nbFRyYW5zbGF0ZWZfMT0KLUdMX2dsVHJhbnNsYXRlZl8yPQotCi1HTF9nbFZlcnRleDJkPQotR0xfZ2xWZXJ0ZXgyZF8wPQotR0xfZ2xWZXJ0ZXgyZF8xPQotCi1HTF9nbFZlcnRleDJkdj0KLUdMX2dsVmVydGV4MmR2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgyZj0KLUdMX2dsVmVydGV4MmZfMD0KLUdMX2dsVmVydGV4MmZfMT0KLQotR0xfZ2xWZXJ0ZXgyZnY9Ci1HTF9nbFZlcnRleDJmdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4Mmk9Ci1HTF9nbFZlcnRleDJpXzA9Ci1HTF9nbFZlcnRleDJpXzE9Ci0KLUdMX2dsVmVydGV4Mml2PQotR0xfZ2xWZXJ0ZXgyaXZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDJzPQotR0xfZ2xWZXJ0ZXgyc18wPQotR0xfZ2xWZXJ0ZXgyc18xPQotCi1HTF9nbFZlcnRleDJzdj0KLUdMX2dsVmVydGV4MnN2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgzZD0KLUdMX2dsVmVydGV4M2RfMD0KLUdMX2dsVmVydGV4M2RfMT0KLUdMX2dsVmVydGV4M2RfMj0KLQotR0xfZ2xWZXJ0ZXgzZHZfX0k9Ci1HTF9nbFZlcnRleDNkdl9fSV8wPWNhc3Q9KGNvbnN0IEdMZG91YmxlICopCi0KLUdMX2dsVmVydGV4M2R2X19fM0Q9Ci1HTF9nbFZlcnRleDNkdl9fXzNEXzA9Ci0KLUdMX2dsVmVydGV4M2Y9Ci1HTF9nbFZlcnRleDNmXzA9Ci1HTF9nbFZlcnRleDNmXzE9Ci1HTF9nbFZlcnRleDNmXzI9Ci0KLUdMX2dsVmVydGV4M2Z2PQotR0xfZ2xWZXJ0ZXgzZnZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDNpPQotR0xfZ2xWZXJ0ZXgzaV8wPQotR0xfZ2xWZXJ0ZXgzaV8xPQotR0xfZ2xWZXJ0ZXgzaV8yPQotCi1HTF9nbFZlcnRleDNpdj0KLUdMX2dsVmVydGV4M2l2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXgzcz0KLUdMX2dsVmVydGV4M3NfMD0KLUdMX2dsVmVydGV4M3NfMT0KLUdMX2dsVmVydGV4M3NfMj0KLQotR0xfZ2xWZXJ0ZXgzc3Y9Ci1HTF9nbFZlcnRleDNzdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4NGQ9Ci1HTF9nbFZlcnRleDRkXzA9Ci1HTF9nbFZlcnRleDRkXzE9Ci1HTF9nbFZlcnRleDRkXzI9Ci1HTF9nbFZlcnRleDRkXzM9Ci0KLUdMX2dsVmVydGV4NGR2PQotR0xfZ2xWZXJ0ZXg0ZHZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleDRmPQotR0xfZ2xWZXJ0ZXg0Zl8wPQotR0xfZ2xWZXJ0ZXg0Zl8xPQotR0xfZ2xWZXJ0ZXg0Zl8yPQotR0xfZ2xWZXJ0ZXg0Zl8zPQotCi1HTF9nbFZlcnRleDRmdj0KLUdMX2dsVmVydGV4NGZ2XzA9ZmxhZ3M9Y3JpdGljYWwKLQotR0xfZ2xWZXJ0ZXg0aT0KLUdMX2dsVmVydGV4NGlfMD0KLUdMX2dsVmVydGV4NGlfMT0KLUdMX2dsVmVydGV4NGlfMj0KLUdMX2dsVmVydGV4NGlfMz0KLQotR0xfZ2xWZXJ0ZXg0aXY9Ci1HTF9nbFZlcnRleDRpdl8wPWZsYWdzPWNyaXRpY2FsCi0KLUdMX2dsVmVydGV4NHM9Ci1HTF9nbFZlcnRleDRzXzA9Ci1HTF9nbFZlcnRleDRzXzE9Ci1HTF9nbFZlcnRleDRzXzI9Ci1HTF9nbFZlcnRleDRzXzM9Ci0KLUdMX2dsVmVydGV4NHN2PQotR0xfZ2xWZXJ0ZXg0c3ZfMD1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZlcnRleFBvaW50ZXI9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMD0KLUdMX2dsVmVydGV4UG9pbnRlcl8xPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzI9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMz1mbGFncz1jcml0aWNhbAotCi1HTF9nbFZpZXdwb3J0PQotR0xfZ2xWaWV3cG9ydF8wPQotR0xfZ2xWaWV3cG9ydF8xPQotR0xfZ2xWaWV3cG9ydF8yPQotR0xfZ2xWaWV3cG9ydF8zPQotCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xDb250ZXh0PWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMRGF0YT1mbGFncz1ub19nZW4KLUdMRGF0YV9kZXZpY2U9Ci1HTERhdGFfc3R5bGU9Ci1HTERhdGFfaW1hZ2U9Ci1HTERhdGFfZGlzcGxheT0KLUdMRGF0YV9kcmF3YWJsZT0KLUdMRGF0YV9mb3JlZ3JvdW5kPQotR0xEYXRhX2JhY2tncm91bmQ9Ci1HTERhdGFfZm9udD0KLUdMRGF0YV9jb2xvcm1hcD0KLUdMRGF0YV9jbGlwUmduPQotR0xEYXRhX2xpbmVTdHlsZT0KLUdMRGF0YV9yZW5kZXJUYWJsZT0KLUdMRGF0YV9zdHJpbmc9Ci1HTERhdGFfc3RyaW5nV2lkdGg9Ci1HTERhdGFfc3RyaW5nSGVpZ2h0PQotR0xEYXRhX3htU3RyaW5nPQotR0xEYXRhX3RleHQ9Ci1HTERhdGFfdGV4dFdpZHRoPQotR0xEYXRhX3RleHRIZWlnaHQ9Ci1HTERhdGFfeG1UZXh0PQotR0xEYXRhX3htTW5lbW9uaWM9Ci1HTERhdGFfZHJhd0ZsYWdzPQotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMRHJhd2FibGU9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xMaXN0ZW5lcj1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTFU9ZmxhZ3M9bm9fZ2VuCi1HTFVfZ2x1QmVnaW5DdXJ2ZT0KLUdMVV9nbHVCZWdpbkN1cnZlXzA9Ci0KLUdMVV9nbHVCZWdpblBvbHlnb249Ci1HTFVfZ2x1QmVnaW5Qb2x5Z29uXzA9Ci0KLUdMVV9nbHVCZWdpblN1cmZhY2U9Ci1HTFVfZ2x1QmVnaW5TdXJmYWNlXzA9Ci0KLUdMVV9nbHVCZWdpblRyaW09Ci1HTFVfZ2x1QmVnaW5UcmltXzA9Ci0KLUdMVV9nbHVCdWlsZDFETWlwbWFwcz0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18wPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzE9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMj0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18zPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzQ9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfNT0KLQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzA9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMT0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18yPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzM9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfND0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc181PQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzY9Ci0KLUdMVV9nbHVDeWxpbmRlcj0KLUdMVV9nbHVDeWxpbmRlcl8wPQotR0xVX2dsdUN5bGluZGVyXzE9Ci1HTFVfZ2x1Q3lsaW5kZXJfMj0KLUdMVV9nbHVDeWxpbmRlcl8zPQotR0xVX2dsdUN5bGluZGVyXzQ9Ci1HTFVfZ2x1Q3lsaW5kZXJfNT0KLQotR0xVX2dsdURlbGV0ZU51cmJzUmVuZGVyZXI9Ci1HTFVfZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl8wPQotCi1HTFVfZ2x1RGVsZXRlUXVhZHJpYz0KLUdMVV9nbHVEZWxldGVRdWFkcmljXzA9Ci0KLUdMVV9nbHVEZWxldGVUZXNzPQotR0xVX2dsdURlbGV0ZVRlc3NfMD0KLQotR0xVX2dsdURpc2s9Ci1HTFVfZ2x1RGlza18wPQotR0xVX2dsdURpc2tfMT0KLUdMVV9nbHVEaXNrXzI9Ci1HTFVfZ2x1RGlza18zPQotR0xVX2dsdURpc2tfND0KLQotR0xVX2dsdUVuZEN1cnZlPQotR0xVX2dsdUVuZEN1cnZlXzA9Ci0KLUdMVV9nbHVFbmRQb2x5Z29uPQotR0xVX2dsdUVuZFBvbHlnb25fMD0KLQotR0xVX2dsdUVuZFN1cmZhY2U9Ci1HTFVfZ2x1RW5kU3VyZmFjZV8wPQotCi1HTFVfZ2x1RW5kVHJpbT0KLUdMVV9nbHVFbmRUcmltXzA9Ci0KLUdMVV9nbHVFcnJvclN0cmluZz0KLUdMVV9nbHVFcnJvclN0cmluZ18wPQotCi1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eT0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzA9Ci1HTFVfZ2x1R2V0TnVyYnNQcm9wZXJ0eV8xPQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMj0KLQotR0xVX2dsdUdldFN0cmluZz0KLUdMVV9nbHVHZXRTdHJpbmdfMD0KLQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eT0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMD0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMT0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMj0KLQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzPQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzA9Ci1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMT0KLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18yPQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzM9Ci0KLUdMVV9nbHVMb29rQXQ9Ci1HTFVfZ2x1TG9va0F0XzA9Ci1HTFVfZ2x1TG9va0F0XzE9Ci1HTFVfZ2x1TG9va0F0XzI9Ci1HTFVfZ2x1TG9va0F0XzM9Ci1HTFVfZ2x1TG9va0F0XzQ9Ci1HTFVfZ2x1TG9va0F0XzU9Ci1HTFVfZ2x1TG9va0F0XzY9Ci1HTFVfZ2x1TG9va0F0Xzc9Ci1HTFVfZ2x1TG9va0F0Xzg9Ci0KLUdMVV9nbHVOZXdOdXJic1JlbmRlcmVyPQotCi1HTFVfZ2x1TmV3UXVhZHJpYz0KLQotR0xVX2dsdU5ld1Rlc3M9Ci0KLUdMVV9nbHVOZXh0Q29udG91cj0KLUdMVV9nbHVOZXh0Q29udG91cl8wPQotR0xVX2dsdU5leHRDb250b3VyXzE9Ci0KLUdMVV9nbHVOdXJic0NhbGxiYWNrPQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMD0KLUdMVV9nbHVOdXJic0NhbGxiYWNrXzE9Ci1HTFVfZ2x1TnVyYnNDYWxsYmFja18yPQotCi1HTFVfZ2x1TnVyYnNDdXJ2ZT0KLUdMVV9nbHVOdXJic0N1cnZlXzA9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8xPQotR0xVX2dsdU51cmJzQ3VydmVfMj0KLUdMVV9nbHVOdXJic0N1cnZlXzM9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV80PQotR0xVX2dsdU51cmJzQ3VydmVfNT0KLUdMVV9nbHVOdXJic0N1cnZlXzY9Ci0KLUdMVV9nbHVOdXJic1Byb3BlcnR5PQotR0xVX2dsdU51cmJzUHJvcGVydHlfMD0KLUdMVV9nbHVOdXJic1Byb3BlcnR5XzE9Ci1HTFVfZ2x1TnVyYnNQcm9wZXJ0eV8yPQotCi1HTFVfZ2x1TnVyYnNTdXJmYWNlPQotR0xVX2dsdU51cmJzU3VyZmFjZV8wPQotR0xVX2dsdU51cmJzU3VyZmFjZV8xPQotR0xVX2dsdU51cmJzU3VyZmFjZV8yPQotR0xVX2dsdU51cmJzU3VyZmFjZV8zPQotR0xVX2dsdU51cmJzU3VyZmFjZV80PQotR0xVX2dsdU51cmJzU3VyZmFjZV81PQotR0xVX2dsdU51cmJzU3VyZmFjZV82PQotR0xVX2dsdU51cmJzU3VyZmFjZV83PQotR0xVX2dsdU51cmJzU3VyZmFjZV84PQotR0xVX2dsdU51cmJzU3VyZmFjZV85PQotR0xVX2dsdU51cmJzU3VyZmFjZV8xMD0KLQotR0xVX2dsdU9ydGhvMkQ9Ci1HTFVfZ2x1T3J0aG8yRF8wPQotR0xVX2dsdU9ydGhvMkRfMT0KLUdMVV9nbHVPcnRobzJEXzI9Ci1HTFVfZ2x1T3J0aG8yRF8zPQotCi1HTFVfZ2x1UGFydGlhbERpc2s9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMD0KLUdMVV9nbHVQYXJ0aWFsRGlza18xPQotR0xVX2dsdVBhcnRpYWxEaXNrXzI9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMz0KLUdMVV9nbHVQYXJ0aWFsRGlza180PQotR0xVX2dsdVBhcnRpYWxEaXNrXzU9Ci1HTFVfZ2x1UGFydGlhbERpc2tfNj0KLQotR0xVX2dsdVBlcnNwZWN0aXZlPQotR0xVX2dsdVBlcnNwZWN0aXZlXzA9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMT0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8yPQotR0xVX2dsdVBlcnNwZWN0aXZlXzM9Ci0KLUdMVV9nbHVQaWNrTWF0cml4PQotR0xVX2dsdVBpY2tNYXRyaXhfMD0KLUdMVV9nbHVQaWNrTWF0cml4XzE9Ci1HTFVfZ2x1UGlja01hdHJpeF8yPQotR0xVX2dsdVBpY2tNYXRyaXhfMz0KLUdMVV9nbHVQaWNrTWF0cml4XzQ9Ci0KLUdMVV9nbHVQcm9qZWN0PQotR0xVX2dsdVByb2plY3RfMD0KLUdMVV9nbHVQcm9qZWN0XzE9Ci1HTFVfZ2x1UHJvamVjdF8yPQotR0xVX2dsdVByb2plY3RfMz0KLUdMVV9nbHVQcm9qZWN0XzQ9Ci1HTFVfZ2x1UHJvamVjdF81PQotR0xVX2dsdVByb2plY3RfNj0KLUdMVV9nbHVQcm9qZWN0Xzc9Ci1HTFVfZ2x1UHJvamVjdF84PQotCi1HTFVfZ2x1UHdsQ3VydmU9Ci1HTFVfZ2x1UHdsQ3VydmVfMD0KLUdMVV9nbHVQd2xDdXJ2ZV8xPQotR0xVX2dsdVB3bEN1cnZlXzI9Ci1HTFVfZ2x1UHdsQ3VydmVfMz0KLUdMVV9nbHVQd2xDdXJ2ZV80PQotCi1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrPQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18wPQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18xPQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18yPQotCi1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZT0KLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlXzA9Ci1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZV8xPQotCi1HTFVfZ2x1UXVhZHJpY05vcm1hbHM9Ci1HTFVfZ2x1UXVhZHJpY05vcm1hbHNfMD0KLUdMVV9nbHVRdWFkcmljTm9ybWFsc18xPQotCi1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uPQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbl8wPQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbl8xPQotCi1HTFVfZ2x1UXVhZHJpY1RleHR1cmU9Ci1HTFVfZ2x1UXVhZHJpY1RleHR1cmVfMD0KLUdMVV9nbHVRdWFkcmljVGV4dHVyZV8xPQotCi1HTFVfZ2x1U2NhbGVJbWFnZT0KLUdMVV9nbHVTY2FsZUltYWdlXzA9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8xPQotR0xVX2dsdVNjYWxlSW1hZ2VfMj0KLUdMVV9nbHVTY2FsZUltYWdlXzM9Ci1HTFVfZ2x1U2NhbGVJbWFnZV80PQotR0xVX2dsdVNjYWxlSW1hZ2VfNT0KLUdMVV9nbHVTY2FsZUltYWdlXzY9Ci1HTFVfZ2x1U2NhbGVJbWFnZV83PQotR0xVX2dsdVNjYWxlSW1hZ2VfOD0KLQotR0xVX2dsdVNwaGVyZT0KLUdMVV9nbHVTcGhlcmVfMD0KLUdMVV9nbHVTcGhlcmVfMT0KLUdMVV9nbHVTcGhlcmVfMj0KLUdMVV9nbHVTcGhlcmVfMz0KLQotR0xVX2dsdVRlc3NCZWdpbkNvbnRvdXI9Ci1HTFVfZ2x1VGVzc0JlZ2luQ29udG91cl8wPQotCi1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbj0KLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uXzA9Ci1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbl8xPQotCi1HTFVfZ2x1VGVzc0NhbGxiYWNrPQotR0xVX2dsdVRlc3NDYWxsYmFja18wPQotR0xVX2dsdVRlc3NDYWxsYmFja18xPQotR0xVX2dsdVRlc3NDYWxsYmFja18yPQotCi1HTFVfZ2x1VGVzc0VuZENvbnRvdXI9Ci1HTFVfZ2x1VGVzc0VuZENvbnRvdXJfMD0KLQotR0xVX2dsdVRlc3NFbmRQb2x5Z29uPQotR0xVX2dsdVRlc3NFbmRQb2x5Z29uXzA9Ci0KLUdMVV9nbHVUZXNzTm9ybWFsPQotR0xVX2dsdVRlc3NOb3JtYWxfMD0KLUdMVV9nbHVUZXNzTm9ybWFsXzE9Ci1HTFVfZ2x1VGVzc05vcm1hbF8yPQotR0xVX2dsdVRlc3NOb3JtYWxfMz0KLQotR0xVX2dsdVRlc3NQcm9wZXJ0eT0KLUdMVV9nbHVUZXNzUHJvcGVydHlfMD0KLUdMVV9nbHVUZXNzUHJvcGVydHlfMT0KLUdMVV9nbHVUZXNzUHJvcGVydHlfMj0KLQotR0xVX2dsdVRlc3NWZXJ0ZXg9Ci1HTFVfZ2x1VGVzc1ZlcnRleF8wPQotR0xVX2dsdVRlc3NWZXJ0ZXhfMT0KLUdMVV9nbHVUZXNzVmVydGV4XzI9Ci0KLUdMVV9nbHVVblByb2plY3Q9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzA9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzE9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzI9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzM9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzQ9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzU9Ci1HTFVfZ2x1VW5Qcm9qZWN0XzY9Ci1HTFVfZ2x1VW5Qcm9qZWN0Xzc9Ci1HTFVfZ2x1VW5Qcm9qZWN0Xzg9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9MaWJyYXJ5PWZsYWdzPW5vX2dlbgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9KTkkgR2VuZXJhdGlvbi9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTFUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMVS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgwNzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL0pOSSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMVS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTc3OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMPWZsYWdzPW5vX2dlbgotR0xfZ2xBY2N1bT0KLUdMX2dsQWNjdW1fMD0KLUdMX2dsQWNjdW1fMT0KLQotR0xfZ2xBbHBoYUZ1bmM9Ci1HTF9nbEFscGhhRnVuY18wPQotR0xfZ2xBbHBoYUZ1bmNfMT0KLQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50PQotR0xfZ2xBcmVUZXh0dXJlc1Jlc2lkZW50XzA9Ci1HTF9nbEFyZVRleHR1cmVzUmVzaWRlbnRfMT0KLUdMX2dsQXJlVGV4dHVyZXNSZXNpZGVudF8yPQotCi1HTF9nbEFycmF5RWxlbWVudD0KLUdMX2dsQXJyYXlFbGVtZW50XzA9Ci0KLUdMX2dsQmVnaW49Ci1HTF9nbEJlZ2luXzA9Ci0KLUdMX2dsQmluZFRleHR1cmU9Ci1HTF9nbEJpbmRUZXh0dXJlXzA9Ci1HTF9nbEJpbmRUZXh0dXJlXzE9Ci0KLUdMX2dsQml0bWFwPQotR0xfZ2xCaXRtYXBfMD0KLUdMX2dsQml0bWFwXzE9Ci1HTF9nbEJpdG1hcF8yPQotR0xfZ2xCaXRtYXBfMz0KLUdMX2dsQml0bWFwXzQ9Ci1HTF9nbEJpdG1hcF81PQotR0xfZ2xCaXRtYXBfNj0KLQotR0xfZ2xCbGVuZEZ1bmM9Ci1HTF9nbEJsZW5kRnVuY18wPQotR0xfZ2xCbGVuZEZ1bmNfMT0KLQotR0xfZ2xDYWxsTGlzdD0KLUdMX2dsQ2FsbExpc3RfMD0KLQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNCXzA9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0JfMT0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQl8yPQotCi1HTF9nbENhbGxMaXN0c19fSUlfM0M9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0NfMD0KLUdMX2dsQ2FsbExpc3RzX19JSV8zQ18xPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNDXzI9Ci0KLUdMX2dsQ2FsbExpc3RzX19JSV8zST0KLUdMX2dsQ2FsbExpc3RzX19JSV8zSV8wPQotR0xfZ2xDYWxsTGlzdHNfX0lJXzNJXzE9Ci1HTF9nbENhbGxMaXN0c19fSUlfM0lfMj0KLQotR0xfZ2xDbGVhcj0KLUdMX2dsQ2xlYXJfMD0KLQotR0xfZ2xDbGVhckFjY3VtPQotR0xfZ2xDbGVhckFjY3VtXzA9Ci1HTF9nbENsZWFyQWNjdW1fMT0KLUdMX2dsQ2xlYXJBY2N1bV8yPQotR0xfZ2xDbGVhckFjY3VtXzM9Ci0KLUdMX2dsQ2xlYXJDb2xvcj0KLUdMX2dsQ2xlYXJDb2xvcl8wPQotR0xfZ2xDbGVhckNvbG9yXzE9Ci1HTF9nbENsZWFyQ29sb3JfMj0KLUdMX2dsQ2xlYXJDb2xvcl8zPQotCi1HTF9nbENsZWFyRGVwdGg9Ci1HTF9nbENsZWFyRGVwdGhfMD0KLQotR0xfZ2xDbGVhckluZGV4PQotR0xfZ2xDbGVhckluZGV4XzA9Ci0KLUdMX2dsQ2xlYXJTdGVuY2lsPQotR0xfZ2xDbGVhclN0ZW5jaWxfMD0KLQotR0xfZ2xDbGlwUGxhbmU9Ci1HTF9nbENsaXBQbGFuZV8wPQotR0xfZ2xDbGlwUGxhbmVfMT0KLQotR0xfZ2xDb2xvcjNiPQotR0xfZ2xDb2xvcjNiXzA9Ci1HTF9nbENvbG9yM2JfMT0KLUdMX2dsQ29sb3IzYl8yPQotCi1HTF9nbENvbG9yM2J2PQotR0xfZ2xDb2xvcjNidl8wPQotCi1HTF9nbENvbG9yM2Q9Ci1HTF9nbENvbG9yM2RfMD0KLUdMX2dsQ29sb3IzZF8xPQotR0xfZ2xDb2xvcjNkXzI9Ci0KLUdMX2dsQ29sb3IzZHY9Ci1HTF9nbENvbG9yM2R2XzA9Ci0KLUdMX2dsQ29sb3IzZj0KLUdMX2dsQ29sb3IzZl8wPQotR0xfZ2xDb2xvcjNmXzE9Ci1HTF9nbENvbG9yM2ZfMj0KLQotR0xfZ2xDb2xvcjNmdj0KLUdMX2dsQ29sb3IzZnZfMD0KLQotR0xfZ2xDb2xvcjNpPQotR0xfZ2xDb2xvcjNpXzA9Ci1HTF9nbENvbG9yM2lfMT0KLUdMX2dsQ29sb3IzaV8yPQotCi1HTF9nbENvbG9yM2l2PQotR0xfZ2xDb2xvcjNpdl8wPQotCi1HTF9nbENvbG9yM3M9Ci1HTF9nbENvbG9yM3NfMD0KLUdMX2dsQ29sb3Izc18xPQotR0xfZ2xDb2xvcjNzXzI9Ci0KLUdMX2dsQ29sb3Izc3Y9Ci1HTF9nbENvbG9yM3N2XzA9Ci0KLUdMX2dsQ29sb3IzdWI9Ci1HTF9nbENvbG9yM3ViXzA9Ci1HTF9nbENvbG9yM3ViXzE9Ci1HTF9nbENvbG9yM3ViXzI9Ci0KLUdMX2dsQ29sb3IzdWJ2PQotR0xfZ2xDb2xvcjN1YnZfMD0KLQotR0xfZ2xDb2xvcjN1aT0KLUdMX2dsQ29sb3IzdWlfMD0KLUdMX2dsQ29sb3IzdWlfMT0KLUdMX2dsQ29sb3IzdWlfMj0KLQotR0xfZ2xDb2xvcjN1aXY9Ci1HTF9nbENvbG9yM3Vpdl8wPQotCi1HTF9nbENvbG9yM3VzPQotR0xfZ2xDb2xvcjN1c18wPQotR0xfZ2xDb2xvcjN1c18xPQotR0xfZ2xDb2xvcjN1c18yPQotCi1HTF9nbENvbG9yM3Vzdj0KLUdMX2dsQ29sb3IzdXN2XzA9Ci0KLUdMX2dsQ29sb3I0Yj0KLUdMX2dsQ29sb3I0Yl8wPQotR0xfZ2xDb2xvcjRiXzE9Ci1HTF9nbENvbG9yNGJfMj0KLUdMX2dsQ29sb3I0Yl8zPQotCi1HTF9nbENvbG9yNGJ2PQotR0xfZ2xDb2xvcjRidl8wPQotCi1HTF9nbENvbG9yNGQ9Ci1HTF9nbENvbG9yNGRfMD0KLUdMX2dsQ29sb3I0ZF8xPQotR0xfZ2xDb2xvcjRkXzI9Ci1HTF9nbENvbG9yNGRfMz0KLQotR0xfZ2xDb2xvcjRkdj0KLUdMX2dsQ29sb3I0ZHZfMD0KLQotR0xfZ2xDb2xvcjRmPQotR0xfZ2xDb2xvcjRmXzA9Ci1HTF9nbENvbG9yNGZfMT0KLUdMX2dsQ29sb3I0Zl8yPQotR0xfZ2xDb2xvcjRmXzM9Ci0KLUdMX2dsQ29sb3I0ZnY9Ci1HTF9nbENvbG9yNGZ2XzA9Ci0KLUdMX2dsQ29sb3I0aT0KLUdMX2dsQ29sb3I0aV8wPQotR0xfZ2xDb2xvcjRpXzE9Ci1HTF9nbENvbG9yNGlfMj0KLUdMX2dsQ29sb3I0aV8zPQotCi1HTF9nbENvbG9yNGl2PQotR0xfZ2xDb2xvcjRpdl8wPQotCi1HTF9nbENvbG9yNHM9Ci1HTF9nbENvbG9yNHNfMD0KLUdMX2dsQ29sb3I0c18xPQotR0xfZ2xDb2xvcjRzXzI9Ci1HTF9nbENvbG9yNHNfMz0KLQotR0xfZ2xDb2xvcjR1Yj0KLUdMX2dsQ29sb3I0dWJfMD0KLUdMX2dsQ29sb3I0dWJfMT0KLUdMX2dsQ29sb3I0dWJfMj0KLUdMX2dsQ29sb3I0dWJfMz0KLQotR0xfZ2xDb2xvcjR1YnZfX18zQj0KLUdMX2dsQ29sb3I0dWJ2X19fM0JfMD0KLQotR0xfZ2xDb2xvcjR1YnZfX18zUz0KLUdMX2dsQ29sb3I0dWJ2X19fM1NfMD0KLQotR0xfZ2xDb2xvcjR1aT0KLUdMX2dsQ29sb3I0dWlfMD0KLUdMX2dsQ29sb3I0dWlfMT0KLUdMX2dsQ29sb3I0dWlfMj0KLUdMX2dsQ29sb3I0dWlfMz0KLQotR0xfZ2xDb2xvcjR1aXY9Ci1HTF9nbENvbG9yNHVpdl8wPQotCi1HTF9nbENvbG9yNHVzPQotR0xfZ2xDb2xvcjR1c18wPQotR0xfZ2xDb2xvcjR1c18xPQotR0xfZ2xDb2xvcjR1c18yPQotR0xfZ2xDb2xvcjR1c18zPQotCi1HTF9nbENvbG9yNHVzdj0KLUdMX2dsQ29sb3I0dXN2XzA9Ci0KLUdMX2dsQ29sb3JNYXNrPQotR0xfZ2xDb2xvck1hc2tfMD0KLUdMX2dsQ29sb3JNYXNrXzE9Ci1HTF9nbENvbG9yTWFza18yPQotR0xfZ2xDb2xvck1hc2tfMz0KLQotR0xfZ2xDb2xvck1hdGVyaWFsPQotR0xfZ2xDb2xvck1hdGVyaWFsXzA9Ci1HTF9nbENvbG9yTWF0ZXJpYWxfMT0KLQotR0xfZ2xDb2xvclBvaW50ZXI9Ci1HTF9nbENvbG9yUG9pbnRlcl8wPQotR0xfZ2xDb2xvclBvaW50ZXJfMT0KLUdMX2dsQ29sb3JQb2ludGVyXzI9Ci1HTF9nbENvbG9yUG9pbnRlcl8zPQotCi1HTF9nbENvcHlQaXhlbHM9Ci1HTF9nbENvcHlQaXhlbHNfMD0KLUdMX2dsQ29weVBpeGVsc18xPQotR0xfZ2xDb3B5UGl4ZWxzXzI9Ci1HTF9nbENvcHlQaXhlbHNfMz0KLUdMX2dsQ29weVBpeGVsc180PQotCi1HTF9nbENvcHlUZXhJbWFnZTFEPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8wPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8xPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8yPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF8zPQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF80PQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF81PQotR0xfZ2xDb3B5VGV4SW1hZ2UxRF82PQotCi1HTF9nbENvcHlUZXhJbWFnZTJEPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8wPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8xPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8yPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF8zPQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF80PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF81PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF82PQotR0xfZ2xDb3B5VGV4SW1hZ2UyRF83PQotCi1HTF9nbENvcHlUZXhTdWJJbWFnZTFEPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8wPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8xPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8yPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF8zPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF80PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UxRF81PQotCi1HTF9nbENvcHlUZXhTdWJJbWFnZTJEPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8wPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8xPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8yPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF8zPQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF80PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF81PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF82PQotR0xfZ2xDb3B5VGV4U3ViSW1hZ2UyRF83PQotCi1HTF9nbEN1bGxGYWNlPQotR0xfZ2xDdWxsRmFjZV8wPQotCi1HTF9nbERlbGV0ZUxpc3RzPQotR0xfZ2xEZWxldGVMaXN0c18wPQotR0xfZ2xEZWxldGVMaXN0c18xPQotCi1HTF9nbERlbGV0ZVRleHR1cmVzPQotR0xfZ2xEZWxldGVUZXh0dXJlc18wPQotR0xfZ2xEZWxldGVUZXh0dXJlc18xPQotCi1HTF9nbERlcHRoRnVuYz0KLUdMX2dsRGVwdGhGdW5jXzA9Ci0KLUdMX2dsRGVwdGhNYXNrPQotR0xfZ2xEZXB0aE1hc2tfMD0KLQotR0xfZ2xEZXB0aFJhbmdlPQotR0xfZ2xEZXB0aFJhbmdlXzA9Ci1HTF9nbERlcHRoUmFuZ2VfMT0KLQotR0xfZ2xEaXNhYmxlPQotR0xfZ2xEaXNhYmxlXzA9Ci0KLUdMX2dsRGlzYWJsZUNsaWVudFN0YXRlPQotR0xfZ2xEaXNhYmxlQ2xpZW50U3RhdGVfMD0KLQotR0xfZ2xEcmF3QXJyYXlzPQotR0xfZ2xEcmF3QXJyYXlzXzA9Ci1HTF9nbERyYXdBcnJheXNfMT0KLUdMX2dsRHJhd0FycmF5c18yPQotCi1HTF9nbERyYXdCdWZmZXI9Ci1HTF9nbERyYXdCdWZmZXJfMD0KLQotR0xfZ2xEcmF3RWxlbWVudHM9Ci1HTF9nbERyYXdFbGVtZW50c18wPQotR0xfZ2xEcmF3RWxlbWVudHNfMT0KLUdMX2dsRHJhd0VsZW1lbnRzXzI9Ci1HTF9nbERyYXdFbGVtZW50c18zPQotCi1HTF9nbERyYXdQaXhlbHM9Ci1HTF9nbERyYXdQaXhlbHNfMD0KLUdMX2dsRHJhd1BpeGVsc18xPQotR0xfZ2xEcmF3UGl4ZWxzXzI9Ci1HTF9nbERyYXdQaXhlbHNfMz0KLUdMX2dsRHJhd1BpeGVsc180PQotCi1HTF9nbEVkZ2VGbGFnPQotR0xfZ2xFZGdlRmxhZ18wPQotCi1HTF9nbEVkZ2VGbGFnUG9pbnRlcj0KLUdMX2dsRWRnZUZsYWdQb2ludGVyXzA9Ci1HTF9nbEVkZ2VGbGFnUG9pbnRlcl8xPQotCi1HTF9nbEVkZ2VGbGFndj0KLUdMX2dsRWRnZUZsYWd2XzA9Ci0KLUdMX2dsRW5hYmxlPQotR0xfZ2xFbmFibGVfMD0KLQotR0xfZ2xFbmFibGVDbGllbnRTdGF0ZT0KLUdMX2dsRW5hYmxlQ2xpZW50U3RhdGVfMD0KLQotR0xfZ2xFbmQ9Ci0KLUdMX2dsRW5kTGlzdD0KLQotR0xfZ2xFdmFsQ29vcmQxZD0KLUdMX2dsRXZhbENvb3JkMWRfMD0KLQotR0xfZ2xFdmFsQ29vcmQxZHY9Ci1HTF9nbEV2YWxDb29yZDFkdl8wPQotCi1HTF9nbEV2YWxDb29yZDFmPQotR0xfZ2xFdmFsQ29vcmQxZl8wPQotCi1HTF9nbEV2YWxDb29yZDFmdj0KLUdMX2dsRXZhbENvb3JkMWZ2XzA9Ci0KLUdMX2dsRXZhbENvb3JkMmQ9Ci1HTF9nbEV2YWxDb29yZDJkXzA9Ci1HTF9nbEV2YWxDb29yZDJkXzE9Ci0KLUdMX2dsRXZhbENvb3JkMmR2PQotR0xfZ2xFdmFsQ29vcmQyZHZfMD0KLQotR0xfZ2xFdmFsQ29vcmQyZj0KLUdMX2dsRXZhbENvb3JkMmZfMD0KLUdMX2dsRXZhbENvb3JkMmZfMT0KLQotR0xfZ2xFdmFsQ29vcmQyZnY9Ci1HTF9nbEV2YWxDb29yZDJmdl8wPQotCi1HTF9nbEV2YWxNZXNoMT0KLUdMX2dsRXZhbE1lc2gxXzA9Ci1HTF9nbEV2YWxNZXNoMV8xPQotR0xfZ2xFdmFsTWVzaDFfMj0KLQotR0xfZ2xFdmFsTWVzaDI9Ci1HTF9nbEV2YWxNZXNoMl8wPQotR0xfZ2xFdmFsTWVzaDJfMT0KLUdMX2dsRXZhbE1lc2gyXzI9Ci1HTF9nbEV2YWxNZXNoMl8zPQotR0xfZ2xFdmFsTWVzaDJfND0KLQotR0xfZ2xFdmFsUG9pbnQxPQotR0xfZ2xFdmFsUG9pbnQxXzA9Ci0KLUdMX2dsRXZhbFBvaW50Mj0KLUdMX2dsRXZhbFBvaW50Ml8wPQotR0xfZ2xFdmFsUG9pbnQyXzE9Ci0KLUdMX2dsRmVlZGJhY2tCdWZmZXI9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzA9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzE9Ci1HTF9nbEZlZWRiYWNrQnVmZmVyXzI9Ci0KLUdMX2dsRmluaXNoPQotCi1HTF9nbEZsdXNoPQotCi1HTF9nbEZvZ2Y9Ci1HTF9nbEZvZ2ZfMD0KLUdMX2dsRm9nZl8xPQotCi1HTF9nbEZvZ2Z2PQotR0xfZ2xGb2dmdl8wPQotR0xfZ2xGb2dmdl8xPQotCi1HTF9nbEZvZ2k9Ci1HTF9nbEZvZ2lfMD0KLUdMX2dsRm9naV8xPQotCi1HTF9nbEZvZ2l2PQotR0xfZ2xGb2dpdl8wPQotR0xfZ2xGb2dpdl8xPQotCi1HTF9nbEZyb250RmFjZT0KLUdMX2dsRnJvbnRGYWNlXzA9Ci0KLUdMX2dsRnJ1c3R1bT0KLUdMX2dsRnJ1c3R1bV8wPQotR0xfZ2xGcnVzdHVtXzE9Ci1HTF9nbEZydXN0dW1fMj0KLUdMX2dsRnJ1c3R1bV8zPQotR0xfZ2xGcnVzdHVtXzQ9Ci1HTF9nbEZydXN0dW1fNT0KLQotR0xfZ2xHZW5MaXN0cz0KLUdMX2dsR2VuTGlzdHNfMD0KLQotR0xfZ2xHZW5UZXh0dXJlcz0KLUdMX2dsR2VuVGV4dHVyZXNfMD0KLUdMX2dsR2VuVGV4dHVyZXNfMT0KLQotR0xfZ2xHZXRCb29sZWFudj0KLUdMX2dsR2V0Qm9vbGVhbnZfMD0KLUdMX2dsR2V0Qm9vbGVhbnZfMT0KLQotR0xfZ2xHZXRDbGlwUGxhbmU9Ci1HTF9nbEdldENsaXBQbGFuZV8wPQotR0xfZ2xHZXRDbGlwUGxhbmVfMT0KLQotR0xfZ2xHZXREb3VibGV2PQotR0xfZ2xHZXREb3VibGV2XzA9Ci1HTF9nbEdldERvdWJsZXZfMT0KLQotR0xfZ2xHZXRFcnJvcj0KLQotR0xfZ2xHZXRGbG9hdHY9Ci1HTF9nbEdldEZsb2F0dl8wPQotR0xfZ2xHZXRGbG9hdHZfMT0KLQotR0xfZ2xHZXRJbnRlZ2Vydj0KLUdMX2dsR2V0SW50ZWdlcnZfMD0KLUdMX2dsR2V0SW50ZWdlcnZfMT0KLQotR0xfZ2xHZXRMaWdodGZ2PQotR0xfZ2xHZXRMaWdodGZ2XzA9Ci1HTF9nbEdldExpZ2h0ZnZfMT0KLUdMX2dsR2V0TGlnaHRmdl8yPQotCi1HTF9nbEdldExpZ2h0aXY9Ci1HTF9nbEdldExpZ2h0aXZfMD0KLUdMX2dsR2V0TGlnaHRpdl8xPQotR0xfZ2xHZXRMaWdodGl2XzI9Ci0KLUdMX2dsR2V0TWFwZHY9Ci1HTF9nbEdldE1hcGR2XzA9Ci1HTF9nbEdldE1hcGR2XzE9Ci1HTF9nbEdldE1hcGR2XzI9Ci0KLUdMX2dsR2V0TWFwZnY9Ci1HTF9nbEdldE1hcGZ2XzA9Ci1HTF9nbEdldE1hcGZ2XzE9Ci1HTF9nbEdldE1hcGZ2XzI9Ci0KLUdMX2dsR2V0TWFwaXY9Ci1HTF9nbEdldE1hcGl2XzA9Ci1HTF9nbEdldE1hcGl2XzE9Ci1HTF9nbEdldE1hcGl2XzI9Ci0KLUdMX2dsR2V0TWF0ZXJpYWxmdj0KLUdMX2dsR2V0TWF0ZXJpYWxmdl8wPQotR0xfZ2xHZXRNYXRlcmlhbGZ2XzE9Ci1HTF9nbEdldE1hdGVyaWFsZnZfMj0KLQotR0xfZ2xHZXRNYXRlcmlhbGl2PQotR0xfZ2xHZXRNYXRlcmlhbGl2XzA9Ci1HTF9nbEdldE1hdGVyaWFsaXZfMT0KLUdMX2dsR2V0TWF0ZXJpYWxpdl8yPQotCi1HTF9nbEdldFBpeGVsTWFwZnY9Ci1HTF9nbEdldFBpeGVsTWFwZnZfMD0KLUdMX2dsR2V0UGl4ZWxNYXBmdl8xPQotCi1HTF9nbEdldFBpeGVsTWFwdWl2PQotR0xfZ2xHZXRQaXhlbE1hcHVpdl8wPQotR0xfZ2xHZXRQaXhlbE1hcHVpdl8xPQotCi1HTF9nbEdldFBpeGVsTWFwdXN2PQotR0xfZ2xHZXRQaXhlbE1hcHVzdl8wPQotR0xfZ2xHZXRQaXhlbE1hcHVzdl8xPQotCi1HTF9nbEdldFBvaW50ZXJ2PQotR0xfZ2xHZXRQb2ludGVydl8wPQotR0xfZ2xHZXRQb2ludGVydl8xPQotCi1HTF9nbEdldFBvbHlnb25TdGlwcGxlPQotR0xfZ2xHZXRQb2x5Z29uU3RpcHBsZV8wPQotCi1HTF9nbEdldFN0cmluZz0KLUdMX2dsR2V0U3RyaW5nXzA9Ci0KLUdMX2dsR2V0VGV4RW52ZnY9Ci1HTF9nbEdldFRleEVudmZ2XzA9Ci1HTF9nbEdldFRleEVudmZ2XzE9Ci1HTF9nbEdldFRleEVudmZ2XzI9Ci0KLUdMX2dsR2V0VGV4RW52aXY9Ci1HTF9nbEdldFRleEVudml2XzA9Ci1HTF9nbEdldFRleEVudml2XzE9Ci1HTF9nbEdldFRleEVudml2XzI9Ci0KLUdMX2dsR2V0VGV4R2VuZHY9Ci1HTF9nbEdldFRleEdlbmR2XzA9Ci1HTF9nbEdldFRleEdlbmR2XzE9Ci1HTF9nbEdldFRleEdlbmR2XzI9Ci0KLUdMX2dsR2V0VGV4R2VuZnY9Ci1HTF9nbEdldFRleEdlbmZ2XzA9Ci1HTF9nbEdldFRleEdlbmZ2XzE9Ci1HTF9nbEdldFRleEdlbmZ2XzI9Ci0KLUdMX2dsR2V0VGV4R2VuaXY9Ci1HTF9nbEdldFRleEdlbml2XzA9Ci1HTF9nbEdldFRleEdlbml2XzE9Ci1HTF9nbEdldFRleEdlbml2XzI9Ci0KLUdMX2dsR2V0VGV4SW1hZ2U9Ci1HTF9nbEdldFRleEltYWdlXzA9Ci1HTF9nbEdldFRleEltYWdlXzE9Ci1HTF9nbEdldFRleEltYWdlXzI9Ci1HTF9nbEdldFRleEltYWdlXzM9Ci1HTF9nbEdldFRleEltYWdlXzQ9Ci0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8wPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2XzE9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyZnZfMj0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl8zPQotCi1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXY9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMD0KLUdMX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl8xPQotR0xfZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2XzI9Ci1HTF9nbEdldFRleExldmVsUGFyYW1ldGVyaXZfMz0KLQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJmdj0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMD0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMT0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyZnZfMj0KLQotR0xfZ2xHZXRUZXhQYXJhbWV0ZXJpdj0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMD0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMT0KLUdMX2dsR2V0VGV4UGFyYW1ldGVyaXZfMj0KLQotR0xfZ2xIaW50PQotR0xfZ2xIaW50XzA9Ci1HTF9nbEhpbnRfMT0KLQotR0xfZ2xJbmRleE1hc2s9Ci1HTF9nbEluZGV4TWFza18wPQotCi1HTF9nbEluZGV4UG9pbnRlcj0KLUdMX2dsSW5kZXhQb2ludGVyXzA9Ci1HTF9nbEluZGV4UG9pbnRlcl8xPQotR0xfZ2xJbmRleFBvaW50ZXJfMj0KLQotR0xfZ2xJbmRleGQ9Ci1HTF9nbEluZGV4ZF8wPQotCi1HTF9nbEluZGV4ZHY9Ci1HTF9nbEluZGV4ZHZfMD0KLQotR0xfZ2xJbmRleGY9Ci1HTF9nbEluZGV4Zl8wPQotCi1HTF9nbEluZGV4ZnY9Ci1HTF9nbEluZGV4ZnZfMD0KLQotR0xfZ2xJbmRleGk9Ci1HTF9nbEluZGV4aV8wPQotCi1HTF9nbEluZGV4aXY9Ci1HTF9nbEluZGV4aXZfMD0KLQotR0xfZ2xJbmRleHM9Ci1HTF9nbEluZGV4c18wPQotCi1HTF9nbEluZGV4c3Y9Ci1HTF9nbEluZGV4c3ZfMD0KLQotR0xfZ2xJbml0TmFtZXM9Ci0KLUdMX2dsSW50ZXJsZWF2ZWRBcnJheXM9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzA9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzE9Ci1HTF9nbEludGVybGVhdmVkQXJyYXlzXzI9Ci0KLUdMX2dsSXNFbmFibGVkPQotR0xfZ2xJc0VuYWJsZWRfMD0KLQotR0xfZ2xJc0xpc3Q9Ci1HTF9nbElzTGlzdF8wPQotCi1HTF9nbElzVGV4dHVyZT0KLUdMX2dsSXNUZXh0dXJlXzA9Ci0KLUdMX2dsTGlnaHRNb2RlbGY9Ci1HTF9nbExpZ2h0TW9kZWxmXzA9Ci1HTF9nbExpZ2h0TW9kZWxmXzE9Ci0KLUdMX2dsTGlnaHRNb2RlbGZ2PQotR0xfZ2xMaWdodE1vZGVsZnZfMD0KLUdMX2dsTGlnaHRNb2RlbGZ2XzE9Ci0KLUdMX2dsTGlnaHRNb2RlbGk9Ci1HTF9nbExpZ2h0TW9kZWxpXzA9Ci1HTF9nbExpZ2h0TW9kZWxpXzE9Ci0KLUdMX2dsTGlnaHRNb2RlbGl2PQotR0xfZ2xMaWdodE1vZGVsaXZfMD0KLUdMX2dsTGlnaHRNb2RlbGl2XzE9Ci0KLUdMX2dsTGlnaHRmPQotR0xfZ2xMaWdodGZfMD0KLUdMX2dsTGlnaHRmXzE9Ci1HTF9nbExpZ2h0Zl8yPQotCi1HTF9nbExpZ2h0ZnY9Ci1HTF9nbExpZ2h0ZnZfMD0KLUdMX2dsTGlnaHRmdl8xPQotR0xfZ2xMaWdodGZ2XzI9Ci0KLUdMX2dsTGlnaHRpPQotR0xfZ2xMaWdodGlfMD0KLUdMX2dsTGlnaHRpXzE9Ci1HTF9nbExpZ2h0aV8yPQotCi1HTF9nbExpZ2h0aXY9Ci1HTF9nbExpZ2h0aXZfMD0KLUdMX2dsTGlnaHRpdl8xPQotR0xfZ2xMaWdodGl2XzI9Ci0KLUdMX2dsTGluZVN0aXBwbGU9Ci1HTF9nbExpbmVTdGlwcGxlXzA9Ci1HTF9nbExpbmVTdGlwcGxlXzE9Ci0KLUdMX2dsTGluZVdpZHRoPQotR0xfZ2xMaW5lV2lkdGhfMD0KLQotR0xfZ2xMaXN0QmFzZT0KLUdMX2dsTGlzdEJhc2VfMD0KLQotR0xfZ2xMb2FkSWRlbnRpdHk9Ci0KLUdMX2dsTG9hZE1hdHJpeGQ9Ci1HTF9nbExvYWRNYXRyaXhkXzA9Ci0KLUdMX2dsTG9hZE1hdHJpeGY9Ci1HTF9nbExvYWRNYXRyaXhmXzA9Ci0KLUdMX2dsTG9hZE5hbWU9Ci1HTF9nbExvYWROYW1lXzA9Ci0KLUdMX2dsTG9naWNPcD0KLUdMX2dsTG9naWNPcF8wPQotCi1HTF9nbE1hcDFkPQotR0xfZ2xNYXAxZF8wPQotR0xfZ2xNYXAxZF8xPQotR0xfZ2xNYXAxZF8yPQotR0xfZ2xNYXAxZF8zPQotR0xfZ2xNYXAxZF80PQotR0xfZ2xNYXAxZF81PQotCi1HTF9nbE1hcDFmPQotR0xfZ2xNYXAxZl8wPQotR0xfZ2xNYXAxZl8xPQotR0xfZ2xNYXAxZl8yPQotR0xfZ2xNYXAxZl8zPQotR0xfZ2xNYXAxZl80PQotR0xfZ2xNYXAxZl81PQotCi1HTF9nbE1hcDJkPQotR0xfZ2xNYXAyZF8wPQotR0xfZ2xNYXAyZF8xPQotR0xfZ2xNYXAyZF8yPQotR0xfZ2xNYXAyZF8zPQotR0xfZ2xNYXAyZF80PQotR0xfZ2xNYXAyZF81PQotR0xfZ2xNYXAyZF82PQotR0xfZ2xNYXAyZF83PQotR0xfZ2xNYXAyZF84PQotR0xfZ2xNYXAyZF85PQotCi1HTF9nbE1hcDJmPQotR0xfZ2xNYXAyZl8wPQotR0xfZ2xNYXAyZl8xPQotR0xfZ2xNYXAyZl8yPQotR0xfZ2xNYXAyZl8zPQotR0xfZ2xNYXAyZl80PQotR0xfZ2xNYXAyZl81PQotR0xfZ2xNYXAyZl82PQotR0xfZ2xNYXAyZl83PQotR0xfZ2xNYXAyZl84PQotR0xfZ2xNYXAyZl85PQotCi1HTF9nbE1hcEdyaWQxZD0KLUdMX2dsTWFwR3JpZDFkXzA9Ci1HTF9nbE1hcEdyaWQxZF8xPQotR0xfZ2xNYXBHcmlkMWRfMj0KLQotR0xfZ2xNYXBHcmlkMWY9Ci1HTF9nbE1hcEdyaWQxZl8wPQotR0xfZ2xNYXBHcmlkMWZfMT0KLUdMX2dsTWFwR3JpZDFmXzI9Ci0KLUdMX2dsTWFwR3JpZDJkPQotR0xfZ2xNYXBHcmlkMmRfMD0KLUdMX2dsTWFwR3JpZDJkXzE9Ci1HTF9nbE1hcEdyaWQyZF8yPQotR0xfZ2xNYXBHcmlkMmRfMz0KLUdMX2dsTWFwR3JpZDJkXzQ9Ci1HTF9nbE1hcEdyaWQyZF81PQotCi1HTF9nbE1hcEdyaWQyZj0KLUdMX2dsTWFwR3JpZDJmXzA9Ci1HTF9nbE1hcEdyaWQyZl8xPQotR0xfZ2xNYXBHcmlkMmZfMj0KLUdMX2dsTWFwR3JpZDJmXzM9Ci1HTF9nbE1hcEdyaWQyZl80PQotR0xfZ2xNYXBHcmlkMmZfNT0KLQotR0xfZ2xNYXRlcmlhbGY9Ci1HTF9nbE1hdGVyaWFsZl8wPQotR0xfZ2xNYXRlcmlhbGZfMT0KLUdMX2dsTWF0ZXJpYWxmXzI9Ci0KLUdMX2dsTWF0ZXJpYWxmdj0KLUdMX2dsTWF0ZXJpYWxmdl8wPQotR0xfZ2xNYXRlcmlhbGZ2XzE9Ci1HTF9nbE1hdGVyaWFsZnZfMj0KLQotR0xfZ2xNYXRlcmlhbGk9Ci1HTF9nbE1hdGVyaWFsaV8wPQotR0xfZ2xNYXRlcmlhbGlfMT0KLUdMX2dsTWF0ZXJpYWxpXzI9Ci0KLUdMX2dsTWF0ZXJpYWxpdj0KLUdMX2dsTWF0ZXJpYWxpdl8wPQotR0xfZ2xNYXRlcmlhbGl2XzE9Ci1HTF9nbE1hdGVyaWFsaXZfMj0KLQotR0xfZ2xNYXRyaXhNb2RlPQotR0xfZ2xNYXRyaXhNb2RlXzA9Ci0KLUdMX2dsTXVsdE1hdHJpeGQ9Ci1HTF9nbE11bHRNYXRyaXhkXzA9Ci0KLUdMX2dsTXVsdE1hdHJpeGY9Ci1HTF9nbE11bHRNYXRyaXhmXzA9Ci0KLUdMX2dsTmV3TGlzdD0KLUdMX2dsTmV3TGlzdF8wPQotR0xfZ2xOZXdMaXN0XzE9Ci0KLUdMX2dsTm9ybWFsM2I9Ci1HTF9nbE5vcm1hbDNiXzA9Ci1HTF9nbE5vcm1hbDNiXzE9Ci1HTF9nbE5vcm1hbDNiXzI9Ci0KLUdMX2dsTm9ybWFsM2J2PQotR0xfZ2xOb3JtYWwzYnZfMD0KLQotR0xfZ2xOb3JtYWwzZD0KLUdMX2dsTm9ybWFsM2RfMD0KLUdMX2dsTm9ybWFsM2RfMT0KLUdMX2dsTm9ybWFsM2RfMj0KLQotR0xfZ2xOb3JtYWwzZHY9Ci1HTF9nbE5vcm1hbDNkdl8wPQotCi1HTF9nbE5vcm1hbDNmPQotR0xfZ2xOb3JtYWwzZl8wPQotR0xfZ2xOb3JtYWwzZl8xPQotR0xfZ2xOb3JtYWwzZl8yPQotCi1HTF9nbE5vcm1hbDNmdj0KLUdMX2dsTm9ybWFsM2Z2XzA9Ci0KLUdMX2dsTm9ybWFsM2k9Ci1HTF9nbE5vcm1hbDNpXzA9Ci1HTF9nbE5vcm1hbDNpXzE9Ci1HTF9nbE5vcm1hbDNpXzI9Ci0KLUdMX2dsTm9ybWFsM2l2PQotR0xfZ2xOb3JtYWwzaXZfMD0KLQotR0xfZ2xOb3JtYWwzcz0KLUdMX2dsTm9ybWFsM3NfMD0KLUdMX2dsTm9ybWFsM3NfMT0KLUdMX2dsTm9ybWFsM3NfMj0KLQotR0xfZ2xOb3JtYWwzc3Y9Ci1HTF9nbE5vcm1hbDNzdl8wPQotCi1HTF9nbE5vcm1hbFBvaW50ZXI9Ci1HTF9nbE5vcm1hbFBvaW50ZXJfMD0KLUdMX2dsTm9ybWFsUG9pbnRlcl8xPQotR0xfZ2xOb3JtYWxQb2ludGVyXzI9Ci0KLUdMX2dsT3J0aG89Ci1HTF9nbE9ydGhvXzA9Ci1HTF9nbE9ydGhvXzE9Ci1HTF9nbE9ydGhvXzI9Ci1HTF9nbE9ydGhvXzM9Ci1HTF9nbE9ydGhvXzQ9Ci1HTF9nbE9ydGhvXzU9Ci0KLUdMX2dsUGFzc1Rocm91Z2g9Ci1HTF9nbFBhc3NUaHJvdWdoXzA9Ci0KLUdMX2dsUGl4ZWxNYXBmdj0KLUdMX2dsUGl4ZWxNYXBmdl8wPQotR0xfZ2xQaXhlbE1hcGZ2XzE9Ci1HTF9nbFBpeGVsTWFwZnZfMj0KLQotR0xfZ2xQaXhlbE1hcHVpdj0KLUdMX2dsUGl4ZWxNYXB1aXZfMD0KLUdMX2dsUGl4ZWxNYXB1aXZfMT0KLUdMX2dsUGl4ZWxNYXB1aXZfMj0KLQotR0xfZ2xQaXhlbE1hcHVzdj0KLUdMX2dsUGl4ZWxNYXB1c3ZfMD0KLUdMX2dsUGl4ZWxNYXB1c3ZfMT0KLUdMX2dsUGl4ZWxNYXB1c3ZfMj0KLQotR0xfZ2xQaXhlbFN0b3JlZj0KLUdMX2dsUGl4ZWxTdG9yZWZfMD0KLUdMX2dsUGl4ZWxTdG9yZWZfMT0KLQotR0xfZ2xQaXhlbFN0b3JlaT0KLUdMX2dsUGl4ZWxTdG9yZWlfMD0KLUdMX2dsUGl4ZWxTdG9yZWlfMT0KLQotR0xfZ2xQaXhlbFRyYW5zZmVyZj0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmZfMD0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmZfMT0KLQotR0xfZ2xQaXhlbFRyYW5zZmVyaT0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmlfMD0KLUdMX2dsUGl4ZWxUcmFuc2ZlcmlfMT0KLQotR0xfZ2xQaXhlbFpvb209Ci1HTF9nbFBpeGVsWm9vbV8wPQotR0xfZ2xQaXhlbFpvb21fMT0KLQotR0xfZ2xQb2ludFNpemU9Ci1HTF9nbFBvaW50U2l6ZV8wPQotCi1HTF9nbFBvbHlnb25Nb2RlPQotR0xfZ2xQb2x5Z29uTW9kZV8wPQotR0xfZ2xQb2x5Z29uTW9kZV8xPQotCi1HTF9nbFBvbHlnb25PZmZzZXQ9Ci1HTF9nbFBvbHlnb25PZmZzZXRfMD0KLUdMX2dsUG9seWdvbk9mZnNldF8xPQotCi1HTF9nbFBvbHlnb25TdGlwcGxlPQotR0xfZ2xQb2x5Z29uU3RpcHBsZV8wPQotCi1HTF9nbFBvcEF0dHJpYj0KLQotR0xfZ2xQb3BDbGllbnRBdHRyaWI9Ci0KLUdMX2dsUG9wTWF0cml4PQotCi1HTF9nbFBvcE5hbWU9Ci0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzPQotR0xfZ2xQcmlvcml0aXplVGV4dHVyZXNfMD0KLUdMX2dsUHJpb3JpdGl6ZVRleHR1cmVzXzE9Ci1HTF9nbFByaW9yaXRpemVUZXh0dXJlc18yPQotCi1HTF9nbFB1c2hBdHRyaWI9Ci1HTF9nbFB1c2hBdHRyaWJfMD0KLQotR0xfZ2xQdXNoQ2xpZW50QXR0cmliPQotR0xfZ2xQdXNoQ2xpZW50QXR0cmliXzA9Ci0KLUdMX2dsUHVzaE1hdHJpeD0KLQotR0xfZ2xQdXNoTmFtZT0KLUdMX2dsUHVzaE5hbWVfMD0KLQotR0xfZ2xSYXN0ZXJQb3MyZD0KLUdMX2dsUmFzdGVyUG9zMmRfMD0KLUdMX2dsUmFzdGVyUG9zMmRfMT0KLQotR0xfZ2xSYXN0ZXJQb3MyZHY9Ci1HTF9nbFJhc3RlclBvczJkdl8wPQotCi1HTF9nbFJhc3RlclBvczJmPQotR0xfZ2xSYXN0ZXJQb3MyZl8wPQotR0xfZ2xSYXN0ZXJQb3MyZl8xPQotCi1HTF9nbFJhc3RlclBvczJmdj0KLUdMX2dsUmFzdGVyUG9zMmZ2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zMmk9Ci1HTF9nbFJhc3RlclBvczJpXzA9Ci1HTF9nbFJhc3RlclBvczJpXzE9Ci0KLUdMX2dsUmFzdGVyUG9zMml2PQotR0xfZ2xSYXN0ZXJQb3MyaXZfMD0KLQotR0xfZ2xSYXN0ZXJQb3Mycz0KLUdMX2dsUmFzdGVyUG9zMnNfMD0KLUdMX2dsUmFzdGVyUG9zMnNfMT0KLQotR0xfZ2xSYXN0ZXJQb3Myc3Y9Ci1HTF9nbFJhc3RlclBvczJzdl8wPQotCi1HTF9nbFJhc3RlclBvczNkPQotR0xfZ2xSYXN0ZXJQb3MzZF8wPQotR0xfZ2xSYXN0ZXJQb3MzZF8xPQotR0xfZ2xSYXN0ZXJQb3MzZF8yPQotCi1HTF9nbFJhc3RlclBvczNkdj0KLUdMX2dsUmFzdGVyUG9zM2R2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zM2Y9Ci1HTF9nbFJhc3RlclBvczNmXzA9Ci1HTF9nbFJhc3RlclBvczNmXzE9Ci1HTF9nbFJhc3RlclBvczNmXzI9Ci0KLUdMX2dsUmFzdGVyUG9zM2Z2PQotR0xfZ2xSYXN0ZXJQb3MzZnZfMD0KLQotR0xfZ2xSYXN0ZXJQb3MzaT0KLUdMX2dsUmFzdGVyUG9zM2lfMD0KLUdMX2dsUmFzdGVyUG9zM2lfMT0KLUdMX2dsUmFzdGVyUG9zM2lfMj0KLQotR0xfZ2xSYXN0ZXJQb3MzaXY9Ci1HTF9nbFJhc3RlclBvczNpdl8wPQotCi1HTF9nbFJhc3RlclBvczNzPQotR0xfZ2xSYXN0ZXJQb3Mzc18wPQotR0xfZ2xSYXN0ZXJQb3Mzc18xPQotR0xfZ2xSYXN0ZXJQb3Mzc18yPQotCi1HTF9nbFJhc3RlclBvczNzdj0KLUdMX2dsUmFzdGVyUG9zM3N2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zNGQ9Ci1HTF9nbFJhc3RlclBvczRkXzA9Ci1HTF9nbFJhc3RlclBvczRkXzE9Ci1HTF9nbFJhc3RlclBvczRkXzI9Ci1HTF9nbFJhc3RlclBvczRkXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNGR2PQotR0xfZ2xSYXN0ZXJQb3M0ZHZfMD0KLQotR0xfZ2xSYXN0ZXJQb3M0Zj0KLUdMX2dsUmFzdGVyUG9zNGZfMD0KLUdMX2dsUmFzdGVyUG9zNGZfMT0KLUdMX2dsUmFzdGVyUG9zNGZfMj0KLUdMX2dsUmFzdGVyUG9zNGZfMz0KLQotR0xfZ2xSYXN0ZXJQb3M0ZnY9Ci1HTF9nbFJhc3RlclBvczRmdl8wPQotCi1HTF9nbFJhc3RlclBvczRpPQotR0xfZ2xSYXN0ZXJQb3M0aV8wPQotR0xfZ2xSYXN0ZXJQb3M0aV8xPQotR0xfZ2xSYXN0ZXJQb3M0aV8yPQotR0xfZ2xSYXN0ZXJQb3M0aV8zPQotCi1HTF9nbFJhc3RlclBvczRpdj0KLUdMX2dsUmFzdGVyUG9zNGl2XzA9Ci0KLUdMX2dsUmFzdGVyUG9zNHM9Ci1HTF9nbFJhc3RlclBvczRzXzA9Ci1HTF9nbFJhc3RlclBvczRzXzE9Ci1HTF9nbFJhc3RlclBvczRzXzI9Ci1HTF9nbFJhc3RlclBvczRzXzM9Ci0KLUdMX2dsUmFzdGVyUG9zNHN2PQotR0xfZ2xSYXN0ZXJQb3M0c3ZfMD0KLQotR0xfZ2xSZWFkQnVmZmVyPQotR0xfZ2xSZWFkQnVmZmVyXzA9Ci0KLUdMX2dsUmVhZFBpeGVscz0KLUdMX2dsUmVhZFBpeGVsc18wPQotR0xfZ2xSZWFkUGl4ZWxzXzE9Ci1HTF9nbFJlYWRQaXhlbHNfMj0KLUdMX2dsUmVhZFBpeGVsc18zPQotR0xfZ2xSZWFkUGl4ZWxzXzQ9Ci1HTF9nbFJlYWRQaXhlbHNfNT0KLUdMX2dsUmVhZFBpeGVsc182PQotCi1HTF9nbFJlY3RkPQotR0xfZ2xSZWN0ZF8wPQotR0xfZ2xSZWN0ZF8xPQotR0xfZ2xSZWN0ZF8yPQotR0xfZ2xSZWN0ZF8zPQotCi1HTF9nbFJlY3Rkdj0KLUdMX2dsUmVjdGR2XzA9Ci1HTF9nbFJlY3Rkdl8xPQotCi1HTF9nbFJlY3RmPQotR0xfZ2xSZWN0Zl8wPQotR0xfZ2xSZWN0Zl8xPQotR0xfZ2xSZWN0Zl8yPQotR0xfZ2xSZWN0Zl8zPQotCi1HTF9nbFJlY3Rmdj0KLUdMX2dsUmVjdGZ2XzA9Ci1HTF9nbFJlY3Rmdl8xPQotCi1HTF9nbFJlY3RpPQotR0xfZ2xSZWN0aV8wPQotR0xfZ2xSZWN0aV8xPQotR0xfZ2xSZWN0aV8yPQotR0xfZ2xSZWN0aV8zPQotCi1HTF9nbFJlY3Rpdj0KLUdMX2dsUmVjdGl2XzA9Ci1HTF9nbFJlY3Rpdl8xPQotCi1HTF9nbFJlY3RzPQotR0xfZ2xSZWN0c18wPQotR0xfZ2xSZWN0c18xPQotR0xfZ2xSZWN0c18yPQotR0xfZ2xSZWN0c18zPQotCi1HTF9nbFJlY3Rzdj0KLUdMX2dsUmVjdHN2XzA9Ci1HTF9nbFJlY3Rzdl8xPQotCi1HTF9nbFJlbmRlck1vZGU9Ci1HTF9nbFJlbmRlck1vZGVfMD0KLQotR0xfZ2xSb3RhdGVkPQotR0xfZ2xSb3RhdGVkXzA9Ci1HTF9nbFJvdGF0ZWRfMT0KLUdMX2dsUm90YXRlZF8yPQotR0xfZ2xSb3RhdGVkXzM9Ci0KLUdMX2dsUm90YXRlZj0KLUdMX2dsUm90YXRlZl8wPQotR0xfZ2xSb3RhdGVmXzE9Ci1HTF9nbFJvdGF0ZWZfMj0KLUdMX2dsUm90YXRlZl8zPQotCi1HTF9nbFNjYWxlZD0KLUdMX2dsU2NhbGVkXzA9Ci1HTF9nbFNjYWxlZF8xPQotR0xfZ2xTY2FsZWRfMj0KLQotR0xfZ2xTY2FsZWY9Ci1HTF9nbFNjYWxlZl8wPQotR0xfZ2xTY2FsZWZfMT0KLUdMX2dsU2NhbGVmXzI9Ci0KLUdMX2dsU2Npc3Nvcj0KLUdMX2dsU2Npc3Nvcl8wPQotR0xfZ2xTY2lzc29yXzE9Ci1HTF9nbFNjaXNzb3JfMj0KLUdMX2dsU2Npc3Nvcl8zPQotCi1HTF9nbFNlbGVjdEJ1ZmZlcj0KLUdMX2dsU2VsZWN0QnVmZmVyXzA9Ci1HTF9nbFNlbGVjdEJ1ZmZlcl8xPQotCi1HTF9nbFNoYWRlTW9kZWw9Ci1HTF9nbFNoYWRlTW9kZWxfMD0KLQotR0xfZ2xTdGVuY2lsRnVuYz0KLUdMX2dsU3RlbmNpbEZ1bmNfMD0KLUdMX2dsU3RlbmNpbEZ1bmNfMT0KLUdMX2dsU3RlbmNpbEZ1bmNfMj0KLQotR0xfZ2xTdGVuY2lsTWFzaz0KLUdMX2dsU3RlbmNpbE1hc2tfMD0KLQotR0xfZ2xTdGVuY2lsT3A9Ci1HTF9nbFN0ZW5jaWxPcF8wPQotR0xfZ2xTdGVuY2lsT3BfMT0KLUdMX2dsU3RlbmNpbE9wXzI9Ci0KLUdMX2dsVGV4Q29vcmQxZD0KLUdMX2dsVGV4Q29vcmQxZF8wPQotCi1HTF9nbFRleENvb3JkMWR2PQotR0xfZ2xUZXhDb29yZDFkdl8wPQotCi1HTF9nbFRleENvb3JkMWY9Ci1HTF9nbFRleENvb3JkMWZfMD0KLQotR0xfZ2xUZXhDb29yZDFmdj0KLUdMX2dsVGV4Q29vcmQxZnZfMD0KLQotR0xfZ2xUZXhDb29yZDFpPQotR0xfZ2xUZXhDb29yZDFpXzA9Ci0KLUdMX2dsVGV4Q29vcmQxaXY9Ci1HTF9nbFRleENvb3JkMWl2XzA9Ci0KLUdMX2dsVGV4Q29vcmQxcz0KLUdMX2dsVGV4Q29vcmQxc18wPQotCi1HTF9nbFRleENvb3JkMXN2PQotR0xfZ2xUZXhDb29yZDFzdl8wPQotCi1HTF9nbFRleENvb3JkMmQ9Ci1HTF9nbFRleENvb3JkMmRfMD0KLUdMX2dsVGV4Q29vcmQyZF8xPQotCi1HTF9nbFRleENvb3JkMmR2PQotR0xfZ2xUZXhDb29yZDJkdl8wPQotCi1HTF9nbFRleENvb3JkMmY9Ci1HTF9nbFRleENvb3JkMmZfMD0KLUdMX2dsVGV4Q29vcmQyZl8xPQotCi1HTF9nbFRleENvb3JkMmZ2PQotR0xfZ2xUZXhDb29yZDJmdl8wPQotCi1HTF9nbFRleENvb3JkMmk9Ci1HTF9nbFRleENvb3JkMmlfMD0KLUdMX2dsVGV4Q29vcmQyaV8xPQotCi1HTF9nbFRleENvb3JkMml2PQotR0xfZ2xUZXhDb29yZDJpdl8wPQotCi1HTF9nbFRleENvb3JkMnM9Ci1HTF9nbFRleENvb3JkMnNfMD0KLUdMX2dsVGV4Q29vcmQyc18xPQotCi1HTF9nbFRleENvb3JkMnN2PQotR0xfZ2xUZXhDb29yZDJzdl8wPQotCi1HTF9nbFRleENvb3JkM2Q9Ci1HTF9nbFRleENvb3JkM2RfMD0KLUdMX2dsVGV4Q29vcmQzZF8xPQotR0xfZ2xUZXhDb29yZDNkXzI9Ci0KLUdMX2dsVGV4Q29vcmQzZHY9Ci1HTF9nbFRleENvb3JkM2R2XzA9Ci0KLUdMX2dsVGV4Q29vcmQzZj0KLUdMX2dsVGV4Q29vcmQzZl8wPQotR0xfZ2xUZXhDb29yZDNmXzE9Ci1HTF9nbFRleENvb3JkM2ZfMj0KLQotR0xfZ2xUZXhDb29yZDNmdj0KLUdMX2dsVGV4Q29vcmQzZnZfMD0KLQotR0xfZ2xUZXhDb29yZDNpPQotR0xfZ2xUZXhDb29yZDNpXzA9Ci1HTF9nbFRleENvb3JkM2lfMT0KLUdMX2dsVGV4Q29vcmQzaV8yPQotCi1HTF9nbFRleENvb3JkM2l2PQotR0xfZ2xUZXhDb29yZDNpdl8wPQotCi1HTF9nbFRleENvb3JkM3M9Ci1HTF9nbFRleENvb3JkM3NfMD0KLUdMX2dsVGV4Q29vcmQzc18xPQotR0xfZ2xUZXhDb29yZDNzXzI9Ci0KLUdMX2dsVGV4Q29vcmQzc3Y9Ci1HTF9nbFRleENvb3JkM3N2XzA9Ci0KLUdMX2dsVGV4Q29vcmQ0ZD0KLUdMX2dsVGV4Q29vcmQ0ZF8wPQotR0xfZ2xUZXhDb29yZDRkXzE9Ci1HTF9nbFRleENvb3JkNGRfMj0KLUdMX2dsVGV4Q29vcmQ0ZF8zPQotCi1HTF9nbFRleENvb3JkNGR2PQotR0xfZ2xUZXhDb29yZDRkdl8wPQotCi1HTF9nbFRleENvb3JkNGY9Ci1HTF9nbFRleENvb3JkNGZfMD0KLUdMX2dsVGV4Q29vcmQ0Zl8xPQotR0xfZ2xUZXhDb29yZDRmXzI9Ci1HTF9nbFRleENvb3JkNGZfMz0KLQotR0xfZ2xUZXhDb29yZDRmdj0KLUdMX2dsVGV4Q29vcmQ0ZnZfMD0KLQotR0xfZ2xUZXhDb29yZDRpPQotR0xfZ2xUZXhDb29yZDRpXzA9Ci1HTF9nbFRleENvb3JkNGlfMT0KLUdMX2dsVGV4Q29vcmQ0aV8yPQotR0xfZ2xUZXhDb29yZDRpXzM9Ci0KLUdMX2dsVGV4Q29vcmQ0aXY9Ci1HTF9nbFRleENvb3JkNGl2XzA9Ci0KLUdMX2dsVGV4Q29vcmQ0cz0KLUdMX2dsVGV4Q29vcmQ0c18wPQotR0xfZ2xUZXhDb29yZDRzXzE9Ci1HTF9nbFRleENvb3JkNHNfMj0KLUdMX2dsVGV4Q29vcmQ0c18zPQotCi1HTF9nbFRleENvb3JkNHN2PQotR0xfZ2xUZXhDb29yZDRzdl8wPQotCi1HTF9nbFRleENvb3JkUG9pbnRlcj0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzA9Ci1HTF9nbFRleENvb3JkUG9pbnRlcl8xPQotR0xfZ2xUZXhDb29yZFBvaW50ZXJfMj0KLUdMX2dsVGV4Q29vcmRQb2ludGVyXzM9Ci0KLUdMX2dsVGV4RW52Zj0KLUdMX2dsVGV4RW52Zl8wPQotR0xfZ2xUZXhFbnZmXzE9Ci1HTF9nbFRleEVudmZfMj0KLQotR0xfZ2xUZXhFbnZmdj0KLUdMX2dsVGV4RW52ZnZfMD0KLUdMX2dsVGV4RW52ZnZfMT0KLUdMX2dsVGV4RW52ZnZfMj0KLQotR0xfZ2xUZXhFbnZpPQotR0xfZ2xUZXhFbnZpXzA9Ci1HTF9nbFRleEVudmlfMT0KLUdMX2dsVGV4RW52aV8yPQotCi1HTF9nbFRleEVudml2PQotR0xfZ2xUZXhFbnZpdl8wPQotR0xfZ2xUZXhFbnZpdl8xPQotR0xfZ2xUZXhFbnZpdl8yPQotCi1HTF9nbFRleEdlbmQ9Ci1HTF9nbFRleEdlbmRfMD0KLUdMX2dsVGV4R2VuZF8xPQotR0xfZ2xUZXhHZW5kXzI9Ci0KLUdMX2dsVGV4R2VuZHY9Ci1HTF9nbFRleEdlbmR2XzA9Ci1HTF9nbFRleEdlbmR2XzE9Ci1HTF9nbFRleEdlbmR2XzI9Ci0KLUdMX2dsVGV4R2VuZj0KLUdMX2dsVGV4R2VuZl8wPQotR0xfZ2xUZXhHZW5mXzE9Ci1HTF9nbFRleEdlbmZfMj0KLQotR0xfZ2xUZXhHZW5mdj0KLUdMX2dsVGV4R2VuZnZfMD0KLUdMX2dsVGV4R2VuZnZfMT0KLUdMX2dsVGV4R2VuZnZfMj0KLQotR0xfZ2xUZXhHZW5pPQotR0xfZ2xUZXhHZW5pXzA9Ci1HTF9nbFRleEdlbmlfMT0KLUdMX2dsVGV4R2VuaV8yPQotCi1HTF9nbFRleEdlbml2PQotR0xfZ2xUZXhHZW5pdl8wPQotR0xfZ2xUZXhHZW5pdl8xPQotR0xfZ2xUZXhHZW5pdl8yPQotCi1HTF9nbFRleEltYWdlMUQ9Ci1HTF9nbFRleEltYWdlMURfMD0KLUdMX2dsVGV4SW1hZ2UxRF8xPQotR0xfZ2xUZXhJbWFnZTFEXzI9Ci1HTF9nbFRleEltYWdlMURfMz0KLUdMX2dsVGV4SW1hZ2UxRF80PQotR0xfZ2xUZXhJbWFnZTFEXzU9Ci1HTF9nbFRleEltYWdlMURfNj0KLUdMX2dsVGV4SW1hZ2UxRF83PQotCi1HTF9nbFRleEltYWdlMkQ9Ci1HTF9nbFRleEltYWdlMkRfMD0KLUdMX2dsVGV4SW1hZ2UyRF8xPQotR0xfZ2xUZXhJbWFnZTJEXzI9Ci1HTF9nbFRleEltYWdlMkRfMz0KLUdMX2dsVGV4SW1hZ2UyRF80PQotR0xfZ2xUZXhJbWFnZTJEXzU9Ci1HTF9nbFRleEltYWdlMkRfNj0KLUdMX2dsVGV4SW1hZ2UyRF83PQotR0xfZ2xUZXhJbWFnZTJEXzg9Ci0KLUdMX2dsVGV4UGFyYW1ldGVyZj0KLUdMX2dsVGV4UGFyYW1ldGVyZl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJmXzE9Ci1HTF9nbFRleFBhcmFtZXRlcmZfMj0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJmdj0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMD0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMT0KLUdMX2dsVGV4UGFyYW1ldGVyZnZfMj0KLQotR0xfZ2xUZXhQYXJhbWV0ZXJpPQotR0xfZ2xUZXhQYXJhbWV0ZXJpXzA9Ci1HTF9nbFRleFBhcmFtZXRlcmlfMT0KLUdMX2dsVGV4UGFyYW1ldGVyaV8yPQotCi1HTF9nbFRleFBhcmFtZXRlcml2PQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8wPQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8xPQotR0xfZ2xUZXhQYXJhbWV0ZXJpdl8yPQotCi1HTF9nbFRleFN1YkltYWdlMUQ9Ci1HTF9nbFRleFN1YkltYWdlMURfMD0KLUdMX2dsVGV4U3ViSW1hZ2UxRF8xPQotR0xfZ2xUZXhTdWJJbWFnZTFEXzI9Ci1HTF9nbFRleFN1YkltYWdlMURfMz0KLUdMX2dsVGV4U3ViSW1hZ2UxRF80PQotR0xfZ2xUZXhTdWJJbWFnZTFEXzU9Ci1HTF9nbFRleFN1YkltYWdlMURfNj0KLQotR0xfZ2xUZXhTdWJJbWFnZTJEPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzA9Ci1HTF9nbFRleFN1YkltYWdlMkRfMT0KLUdMX2dsVGV4U3ViSW1hZ2UyRF8yPQotR0xfZ2xUZXhTdWJJbWFnZTJEXzM9Ci1HTF9nbFRleFN1YkltYWdlMkRfND0KLUdMX2dsVGV4U3ViSW1hZ2UyRF81PQotR0xfZ2xUZXhTdWJJbWFnZTJEXzY9Ci1HTF9nbFRleFN1YkltYWdlMkRfNz0KLUdMX2dsVGV4U3ViSW1hZ2UyRF84PQotCi1HTF9nbFRyYW5zbGF0ZWQ9Ci1HTF9nbFRyYW5zbGF0ZWRfMD0KLUdMX2dsVHJhbnNsYXRlZF8xPQotR0xfZ2xUcmFuc2xhdGVkXzI9Ci0KLUdMX2dsVHJhbnNsYXRlZj0KLUdMX2dsVHJhbnNsYXRlZl8wPQotR0xfZ2xUcmFuc2xhdGVmXzE9Ci1HTF9nbFRyYW5zbGF0ZWZfMj0KLQotR0xfZ2xWZXJ0ZXgyZD0KLUdMX2dsVmVydGV4MmRfMD0KLUdMX2dsVmVydGV4MmRfMT0KLQotR0xfZ2xWZXJ0ZXgyZHY9Ci1HTF9nbFZlcnRleDJkdl8wPQotCi1HTF9nbFZlcnRleDJmPQotR0xfZ2xWZXJ0ZXgyZl8wPQotR0xfZ2xWZXJ0ZXgyZl8xPQotCi1HTF9nbFZlcnRleDJmdj0KLUdMX2dsVmVydGV4MmZ2XzA9Ci0KLUdMX2dsVmVydGV4Mmk9Ci1HTF9nbFZlcnRleDJpXzA9Ci1HTF9nbFZlcnRleDJpXzE9Ci0KLUdMX2dsVmVydGV4Mml2PQotR0xfZ2xWZXJ0ZXgyaXZfMD0KLQotR0xfZ2xWZXJ0ZXgycz0KLUdMX2dsVmVydGV4MnNfMD0KLUdMX2dsVmVydGV4MnNfMT0KLQotR0xfZ2xWZXJ0ZXgyc3Y9Ci1HTF9nbFZlcnRleDJzdl8wPQotCi1HTF9nbFZlcnRleDNkPQotR0xfZ2xWZXJ0ZXgzZF8wPQotR0xfZ2xWZXJ0ZXgzZF8xPQotR0xfZ2xWZXJ0ZXgzZF8yPQotCi1HTF9nbFZlcnRleDNkdl9fST0KLUdMX2dsVmVydGV4M2R2X19JXzA9Ci0KLUdMX2dsVmVydGV4M2R2X19fM0Q9Ci1HTF9nbFZlcnRleDNkdl9fXzNEXzA9Ci0KLUdMX2dsVmVydGV4M2Y9Ci1HTF9nbFZlcnRleDNmXzA9Ci1HTF9nbFZlcnRleDNmXzE9Ci1HTF9nbFZlcnRleDNmXzI9Ci0KLUdMX2dsVmVydGV4M2Z2PQotR0xfZ2xWZXJ0ZXgzZnZfMD0KLQotR0xfZ2xWZXJ0ZXgzaT0KLUdMX2dsVmVydGV4M2lfMD0KLUdMX2dsVmVydGV4M2lfMT0KLUdMX2dsVmVydGV4M2lfMj0KLQotR0xfZ2xWZXJ0ZXgzaXY9Ci1HTF9nbFZlcnRleDNpdl8wPQotCi1HTF9nbFZlcnRleDNzPQotR0xfZ2xWZXJ0ZXgzc18wPQotR0xfZ2xWZXJ0ZXgzc18xPQotR0xfZ2xWZXJ0ZXgzc18yPQotCi1HTF9nbFZlcnRleDNzdj0KLUdMX2dsVmVydGV4M3N2XzA9Ci0KLUdMX2dsVmVydGV4NGQ9Ci1HTF9nbFZlcnRleDRkXzA9Ci1HTF9nbFZlcnRleDRkXzE9Ci1HTF9nbFZlcnRleDRkXzI9Ci1HTF9nbFZlcnRleDRkXzM9Ci0KLUdMX2dsVmVydGV4NGR2PQotR0xfZ2xWZXJ0ZXg0ZHZfMD0KLQotR0xfZ2xWZXJ0ZXg0Zj0KLUdMX2dsVmVydGV4NGZfMD0KLUdMX2dsVmVydGV4NGZfMT0KLUdMX2dsVmVydGV4NGZfMj0KLUdMX2dsVmVydGV4NGZfMz0KLQotR0xfZ2xWZXJ0ZXg0ZnY9Ci1HTF9nbFZlcnRleDRmdl8wPQotCi1HTF9nbFZlcnRleDRpPQotR0xfZ2xWZXJ0ZXg0aV8wPQotR0xfZ2xWZXJ0ZXg0aV8xPQotR0xfZ2xWZXJ0ZXg0aV8yPQotR0xfZ2xWZXJ0ZXg0aV8zPQotCi1HTF9nbFZlcnRleDRpdj0KLUdMX2dsVmVydGV4NGl2XzA9Ci0KLUdMX2dsVmVydGV4NHM9Ci1HTF9nbFZlcnRleDRzXzA9Ci1HTF9nbFZlcnRleDRzXzE9Ci1HTF9nbFZlcnRleDRzXzI9Ci1HTF9nbFZlcnRleDRzXzM9Ci0KLUdMX2dsVmVydGV4NHN2PQotR0xfZ2xWZXJ0ZXg0c3ZfMD0KLQotR0xfZ2xWZXJ0ZXhQb2ludGVyPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzA9Ci1HTF9nbFZlcnRleFBvaW50ZXJfMT0KLUdMX2dsVmVydGV4UG9pbnRlcl8yPQotR0xfZ2xWZXJ0ZXhQb2ludGVyXzM9Ci0KLUdMX2dsVmlld3BvcnQ9Ci1HTF9nbFZpZXdwb3J0XzA9Ci1HTF9nbFZpZXdwb3J0XzE9Ci1HTF9nbFZpZXdwb3J0XzI9Ci1HTF9nbFZpZXdwb3J0XzM9Ci0KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTENvbnRleHQ9ZmxhZ3M9bm9fZ2VuCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xEYXRhPWZsYWdzPW5vX2dlbgotR0xEYXRhX2RldmljZT0KLUdMRGF0YV9zdHlsZT0KLUdMRGF0YV9pbWFnZT0KLUdMRGF0YV9kaXNwbGF5PQotR0xEYXRhX2RyYXdhYmxlPQotR0xEYXRhX2ZvcmVncm91bmQ9Ci1HTERhdGFfYmFja2dyb3VuZD0KLUdMRGF0YV9mb250PQotR0xEYXRhX2NvbG9ybWFwPQotR0xEYXRhX2NsaXBSZ249Ci1HTERhdGFfbGluZVN0eWxlPQotR0xEYXRhX3JlbmRlclRhYmxlPQotR0xEYXRhX3N0cmluZz0KLUdMRGF0YV9zdHJpbmdXaWR0aD0KLUdMRGF0YV9zdHJpbmdIZWlnaHQ9Ci1HTERhdGFfeG1TdHJpbmc9Ci1HTERhdGFfdGV4dD0KLUdMRGF0YV90ZXh0V2lkdGg9Ci1HTERhdGFfdGV4dEhlaWdodD0KLUdMRGF0YV94bVRleHQ9Ci1HTERhdGFfeG1NbmVtb25pYz0KLUdMRGF0YV9kcmF3RmxhZ3M9Ci0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfR0xEcmF3YWJsZT1mbGFncz1ub19nZW4KLQotb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9HTExpc3RlbmVyPWZsYWdzPW5vX2dlbgotCi1vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX0dMVT0KLUdMVV9nbHVCZWdpbkN1cnZlPQotR0xVX2dsdUJlZ2luQ3VydmVfMD1jYXN0PShHTFVudXJicyAqKQotCi1HTFVfZ2x1QmVnaW5Qb2x5Z29uPQotR0xVX2dsdUJlZ2luUG9seWdvbl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IqKQotCi1HTFVfZ2x1QmVnaW5TdXJmYWNlPQotR0xVX2dsdUJlZ2luU3VyZmFjZV8wPWNhc3Q9KEdMVW51cmJzICopCi0KLUdMVV9nbHVCZWdpblRyaW09Ci1HTFVfZ2x1QmVnaW5UcmltXzA9Y2FzdD0oR0xVbnVyYnMgKikKLQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzA9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfMT0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc18yPQotR0xVX2dsdUJ1aWxkMURNaXBtYXBzXzM9Ci1HTFVfZ2x1QnVpbGQxRE1pcG1hcHNfND0KLUdMVV9nbHVCdWlsZDFETWlwbWFwc181PWNhc3Q9KGNvbnN0IHZvaWQgKikKLQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzA9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfMT0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc18yPQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzM9Ci1HTFVfZ2x1QnVpbGQyRE1pcG1hcHNfND0KLUdMVV9nbHVCdWlsZDJETWlwbWFwc181PQotR0xVX2dsdUJ1aWxkMkRNaXBtYXBzXzY9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdUN5bGluZGVyPQotR0xVX2dsdUN5bGluZGVyXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotR0xVX2dsdUN5bGluZGVyXzE9Ci1HTFVfZ2x1Q3lsaW5kZXJfMj0KLUdMVV9nbHVDeWxpbmRlcl8zPQotR0xVX2dsdUN5bGluZGVyXzQ9Ci1HTFVfZ2x1Q3lsaW5kZXJfNT0KLQotR0xVX2dsdURlbGV0ZU51cmJzUmVuZGVyZXI9Ci1HTFVfZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl8wPWNhc3Q9KEdMVW51cmJzICopCi0KLUdMVV9nbHVEZWxldGVRdWFkcmljPQotR0xVX2dsdURlbGV0ZVF1YWRyaWNfMD1jYXN0PShHTFVxdWFkcmljICopCi0KLUdMVV9nbHVEZWxldGVUZXNzPQotR0xVX2dsdURlbGV0ZVRlc3NfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi0KLUdMVV9nbHVEaXNrPQotR0xVX2dsdURpc2tfMD1jYXN0PShHTFVxdWFkcmljT2JqICopCi1HTFVfZ2x1RGlza18xPQotR0xVX2dsdURpc2tfMj0KLUdMVV9nbHVEaXNrXzM9Ci1HTFVfZ2x1RGlza180PQotCi1HTFVfZ2x1RW5kQ3VydmU9Ci1HTFVfZ2x1RW5kQ3VydmVfMD1jYXN0PShHTFVudXJic09iaiAqKQotCi1HTFVfZ2x1RW5kUG9seWdvbj0KLUdMVV9nbHVFbmRQb2x5Z29uXzA9Y2FzdD0oR0xVdHJpYW5ndWxhdG9yT2JqICopCi0KLUdMVV9nbHVFbmRTdXJmYWNlPQotR0xVX2dsdUVuZFN1cmZhY2VfMD1jYXN0PShHTFVudXJic09iaiAqKQotCi1HTFVfZ2x1RW5kVHJpbT0KLUdMVV9nbHVFbmRUcmltXzA9Y2FzdD0oR0xVbnVyYnNPYmogKikKLQotR0xVX2dsdUVycm9yU3RyaW5nPQotR0xVX2dsdUVycm9yU3RyaW5nXzA9Ci0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5PQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdUdldE51cmJzUHJvcGVydHlfMT0KLUdMVV9nbHVHZXROdXJic1Byb3BlcnR5XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdUdldFN0cmluZz0KLUdMVV9nbHVHZXRTdHJpbmdfMD0KLQotR0xVX2dsdUdldFRlc3NQcm9wZXJ0eT0KLUdMVV9nbHVHZXRUZXNzUHJvcGVydHlfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzE9Ci1HTFVfZ2x1R2V0VGVzc1Byb3BlcnR5XzI9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzPQotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVMb2FkU2FtcGxpbmdNYXRyaWNlc18xPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXNfMj1mbGFncz1jcml0aWNhbAotR0xVX2dsdUxvYWRTYW1wbGluZ01hdHJpY2VzXzM9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdUxvb2tBdD0KLUdMVV9nbHVMb29rQXRfMD0KLUdMVV9nbHVMb29rQXRfMT0KLUdMVV9nbHVMb29rQXRfMj0KLUdMVV9nbHVMb29rQXRfMz0KLUdMVV9nbHVMb29rQXRfND0KLUdMVV9nbHVMb29rQXRfNT0KLUdMVV9nbHVMb29rQXRfNj0KLUdMVV9nbHVMb29rQXRfNz0KLUdMVV9nbHVMb29rQXRfOD0KLQotR0xVX2dsdU5ld051cmJzUmVuZGVyZXI9Ci0KLUdMVV9nbHVOZXdRdWFkcmljPQotCi1HTFVfZ2x1TmV3VGVzcz0KLQotR0xVX2dsdU5leHRDb250b3VyPQotR0xVX2dsdU5leHRDb250b3VyXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdU5leHRDb250b3VyXzE9Ci0KLUdMVV9nbHVOdXJic0NhbGxiYWNrPQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdU51cmJzQ2FsbGJhY2tfMT0KLUdMVV9nbHVOdXJic0NhbGxiYWNrXzI9Y2FzdD0oR0x2b2lkKCopKQotCi1HTFVfZ2x1TnVyYnNDdXJ2ZT0KLUdMVV9nbHVOdXJic0N1cnZlXzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVOdXJic0N1cnZlXzE9Ci1HTFVfZ2x1TnVyYnNDdXJ2ZV8yPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TnVyYnNDdXJ2ZV8zPQotR0xVX2dsdU51cmJzQ3VydmVfND1mbGFncz1jcml0aWNhbAotR0xVX2dsdU51cmJzQ3VydmVfNT0KLUdMVV9nbHVOdXJic0N1cnZlXzY9Ci0KLUdMVV9nbHVOdXJic1Byb3BlcnR5PQotR0xVX2dsdU51cmJzUHJvcGVydHlfMD1jYXN0PShHTFVudXJicyAqKQotR0xVX2dsdU51cmJzUHJvcGVydHlfMT0KLUdMVV9nbHVOdXJic1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVOdXJic1N1cmZhY2U9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzA9Y2FzdD0oR0xVbnVyYnNPYmogKikKLUdMVV9nbHVOdXJic1N1cmZhY2VfMT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMj1mbGFncz1jcml0aWNhbAotR0xVX2dsdU51cmJzU3VyZmFjZV8zPQotR0xVX2dsdU51cmJzU3VyZmFjZV80PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1TnVyYnNTdXJmYWNlXzU9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzY9Ci1HTFVfZ2x1TnVyYnNTdXJmYWNlXzc9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVOdXJic1N1cmZhY2VfOD0KLUdMVV9nbHVOdXJic1N1cmZhY2VfOT0KLUdMVV9nbHVOdXJic1N1cmZhY2VfMTA9Ci0KLUdMVV9nbHVPcnRobzJEPQotR0xVX2dsdU9ydGhvMkRfMD0KLUdMVV9nbHVPcnRobzJEXzE9Ci1HTFVfZ2x1T3J0aG8yRF8yPQotR0xVX2dsdU9ydGhvMkRfMz0KLQotR0xVX2dsdVBhcnRpYWxEaXNrPQotR0xVX2dsdVBhcnRpYWxEaXNrXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotR0xVX2dsdVBhcnRpYWxEaXNrXzE9Ci1HTFVfZ2x1UGFydGlhbERpc2tfMj0KLUdMVV9nbHVQYXJ0aWFsRGlza18zPQotR0xVX2dsdVBhcnRpYWxEaXNrXzQ9Ci1HTFVfZ2x1UGFydGlhbERpc2tfNT0KLUdMVV9nbHVQYXJ0aWFsRGlza182PQotCi1HTFVfZ2x1UGVyc3BlY3RpdmU9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMD0KLUdMVV9nbHVQZXJzcGVjdGl2ZV8xPQotR0xVX2dsdVBlcnNwZWN0aXZlXzI9Ci1HTFVfZ2x1UGVyc3BlY3RpdmVfMz0KLQotR0xVX2dsdVBpY2tNYXRyaXg9Ci1HTFVfZ2x1UGlja01hdHJpeF8wPQotR0xVX2dsdVBpY2tNYXRyaXhfMT0KLUdMVV9nbHVQaWNrTWF0cml4XzI9Ci1HTFVfZ2x1UGlja01hdHJpeF8zPQotR0xVX2dsdVBpY2tNYXRyaXhfND1mbGFncz1jcml0aWNhbAotCi1HTFVfZ2x1UHJvamVjdD0KLUdMVV9nbHVQcm9qZWN0XzA9Ci1HTFVfZ2x1UHJvamVjdF8xPQotR0xVX2dsdVByb2plY3RfMj0KLUdMVV9nbHVQcm9qZWN0XzM9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQcm9qZWN0XzQ9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQcm9qZWN0XzU9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQcm9qZWN0XzY9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQcm9qZWN0Xzc9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQcm9qZWN0Xzg9ZmxhZ3M9Y3JpdGljYWwKLQotR0xVX2dsdVB3bEN1cnZlPQotR0xVX2dsdVB3bEN1cnZlXzA9Y2FzdD0oR0xVbnVyYnMgKikKLUdMVV9nbHVQd2xDdXJ2ZV8xPQotR0xVX2dsdVB3bEN1cnZlXzI9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVQd2xDdXJ2ZV8zPQotR0xVX2dsdVB3bEN1cnZlXzQ9Ci0KLUdMVV9nbHVRdWFkcmljQ2FsbGJhY2s9Ci1HTFVfZ2x1UXVhZHJpY0NhbGxiYWNrXzA9Y2FzdD0oR0xVcXVhZHJpY09iaiAqKQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18xPQotR0xVX2dsdVF1YWRyaWNDYWxsYmFja18yPWNhc3Q9KEdMdm9pZCgqKSkKLQotR0xVX2dsdVF1YWRyaWNEcmF3U3R5bGU9Ci1HTFVfZ2x1UXVhZHJpY0RyYXdTdHlsZV8wPWNhc3Q9KEdMVXF1YWRyaWNPYmogKikKLUdMVV9nbHVRdWFkcmljRHJhd1N0eWxlXzE9Ci0KLUdMVV9nbHVRdWFkcmljTm9ybWFscz0KLUdMVV9nbHVRdWFkcmljTm9ybWFsc18wPWNhc3Q9KEdMVXF1YWRyaWNPYmogKikKLUdMVV9nbHVRdWFkcmljTm9ybWFsc18xPQotCi1HTFVfZ2x1UXVhZHJpY09yaWVudGF0aW9uPQotR0xVX2dsdVF1YWRyaWNPcmllbnRhdGlvbl8wPWNhc3Q9KEdMVXF1YWRyaWMgKikKLUdMVV9nbHVRdWFkcmljT3JpZW50YXRpb25fMT0KLQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlPQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotR0xVX2dsdVF1YWRyaWNUZXh0dXJlXzE9Ci0KLUdMVV9nbHVTY2FsZUltYWdlPQotR0xVX2dsdVNjYWxlSW1hZ2VfMD0KLUdMVV9nbHVTY2FsZUltYWdlXzE9Ci1HTFVfZ2x1U2NhbGVJbWFnZV8yPQotR0xVX2dsdVNjYWxlSW1hZ2VfMz0KLUdMVV9nbHVTY2FsZUltYWdlXzQ9Y2FzdD0oY29uc3Qgdm9pZCAqKQotR0xVX2dsdVNjYWxlSW1hZ2VfNT0KLUdMVV9nbHVTY2FsZUltYWdlXzY9Ci1HTFVfZ2x1U2NhbGVJbWFnZV83PQotR0xVX2dsdVNjYWxlSW1hZ2VfOD1jYXN0PSh2b2lkICopCi0KLUdMVV9nbHVTcGhlcmU9Ci1HTFVfZ2x1U3BoZXJlXzA9Y2FzdD0oR0xVcXVhZHJpYyAqKQotR0xVX2dsdVNwaGVyZV8xPQotR0xVX2dsdVNwaGVyZV8yPQotR0xVX2dsdVNwaGVyZV8zPQotCi1HTFVfZ2x1VGVzc0JlZ2luQ29udG91cj0KLUdMVV9nbHVUZXNzQmVnaW5Db250b3VyXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotCi1HTFVfZ2x1VGVzc0JlZ2luUG9seWdvbj0KLUdMVV9nbHVUZXNzQmVnaW5Qb2x5Z29uXzA9Y2FzdD0oR0xVdGVzc2VsYXRvciAqKQotR0xVX2dsdVRlc3NCZWdpblBvbHlnb25fMT1jYXN0PShHTHZvaWQgKikKLQotR0xVX2dsdVRlc3NDYWxsYmFjaz0KLUdMVV9nbHVUZXNzQ2FsbGJhY2tfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1VGVzc0NhbGxiYWNrXzE9Ci1HTFVfZ2x1VGVzc0NhbGxiYWNrXzI9Y2FzdD0oR0x2b2lkKCopKQotCi1HTFVfZ2x1VGVzc0VuZENvbnRvdXI9Ci1HTFVfZ2x1VGVzc0VuZENvbnRvdXJfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi0KLUdMVV9nbHVUZXNzRW5kUG9seWdvbj0KLUdMVV9nbHVUZXNzRW5kUG9seWdvbl8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLQotR0xVX2dsdVRlc3NOb3JtYWw9Ci1HTFVfZ2x1VGVzc05vcm1hbF8wPWNhc3Q9KEdMVXRlc3NlbGF0b3IgKikKLUdMVV9nbHVUZXNzTm9ybWFsXzE9Ci1HTFVfZ2x1VGVzc05vcm1hbF8yPQotR0xVX2dsdVRlc3NOb3JtYWxfMz0KLQotR0xVX2dsdVRlc3NQcm9wZXJ0eT0KLUdMVV9nbHVUZXNzUHJvcGVydHlfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1VGVzc1Byb3BlcnR5XzE9Ci1HTFVfZ2x1VGVzc1Byb3BlcnR5XzI9Ci0KLUdMVV9nbHVUZXNzVmVydGV4PQotR0xVX2dsdVRlc3NWZXJ0ZXhfMD1jYXN0PShHTFV0ZXNzZWxhdG9yICopCi1HTFVfZ2x1VGVzc1ZlcnRleF8xPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VGVzc1ZlcnRleF8yPWNhc3Q9KEdMdm9pZCAqKQotCi1HTFVfZ2x1VW5Qcm9qZWN0PQotR0xVX2dsdVVuUHJvamVjdF8wPQotR0xVX2dsdVVuUHJvamVjdF8xPQotR0xVX2dsdVVuUHJvamVjdF8yPQotR0xVX2dsdVVuUHJvamVjdF8zPWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VW5Qcm9qZWN0XzQ9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVVblByb2plY3RfNT1mbGFncz1jcml0aWNhbAotR0xVX2dsdVVuUHJvamVjdF82PWZsYWdzPWNyaXRpY2FsCi1HTFVfZ2x1VW5Qcm9qZWN0Xzc9ZmxhZ3M9Y3JpdGljYWwKLUdMVV9nbHVVblByb2plY3RfOD1mbGFncz1jcml0aWNhbAotCi0KLW9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfTGlicmFyeT1mbGFncz1ub19nZW4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTW96aWxsYSBHZW5lcmF0aW9uL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9Nb3ppbGxhR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9Nb3ppbGxhIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01vemlsbGFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5NmVjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9Nb3ppbGxhIEdlbmVyYXRpb24vb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL01vemlsbGFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyogUHJvZHVjZXMgdGhlIGphdmEgY2xhc3NlcyBtYXBwaW5nIHRvIFhQQ09NIE1vemlsbGEgb2JqZWN0cyAqLwotcHVibGljIGNsYXNzIE1vemlsbGFHZW5lcmF0b3IgewotCUZpbGVSZWFkZXIgciA9IG51bGw7Ci0JRmlsZVdyaXRlciB3ID0gbnVsbDsKLQlpbnQgbWF4TGluZXMgPSAxMDAwOwotCWludCBjbnRMaW5lcyA9IDA7Ci0JaW50IG4gPSAwOwotCVN0cmluZ1tdIGIgPSBudWxsOwotCVN0cmluZyBib2R5ID0gbnVsbDsKLQlpbnQgbk1ldGhvZHMgPSAwOwotCVN0cmluZyB1dWlkTmFtZTsKLQlTdHJpbmcgdXVpZFZhbHVlOwotCVN0cmluZyBjbGFzc05hbWU7Ci0JU3RyaW5nIHBhcmVudE5hbWU7Ci0JU3RyaW5nW10gY29uc3RhbnROYW1lczsKLQlTdHJpbmdbXSBjb25zdGFudFZhbHVlczsKLQlTdHJpbmdbXSBtZXRob2ROYW1lczsKLQlTdHJpbmdbXVtdIGFyZ1R5cGVzOwotCVN0cmluZ1tdW10gYXJnTmFtZXM7Ci0JU3RyaW5nIGJvZHlPcmRlcjsKLQlIYXNodGFibGUgdnRibHM7Ci0KLQlzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLy8gQ29udGFpbnMgdGhlIGNoYXJhY3RlcnMgZm91bmQgYmVmb3JlIGEgbWV0aG9kIG5hbWUKLQkvLyBVc2VmdWwgdG8gZXh0cmFjdCB0aGUgbWV0aG9kIG5hbWUuIGUuZy4KLQkvLyAgTlNfSU1FVEhPRCBRdWVyeUludGVyZmFjZShjb25zdCBuc0lJRCAmIHV1aWQsIHZvaWQgKiAqcmVzdWx0KSA9IDA7Ci0JLy8gIE5TX0lNRVRIT0RfKG5zcmVmY250KSBBZGRSZWYodm9pZCkgPSAwOwotCS8vIG1ldGhvZCBuYW1lIGZvbGxvd3M6IFF1ZXJ5SW50ZXJmYWNlLCBBZGRSZWYgZXRjLgotCXN0YXRpYyBTdHJpbmdbXSBCRUZPUkVfTUVUSE9EX05BTUUgPSB7Ci0JCSIgIE5TX0lNRVRIT0QgIiwKLQkJIiAgTlNfSU1FVEhPRF8obnNyZWZjbnQpICIsCi0JCSIgIE5TX0lNRVRIT0RfKHZvaWQgKikgIiwKLQkJIiAgTlNfSU1FVEhPRF8odm9pZCkgIgotCX07Ci0Jc3RhdGljIFN0cmluZyBOT19TVVBFUl9DTEFTUyA9ICJTV1RfTk9fU1VQRVJfQ0xBU1MiOwotCQotCXN0YXRpYyBTdHJpbmdbXVtdIFRZUEVTX0MySkFWQSA9IHsgCi0JCXsgIlBSQm9vbCAqIiwgImJvb2xlYW5bXSIgfSwKLQkJeyAibnNJSUQgJiIsICJuc0lEIiB9LAotCQl7ICJuc0NJRCAmIiwgIm5zSUQiIH0sCi0JCXsgIm5zQ0lEICogKiIsICJpbnQgLypsb25nKi8iIH0sIC8vIG5zSURbXSBub3Qgc3VwcG9ydGVkIGJ5IGpuaWdlbgotCQl7ICIqICoiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIioqIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICIqICYiLCAiaW50IC8qbG9uZyovW10iIH0sCi0JCXsgIlBSVWludDMyICoiLCAiaW50W10iIH0sIAotCQl7ICJQUkludDMyICoiLCAiaW50W10iIH0sCi0JCXsgIlBSSW50NjQgKiIsICJsb25nW10iIH0sCi0JCXsgIlBSVW5pY2hhciAqIiwgImNoYXJbXSIgfSwKLQkJeyAiY2hhciAqIiwgImJ5dGVbXSIgfSwKLQkJeyAiZmxvYXQgKiIsICJmbG9hdFtdIiB9LAotCQl7ICJQUlVpbnQxNiAqIiwgInNob3J0W10iIH0sCi0JCXsgIm5hdGl2ZVdpbmRvdyAqIiwgImludCAvKmxvbmcqL1tdIiB9LAotCQl7ICJuc1dyaXRlU2VnbWVudEZ1biIsICJpbnQgLypsb25nKi8iIH0sCi0JCXsgIm5hdGl2ZVdpbmRvdyIsICJpbnQgLypsb25nKi8iIH0sCi0KLQkJeyAiKiIsICJpbnQgLypsb25nKi8iIH0sIC8vIGMgdHlwZSBjb250YWluaW5nIG9uZSBvciBtb3JlICogKGFuZCBhbnkgb3RoZXIgY2hhcmFjdGVyLCBhbmQgZGlkIG5vdCBtYXRjaCBwcmV2aW91cyBwYXR0ZXJucykgaXMgYSBzaW1wbGUgcG9pbnRlcgotCQl7ICImIiwgImludCAvKmxvbmcqLyIgfSwgCi0KLQkJeyAiUFJVaW50MzIiLCAiaW50IiB9LAotCQl7ICJQUkludDMyIiwgImludCIgfSwgCi0JCXsgIlBSSW50NjQiLCAibG9uZyIgfSwgCi0JCXsgIm5zcmVzdWx0IiwgImludCIgfSwKLQkJeyAiUFJCb29sIiwgImJvb2xlYW4iIH0sCi0JCXsgImZsb2F0IiwgImZsb2F0IiB9LAotCQl7ICJQUlVpbnQxNiIsICJzaG9ydCIgfSwKLQkJeyAic2l6ZV90IiwgImludCIgfSwKLQkJfTsKLQotCXN0YXRpYyBTdHJpbmcgR0VDS08gPSAiL2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL21vemlsbGEvMS40L2xpbnV4X2d0azIvbW96aWxsYS9kaXN0L2luY2x1ZGUvIjsKLQlzdGF0aWMgU3RyaW5nIFRBUkdFVF9GT0xERVIgPSAiL2JsdWViaXJkL3RlYW1zd3QvY2hyaXN4L2FtZDY0L3dvcmtzcGFjZS9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QgTW96aWxsYS9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL21vemlsbGEvIjsKLQlzdGF0aWMgU3RyaW5nW10gWFBDT01fSEVBREVSUyA9IHsgCi0JCSJwcm9maWxlL25zSVByb2ZpbGUuaCIsCi0JCSJ3aWRnZXQvbnNJQXBwU2hlbGwuaCIsCi0JCSJ3aWRnZXQvbnNJQmFzZVdpbmRvdy5oIiwgCi0JCSJ4cGNvbS9uc0lDb21wb25lbnRNYW5hZ2VyLmgiLAotCQkieHBjb20vbnNJQ29tcG9uZW50UmVnaXN0cmFyLmgiLAotCQkid2ViYnJ3c3IvbnNJQ29udGV4dE1lbnVMaXN0ZW5lci5oIiwgCi0JCSJkb2NzaGVsbC9uc0lEb2NTaGVsbC5oIiwKLQkJImRvbS9uc0lET01FdmVudC5oIiwgCi0JCSJkb20vbnNJRE9NTW91c2VFdmVudC5oIiwKLQkJImRvbS9uc0lET01VSUV2ZW50LmgiLCAKLQkJImRvbS9uc0lET01XaW5kb3cuaCIsCi0JCSJ1cmlsb2FkZXIvbnNJRG93bmxvYWQuaCIsIAotCQkid2ViYnJ3c3IvbnNJRW1iZWRkaW5nU2l0ZVdpbmRvdy5oIiwKLQkJInhwY29tL25zSUZhY3RvcnkuaCIsIAotCQkieHBjb20vbnNJRmlsZS5oIiwKLQkJImhlbHBlckFwcERsZy9uc0lIZWxwZXJBcHBMYXVuY2hlckRpYWxvZy5oIiwKLQkJImV4dGhhbmRsZXIvbnNJRXh0ZXJuYWxIZWxwZXJBcHBTZXJ2aWNlLmgiLCAvLyBjb250YWlucyBuc0lIZWxwZXJBcHBMYXVuY2hlcgotCQkieHBjb20vbnNJSW5wdXRTdHJlYW0uaCIsIAotCQkieHBjb20vbnNJSW50ZXJmYWNlUmVxdWVzdG9yLmgiLAotCQkibmVja28vbnNJSU9TZXJ2aWNlLmgiLCAKLQkJInhwY29tL25zSUxvY2FsRmlsZS5oIiwgCi0JCSJ4cGNvbS9uc0lNZW1vcnkuaCIsCi0JCSJwcm9ncmVzc0RsZy9uc0lQcm9ncmVzc0RpYWxvZy5oIiwKLQkJIndpbmRvd3dhdGNoZXIvbnNJUHJvbXB0U2VydmljZS5oIiwgCi0JCSJ4cGNvbS9uc0lTZXJ2aWNlTWFuYWdlci5oIiwKLQkJInhwY29tL25zSVN1cHBvcnRzLmgiLCAKLQkJIndlYmJyd3NyL25zSVRvb2x0aXBMaXN0ZW5lci5oIiwgCi0JCSJuZWNrby9uc0lVUkkuaCIsCi0JCSJ1cmlsb2FkZXIvbnNJVVJJQ29udGVudExpc3RlbmVyLmgiLCAKLQkJInhwY29tL25zSVdlYWtSZWZlcmVuY2UuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyLmgiLCAKLQkJIndlYmJyd3NyL25zSVdlYkJyb3dzZXJDaHJvbWUuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyQ2hyb21lRm9jdXMuaCIsCi0JCSJ3ZWJicndzci9uc0lXZWJCcm93c2VyRm9jdXMuaCIsIAotCQkiZG9jc2hlbGwvbnNJV2ViTmF2aWdhdGlvbi5oIiwKLQkJInVyaWxvYWRlci9uc0lXZWJQcm9ncmVzcy5oIiwgCi0JCSJ1cmlsb2FkZXIvbnNJV2ViUHJvZ3Jlc3NMaXN0ZW5lci5oIiwKLQkJImVtYmVkX2Jhc2UvbnNJV2luZG93Q3JlYXRvci5oIiwgCi0JCSJ3aW5kb3d3YXRjaGVyL25zSVdpbmRvd1dhdGNoZXIuaCIgfTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJTW96aWxsYUdlbmVyYXRvciB4ID0gbmV3IE1vemlsbGFHZW5lcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBYUENPTV9IRUFERVJTLmxlbmd0aDsgaSsrKQotCQkJeC5wYXJzZShHRUNLTyArIFhQQ09NX0hFQURFUlNbaV0sIFRBUkdFVF9GT0xERVIpOwotCQl4Lm91dHB1dFZ0YmxDYWxsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZG9uZSIpOwotCX0KLQotCXB1YmxpYyBNb3ppbGxhR2VuZXJhdG9yKCkgewotCQl2dGJscyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKiogV3JpdGUgY2FsbGJhY2tzICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGRhdGEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQl3LndyaXRlKGRhdGEpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlKCJcclxuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGRhdGEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlKGRhdGEgKyAiXHJcbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ29weXJpZ2h0cygpIHsKLQkJd3JpdGVMaW5lKENPUFlSSUdIVFMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlUGFja2FnZURlY2xhcmF0aW9uKCkgewotCQl3cml0ZUxpbmUoUEFDS0FHRV9ERUNMQVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVDbGFzc0RlY2xhcmF0aW9uKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCVN0cmluZyBsaW5lID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lOwotCQlpZiAoIXBhcmVudE5hbWUuZXF1YWxzKE5PX1NVUEVSX0NMQVNTKSkgbGluZSArPSAiIGV4dGVuZHMgIiArIHBhcmVudE5hbWU7Ci0JCWxpbmUgKz0gIiB7IjsKLQkJd3JpdGVMaW5lKGxpbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlTGFzdE1ldGhvZElkKFN0cmluZyBwYXJlbnROYW1lLCBpbnQgbk1ldGhvZHMpIHsKLQkJU3RyaW5nIGxpbmUgPSAiXHRzdGF0aWMgZmluYWwgaW50IExBU1RfTUVUSE9EX0lEID0gIjsKLQkJaWYgKCFwYXJlbnROYW1lLmVxdWFscyhOT19TVVBFUl9DTEFTUykpIGxpbmUgKz0gcGFyZW50TmFtZSArICIuTEFTVF9NRVRIT0RfSUQgKyAiICsgbk1ldGhvZHMgKyAiOyI7Ci0JCWVsc2UgbGluZSArPSAiIiArIChuTWV0aG9kcyAtIDEpKyAiOyI7IC8vIHplcm8gaW5kZXhlZAotCQl3cml0ZUxpbmUobGluZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVJSUQoU3RyaW5nIHV1aWROYW1lLCBTdHJpbmcgdXVpZFZhbHVlKSB7Ci0JCXdyaXRlTGluZSgiXHRwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAiICsgdXVpZE5hbWUgKyAiID0iKTsKLQkJd3JpdGVMaW5lKCJcdFx0XCIiICsgdXVpZFZhbHVlICsgIlwiOyIpOwotCQl3cml0ZUxpbmUoKTsKLQkJU3RyaW5nIGlpZCA9IHV1aWROYW1lLnN1YnN0cmluZygwLCB1dWlkTmFtZS5pbmRleE9mKCJfU1RSIikpOwotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBuc0lEICIgKyBpaWQgKyAiID0iKTsKLQkJd3JpdGVMaW5lKCJcdFx0bmV3IG5zSUQoIiArIHV1aWROYW1lICsgIik7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVBZGRyZXNzRmllbGQoKSB7Ci0JCXdyaXRlTGluZSgiXHRpbnQgLypsb25nKi8gYWRkcmVzczsiKTsKLQl9Ci0JcHVibGljIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljICIgKyBjbGFzc05hbWUgKyAiKGludCAvKmxvbmcqLyBhZGRyZXNzKSB7Iik7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQl3cml0ZUxpbmUoIlx0XHRzdXBlcihhZGRyZXNzKTsiKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlTGluZSgiXHRcdHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Iik7Ci0JCX0KLQkJd3JpdGVMaW5lKCJcdH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUFkZHJlc3NHZXR0ZXIoKSB7Ci0JCXdyaXRlTGluZSgiXHRwdWJsaWMgaW50IC8qbG9uZyovIGdldEFkZHJlc3MoKSB7Iik7Ci0JCXdyaXRlTGluZSgiXHRcdHJldHVybiB0aGlzLmFkZHJlc3M7Iik7Ci0JCXdyaXRlTGluZSgiXHR9Iik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlQ29uc3RhbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl3cml0ZUxpbmUoIlx0cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgIiArIG5hbWUgKyAiID0gIiArIHZhbHVlICsgIjsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZU1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIGludCBtZXRob2RJbmRleCwgU3RyaW5nW10gYXJnVHlwZXMsIFN0cmluZ1tdIGFyZ05hbWVzKSB7Ci0JCXdyaXRlKCJcdHB1YmxpYyBpbnQgIiArIG5hbWUgKyAiKCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZShhcmdUeXBlc1tpXSArICIgIiArIGFyZ05hbWVzW2ldKTsKLQkJCWlmIChpIDwgYXJnVHlwZXMubGVuZ3RoIC0gMSkKLQkJCQl3cml0ZSgiLCAiKTsKLQkJfQotCQl3cml0ZSgiKSB7Iik7Ci0JCXdyaXRlTGluZSgpOwotCQlTdHJpbmcgbGluZSA9ICJcdFx0cmV0dXJuIFhQQ09NLlZ0YmxDYWxsKCI7Ci0JCWlmICghcGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSBsaW5lICs9IHBhcmVudE5hbWUgKyAiLkxBU1RfTUVUSE9EX0lEICsgIiArIChtZXRob2RJbmRleCArIDEpICsgIiwgZ2V0QWRkcmVzcygpIjsKLQkJZWxzZSBsaW5lICs9IG1ldGhvZEluZGV4ICsgIiwgZ2V0QWRkcmVzcygpIjsgLy8gemVybyBpbmRleGVkCi0JCXdyaXRlKGxpbmUpOwotCQlpZiAoYXJnVHlwZXMubGVuZ3RoID4gMCkKLQkJCXdyaXRlKCIsICIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZShhcmdOYW1lc1tpXSk7Ci0JCQlpZiAoaSA8IGFyZ1R5cGVzLmxlbmd0aCAtIDEpCi0JCQkJd3JpdGUoIiwgIik7Ci0JCX0KLQkJd3JpdGVMaW5lKCIpOyIpOwotCQl3cml0ZUxpbmUoIlx0fSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NFbmQoKSB7Ci0JCXdyaXRlKCJ9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nVnRibENhbGwoU3RyaW5nW10gYXJnVHlwZXMpIHsKLQkJU3RyaW5nIHZ0YmwgPSAic3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgLypsb25nKi8gcHBWdGJsIjsKLQkJaWYgKGFyZ1R5cGVzLmxlbmd0aCA+IDApCi0JCQl2dGJsICs9ICIsICI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXZ0YmwgKz0gYXJnVHlwZXNbaV0gKyAiIGFyZyIgKyBpOwotCQkJaWYgKGkgPCBhcmdUeXBlcy5sZW5ndGggLSAxKQotCQkJCXZ0YmwgKz0gIiwgIjsKLQkJfQotCQl2dGJsICs9ICIpOyI7Ci0JCUludGVnZXIga2V5ID0gbmV3IEludGVnZXIoYXJnVHlwZXMubGVuZ3RoKTsKLQkJVmVjdG9yIGxpc3QgPSAoVmVjdG9yKSB2dGJscy5nZXQoa2V5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCXZ0YmxzLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWJvb2xlYW4gZHVwbGljYXRlID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uIGUgPSBsaXN0LmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICh2dGJsLmVxdWFscyhzKSkgewotCQkJCWR1cGxpY2F0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkdXBsaWNhdGUpCi0JCQlsaXN0LmFkZCh2dGJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvdXRwdXRWdGJsQ2FsbCgpIHsKLQkJRW51bWVyYXRpb24gZSA9IHZ0YmxzLmtleXMoKTsKLQkJaW50IG4gPSAwOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZS5uZXh0RWxlbWVudCgpOwotCQkJbisrOwotCQl9Ci0JCUludGVnZXJbXSBrZXlzID0gbmV3IEludGVnZXJbbl07Ci0JCWUgPSB2dGJscy5rZXlzKCk7Ci0JCW4gPSAwOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJa2V5c1tuXSA9IChJbnRlZ2VyKSBlLm5leHRFbGVtZW50KCk7Ci0JCQluKys7Ci0JCX0KLQkJQXJyYXlzLnNvcnQoa2V5cyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJVmVjdG9yIGxpc3QgPSAoVmVjdG9yKSB2dGJscy5nZXQoa2V5c1tpXSk7Ci0JCQlPYmplY3RbXSBlbHRzID0gKE9iamVjdFtdKSBsaXN0LnRvQXJyYXkoKTsKLQkJCUFycmF5cy5zb3J0KGVsdHMpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbHRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGVsdHNbal0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKiogUGFyc2luZyBpbnZva2luZyB3cml0ZSBjYWxsYmFja3MgKi8KLQotCS8qCi0JICogQ29udmVydCBhIEMgaGVhZGVyIGZpbGUgaW50byBhIEphdmEgc291cmNlIGZpbGUgbWF0Y2hpbmcgU1dUIE1vemlsbGEKLQkgYmluZGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdFBhdGgpIHsKLQkJaWYgKERFQlVHKSB3cml0ZUxpbmUoIioqKiBQQVJTSU5HIDwiK3NyYysiPiB0byBmb2xkZXIgIitkZXN0UGF0aCk7Ci0JCWIgPSBuZXcgU3RyaW5nW21heExpbmVzXTsKLQkJY250TGluZXMgPSAwOwotCQl0cnkgewotCQkJciA9IG5ldyBGaWxlUmVhZGVyKHNyYyk7Ci0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKLQkJCXdoaWxlICgoYltjbnRMaW5lc10gPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJY250TGluZXMrKzsKLQkJCX0KLQkJCWJyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbiA9IDA7Ci0JCWJvb2xlYW4gbG9va0ZvckNsYXNzZXMgPSB0cnVlOwotCQl3aGlsZSAobG9va0ZvckNsYXNzZXMpIHsJCi0JCQkvKiBwYXJzaW5nICovCi0JCQlsb29rRm9yQ2xhc3NlcyA9IHBhcnNlKCk7Ci0JCi0JCQlTdHJpbmcgZGVzdEZpbGUgPSBkZXN0UGF0aCArIGNsYXNzTmFtZSArICIuamF2YSI7Ci0JCQl0cnkgewotCQkJCXcgPSBuZXcgRmlsZVdyaXRlcihkZXN0RmlsZSk7Ci0JCQkJaWYgKERFQlVHKSB3cml0ZUxpbmUoIioqIENSRUFURUQgSkFWQSBGSUxFIDwiK2Rlc3RGaWxlKyI+Iik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQkvKiB3cml0aW5nICovCi0JCQl3cml0ZUNvcHlyaWdodHMoKTsKLQkJCXdyaXRlUGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCXdyaXRlQ2xhc3NEZWNsYXJhdGlvbihjbGFzc05hbWUsIHBhcmVudE5hbWUpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQl3cml0ZUxhc3RNZXRob2RJZChwYXJlbnROYW1lLCBuTWV0aG9kcyk7Ci0JCQl3cml0ZUxpbmUoKTsKLQkJCXdyaXRlSUlEKHV1aWROYW1lLCB1dWlkVmFsdWUpOwotCQkJd3JpdGVMaW5lKCk7Ci0JCQlpZiAocGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQkJd3JpdGVBZGRyZXNzRmllbGQoKTsKLQkJCQl3cml0ZUxpbmUoKTsKLQkJCX0KLQkJCXdyaXRlQ29uc3RydWN0b3IoY2xhc3NOYW1lLCBwYXJlbnROYW1lKTsKLQkJCXdyaXRlTGluZSgpOwotCQkJCi0JCQlpZiAocGFyZW50TmFtZS5lcXVhbHMoTk9fU1VQRVJfQ0xBU1MpKSB7Ci0JCQkJd3JpdGVBZGRyZXNzR2V0dGVyKCk7Ci0JCQkJd3JpdGVMaW5lKCk7Ci0JCQl9Ci0JCi0JCQlpbnQgY29uc3RhbnRJbmRleCA9IDAsIG1ldGhvZEluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYm9keU9yZGVyLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoYm9keU9yZGVyLmNoYXJBdChpKSA9PSAnQycpIHsKLQkJCQkJd3JpdGVDb25zdGFudChjb25zdGFudE5hbWVzW2NvbnN0YW50SW5kZXhdLAotCQkJCQkJCWNvbnN0YW50VmFsdWVzW2NvbnN0YW50SW5kZXhdKTsKLQkJCQkJaWYgKGkgPCBib2R5T3JkZXIubGVuZ3RoKCkgLSAxKSB3cml0ZUxpbmUoKTsKLQkJCQkJY29uc3RhbnRJbmRleCsrOwotCQkJCX0gZWxzZSBpZiAoYm9keU9yZGVyLmNoYXJBdChpKSA9PSAnTScpIHsKLQkJCQkJd3JpdGVNZXRob2QobWV0aG9kTmFtZXNbbWV0aG9kSW5kZXhdLCBwYXJlbnROYW1lLCBtZXRob2RJbmRleCwKLQkJCQkJCQlhcmdUeXBlc1ttZXRob2RJbmRleF0sIGFyZ05hbWVzW21ldGhvZEluZGV4XSk7Ci0JCQkJCWlmIChpIDwgYm9keU9yZGVyLmxlbmd0aCgpIC0gMSkgd3JpdGVMaW5lKCk7Ci0JCQkJCW1ldGhvZEluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQotCQkJd3JpdGVDbGFzc0VuZCgpOwotCQotCQkJdHJ5IHsKLQkJCQl3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZXMoKSB7Ci0JCXJldHVybiAicGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW96aWxsYTsiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcnNlKCkgewotCQlpZiAoIWp1bXBUb1V1aWREZWNsYXJhdGlvbigpKSByZXR1cm4gZmFsc2U7Ci0JCXV1aWROYW1lID0gZ2V0VXVpZE5hbWUoYltuXSk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVVVJRCBuYW1lOiA8IiArIHV1aWROYW1lICsgIj4iKTsKLQkJdXVpZFZhbHVlID0gZ2V0VXVpZFZhbHVlKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVVSUQgdmFsdWU6IDwiICsgdXVpZFZhbHVlICsgIj4iKTsKLQkJanVtcFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKLQkJY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZSBuYW1lOiA8IiArIGNsYXNzTmFtZSArICI+Iik7Ci0JCXBhcmVudE5hbWUgPSBnZXRQYXJlbnROYW1lKGJbbl0pOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhcmVudE5hbWU6IDwiICsgcGFyZW50TmFtZSArICI+Iik7Ci0JCXBhcnNlQm9keSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlib29sZWFuIGp1bXBUb1V1aWREZWNsYXJhdGlvbigpIHsKLQkJLy8ganVtcCB0byBsaW5lIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCQl3aGlsZSAoIShiW25dLnN0YXJ0c1dpdGgoIiNkZWZpbmUgIikgJiYgYltuXS5pbmRleE9mKCJfSUlEX1NUUiBcIiIpICE9IC0xKSkgewotCQkJbisrOwotCQkJaWYgKG4gPj0gY250TGluZXMpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvL2Fzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCS8vcmV0dXJucyBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSCi0JU3RyaW5nIGdldFV1aWROYW1lKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoIiNkZWZpbmUgIikKLQkJCQkrICIjZGVmaW5lICIubGVuZ3RoKCksIGRlY2xhcmF0aW9uLmluZGV4T2YoIiBcIiIpKTsKLQl9Ci0KLQkvL2Fzc3VtZSBhIGRlY2xhcmF0aW9uIG1hdGNoaW5nOiAiI2RlZmluZSBOU19JV0VCQlJPV1NFUkNIUk9NRV9JSURfU1RSICJiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMiIgotCS8vcmV0dXJucyBiYTQzNGM2MC05ZDUyLTExZDMtYWZiMC0wMGEwMjRmZmMwOGMKLQlTdHJpbmcgZ2V0VXVpZFZhbHVlKFN0cmluZyBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uc3Vic3RyaW5nKGRlY2xhcmF0aW9uLmluZGV4T2YoIl9JSURfU1RSIFwiIikKLQkJCQkrICJfSUlEX1NUUiBcIiIubGVuZ3RoKCksIGRlY2xhcmF0aW9uLmxhc3RJbmRleE9mKCciJykpOwotCX0KLQotCXZvaWQganVtcFRvSW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7Ci0JCS8vIGp1bXAgdG8gbGluZSBtYXRjaGluZzogImNsYXNzIE5TX05PX1ZUQUJMRSBuc0lXZWJCcm93c2VyQ2hyb21lIDogcHVibGljIG5zSVN1cHBvcnRzIHsiCi0JCXdoaWxlICghKGJbbl0uc3RhcnRzV2l0aCgiY2xhc3MgTlNfTk9fVlRBQkxFICIpKSkgewotCQkJbisrOwotCQl9Ci0JfQotCi0JLy8gYXNzdW1lIGEgZGVjbGFyYXRpb24gbWF0Y2hpbmc6ICJjbGFzcyBOU19OT19WVEFCTEUgbnNJV2ViQnJvd3NlckNocm9tZSA6IHB1YmxpYyBuc0lTdXBwb3J0cyB7IgotCS8vIHJldHVybnMgbnNJV2ViQnJvd3NlckNocm9tZQotCS8vIHNwZWNpYWwgY2FzZSBmb3IgbnNJU3VwcG9ydHMgdGhhdCBoYXMgbm8gc3VwZXIgY2xhc3M6IGNsYXNzIE5TX05PX1ZUQUJMRSBuc0lTdXBwb3J0cyB7Ci0JU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgZGVjbGFyYXRpb24pIHsKLQkJaW50IGVuZEluZGV4ID0gZGVjbGFyYXRpb24uaW5kZXhPZigiIDoiKTsKLQkJLy8gbnNJU3VwcG9ydHMgc3BlY2lhbCBjYXNlIChubyBzdXBlciBjbGFzcykKLQkJaWYgKGVuZEluZGV4ID09IC0xKSBlbmRJbmRleCA9IGRlY2xhcmF0aW9uLmluZGV4T2YoIiB7Iik7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5zdWJzdHJpbmcoZGVjbGFyYXRpb24uaW5kZXhPZigiY2xhc3MgTlNfTk9fVlRBQkxFICIpCi0JCQkJKyAiY2xhc3MgTlNfTk9fVlRBQkxFICIubGVuZ3RoKCksIGVuZEluZGV4KTsKLQl9Ci0KLQkvLyBhc3N1bWUgYSBkZWNsYXJhdGlvbiBtYXRjaGluZzogImNsYXNzIE5TX05PX1ZUQUJMRSBuc0lXZWJCcm93c2VyQ2hyb21lIDogcHVibGljIG5zSVN1cHBvcnRzIHsiCi0JLy8gcmV0dXJucyBuc0lTdXBwb3J0cwotCS8vIHNwZWNpYWwgY2FzZSBmb3IgbnNJU3VwcG9ydHMgdGhhdCBoYXMgbm8gc3VwZXIgY2xhc3M6IGNsYXNzIE5TX05PX1ZUQUJMRSBuc0lTdXBwb3J0cyB7Ci0JU3RyaW5nIGdldFBhcmVudE5hbWUoU3RyaW5nIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbi5pbmRleE9mKCIgOiIpID09IC0xKSByZXR1cm4gTk9fU1VQRVJfQ0xBU1M7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5zdWJzdHJpbmcoZGVjbGFyYXRpb24uaW5kZXhPZigiOiBwdWJsaWMgIikKLQkJCQkrICI6IHB1YmxpYyAiLmxlbmd0aCgpLCBkZWNsYXJhdGlvbi5pbmRleE9mKCIgeyIpKTsKLQl9Ci0KLQkvLyBwYXJzZSBtZXRob2RzIGFuZCBjb25zdGFudHMgZGVjbGFyYXRpb25zIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IGluZGV4Ci0JLy8gb3V0OgotCS8vIC5TdHJpbmcgYm9keSAtIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIGphdmEgY29udGVudAotCS8vIC5uIC0gc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGludGVyZmFjZSBib2R5IGRlY2xhcmF0aW9uICggbGluZSB3aXRoIHRoZSBlbmNsb3NpbmcgIn07IiApCi0JLy8gLm5NZXRob2RzICAgIC0gc2V0IHRvIHRoZSBudW1iZXIgb2YgbWV0aG9kcyBwYXJzZWQKLQl2b2lkIHBhcnNlQm9keSgpIHsKLQkJYm9keSA9ICIiOwotCQlib2R5T3JkZXIgPSAiIjsKLQkJaW50IG5Db25zdGFudHMgPSAwOwotCQluTWV0aG9kcyA9IDA7Ci0KLQkJaW50IHRtcF9uID0gbjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCB0eXBlID0ganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKTsKLQkJCWlmICh0eXBlID09IENPTlNUQU5UKQotCQkJCW5Db25zdGFudHMrKzsKLQkJCWlmICh0eXBlID09IE1FVEhPRCkKLQkJCQluTWV0aG9kcysrOwotCQkJaWYgKHR5cGUgPT0gRU5EX0JPRFkpCi0JCQkJYnJlYWs7Ci0JCQluKys7Ci0JCX0KLQkJbiA9IHRtcF9uOwotCQljb25zdGFudE5hbWVzID0gbmV3IFN0cmluZ1tuQ29uc3RhbnRzXTsKLQkJY29uc3RhbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW25Db25zdGFudHNdOwotCQltZXRob2ROYW1lcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdOwotCQlhcmdUeXBlcyA9IG5ldyBTdHJpbmdbbk1ldGhvZHNdW107Ci0JCWFyZ05hbWVzID0gbmV3IFN0cmluZ1tuTWV0aG9kc11bXTsKLQkJaW50IGNvbnN0YW50SW5kZXggPSAwLCBtZXRob2RJbmRleCA9IDA7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgdHlwZSA9IGp1bXBUb05leHRDb25zdGFudE9yTWV0aG9kKCk7Ci0JCQlpZiAodHlwZSA9PSBDT05TVEFOVCkgewotCQkJCXBhcnNlQ29uc3RhbnQoYltuXSwgY29uc3RhbnRJbmRleCk7Ci0JCQkJYm9keU9yZGVyICs9ICJDIjsKLQkJCQljb25zdGFudEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBNRVRIT0QpIHsKLQkJCQlwYXJzZU1ldGhvZChiW25dLCBtZXRob2RJbmRleCk7Ci0JCQkJbG9nVnRibENhbGwoYXJnVHlwZXNbbWV0aG9kSW5kZXhdKTsKLQkJCQlib2R5T3JkZXIgKz0gIk0iOwotCQkJCW1ldGhvZEluZGV4Kys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBFTkRfQk9EWSkKLQkJCQlyZXR1cm47Ci0JCQluKys7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgaW50IENPTlNUQU5UID0gMDsKLQotCXN0YXRpYyBpbnQgTUVUSE9EID0gMTsKLQotCXN0YXRpYyBpbnQgRU5EX0JPRFkgPSAyOwotCi0JYm9vbGVhbiBpc0VuZE9mSW50ZXJmYWNlQm9keSgpIHsKLQkJcmV0dXJuIGJbbl0uc3RhcnRzV2l0aCgifTsiKTsKLQl9Ci0KLQlpbnQganVtcFRvTmV4dENvbnN0YW50T3JNZXRob2QoKSB7Ci0JCXdoaWxlICghaXNFbmRPZkludGVyZmFjZUJvZHkoKSkgewotCQkJaWYgKGJbbl0uc3RhcnRzV2l0aCgiICBlbnVtIHsgIikpIHsKLQkJCQlyZXR1cm4gQ09OU1RBTlQ7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihiW25dKSAhPSAtMSkgewotCQkJCXJldHVybiBNRVRIT0Q7Ci0JCQl9Ci0JCQluKys7Ci0JCX0KLQkJcmV0dXJuIEVORF9CT0RZOwotCX0KLQotCXZvaWQgcGFyc2VDb25zdGFudChTdHJpbmcgY29uc3RhbnQsIGludCBjb25zdGFudEluZGV4KSB7Ci0JCVN0cmluZyBjb25zdGFudE5hbWUgPSBjb25zdGFudC5zdWJzdHJpbmcoY29uc3RhbnQuaW5kZXhPZigiIGVudW0geyAiKQotCQkJCSsgIiBlbnVtIHsgIi5sZW5ndGgoKSwgY29uc3RhbnQuaW5kZXhPZigiID0iKSk7Ci0JCWlmIChERUJVRykKLQkJCXdyaXRlTGluZSgiY29uc3RhbnROYW1lIDwiICsgY29uc3RhbnROYW1lICsgIj4iKTsKLQkJY29uc3RhbnROYW1lc1tjb25zdGFudEluZGV4XSA9IGNvbnN0YW50TmFtZTsKLQkJCi0JCS8vIG1vc3QgY29uc3RhbnRzIHZhbHVlcyBoYXZlIGEgdHJhaWxpbmcgVQotCQkvLyBlbnVtIHsgQVBQX1RZUEVfVU5LTk9XTiA9IDBVIH07Ci0JCWludCBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIlUgfTsiKTsKLQkJLy8gYSBmZXcgb3RoZXJzIGRvbid0Ci0JCS8vIGVudW0geyBFTlVNRVJBVEVfRk9SV0FSRFMgPSAwIH07CQkKLQkJaWYgKGVuZEluZGV4ID09IC0xKSBlbmRJbmRleCA9IGNvbnN0YW50LmluZGV4T2YoIiB9OyIpOwotCQlTdHJpbmcgY29uc3RhbnRWYWx1ZSA9IGNvbnN0YW50LnN1YnN0cmluZyhjb25zdGFudC5pbmRleE9mKCIgPSAiKQotCQkJCSsgIiA9ICIubGVuZ3RoKCksIGVuZEluZGV4KTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJjb25zdGFudFZhbHVlIDwiICsgY29uc3RhbnRWYWx1ZSArICI+Iik7Ci0JCWNvbnN0YW50VmFsdWVzW2NvbnN0YW50SW5kZXhdID0gY29uc3RhbnRWYWx1ZTsKLQl9Ci0KLQkvLyBOU19JTUVUSE9EIFNldFN0YXR1cyhQUlVpbnQzMiBzdGF0dXNUeXBlLCBjb25zdCBQUlVuaWNoYXIgKnN0YXR1cykgPSAwOwotCS8vIGlkZW50aWZ5OgotCS8vIG1ldGhvZCBuYW1lOiA8U2V0U3RhdHVzPgotCS8vIE5iciBvZiBhcmd1bWVudHM6IDIKLQkvLyBUeXBlIG9mIGFyZ3VtZW50IDA6IFBSVWludDMyCi0JLy8gTmFtZSBvZiBhcmd1bWVudCAwOiBzdGF0dXNUeXBlCi0JLy8gVHlwZSBvZiBhcmd1bWVudCAxOiBjb25zdCBQUlVuaWNoYXIgKgotCS8vIE5hbWUgb2YgYXJndW1lbnQgMTogc3RhdHVzCi0Jdm9pZCBwYXJzZU1ldGhvZChTdHJpbmcgbGluZSwgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBzdGFydCA9IG1ldGhvZE5hbWVTdGFydEluZGV4T2YobGluZSk7Ci0JCWludCBlbmQgPSBtZXRob2ROYW1lRW5kSW5kZXhPZihsaW5lKTsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBsaW5lLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJaWYgKERFQlVHKQotCQkJd3JpdGVMaW5lKCJtZXRob2QgbmFtZTogPCIgKyBtZXRob2ROYW1lICsgIj4iKTsKLQkJbWV0aG9kTmFtZXNbbWV0aG9kSW5kZXhdID0gbWV0aG9kTmFtZTsKLQkJaW50IGFyZ1N0YXJ0ID0gZW5kKyIoIi5sZW5ndGgoKTsKLQkJaW50IGFyZ0VuZCA9IGxpbmUuaW5kZXhPZigiKSIsIGFyZ1N0YXJ0KTsKLQkJcGFyc2VBcmdzKGxpbmUuc3Vic3RyaW5nKGFyZ1N0YXJ0LCBhcmdFbmQpLCBtZXRob2RJbmRleCk7Ci0JfQotCi0JLy8gR2l2ZW4gYSBsaW5lLCByZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kIG5hbWUgb3IgLTEKLQkvLyBpZiB0aGUgbGluZSBkb2VzIG5vdCBjb250YWluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgotCWludCBtZXRob2ROYW1lU3RhcnRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkVGT1JFX01FVEhPRF9OQU1FLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoQkVGT1JFX01FVEhPRF9OQU1FW2ldKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgcmV0dXJuIGluZGV4ICsgQkVGT1JFX01FVEhPRF9OQU1FW2ldLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JaW50IG1ldGhvZE5hbWVFbmRJbmRleE9mKFN0cmluZyBsaW5lKSB7Ci0JCWludCBzdGFydEluZGV4ID0gbWV0aG9kTmFtZVN0YXJ0SW5kZXhPZihsaW5lKTsKLQkJcmV0dXJuIGxpbmUuaW5kZXhPZigiKCIsIHN0YXJ0SW5kZXgpOwotCX0KLQl2b2lkIHBhcnNlQXJncyhTdHJpbmcgYXJncywgaW50IG1ldGhvZEluZGV4KSB7Ci0JCWludCBuQXJncyA9IC0xOwotCQkvLyBtZXRob2RzIHdpdGggbm8gYXJncyBsb29rIGxpa2U6ICgpIG9yICh2b2lkKQotCQlTdHJpbmdbXSBub0FyZ3MgPSBuZXcgU3RyaW5nW10geyAiIiwgInZvaWQiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJncy5lcXVhbHMobm9BcmdzW2ldKSkgewotCQkJCW5BcmdzID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobkFyZ3MgPT0gLTEpCi0JCQluQXJncyA9IGNvdW50KGFyZ3MsICIsICIpICsgMTsKLQkJU3RyaW5nW10gYXJnVHlwZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdUeXBlc1ttZXRob2RJbmRleF0gPSBhcmdUeXBlczsKLQkJU3RyaW5nW10gYXJnTmFtZXMgPSBuZXcgU3RyaW5nW25BcmdzXTsKLQkJdGhpcy5hcmdOYW1lc1ttZXRob2RJbmRleF0gPSBhcmdOYW1lczsKLQkJaW50IHR5cGVTdGFydCA9IDA7Ci0KLQkJLy8gbmFtZSBpcyBzZXBhcmF0ZWQgZnJvbSBpdHMgdHlwZSBieSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyAoc29ydGVkIGJ5IGRlY3JlYXNpbmcgc2l6ZSB0byBmaW5kIHRoZSBtb3N0IGNvbXBsZXRlIHBhdHRlcm4gKi8KLQkJU3RyaW5nW10gdHlwZU5hbWVTZXAgPSBuZXcgU3RyaW5nW10geyAiICogKiIsICIgKioiLCAiICogJiAiLCAiICogIiwgIiAqIiwKLQkJCQkiICYgIiwgIiAiIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkFyZ3M7IGkrKykgewotCQkJLyogZ2V0IHRoZSB0eXBlICovCi0JCQlpbnQgbmV4dFR5cGVTdGFydCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgdHlwZVN0YXJ0KQotCQkJCQkrICIsICIubGVuZ3RoKCkgOiBhcmdzLmxlbmd0aCgpOwotCQkJaW50IHR5cGVOYW1lU2VwSW5kZXggPSAwOwotCQkJaW50IHNlcGFyYXRvckluZGV4ID0gMDsKLQkJCWZvciAoOyB0eXBlTmFtZVNlcEluZGV4IDwgdHlwZU5hbWVTZXAubGVuZ3RoOyB0eXBlTmFtZVNlcEluZGV4KyspIHsKLQkJCQlzZXBhcmF0b3JJbmRleCA9IGFyZ3MuaW5kZXhPZih0eXBlTmFtZVNlcFt0eXBlTmFtZVNlcEluZGV4XSwKLQkJCQkJCXR5cGVTdGFydCk7Ci0JCQkJaWYgKHNlcGFyYXRvckluZGV4ICE9IC0xICYmIHNlcGFyYXRvckluZGV4IDwgbmV4dFR5cGVTdGFydCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gdHlwZU5hbWVTZXBbdHlwZU5hbWVTZXBJbmRleF07Ci0JCQlhcmdUeXBlc1tpXSA9IGdldEMySmF2YVR5cGUoYXJncy5zdWJzdHJpbmcodHlwZVN0YXJ0LAotCQkJCQlzZXBhcmF0b3JJbmRleCArIHNlcGFyYXRvci5sZW5ndGgoKSkpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIHR5cGUiICsgaSArICI6IDwiICsgYXJnVHlwZXNbaV0gKyAiPiIpOwotCQkJLyogZ2V0IHRoZSBuYW1lICovCi0JCQlpbnQgbmFtZVN0YXJ0ID0gc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCQlpbnQgbmFtZUVuZCA9IGkgPCBuQXJncyAtIDEgPyBhcmdzLmluZGV4T2YoIiwgIiwgbmFtZVN0YXJ0KSA6IGFyZ3MKLQkJCQkJLmxlbmd0aCgpOwotCQkJYXJnTmFtZXNbaV0gPSBhcmdzLnN1YnN0cmluZyhuYW1lU3RhcnQsIG5hbWVFbmQpOwotCQkJaWYgKERFQlVHKQotCQkJCXdyaXRlTGluZSgiYXJnIG5hbWUiICsgaSArICI6IDwiICsgYXJnTmFtZXNbaV0gKyAiPiIpOwotCi0JCQl0eXBlU3RhcnQgPSBuZXh0VHlwZVN0YXJ0OwotCQl9Ci0JfQotCi0JU3RyaW5nIGdldEMySmF2YVR5cGUoU3RyaW5nIGNUeXBlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVFlQRVNfQzJKQVZBLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY1R5cGUuaW5kZXhPZihUWVBFU19DMkpBVkFbaV1bMF0pICE9IC0xKQotCQkJCXJldHVybiBUWVBFU19DMkpBVkFbaV1bMV07Ci0JCX0KLQkJcmV0dXJuICIhRVJST1IgVU5LTk9XTiBDIFRZUEUgPCIgKyBjVHlwZSArICI+ISI7Ci0JfQotCi0JLy8gaG93IG1hbnkgdGltZXMgcGFydCBjYW4gYmUgZm91bmQgaW4gcwotCXN0YXRpYyBpbnQgY291bnQoU3RyaW5nIHMsIFN0cmluZyBwYXJ0KSB7Ci0JCWludCBpbmRleCA9IC0xLCBjbnQgPSAwOwotCQl3aGlsZSAoKGluZGV4ID0gcy5pbmRleE9mKHBhcnQsIGluZGV4ICsgMSkpICE9IC0xKQotCQkJY250Kys7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBDT1BZUklHSFRTID0KLQkJIi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKipcclxuIgotCQkrICIgKiBWZXJzaW9uOiBNUEwgMS4xXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb25cclxuIgotCQkrICIgKiAxLjEgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxyXG4iCi0JCSsgIiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuIgotCQkrICIgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9cclxuIgotCQkrICIgKlxyXG4iCi0JCSsgIiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcclxuIgotCQkrICIgKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2VcclxuIgotCQkrICIgKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZVxyXG4iCi0JCSsgIiAqIExpY2Vuc2UuXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZSwgcmVsZWFzZWQgTWFyY2ggMzEsIDE5OTguXHJcbiIKLQkJKyAiICpcclxuIgotCQkrICIgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXNcclxuIgotCQkrICIgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi5cclxuIgotCQkrICIgKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IE5ldHNjYXBlIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OVxyXG4iCi0JCSsgIiAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuIgotCQkrICIgKlxyXG4iIAotCQkrICIgKiBDb250cmlidXRvcihzKTpcclxuIiAKLQkJKyAiICpcclxuIiAKLQkJKyAiICogSUJNXHJcbiIKLQkJKyAiICogLSAgQmluZGluZyB0byBwZXJtaXQgaW50ZXJmYWNpbmcgYmV0d2VlbiBNb3ppbGxhIGFuZCBTV1RcclxuIgotCQkrICIgKiAtICBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4iCi0JCSsgIiAqXHJcbiIgKyAiICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8iOwotCi0Jc3RhdGljIFN0cmluZyBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm1vemlsbGE7IjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvTmF0aXZlU3RhdHMvb3JnL2VjbGlwc2Uvc3d0L3Rvb2xzL2ludGVybmFsL05hdGl2ZVN0YXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3OTZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9OYXRpdmVTdGF0cy9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvTmF0aXZlU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRvb2xzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgTmF0aXZlU3RhdHMgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogMSkgQ29tcGlsZSB0aGUgU1dUIG5hdGl2ZSBsaWJyYXJpZXMgZGVmaW5pbmcgdGhlIE5BVElWRV9TVEFUUyBmbGFnIChpLmUuIHVuY29tbWVudCBsaW5lIGluIG1ha2VmaWxlKS4KLSAqIDIpIEFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXJvdW5kIHRoZSBzZWN0aW9ucyBvZiBpbnRlcmVzdCB0byBkdW1wIHRoZQotICogbmF0aXZlIGNhbGxzIGRvbmUgaW4gdGhhdCBzZWN0aW9uLgotICogCi0gKiAJCU5hdGl2ZVN0YXRzIHN0YXRzID0gbmV3IE5hdGl2ZVN0YXRzKCk7Ci0gKiAJCS4uLgotICogCQk8Y29kZSBzZWN0aW9uPgotICogCQkuLi4KLSAqIAkJc3RhdHMuZHVtcERpZmYoU3lzdGVtLm91dCk7Ci0gKiAKLSAqIDMpIE9yIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUgYXQgYSBnaXZlbiBwb2ludCB0byBkdW1wIGEgc25hcHNob3Qgb2YKLSAqIHRoZSBuYXRpdmUgY2FsbHMgZG9uZSB1bnRpbCB0aGF0IHBvaW50LgotICogCi0gKiAJCW5ldyBOYXRpdmVTdGF0cygpLmR1bXBTbmFwc2hvdChTeXN0ZW0ub3V0KTsgCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTdGF0cyB7Ci0JCi0JSGFzaHRhYmxlIHNuYXBzaG90OwotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjbGFzc2VzID0gbmV3IFN0cmluZ1tdeyJPUyIsICJBVEsiLCAiQ0RFIiwgIkdOT01FIiwgIkdUSyIsICJYUENPTSIsICJDT00iLCAiQUdMIiwgIkdkaXAiLCAiR0xYIiwgIkNhaXJvIiwgIldHTCJ9OwotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOYXRpdmVGdW5jdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlTdHJpbmcgbmFtZTsKLQkJaW50IGNhbGxDb3VudDsKLQkJCi0JcHVibGljIE5hdGl2ZUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY2FsbENvdW50KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY2FsbENvdW50ID0gY2FsbENvdW50OwotCX0KLQotCXZvaWQgc3VidHJhY3QoTmF0aXZlRnVuY3Rpb24gZnVuYykgewotCQl0aGlzLmNhbGxDb3VudCAtPSBmdW5jLmNhbGxDb3VudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhbGxDb3VudCgpIHsKLQkJcmV0dXJuIGNhbGxDb3VudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgZnVuYykgewotCQlyZXR1cm4gKChOYXRpdmVGdW5jdGlvbilmdW5jKS5jYWxsQ291bnQgLSBjYWxsQ291bnQ7Ci0JfQotCX0KLQkKLXB1YmxpYyBOYXRpdmVTdGF0cygpIHsKLQlzbmFwc2hvdCA9IHNuYXBzaG90KCk7Ci19Ci0JCi1wdWJsaWMgSGFzaHRhYmxlIGRpZmYoKSB7Ci0JSGFzaHRhYmxlIG5ld1NuYXBzaG90ID0gc25hcHNob3QoKTsKLQlFbnVtZXJhdGlvbiBrZXlzID0gbmV3U25hcHNob3Qua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkJTmF0aXZlRnVuY3Rpb25bXSBuZXdGdW5jcyA9IChOYXRpdmVGdW5jdGlvbltdKW5ld1NuYXBzaG90LmdldChjbGFzc05hbWUpOwotCQlOYXRpdmVGdW5jdGlvbltdIGZ1bmNzID0gKE5hdGl2ZUZ1bmN0aW9uW10pc25hcHNob3QuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChmdW5jcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0Z1bmNzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3RnVuY3NbaV0uc3VidHJhY3QoZnVuY3NbaV0pOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBuZXdTbmFwc2hvdDsKLX0KLQotcHVibGljIHZvaWQgZHVtcERpZmYoUHJpbnRTdHJlYW0gcHMpIHsKLQlkdW1wKGRpZmYoKSwgcHMpOwotfQotCi1wdWJsaWMgdm9pZCBkdW1wU25hcHNob3QoUHJpbnRTdHJlYW0gcHMpIHsKLQlkdW1wKHNuYXBzaG90KCksIHBzKTsKLX0KLQotcHVibGljIHZvaWQgZHVtcFNuYXBzaG90KFN0cmluZyBjbGFzc05hbWUsIFByaW50U3RyZWFtIHBzKSB7Ci0JSGFzaHRhYmxlIHNuYXBzaG90ID0gbmV3IEhhc2h0YWJsZSgpOwotCXNuYXBzaG90KGNsYXNzTmFtZSwgc25hcHNob3QpOwotCWR1bXAoY2xhc3NOYW1lLCAoTmF0aXZlRnVuY3Rpb25bXSlzbmFwc2hvdC5nZXQoY2xhc3NOYW1lKSwgcHMpOwotfQotCi1wdWJsaWMgdm9pZCBkdW1wKEhhc2h0YWJsZSBzbmFwc2hvdCwgUHJpbnRTdHJlYW0gcHMpIHsKLQlFbnVtZXJhdGlvbiBrZXlzID0gc25hcHNob3Qua2V5cygpOwotCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkJZHVtcChjbGFzc05hbWUsIChOYXRpdmVGdW5jdGlvbltdKXNuYXBzaG90LmdldChjbGFzc05hbWUpLCBwcyk7Ci0JfQotfQotCQotdm9pZCBkdW1wKFN0cmluZyBjbGFzc05hbWUsIE5hdGl2ZUZ1bmN0aW9uW10gZnVuY3MsIFByaW50U3RyZWFtIHBzKSB7Ci0JaWYgKGZ1bmNzID09IG51bGwpIHJldHVybjsKLQlBcnJheXMuc29ydChmdW5jcyk7Ci0JaW50IHRvdGFsID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSsrKSB7Ci0JCU5hdGl2ZUZ1bmN0aW9uIGZ1bmMgPSBmdW5jc1tpXTsKLQkJdG90YWwgKz0gZnVuYy5nZXRDYWxsQ291bnQoKTsKLQl9Ci0JcHMucHJpbnQoY2xhc3NOYW1lKTsKLQlwcy5wcmludCgiPSIpOwotCXBzLnByaW50KHRvdGFsKTsKLQlwcy5wcmludGxuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7IGkrKykgewotCQlOYXRpdmVGdW5jdGlvbiBmdW5jID0gZnVuY3NbaV07Ci0JCWlmIChmdW5jLmdldENhbGxDb3VudCgpID4gMCkgewotCQkJcHMucHJpbnQoIlx0Iik7Ci0JCQlwcy5wcmludChmdW5jLmdldE5hbWUoKSk7Ci0JCQlwcy5wcmludCgiPSIpOwotCQkJcHMucHJpbnQoZnVuYy5nZXRDYWxsQ291bnQoKSk7Ci0JCQlwcy5wcmludGxuKCk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCXNuYXBzaG90ID0gc25hcHNob3QoKTsgCi19Ci0KLXB1YmxpYyBIYXNodGFibGUgc25hcHNob3QoKSB7Ci0JSGFzaHRhYmxlIHNuYXBzaG90ID0gbmV3IEhhc2h0YWJsZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3Nlc1tpXTsKLQkJc25hcHNob3QoY2xhc3NOYW1lLCBzbmFwc2hvdCk7Ci0JfQotCXJldHVybiBzbmFwc2hvdDsKLX0KLQotcHVibGljIEhhc2h0YWJsZSBzbmFwc2hvdChTdHJpbmcgY2xhc3NOYW1lLCBIYXNodGFibGUgc25hcHNob3QpIHsKLQl0cnkgewotCQlDbGFzcyBjbGF6eiA9IGdldENsYXNzKCk7Ci0JCU1ldGhvZCBmdW5jdGlvbkNvdW50ID0gY2xhenouZ2V0TWV0aG9kKGNsYXNzTmFtZSArICJfR2V0RnVuY3Rpb25Db3VudCIsIG5ldyBDbGFzc1swXSk7Ci0JCU1ldGhvZCBmdW5jdGlvbkNhbGxDb3VudCA9IGNsYXp6LmdldE1ldGhvZChjbGFzc05hbWUgKyAiX0dldEZ1bmN0aW9uQ2FsbENvdW50IiwgbmV3IENsYXNzW117aW50LmNsYXNzfSk7Ci0JCU1ldGhvZCBmdW5jdGlvbk5hbWUgPSBjbGF6ei5nZXRNZXRob2QoY2xhc3NOYW1lICsgIl9HZXRGdW5jdGlvbk5hbWUiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3N9KTsKLQkJaW50IGNvdW50ID0gKChJbnRlZ2VyKWZ1bmN0aW9uQ291bnQuaW52b2tlKGNsYXp6LCBuZXcgT2JqZWN0WzBdKSkuaW50VmFsdWUoKTsKLQkJTmF0aXZlRnVuY3Rpb25bXSBmdW5jcyA9IG5ldyBOYXRpdmVGdW5jdGlvbltjb3VudF07Ci0JCU9iamVjdFtdIGluZGV4ID0gbmV3IE9iamVjdFsxXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbmRleFswXSA9IG5ldyBJbnRlZ2VyKGkpOwotCQkJaW50IGNhbGxDb3VudCA9ICgoSW50ZWdlcilmdW5jdGlvbkNhbGxDb3VudC5pbnZva2UoY2xhenosIGluZGV4KSkuaW50VmFsdWUoKTsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylmdW5jdGlvbk5hbWUuaW52b2tlKGNsYXp6LCBpbmRleCk7Ci0JCQlmdW5jc1tpXSA9IG5ldyBOYXRpdmVGdW5jdGlvbihuYW1lLCBjYWxsQ291bnQpOwotCQl9Ci0JCXNuYXBzaG90LnB1dChjbGFzc05hbWUsIGZ1bmNzKTsKLQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotLy8JCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCX0KLQlyZXR1cm4gc25hcHNob3Q7Ci19Ci0JCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgT1NfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIE9TX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IE9TX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBBVEtfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEFUS19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBBVEtfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFHTF9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgQUdMX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEFHTF9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDREVfR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ0RFX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHZGlwX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBHZGlwX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdkaXBfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdMWF9HZXRGdW5jdGlvbkNvdW50KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgR0xYX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdMWF9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR05PTUVfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEdOT01FX0dldEZ1bmN0aW9uTmFtZShpbnQgaW5kZXgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEdOT01FX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHVEtfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIEdUS19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBHVEtfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFhQQ09NX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBYUENPTV9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBYUENPTV9HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ09NX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDT01fR2V0RnVuY3Rpb25OYW1lKGludCBpbmRleCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgQ09NX0dldEZ1bmN0aW9uQ2FsbENvdW50KGludCBpbmRleCk7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBXR0xfR2V0RnVuY3Rpb25Db3VudCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIFdHTF9HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBXR0xfR2V0RnVuY3Rpb25DYWxsQ291bnQoaW50IGluZGV4KTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IENhaXJvX0dldEZ1bmN0aW9uQ291bnQoKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIFN0cmluZyBDYWlyb19HZXRGdW5jdGlvbk5hbWUoaW50IGluZGV4KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDYWlyb19HZXRGdW5jdGlvbkNhbGxDb3VudChpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9TbGVhay9vcmcvZWNsaXBzZS9zd3QvdG9vbHMvaW50ZXJuYWwvU2xlYWsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMzNWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL1NsZWFrL29yZy9lY2xpcHNlL3N3dC90b29scy9pbnRlcm5hbC9TbGVhay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudG9vbHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGUgU2xlYWsgdG9vbCB3aXRoIGEgc3RhbmRsYW9uZSBTV1QgZXhhbXBsZToKLSAqIAotICogTW9kaWZ5IHRoZSBtYWluIG1ldGhvZCBiZWxvdyB0byBsYXVuY2ggeW91ciBhcHBsaWNhdGlvbi4KLSAqIFJ1biBTbGVhay4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2xlYWsgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlMaXN0IGxpc3Q7Ci0JQ2FudmFzIGNhbnZhczsKLQlCdXR0b24gc3RhcnQsIHN0b3AsIGNoZWNrOwotCVRleHQgdGV4dDsKLQlMYWJlbCBsYWJlbDsKLQkKLQlPYmplY3QgW10gb2xkT2JqZWN0cyA9IG5ldyBPYmplY3QgWzBdOwotCUVycm9yIFtdIG9sZEVycm9ycyA9IG5ldyBFcnJvciBbMF07Ci0JT2JqZWN0IFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0IFswXTsKLQlFcnJvciBbXSBlcnJvcnMgPSBuZXcgRXJyb3IgWzBdOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEZXZpY2VEYXRhIGRhdGEgPSBuZXcgRGV2aWNlRGF0YSgpOwotCWRhdGEudHJhY2tpbmcgPSB0cnVlOwotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5IChkYXRhKTsKLQlTbGVhayBzbGVhayA9IG5ldyBTbGVhayAoKTsKLQlzbGVhay5vcGVuICgpOwotCQotCS8vIExhdW5jaCB5b3UgYXBwbGljYXRpb24gaGVyZQotCS8vIGUuZy4JCQotLy8JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0vLwlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLS8vCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCA1MCk7Ci0vLwlidXR0b24xLnNldFRleHQoIkhlbGxvIFdvcmxkIik7Ci0vLwlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAyMCwgMjApOwotLy8JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0vLwlidXR0b24yLnNldEJvdW5kcygxMCwgNzAsIDEwMCwgNTApOwotLy8JYnV0dG9uMi5zZXRJbWFnZShpbWFnZSk7Ci0vLwlzaGVsbC5vcGVuKCk7Ci0JCi0Jd2hpbGUgKCFzbGVhay5zaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQkKLXZvaWQgb3BlbiAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIlMtTGVhayIpOwotCWxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaE9iamVjdCAoKTsKLQkJfQotCX0pOwotCXRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlwYWludENhbnZhcyAoZXZlbnQpOwotCQl9Ci0JfSk7Ci0JY2hlY2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQljaGVjay5zZXRUZXh0ICgiU3RhY2siKTsKLQljaGVjay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXRvZ2dsZVN0YWNrVHJhY2UgKCk7Ci0JCX0KLQl9KTsKLQlzdGFydCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jc3RhcnQuc2V0VGV4dCAoIlNuYXAiKTsKLQlzdGFydC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlyZWZyZXNoQWxsICgpOwotCQl9Ci0JfSk7Ci0Jc3RvcCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jc3RvcC5zZXRUZXh0ICgiRGlmZiIpOwotCXN0b3AuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVmcmVzaERpZmZlcmVuY2UgKCk7Ci0JCX0KLQl9KTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQgKCIwIG9iamVjdChzKSIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJbGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0JY2hlY2suc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JdGV4dC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2l6ZS54IC8gMiwgc2l6ZS55IC8gMik7Ci0Jc2hlbGwub3BlbiAoKTsKLX0KLQotdm9pZCByZWZyZXNoTGFiZWwgKCkgewotCWludCBjb2xvcnMgPSAwLCBjdXJzb3JzID0gMCwgZm9udHMgPSAwLCBnY3MgPSAwLCBpbWFnZXMgPSAwLCByZWdpb25zID0gMDsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQlPYmplY3Qgb2JqZWN0ID0gb2JqZWN0cyBbaV07Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xvcikgY29sb3JzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXJzb3IpIGN1cnNvcnMrKzsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpIGZvbnRzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBHQykgZ2NzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbWFnZSkgaW1hZ2VzKys7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdpb24pIHJlZ2lvbnMrKzsKLQl9Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmIChjb2xvcnMgIT0gMCkgc3RyaW5nICs9IGNvbG9ycyArICIgQ29sb3IocylcbiI7Ci0JaWYgKGN1cnNvcnMgIT0gMCkgc3RyaW5nICs9IGN1cnNvcnMgKyAiIEN1cnNvcihzKVxuIjsKLQlpZiAoZm9udHMgIT0gMCkgc3RyaW5nICs9IGZvbnRzICsgIiBGb250KHMpXG4iOwotCWlmIChnY3MgIT0gMCkgc3RyaW5nICs9IGdjcyArICIgR0MocylcbiI7Ci0JaWYgKGltYWdlcyAhPSAwKSBzdHJpbmcgKz0gaW1hZ2VzICsgIiBJbWFnZShzKVxuIjsKLQlpZiAocmVnaW9ucyAhPSAwKSBzdHJpbmcgKz0gcmVnaW9ucyArICIgUmVnaW9uKHMpXG4iOwotCWlmIChzdHJpbmcubGVuZ3RoICgpICE9IDApIHsKLQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyAoMCwgc3RyaW5nLmxlbmd0aCAoKSAtIDEpOwotCX0KLQlsYWJlbC5zZXRUZXh0IChzdHJpbmcpOwotfQotCi12b2lkIHJlZnJlc2hEaWZmZXJlbmNlICgpIHsKLQlEZXZpY2VEYXRhIGluZm8gPSBkaXNwbGF5LmdldERldmljZURhdGEgKCk7Ci0JaWYgKCFpbmZvLnRyYWNraW5nKSB7Ci0JCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJZGlhbG9nLnNldFRleHQgKHNoZWxsLmdldFRleHQgKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSAoIldhcm5pbmc6IERldmljZSBpcyBub3QgdHJhY2tpbmcgcmVzb3VyY2UgYWxsb2NhdGlvbiIpOwotCQlkaWFsb2cub3BlbiAoKTsKLQl9Ci0JT2JqZWN0IFtdIG5ld09iamVjdHMgPSBpbmZvLm9iamVjdHM7Ci0JRXJyb3IgW10gbmV3RXJyb3JzID0gaW5mby5lcnJvcnM7Ci0JT2JqZWN0IFtdIGRpZmZPYmplY3RzID0gbmV3IE9iamVjdCBbbmV3T2JqZWN0cy5sZW5ndGhdOwotCUVycm9yIFtdIGRpZmZFcnJvcnMgPSBuZXcgRXJyb3IgW25ld0Vycm9ycy5sZW5ndGhdOwotCWludCBjb3VudCA9IDA7Ci0JZm9yIChpbnQgaT0wOyBpPG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWlmIChuZXdPYmplY3RzIFtpXSA9PSBvbGRPYmplY3RzIFtpbmRleF0pIGJyZWFrOwotCQkJaW5kZXgrKzsKLQkJfQotCQlpZiAoaW5kZXggPT0gb2xkT2JqZWN0cy5sZW5ndGgpIHsKLQkJCWRpZmZPYmplY3RzIFtjb3VudF0gPSBuZXdPYmplY3RzIFtpXTsKLQkJCWRpZmZFcnJvcnMgW2NvdW50XSA9IG5ld0Vycm9ycyBbaV07Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCW9iamVjdHMgPSBuZXcgT2JqZWN0IFtjb3VudF07Ci0JZXJyb3JzID0gbmV3IEVycm9yIFtjb3VudF07Ci0JU3lzdGVtLmFycmF5Y29weSAoZGlmZk9iamVjdHMsIDAsIG9iamVjdHMsIDAsIGNvdW50KTsKLQlTeXN0ZW0uYXJyYXljb3B5IChkaWZmRXJyb3JzLCAwLCBlcnJvcnMsIDAsIGNvdW50KTsKLQlsaXN0LnJlbW92ZUFsbCAoKTsKLQl0ZXh0LnNldFRleHQgKCIiKTsKLQljYW52YXMucmVkcmF3ICgpOwotCWZvciAoaW50IGk9MDsgaTxvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3QuYWRkIChvYmplY3ROYW1lIChvYmplY3RzIFtpXSkpOwotCX0KLQlyZWZyZXNoTGFiZWwgKCk7Ci0JbGF5b3V0ICgpOwotfQotCi1TdHJpbmcgb2JqZWN0TmFtZSAoT2JqZWN0IG9iamVjdCkgewotCVN0cmluZyBzdHJpbmcgPSBvYmplY3QudG9TdHJpbmcgKCk7Ci0JaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mICgnLicpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIHN0cmluZzsKLQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyAoaW5kZXggKyAxLCBzdHJpbmcubGVuZ3RoICgpKTsKLX0KLQotdm9pZCB0b2dnbGVTdGFja1RyYWNlICgpIHsKLQlyZWZyZXNoT2JqZWN0ICgpOwotCWxheW91dCAoKTsKLX0KLQotdm9pZCBwYWludENhbnZhcyAoRXZlbnQgZXZlbnQpIHsKLQljYW52YXMuc2V0Q3Vyc29yIChudWxsKTsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCUdDIGdjID0gZXZlbnQuZ2M7Ci0JT2JqZWN0IG9iamVjdCA9IG9iamVjdHMgW2luZGV4XTsKLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sb3IpIHsKLQkJaWYgKCgoQ29sb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWdjLnNldEJhY2tncm91bmQgKChDb2xvcikgb2JqZWN0KTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSAoY2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1cnNvcikgewotCQlpZiAoKChDdXJzb3Ipb2JqZWN0KS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCWNhbnZhcy5zZXRDdXJzb3IgKChDdXJzb3IpIG9iamVjdCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbnQpIHsKLQkJaWYgKCgoRm9udClvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJZ2Muc2V0Rm9udCAoKEZvbnQpIG9iamVjdCk7Ci0JCUZvbnREYXRhIFtdIGFycmF5ID0gZ2MuZ2V0Rm9udCAoKS5nZXRGb250RGF0YSAoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQlTdHJpbmcgbGYgPSB0ZXh0LmdldExpbmVEZWxpbWl0ZXIgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcnJheS5sZW5ndGg7IGkrKykgewotCQkJRm9udERhdGEgZGF0YSA9IGFycmF5IFtpXTsKLQkJCVN0cmluZyBzdHlsZSA9ICJOT1JNQUwiOwotCQkJaW50IGJpdHMgPSBkYXRhLmdldFN0eWxlICgpOwotCQkJaWYgKGJpdHMgIT0gMCkgewotCQkJCWlmICgoYml0cyAmIFNXVC5CT0xEKSAhPSAwKSBzdHlsZSA9ICJCT0xEICI7Ci0JCQkJaWYgKChiaXRzICYgU1dULklUQUxJQykgIT0gMCkgc3R5bGUgKz0gIklUQUxJQyI7Ci0JCQl9Ci0JCQlzdHJpbmcgKz0gZGF0YS5nZXROYW1lICgpICsgIiAiICsgZGF0YS5nZXRIZWlnaHQgKCkgKyAiICIgKyBzdHlsZSArIGxmOwotCQl9Ci0JCWdjLmRyYXdTdHJpbmcgKHN0cmluZywgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JLy9OT1RISU5HIFRPIERSQVcgRk9SIEdDCi0vLwlpZiAob2JqZWN0IGluc3RhbmNlb2YgR0MpIHsKLS8vCQlyZXR1cm47Ci0vLwl9Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCWlmICgoKEltYWdlKW9iamVjdCkuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQlnYy5kcmF3SW1hZ2UgKChJbWFnZSkgb2JqZWN0LCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVnaW9uKSB7Ci0JCWlmICgoKFJlZ2lvbilvYmplY3QpLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJU3RyaW5nIHN0cmluZyA9ICgoUmVnaW9uKW9iamVjdCkuZ2V0Qm91bmRzKCkudG9TdHJpbmcoKTsKLQkJZ2MuZHJhd1N0cmluZyAoc3RyaW5nLCAwLCAwKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotdm9pZCByZWZyZXNoT2JqZWN0ICgpIHsKLQlpbnQgaW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCWlmIChjaGVjay5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gKCk7Ci0JCVByaW50U3RyZWFtIHMgPSBuZXcgUHJpbnRTdHJlYW0gKHN0cmVhbSk7Ci0JCWVycm9ycyBbaW5kZXhdLnByaW50U3RhY2tUcmFjZSAocyk7Ci0JCXRleHQuc2V0VGV4dCAoc3RyZWFtLnRvU3RyaW5nICgpKTsKLQkJdGV4dC5zZXRWaXNpYmxlICh0cnVlKTsKLQkJY2FudmFzLnNldFZpc2libGUgKGZhbHNlKTsKLQl9IGVsc2UgewotCQljYW52YXMuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCXRleHQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCQljYW52YXMucmVkcmF3ICgpOwotCX0KLX0KLQotdm9pZCByZWZyZXNoQWxsICgpIHsKLQlvbGRPYmplY3RzID0gbmV3IE9iamVjdCBbMF07Ci0Jb2xkRXJyb3JzID0gbmV3IEVycm9yIFswXTsKLQlyZWZyZXNoRGlmZmVyZW5jZSAoKTsKLQlvbGRPYmplY3RzID0gb2JqZWN0czsKLQlvbGRFcnJvcnMgPSBlcnJvcnM7Ci19Ci0KLXZvaWQgbGF5b3V0ICgpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JaW50IHdpZHRoID0gMDsKLQlTdHJpbmcgW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotCUdDIGdjID0gbmV3IEdDIChsaXN0KTsKLQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgZ2Muc3RyaW5nRXh0ZW50IChpdGVtcyBbaV0pLngpOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCVBvaW50IHNpemUxID0gc3RhcnQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTIgPSBzdG9wLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IHNpemUzID0gY2hlY2suY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZTQgPSBsYWJlbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQl3aWR0aCA9IE1hdGgubWF4IChzaXplMS54LCBNYXRoLm1heCAoc2l6ZTIueCwgTWF0aC5tYXggKHNpemUzLngsIHdpZHRoKSkpOwotCXdpZHRoID0gTWF0aC5tYXggKDY0LCBNYXRoLm1heCAoc2l6ZTQueCwgbGlzdC5jb21wdXRlU2l6ZSAod2lkdGgsIFNXVC5ERUZBVUxUKS54KSk7Ci0Jc3RhcnQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCwgc2l6ZTEueSk7Ci0Jc3RvcC5zZXRCb3VuZHMgKDAsIHNpemUxLnksIHdpZHRoLCBzaXplMi55KTsKLQljaGVjay5zZXRCb3VuZHMgKDAsIHNpemUxLnkgKyBzaXplMi55LCB3aWR0aCwgc2l6ZTMueSk7Ci0JbGFiZWwuc2V0Qm91bmRzICgwLCByZWN0LmhlaWdodCAtIHNpemU0LnksIHdpZHRoLCBzaXplNC55KTsKLQlpbnQgaGVpZ2h0ID0gc2l6ZTEueSArIHNpemUyLnkgKyBzaXplMy55OwotCWxpc3Quc2V0Qm91bmRzICgwLCBoZWlnaHQsIHdpZHRoLCByZWN0LmhlaWdodCAtIGhlaWdodCAtIHNpemU0LnkpOwotCXRleHQuc2V0Qm91bmRzICh3aWR0aCwgMCwgcmVjdC53aWR0aCAtIHdpZHRoLCByZWN0LmhlaWdodCk7Ci0JY2FudmFzLnNldEJvdW5kcyAod2lkdGgsIDAsIHJlY3Qud2lkdGggLSB3aWR0aCwgcmVjdC5oZWlnaHQpOwotfQotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjIzNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QudG9vbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5zd3R0b29scy5qYXI9Sk5JIEdlbmVyYXRpb24vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdmYzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IFNXVCBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC50b29scy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQxNGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0LnRvb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC50b29scyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIgZXhwb3J0PSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvd2lkZ2V0cy9UYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKaW5kZXggNjg1OTgxOS4uZGViNTJlOSAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAlpbnQgaXRlbUNvdW50LCBjb2x1bW5Db3VudCwgY29sdW1uX2lkLCBpZENvdW50LCBhbmNob3JGaXJzdCwgYW5jaG9yTGFzdCwgaGVhZGVySGVpZ2h0LCBpdGVtSGVpZ2h0LCBsYXN0SW5kZXhPZjsKIAlib29sZWFuICBpZ25vcmVTZWxlY3QsIHdhc1NlbGVjdGVkLCBmaXhTY3JvbGxXaWR0aCwgZHJhd0JhY2tncm91bmQ7CiAJUmVjdGFuZ2xlIGltYWdlQm91bmRzOwotCWludCBzaG93SW5kZXgsIGxhc3RIaXR0ZXN0LCBsYXN0SGl0dGVzdENvbHVtbjsKKwlpbnQgc2hvd0luZGV4LCBsYXN0SGl0dGVzdDsKIAlzdGF0aWMgZmluYWwgaW50IENIRUNLX0NPTFVNTl9JRCA9IDEwMjQ7CiAJc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQgPSAxMDI1OwogCXN0YXRpYyBmaW5hbCBpbnQgR1JJRF9XSURUSCA9IDE7CkBAIC0xNDQwLDggKzE0NDAsOSBAQAogCVJlY3QgcmVjdCA9IG5ldyBSZWN0ICgpOwogCW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uUG9pbnQgcHQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5Qb2ludCAoKTsKIAlPUy5TZXRQdCAocHQsIChzaG9ydCkgcG9pbnQueCwgKHNob3J0KSBwb2ludC55KTsKLQlpZiAoMCA8IGxhc3RIaXR0ZXN0ICYmIGxhc3RIaXR0ZXN0IDw9IGl0ZW1Db3VudCAmJiBsYXN0SGl0dGVzdENvbHVtbiAhPSAwKSB7Ci0JCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGxhc3RIaXR0ZXN0LCBsYXN0SGl0dGVzdENvbHVtbiwgT1Mua0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0LCByZWN0KSA9PSBPUy5ub0VycikgeworCWludCBjb2x1bW5JZCA9IChjb2x1bW5Db3VudCA9PSAwKSA/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+TGF5b3V0czwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGxheW91dHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGxheW91dC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlMYXlvdXRFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IExheW91dEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM5YWYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3NzFjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTM6NDUgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWYwYWUwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQotc291cmNlLnBhaW50LmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ4ZTdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBQYWludCBUb29sPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBQYWludCBUb29sPC9oMj4KLQotPHA+CQotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNXVCBncmFwaGljcyBvcGVyYXRpb25zIGluIHRoZSBmb3JtIG9mIGEKLXJ1ZGltZW50YXJ5IGJpdG1hcCBwYWludGluZyBwcm9ncmFtLiAgVGhlIFBhaW50IFRvb2wgaW1wbGVtZW50YXRpb24gYWxzbyAKLWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgCi10aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdXNlciBpbnB1dC4KLTwvcD4KLTxwPgkKLVNlbGVjdCBhIHRvb2wgd2l0aCB3aGljaCB0byBkcmF3IGluIHRoZSBkcmF3aW5nIGFyZWEuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdG9vbHMKLXRvIGNob29zZSBmcm9tIG9uIHRoZSB0b29sYmFyLiAgVG8gY2hhbmdlIHRoZSBjb2xvciBzZWxlY3Rpb24sIGNsaWNrIG9uIGEgY29sb3IgaW4gdGhlCi1wYWxldHRlIGJlbG93IHRoZSBkcmF3aW5nIGFyZWE7IGxlZnQtY2xpY2sgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCByaWdodC1jbGljayB0byBzZXQgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPk90aGVyPC9zdHJvbmc+LiAgCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdAotdGhlIHZpZXcgbmFtZWQgPHN0cm9uZz5QYWludDwvc3Ryb25nPi4gQSB2aWV3IGNvbnRhaW5pbmcgdGhlIHBhaW50IHByb2dyYW0gd2lsbCBhcHBlYXIuCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9pY29ucy9wYWludF9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9pY29ucy9wYWludF9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk0NWRkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkNzg3NTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RQYWludEV4YW1wbGUubmFtZSA9IFNXVCBQYWludCBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5QYWludEV4YW1wbGUubmFtZSA9IFBhaW50Ci0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLm5hbWUgPSBQYWludAotbGF1bmNoaXRlbS5QYWludEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNXVCBncmFwaGljcyBvcGVyYXRpb25zIGluIHRoZSBmb3JtIG9mIGEgXAotCXJ1ZGltZW50YXJ5IGJpdG1hcCBwYWludGluZyBwcm9ncmFtLiAgVGhlIEFpcmJydXNoIFRvb2wgaW1wbGVtZW50YXRpb24gYWxzbyBcCi0JZGVtb25zdHJhdGVzIGEgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyB0aW1lZCBHVUkgb3BlcmF0aW9ucyBpbiB0aGUgYmFja2dyb3VuZCBcCi0JdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuXG5cblwKLQlTZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzIFwKLQl0byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZSBcCi0JcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOiBsZWZ0LWNsaWNrIGZvciB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgZm9yIHRoZSBcCi0JYmFja2dyb3VuZCBjb2xvci5cblxuXAotCVVzZXMgU1dUJ3MgR0MgYW5kIEZvbnREaWFsb2csIGFuZCBKRmFjZSdzIElucHV0RGlhbG9nIGFuZCBhY3Rpb24gc2V0IHN1cHBvcnQuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3N2I5NmI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQiCi0gICBuYW1lPSIlcGx1Z2luLlNXVFBhaW50RXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGFpbnQuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuUGFpbnRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYWludF9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LlBhaW50VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYWludF9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5QYWludEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQxZGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5NDM3ZmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBQYWludFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBQYWludCBwbHVnaW4uCi0JICovCi0JcHVibGljIFBhaW50UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdG8gdGhlIElMb2cgZm9yIHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHRleHQKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBhc3NvY2lhdGVkIGV4Y2VwdGlvbiwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKAotCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjUwZjQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotCi0vKioKLSAqIFRoZSB2aWV3IGZvciB0aGUgcGFpbnQgYXBwbGljYXRpb24uCi0gKiBBbGwgcmVuZGVyaW5nIGhhcHBlbnMgaW5zaWRlIHRoZSBhcmVhIGNyZWF0ZWQgYnkgY3JlYXRlUGFydENvbnRyb2woKS4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCVBhaW50RXhhbXBsZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUGFpbnQgdmlldy4KLQkgKi8KLQlwdWJsaWMgUGFpbnRWaWV3KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUuCi0JICogCi0JICogQHNlZSBWaWV3UGFydCNjcmVhdGVQYXJ0Q29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5zdGFuY2UgPSBuZXcgUGFpbnRFeGFtcGxlKHBhcmVudCk7Ci0JCWluc3RhbmNlLmNyZWF0ZUdVSShwYXJlbnQpOwotCi0JCS8qKiogQWRkIHRvb2xiYXIgY29udHJpYnV0aW9ucyAqKiovCi0JCWZpbmFsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xiYXJNYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQlUb29sIHRvb2xzW10gPSBQYWludEV4YW1wbGUudG9vbHM7Ci0JCVN0cmluZyBncm91cCA9IHRvb2xzWzBdLmdyb3VwOwotCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKGdyb3VwKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyBpKyspIHsKLQkJCVRvb2wgdG9vbCA9IHRvb2xzW2ldOwotCQkJaWYgKCF0b29sLmdyb3VwLmVxdWFscyhncm91cCkpIHsKLQkJCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQl0b29sYmFyTWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKHRvb2wuZ3JvdXApKTsKLQkJCX0KLQkJCWdyb3VwID0gdG9vbC5ncm91cDsKLQkJCVBhaW50QWN0aW9uIGFjdGlvbiA9IG5ldyBQYWludEFjdGlvbih0b29sKTsKLQkJCXRvb2xiYXJNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoZ3JvdXAsIGFjdGlvbik7Ci0JCQlpZiAoaSA9PSBQYWludEV4YW1wbGUuRGVmYXVsdF90b29sIHx8IGkgPT0gUGFpbnRFeGFtcGxlLkRlZmF1bHRfZmlsbCB8fCBpID09IFBhaW50RXhhbXBsZS5EZWZhdWx0X2xpbmVzdHlsZSkgewotCQkJCWFjdGlvbi5zZXRDaGVja2VkKHRydWUpOwotCQkJfQotCQl9Ci0JCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCi0JCWluc3RhbmNlLnNldERlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IHdlJ3JlIHVzaW5nCi0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlLmdldERpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gd2UgbXVzdCBncmFiIGZvY3VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydCNzZXRGb2N1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpbnN0YW5jZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEFjdGlvbiBzZXQgZ2x1ZS4KLQkgKi8KLQljbGFzcyBQYWludEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByaXZhdGUgaW50IHN0eWxlOwotCQlwcml2YXRlIFJ1bm5hYmxlIGFjdGlvbjsKLQkJcHVibGljIFBhaW50QWN0aW9uKFRvb2wgdG9vbCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBpZCA9IHRvb2wuZ3JvdXAgKyAnLicgKyB0b29sLm5hbWU7Ci0JCQlzZXRJZChpZCk7Ci0JCQlzdHlsZSA9IHRvb2wudHlwZSA9PSBTV1QuUkFESU8gPyBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTiA6IElBY3Rpb24uQVNfUFVTSF9CVVRUT047Ci0JCQlhY3Rpb24gPSB0b29sLmFjdGlvbjsKLQkJCXNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGlkICsgIi5sYWJlbCIpKTsKLQkJCXNldFRvb2xUaXBUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIudG9vbHRpcCIpKTsKLQkJCXNldERlc2NyaXB0aW9uKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIuZGVzY3JpcHRpb24iKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKAotCQkJCQlQYWludEV4YW1wbGUuY2xhc3MsCi0JCQkJCVBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIuaW1hZ2UiKSkpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7IHJldHVybiBzdHlsZTsgfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7IGFjdGlvbi5ydW4oKTsgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3NzI1OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTc1NzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE0OjMxOjM3IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0YjA1NzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHN3dGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5zd3RleGFtcGxlcy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDRjMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQWRkcmVzcyBCb29rIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gQWRkcmVzcyBCb29rPC9oMj4KLQotPHA+Ci1UaGUgQWRkcmVzc0Jvb2sgZXhhbXBsZSBzaG93cyBob3cgYSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvCi1wcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuIFRoZSBhcHBsaWNhdGlvbiBjYW4gc2F2ZSBhbmQgbG9hZCBkYXRhIAotZnJvbSBhIGZpbGUsIHNvcnQgdGhlIGVudHJpZXMsIGFuZCBzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QWRkcmVzcyBCb29rPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5M2EzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBCcm93c2VyPC9oMj4KLQotPHA+Ci1UaGUgQnJvd3NlciBFeGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi1JdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwgYW5kIHNvbWUKLWFkZGl0aW9uYWwgd2lkZ2V0cyB0byBpbXBsZW1lbnQgYWN0aW9ucyBjb21tb25seSBmb3VuZCBvbiBicm93c2VycyAodG9vbGJhcgotd2l0aCBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wIGJ1dHRvbnMsIHN0YXR1cyBiYXIgZXRjLikuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlckV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+V2ViIEJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY2xpcGJvYXJkX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NsaXBib2FyZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJlOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY2xpcGJvYXJkX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDbGlwYm9hcmQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBDbGlwYm9hcmQ8L2gyPgotCi08cD4KLVRoZSBDbGlwYm9hcmQgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgY2xpcGJvYXJkIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4gIFRoZSBleGFtcGxlIGNhbgotY3V0LCBjb3B5IGFuZCBwYXN0ZSB1c2luZyBUZXh0LCBSVEYsIEhUTUwgYW5kIEZpbGUgdHJhbnNmZXIgdHlwZXMuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLkNsaXBib2FyZEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q2xpcGJvYXJkPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJlNzhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIENvbnRyb2xzIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Db250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmMjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDdXN0b20gQ29udHJvbHM8L2gyPgotCi08cD4KLVRoZSBDdXN0b20gQ29udHJvbHMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGVtdWxhdGVkIFNXVCBjb250cm9scy4gCi1JdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIHVzZXIgCi10byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IGVtdWxhdGVkIGNvbnRyb2wuCi1UaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyBlYWNoIGNvbnRyb2wuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9kbmRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYWE1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRHJhZyBhbmQgRHJvcCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIERyYWcgYW5kIERyb3A8L2gyPgotCi08cD4KLVRoZSBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGRhdGEgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLiAgVGhlIGV4YW1wbGUgY2FuCi1kcmFnIGFuZCBkcm9wIHVzaW5nIFRleHQsIFJURiwgSFRNTCBhbmQgRmlsZSB0cmFuc2ZlciB0eXBlcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuRE5ERXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5EcmFnIGFuZCBEcm9wPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9maWxldmlld2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyMWNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEZpbGUgVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gRmlsZSBWaWV3ZXI8L2gyPgotCi08cD4KLVRoZSBGaWxlIFZpZXdlciBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSBhcHBsaWNhdGlvbiBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgU1dULgotVGhpcyBhcHBsaWNhdGlvbiBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBuYXZpZ2F0ZSBmaWxlcyBhbmQgZm9sZGVycyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYW5kIG1hbmlwdWxhdGUgdGhlbSB1c2luZyBkcmFnIGFuZCBkcm9wLgotSXQgdXNlcyBhbHRlcm5hdGUgdGhyZWFkcyBmb3IgbG9uZyBhY3Rpb25zIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgVHJlZSwKLVRhYmxlLCBhbmQgVG9vbGJhciB3aWRnZXRzIGFuZCB0aGUgUHJvZ3JhbSBjbGFzcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyLkZpbGVWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+RmlsZSBWaWV3ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hlbGxvd29ybGRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2VjN2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSGVsbG8gV29ybGQgRXhhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSGVsbG8gV29ybGQ8L2gyPgotCi08cD4KLVRoZSBIZWxsbyBXb3JsZCBleGFtcGxlcyBhcmUgYSBzZXQgb2YgaW50cm9kdWN0b3J5IGV4YW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gZ2V0IHN0YXJ0ZWQgCi1vbiBjcmVhdGluZyBhbiBhcHBsaWNhdGlvbiB3aXRoIFNXVC4gIFRoZXkgY292ZXIgdGhlIGNyZWF0aW9uIG9mIGEgc2hlbGwsIHRoZSB1c2Ugb2YgZXZlbnQgbGlzdGVuZXJzLCAKLXVzaW5nIGxheW91dHMsIHByb2Nlc3NpbmcgZXZlbnRzIGluIGFuIGV2ZW50IGxvb3AsIGFuZCBkcmF3aW5nIHdpdGggYSBHcmFwaGljcyBDb250ZXh0LgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMTwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG9wZW4gYSBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMjwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSBvZiB0aGUgU2hlbGwuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCAzPC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBsaXN0ZW5lciBtZWNoYW5pc20gdG8gcmVzaXplIHRoZSBMYWJlbAotd2hlbiB0aGUgU2hlbGwgc2l6ZSBjaGFuZ2VzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgNDwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgTGF5b3V0IHRvIHJlc2l6ZSB0aGUgTGFiZWwKLXdoZW4gdGhlIFNoZWxsIHNpemUgY2hhbmdlcy4KLTwvcD4KLQotPGg0PkhlbGxvIFdvcmxkIDU8L2g0PgotPHA+Ci1UaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLW9uIGFuIFNXVCBDb250cm9sIHVzaW5nIGEgR3JhcGhpY3MgQ29udGV4dC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZFsxLTVdPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IG9uZSBvZiB0aGUgPHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPiBpdGVtcyBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9ob3ZlcmhlbHBfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ViODliMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSG92ZXIgSGVscCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIEhvdmVyIEhlbHA8L2gyPgotCi08cD4KLVRoZSBIb3ZlciBIZWxwIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBjdXN0b20gdG9vbHRpcHMgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydAotb24gdmFyaW91cyBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLgotVG8gc2VlIHRoZSBjdXN0b20gdG9vbHRpcHMgaW4gYWN0aW9uLCBob3ZlciBvdmVyIGFuIGl0ZW0gb3IgYnV0dG9uIGluIHRoZSBVSSwgYW5kCi1ub3RpY2UgdGhhdCBpbWFnZXMgYXBwZWFyIGluIHRoZSBsZWZ0LWhhbmQgY29ybmVyIG9mIHRoZSB0b29sdGlwLgotVG8gc2VlIHRoZSBjdXN0b20gaG92ZXIgaGVscCBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJIHVudGlsCi10aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQuICBUaGVuLCB3aXRob3V0IG1vdmluZyB0aGUgbW91c2UsIHByZXNzIDxzdHJvbmc+RjE8L3N0cm9uZz4gYW5kIGEgbmV3Ci1TaGVsbCB3aWxsIGJlIHNob3duIHdpdGggdGhlIGV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50LgotPC9wPgkKLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHAuSG92ZXJIZWxwPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkhvdmVyIEhlbHA8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ltYWdlYW5hbHl6ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTg0Y2RhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSW1hZ2UgQW5hbHl6ZXIgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBJbWFnZSBBbmFseXplcjwvaDI+Ci0KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgZXhhbXBsZSBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlaXIgdmlzdWFsIGNvbnRlbnRzIGFuZAotYW4gaW1hZ2UgZGF0YSBzdW1tYXJ5LgotVGhlIHVzZXIgY2FuIG1ha2UgYWRqdXN0bWVudHMgdG8gdmFyaW91cyBlbGVtZW50cyBvZiB0aGUgaW1hZ2Ugc3VjaCBhcyBzY2FsaW5nIGFuZCBBbHBoYQotYmxlbmRpbmcsIGFuZCBjYW4gc2F2ZSB0aGVzZSBjaGFuZ2VzIHRvIGEgZmlsZS4KLTwvcD4KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgY2FuIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBhbmQgUE5HLgotSWYgYSBsb2FkZWQgZmlsZSBpcyBhbiBpbnRlcmxhY2VkIEdJRiBvciBQTkcsIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIDxzdHJvbmc+SW5jcmVtZW50YWwgRGlzcGxheTwvc3Ryb25nPiBpcyBzZWxlY3RlZCwKLXRoZW4gdGhlIEltYWdlQW5hbHl6ZXIgd2lsbCBkaXNwbGF5IHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGxvYWRlZC4KLUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgPHN0cm9uZz5OZXh0PC9zdHJvbmc+LCA8c3Ryb25nPlByZXZpb3VzPC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5BbmltYXRlPC9zdHJvbmc+IGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsCi1hbmQgY2FuIGJlIHVzZWQgdG8gY3ljbGUgdGhyb3VnaCBhbmQgYW5pbWF0ZSB0aGUgaW1hZ2VzIGluIHRoZSBmaWxlLiBJZiBhIEdJRiBkZWZpbmVzIGEgYmFja2dyb3VuZCBjb2xvciwKLWFzIG1hbnkgYW5pbWF0ZWQgR0lGcyBkbywgdGhlbiBzZWxlY3RpbmcgPHN0cm9uZz5CYWNrZ3JvdW5kPC9zdHJvbmc+IHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLgotSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIHdoaWNoIGlzIHBvc3NpYmxlIHdpdGggaW1hZ2VzIG9mIHR5cGUgR0lGLCBQTkcsIGFuZCBJQ08sIHRoZW4gc2VsZWN0aW5nIDxzdHJvbmc+RGlzcGxheSBNYXNrPC9zdHJvbmc+IHdpbGwgZHJhdyB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kKLW1hc2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbWFnZS4gWW91IGNhbiBjaGFuZ2UgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIEltYWdlQW5hbHl6ZXIgaW4gb3JkZXIgdG8gc2VlIHRoZSB0cmFuc3BhcmVuY3kgd29yay4KLVRvIHR1cm4gb2ZmIHRyYW5zcGFyZW5jeSwgZGVzZWxlY3QgPHN0cm9uZz5EaXNwbGF5IFRyYW5zcGFyZW5jeTwvc3Ryb25nPi4KLUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCB3aXRoIHRoZSA8c3Ryb25nPlNjYWxlPC9zdHJvbmc+IGNvbWJvLCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkIHRvIGl0IHVzaW5nIHRoZSA8c3Ryb25nPkFscGhhLUs8L3N0cm9uZz4gY29tYm8KLWFuZCA8c3Ryb25nPkFscGhhPC9zdHJvbmc+IG1lbnUuIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UmVvcGVuPC9zdHJvbmc+IHJlc3RvcmVzIHRoZSBzY2FsaW5nIGFuZCBhbHBoYSBhdHRyaWJ1dGVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFuZCByZWxvYWRzIHRoZSBjdXJyZW50IGltYWdlIGZpbGUuCi1JZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSwKLTxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+U2F2ZSBNYXNrIEFzLi4uPC9zdHJvbmc+IGNhbiBiZSB1c2VkIHRvIHNhdmUgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suCi08L3A+Ci08cD4KLVdoZW4gU1dUIGxvYWRzIGFuIGltYWdlIGZpbGUsIGFuIGluc3RhbmNlIG9mIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE8L2NvZGU+IGlzIGNyZWF0ZWQgKHRob3VnaCBpbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvcgotbXVsdGktaW1hZ2UgR0lGIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSA8Y29kZT5JbWFnZURhdGE8L2NvZGU+Ci1pbnN0YW5jZShzKSBmb3IgdGhlIGN1cnJlbnRseSBsb2FkZWQgaW1hZ2UgZmlsZSwgaW5jbHVkaW5nIHRoZSBwaXhlbCBkYXRhLiBIb3ZlcmluZyBvdmVyIGEgcGl4ZWwgaW4gdGhlIGltYWdlIGRpc3BsYXkgd2lsbCBzaG93IHRoZSBSR0IKLWNvbG9yIGRhdGEgZm9yIHRoYXQgcGl4ZWwuIEZvciBjZXJ0YWluIGltYWdlcywgcGFydGljdWxhcmx5IGFuaW1hdGVkIEdJRnMsIGFkZGl0aW9uYWwgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjwvY29kZT4KLWluc3RhbmNlIHRoYXQgaXMgdXNlZCB0byBsb2FkIHRoZSBpbWFnZS4gVGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgdGhpcyBkYXRhIGFzIHdlbGwuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLkltYWdlQW5hbHl6ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SW1hZ2UgQW5hbHl6ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2phdmF2aWV3ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDFlNzczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSmF2YSBTeW50YXggVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSmF2YSBTeW50YXggVmlld2VyPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBhIHVzZXItZGVmaW5lZCBsaW5lIHN0eWxlciBmb3IgdGhlIFN0eWxlZFRleHQgd2lkZ2V0LgotVGhlIGV4YW1wbGUgcHJvdmlkZXMgYSB0eXBpY2FsIGVkaXRvciBpbnRlcmZhY2UuCi1UbyBzZWUgdGhlIGVmZmVjdCBvZiB0aGUgbGluZSBzdHlsZXIsIG9wZW4gYSAqLmphdmEgZmlsZSwgYW5kCi13aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgZGlzcGxheWVkIGluIHRoZSBlZGl0b3IgYXJlYSwgbm90aWNlIHRoYXQgdGhlIGtleXdvcmRzIGhhdmUgYmVlbiBoaWdobGlnaHRlZC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SmF2YSBTeW50YXggVmlld2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiYzgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEV4YW1wbGUgTGF1bmNoZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvaDI+Ci0KLTxwPgotVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIFdvcmtiZW5jaCB2aWV3cyAKLW9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotPC9wPgotCi08dWw+Ci08bGk+V29ya2JlbmNoIHZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIGxhdW5jaGVyCi1zdGFydHMgYSBXb3JrYmVuY2ggdmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotPGxpPlN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLTwvdWw+Ci0KLTxwPgotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gdGhlIHN0YW5kYWxvbmUgZXhhbXBsZXMgd2l0aG91dCB0aGUgU1dUIEV4YW1wbGUgTGF1bmNoZXIsIAotcmVmZXIgdG8gPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU4OWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5MYXlvdXRzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwNThlZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFNldHVwPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2gyPgotCi08aDM+QWRkaW5nIFNXVCB0byB5b3VyIHdvcmtzcGFjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBTV1QgZm9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLiAgQSBzdGFuZGFsb25lIHZlcnNpb24gb2YgU1dUIGlzIGF2YWlsYWJsZSAKLW9uIHRoZSBzYW1lIGRvd25sb2FkIHBhZ2UgYXMgdGhlIEVjbGlwc2UgU0RLLiAgTG9vayBmb3IgdGhlIHNlY3Rpb24gdGl0bGVkIAotPHN0cm9uZz5TV1QgQmluYXJ5IGFuZCBTb3VyY2U8L3N0cm9uZz4uICBEbyBub3QgZXh0cmFjdCB0aGUgYXJjaGl2ZSBmaWxlLCBqdXN0IHNhdmUgaXQgdG8gZGlzay4KLTxsaT5TZWxlY3QgPHN0cm9uZz5JbXBvcnQuLi48L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5GaWxlPC9zdHJvbmc+IG1lbnUuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5FeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5TZWxlY3QgYXJjaGl2ZSBmaWxlOjwvc3Ryb25nPiBhbmQgdXNlIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24gdG8gbG9jYXRlIHRoZSBTV1QgCi1zdGFuZGFsb25lIGFyY2hpdmUgeW91IGhhdmUgcHJldmlvdXNseSBkb3dubG9hZGVkLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC9vbD4KLQotPGgzPkltcG9ydGluZyBleGFtcGxlIHNvdXJjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgRWNsaXBzZSBFeGFtcGxlIFBsdWctaW5zLiAgVGhlIEVjbGlwc2UgRXhhbXBsZSBQbHVnLWlucyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzYW1lCi1kb3dubG9hZCBwYWdlIGFzIHRoZSBFY2xpcHNlIFNESy4gIExvb2sgZm9yIHRoZSBzZWN0aW9uIHRpdGxlZCA8c3Ryb25nPkV4YW1wbGUgUGx1Zy1pbnM8L3N0cm9uZz4uCi1Zb3UgY2FuIGluc3RhbGwgdGhlIGV4YW1wbGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHlvdSBpbnN0YWxsZWQgRWNsaXBzZSBvciB5b3UgY2FuIGNob29zZQotYSBkaWZmZXJlbnQgbG9jYXRpb24uICBJZiB5b3UgaW5zdGFsbCB0aGUgZXhhbXBsZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgRWNsaXBzZSwgdGhlIGV4YW1wbGUgdmlld3MgCi1hbmQgZWRpdG9ycyB3aWxsIHNob3cgdXAgaW4geW91ciBFY2xpcHNlIGVudmlyb25tZW50IChlLmcuIDxzdHJvbmc+V2luZG93cyAmZ3Q7IFNob3cgVmlldyAuLi4gJmd0OyBPdGhlciAuLi4gJmd0OyBTV1QgRXhhbXBsZXM8L3N0cm9uZz4KLUlmIHRoZSBTV1QgZXhhbXBsZSB2aWV3cyBkbyBub3QgYXBwZWFyIHJpZ2h0IGF3YXkgaW4geW91ciBtZW51LCByZXN0YXJ0IGVjbGlwc2Ugd2l0aCB0aGUgPHN0cm9uZz4tY2xlYW48L3N0cm9uZz4gYXJndW1lbnQpLgotVGhpcyBpcyBmaW5lIGJ1dCBpdCBpcyBub3QgbmVjZXNzYXJ5LgotPGxpPlNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IFByb2plY3QgLi4uPC9zdHJvbmc+IGZyb20gdGhlIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiBtZW51LgotPGxpPlNlbGVjdCA8c3Ryb25nPkphdmEgUHJvamVjdDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBqYXZhIHByb2plY3QgYSBuYW1lIHN1Y2ggYXMgIlNXVCBFeGFtcGxlcyIuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5DcmVhdGUgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+QnJvd3NlIC4uLjwvc3Ryb25nPiAKLWJ1dHRvbiB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnk6Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Y29kZT5lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLnNvdXJjZV8zLjEuMC9zcmMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzXzMuMS4wPC9jb2RlPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPk5leHQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+UHJvamVjdHM8L3N0cm9uZz4gdGFiIGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+UGxhY2UgYSBjaGVjayBiZXNpZGUgPHN0cm9uZz5vcmcuZWNsaXBzZS5zd3Q8L3N0cm9uZz4gYW5kIGNsaWNrIG9uIHRoZSA8c3Ryb25nPk9LPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvb2w+Ci0KLTxwPkF0IHRoaXMgcG9pbnQgeW91ciBTV1QgZXhhbXBsZXMgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IGVycm9ycy4gIENoZWNrIHRoZSA8c3Ryb25nPlByb2JsZW1zPC9zdHJvbmc+IAotdmlldyBmb3IgZXJyb3JzLiAgSWYgeW91IGdldCBhbiBlcnJvciBsaWtlICI8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBub3QgZm91bmQiIGl0IG1lYW5zIAoteW91IGhhdmUgbm90IGNvbmZpZ3VyZWQgYSBKUkUuICBHbyB0byB0aGUgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlByZWZlcmVuY2VzIC4uLjwvc3Ryb25nPiBkaWFsb2cKLWFuZCBzZWxlY3QgdGhlIDxzdHJvbmc+SmF2YTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SW5zdGFsbGVkIEpSRXM8L3N0cm9uZz4gcHJlZmVyZW5jZSBwYWdlLiAgRW5zdXJlIHRoYXQgYSBKUkUgaXMgaW5zdGFsbGVkIAotYW5kIHRoYXQgdGhlIHBhdGggdG8gdGhlIEpSRSBpcyBjb3JyZWN0LjwvcD4KLQotPGgzPjxhIE5BTUU9IlJ1biI+PC9hPlJ1bm5pbmcgdGhlIEV4YW1wbGU8L2gzPgotCi08cD5Ob3cgeW91IGNhbiBydW4gdGhlIFNXVCBzdGFuZGFsb25lIGV4YW1wbGVzLgotCi08b2w+Ci08bGk+T3BlbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZS4KLTxsaT5JbiB0aGUgUGFja2FnZXMgdmlldywgc2VsZWN0IHRoZSBtYWluIGNsYXNzIHRoYXQgeW91IHdhbnQgdG8gcnVuLiAgCi0gICAgRm9yIGV4YW1wbGUsIHRoZSBtYWluIGNsYXNzIGZvciB0aGUgQWRkcmVzcyBCb29rIGV4YW1wbGUgaXMgCi0gICAgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rPC9jb2RlPi4KLTxsaT5TZWxlY3QgPHN0cm9uZz5SdW48L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlJ1biBBcy4uLjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SmF2YSBBcHBsaWNhdGlvbjwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUuCi08L29sPgotCi0KLTxoMz48YSBuYW1lPSJFeGFtcGxlc092ZXJ2aWV3Ij5FeGFtcGxlcyBPdmVydmlldzwvYT48L2gzPgotPHA+Ci1Db25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggaW5kaXZpZHVhbCBleGFtcGxlIGZvciB0aGUgbmFtZSBvZgotaXRzIG1haW4gY2xhc3MgYW5kIGFkZGl0aW9uYWwgZGV0YWlscy4KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5zd3RleGFtcGxlcy5qYXI8L2NvZGU+OgotPC9wPgotPHVsPgotPGxpPjxhIGhyZWY9InN3dF9hZGRyZXNzYm9va19leC5odG1sIj5BZGRyZXNzIEJvb2s8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2Jyb3dzZXJfZXguaHRtbCI+QnJvd3NlciBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF9jbGlwYm9hcmRfZXguaHRtbCI+Q2xpcGJvYXJkPC9hPgotPGxpPjxhIGhyZWY9InN3dF9jb250cm9sc19leC5odG1sIj5Db250cm9sczwvYT4KLTxsaT48YSBocmVmPSJzd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbCI+Q3VzdG9tIENvbnRyb2xzPC9hPgotPGxpPjxhIGhyZWY9InN3dF9kbmRfZXguaHRtbCI+RHJhZyBhbmQgRHJvcCBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF9maWxldmlld2VyX2V4Lmh0bWwiPkZpbGUgVmlld2VyPC9hPgotPGxpPjxhIGhyZWY9InN3dF9oZWxsb3dvcmxkX2V4Lmh0bWwiPkhlbGxvIFdvcmxkIFsxLTVdPC9hPgotPGxpPjxhIGhyZWY9InN3dF9ob3ZlcmhlbHBfZXguaHRtbCI+SG92ZXIgSGVscDwvYT4KLTxsaT48YSBocmVmPSJzd3RfaW1hZ2VhbmFseXplcl9leC5odG1sIj5JbWFnZSBBbmFseXplcjwvYT4KLTxsaT48YSBocmVmPSJzd3RfamF2YXZpZXdlcl9leC5odG1sIj5KYXZhIFN5bnRheCBWaWV3ZXI8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2xheW91dF9leC5odG1sIj5MYXlvdXRzPC9hPgotPGxpPjxhIGhyZWY9InN3dF9wYWludF9leC5odG1sIj5QYWludCBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwiPlRleHQgRWRpdG9yPC9hPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRjZjVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIFBhaW50IFRvb2w8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIFBhaW50IFRvb2w8L2gyPgotCi08cD4JCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgU1dUIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gdGhlIGZvcm0gb2YgYQotcnVkaW1lbnRhcnkgYml0bWFwIHBhaW50aW5nIHByb2dyYW0uICBUaGUgUGFpbnQgVG9vbCBpbXBsZW1lbnRhdGlvbiBhbHNvIAotZGVtb25zdHJhdGVzIGEgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyB0aW1lZCBHVUkgb3BlcmF0aW9ucyBpbiB0aGUgYmFja2dyb3VuZCAKLXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LgotPC9wPgotPHA+CQotU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scwotdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUKLXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTsgbGVmdC1jbGljayB0byBzZXQgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIHRvIHNldCB0aGUKLWJhY2tncm91bmQgY29sb3IuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfdGV4dGVkaXRvcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzY2U5YjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBUZXh0IEVkaXRvciBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIFRleHQgRWRpdG9yPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBTdHlsZWRUZXh0IHdpZGdldCB0byBpbXBsZW1lbnQKLWEgdGV4dCBlZGl0b3Igd2l0aCBmb3JtYXR0aW5nIHN1cHBvcnQuCi1UaGUgZXhhbXBsZSBoYXMgYSB0eXBpY2FsIHRleHQgZWRpdG9yIGludGVyZmFjZS4KLVRoZSA8c3Ryb25nPkVkaXQ8L3N0cm9uZz4gbWVudSBjb250YWlucyA8c3Ryb25nPkN1dDwvc3Ryb25nPiwgPHN0cm9uZz5Db3B5PC9zdHJvbmc+LCA8c3Ryb25nPlBhc3RlPC9zdHJvbmc+IGFuZCA8c3Ryb25nPlNldCBGb250PC9zdHJvbmc+IGl0ZW1zLiAgVGhlIHRvb2xiYXIKLXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzLCBhbmQgYSByZXNldCBidXR0b24sIGFsbCBvZiB3aGljaCBvcGVyYXRlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yLlRleHRFZGl0b3I8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+VGV4dCBFZGl0b3I8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2Njg0YTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUU3RhbmRhbG9uZUV4YW1wbGVTZXQubmFtZSA9IFNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFBsdWdpbgotCi1sYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMubmFtZSA9IFN0YW5kYWxvbmUKLWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gaW5kZXBlbmRhbnQgXAotCW9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotCi1sYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUgPSBBZGRyZXNzIEJvb2sKLWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24gPSBcCi0JVGhlIEFkZHJlc3NCb29rIGV4YW1wbGUgc2hvd3MgaG93IHRoZSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvIFwKLQlwcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuXG5cblwKLQlUaGUgYXBwbGljYXRpb24gY2FuIHNhdmUgYW5kIGxvYWQgZGF0YSBmcm9tIGEgZmlsZSwgc29ydCB0aGUgZW50cmllcywgYW5kIFwKLQlzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSA9IEJyb3dzZXIKLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTC4gXAotCUFkZGl0aW9uYWwgd2lkZ2V0cyBhbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHR5cGljYWwgYnJvd3NlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIFVSTCwgZ28gYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCkuCi0KLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLm5hbWUgPSBDbGlwYm9hcmQKLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLmRlc2NyaXB0aW9uID0gXAotCVRoZSBDbGlwYm9hcmQgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgY2xpcGJvYXJkIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQotbGF1bmNoaXRlbS5Db250cm9sRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUKLWxhdW5jaGl0ZW0uQ29udHJvbEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhlIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0KLWxhdW5jaGl0ZW0uRE5ELm5hbWUgPSBEcmFnIGFuZCBEcm9wCi1sYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNob3dzIHRoZSB2YXJpb3VzIFNXVCBkcmFnIGFuZCBkcm9wIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQkKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5uYW1lID0gRmlsZSBWaWV3ZXIKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRmlsZSBWaWV3ZXIgZXhhbXBsZSBzaG93cyBob3cgYSBzaW1wbGUgYXBwbGljYXRpb24gY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nIFNXVC5cblxuXAotCVRoaXMgYXBwbGljYXRpb24gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbmF2aWdhdGUgZmlsZXMgYW5kIGZvbGRlcnMgYW5kIG1hbmlwdWxhdGUgdGhlbSB2aWEgRHJhZyBhbmQgRHJvcC4gIFwKLQlJdCBpbmNsdWRlcyB0aGUgdXNlIG9mIGFsdGVybmF0ZSB0aHJlYWRzIGZvciBsb25nIGFjdGlvbnMgYW5kIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBUcmVlLCBcCi0JVGFibGUsIFRvb2xiYXIgYW5kIFByb2dyYW0uCi0KLWxhdW5jaGl0ZW0uSG92ZXJIZWxwLm5hbWUgPSBIb3ZlciBIZWxwCi1sYXVuY2hpdGVtLkhvdmVySGVscC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSG92ZXIgSGVscCBleGFtcGxlIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgY3VzdG9tIHRvb2x0aXBzIGFuZCBob3ZlciBoZWxwIHN1cHBvcnQgXAotCW9uIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLlxuXG5cCi0JVGhlIGV4YW1wbGUgaW1wbGVtZW50cyBpdHMgb3duIHRvb2x0aXAgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydC4gIFwKLQlUbyBzZWUgdGhlIGN1c3RvbSB0b29sdGlwcyBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJLiAgXAotCUFuIGltYWdlIGFwcGVhcnMgaW4gdGhlIGxlZnQtaGFuZCBjb3JuZXIgb2YgdGhlIHRvb2x0aXAuXG5cblwKLQlUbyBzZWUgdGhlIGN1c3RvbSBob3ZlciBoZWxwIGluIGFjdGlvbiwgaG92ZXIgb3ZlciBhbiBpdGVtIG9yIGJ1dHRvbiBpbiB0aGUgVUkgdW50aWwgXAotCXRoZSB0b29sdGlwIGlzIGRpc3BsYXllZC4gIFdpdGhvdXQgbW92aW5nIHRoZSBtb3VzZSwgaGl0IEYxLiAgQSBuZXcgU2hlbGwgd2lsbCBwb3AgdXAgd2l0aCB0aGUgXAotCWV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50IGluIHF1ZXN0aW9uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEubmFtZSA9IEhlbGxvIFdvcmxkICgxKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvcGVuIGEgU2hlbGwgYW5kIHByb2Nlc3MgdGhlIGV2ZW50cy4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5uYW1lID0gSGVsbG8gV29ybGQgKDIpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQyLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSB0aGUgU2hlbGwuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMubmFtZSA9IEhlbGxvIFdvcmxkICgzKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMaXN0ZW5lciBtZWNoYW5pc20uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQubmFtZSA9IEhlbGxvIFdvcmxkICg0KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSA9IEhlbGxvIFdvcmxkICg1KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkgb24gYW4gU1dUIENvbnRyb2wgdXNpbmcgYSBncmFwaGljIGNvbnRleHQuCi0KLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5uYW1lID0gSW1hZ2UgQW5hbHl6ZXIKLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSW1hZ2VBbmFseXplciBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlIHZpc3VhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhbG9uZyB3aXRoIGEgXAotCXN1bW1hcnkgb2YgdGhlIGRhdGEgaW4gdGhlIGltYWdlIGZpbGUuXG5cblwKLQlUaGUgdXNlciBjYW4gbWFrZSBhZGp1c3RtZW50cyB0byB2YXJpb3VzIGVsZW1lbnRzIG9mIHRoZSBpbWFnZSBzdWNoIGFzIHNjYWxpbmcgYW5kIEFscGhhIFwKLQlibGVuZGluZyBhbmQgY2FuIHNhdmUgdGhlc2UgY2hhbmdlcyB0byBhIGZpbGUuXG5cblwKLQlUaGUgSW1hZ2VBbmFseXplciB3aWxsIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBQTkcsIGFuZCBUSUZGLiAgXAotCVRvIG9wZW4gYSBmaWxlLCB1c2UgdGhlIEZpbGUtPk9wZW4uLi4gbWVudSBpdGVtLCBhbmQgc2VsZWN0IHRoZSBpbWFnZSBmaWxlIGluIHRoZSBGaWxlRGlhbG9nLlxuXG5cCi0JSWYgdGhlIGZpbGUgaXMgYW4gaW50ZXJsYWNlZCBHSUYgb3IgUE5HIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIEluY3JlbWVudGFsIERpc3BsYXkgaXMgc2VsZWN0ZWQsIFwKLQl0aGVuIHRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGJlaW5nIGxvYWRlZC5cblxuXAotCUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgTmV4dCwgUHJldmlvdXMsIGFuZCBBbmltYXRlIGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsIFwKLQlhbmQgdGhleSBjYW4gYmUgdXNlZCB0byBjeWNsZSB0aHJvdWdoIHRoZSBpbWFnZXMgaW4gdGhlIGZpbGUsIG9yIGFuaW1hdGUgdGhlbS4gSWYgYSBHSUYgZGVmaW5lcyBhIGJhY2tncm91bmQgY29sb3IsIFwKLQlhcyBtYW55IGFuaW1hdGVkIEdJRnMgZG8sIHNlbGVjdGluZyBCYWNrZ3JvdW5kIHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLlxuXG5cCi0JSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3kgKHBvc3NpYmxlIHdpdGggR0lGLCBQTkcsIG9yIElDTyksIHRoZW4gc2VsZWN0aW5nIERpc3BsYXkgTWFzayB3aWxsIGRyYXcgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IFwKLQltYXNrIHRvIHRoZSByaWdodCBvZiB0aGUgaW1hZ2UuIFlvdSBjYW4gY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBJbWFnZUFuYWx5emVyIHRvIHNlZSB0aGUgdHJhbnNwYXJlbmN5IHdvcmsuIFwKLQlUbyB0dXJuIG9mZiB0aGUgdHJhbnNwYXJlbmN5LCBkZXNlbGVjdCBEaXNwbGF5IFRyYW5zcGFyZW5jeS5cblxuXAotCUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkLCB1c2luZyB0aGUgU2NhbGUgYW5kIEFscGhhLUsgY29tYm9zLCBcCi0JYW5kIHRoZSBBbHBoYSBtZW51LiBGaWxlLT5SZW9wZW4gcmVzdG9yZXMgc2NhbGluZyBhbmQgQWxwaGEgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZS5cblxuXAotCUZpbGUtPlNhdmUgQXMuLi4gY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSB0byBhbm90aGVyIHR5cGUgb2YgaW1hZ2UgZmlsZS4gSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIFwKLQlGaWxlLT5TYXZlIE1hc2sgQXMuLi4gc2F2ZXMgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suXG5cblwKLQlXaGVuIFNXVCBsb2FkcyBhbiBpbWFnZSBmaWxlLCBhbiBpbnN0YW5jZSBvZiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhIGlzIGNyZWF0ZWQuIChJbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvciBcCi0JbXVsdGktaW1hZ2UgR0lGLCBhbiBhcnJheSBvZiBJbWFnZURhdGEgaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBJbWFnZURhdGEgXAotCWluc3RhbmNlKHMpIGZvciB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSBmaWxlLCBpbmNsdWRpbmcgdGhlIHBpeGVsIGRhdGEuIEhvdmVyaW5nIG92ZXIgYSBwaXhlbCBpbiB0aGUgaW1hZ2UgZGlzcGxheSB3aWxsIHNob3cgdGhlIFJHQiBcCi0JY29sb3IgZGF0YSBmb3IgdGhhdCBwaXhlbC4gRm9yIGNlcnRhaW4gaW1hZ2VzIChwYXJ0aWN1bGFybHkgYW5pbWF0ZWQgR0lGcykgYWRkaXRpb25hbCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyIFwKLQlpbnN0YW5jZSB1c2VkIHRvIGxvYWQgdGhlIGltYWdlLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyB0aGlzIGRhdGEgYXMgd2VsbC4KLQotbGF1bmNoaXRlbS5KYXZhVmlld2VyLm5hbWUgPSBKYXZhIFN5bnRheCBWaWV3ZXIKLWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbXBsZW1lbnQgYSB1c2VyLWRlZmluZWQgbGluZSBzdHlsZXIgZm9yIHRoZSBTdHlsZWRUZXh0IHdpZGdldC5cblxuXAotCVRoZSBleGFtcGxlIHByb3ZpZGVzIGEgdHlwaWNhbCBlZGl0b3IgaW50ZXJmYWNlLiAgXAotCVRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoZSBsaW5lIHN0eWxlciwgb3BlbiBhICouamF2YSBmaWxlLiAgXAotCVdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvciBhcmVhLCBub3RpY2UgdGhhdCB0aGUga2V5d29yZHMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dCBFeGFtcGxlCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LiBcCi0JVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YSBcCi0JdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIGNvZGUgY2FuIGJlIFwKLQlnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIENvZGUgYnV0dG9uLgotCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MubmFtZSA9IEFkdmFuY2VkIEdyYXBoaWNzCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlICh1cGRhdGVkIGZvciAzLjMpIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBhcHBsaWNhdGlvbnMgdGhhdCBzaG93IHRoZSB1c2Ugb2YgYWR2YW5jZWQgZ3JhcGhpY3Mgb3BlcmF0aW9ucy4KLQotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLm5hbWUgPSBUZXh0IEVkaXRvcgotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgdG8gaW1wbGVtZW50IFwKLQlhIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyBzdXBwb3J0LlxuXG5cCi0JVGhlIGV4YW1wbGUgaGFzIGEgdHlwaWNhbCB0ZXh0IGVkaXRvciBpbnRlcmZhY2UuICBcCi0JVGhlIEVkaXQgbWVudSBjb250YWlucyBDdXQsIENvcHksIFBhc3RlIGFuZCBTZXQgRm9udCBpdGVtcyBhbmQgdGhlIHRvb2xiYXIgXAotCXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgY3VycmVudCBcCi0Jc2VsZWN0aW9uLCBhbmQgYSByZXNldCB0byBkZWZhdWx0cyBidXR0b24gdGhhdCBhbHNvIG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTc4YTQ4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUU3RhbmRhbG9uZUV4YW1wbGVTZXQubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ic3d0ZXhhbXBsZXMuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgPC9saWJyYXJ5PgotPC9ydW50aW1lPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgIDxjYXRlZ29yeQotICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSI+Ci0gICA8L2NhdGVnb3J5PgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2siPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLkNsaXBib2FyZEV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkRORC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kLkROREV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkZpbGVWaWV3ZXIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5GaWxlVmlld2VyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlci5GaWxlVmlld2VyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscC5Ib3ZlckhlbHAiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQxLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDEuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkMSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkMi5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQzLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQzLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDMiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ0Lm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkNCI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkNS5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQ1Ij4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXIuSW1hZ2VBbmFseXplciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkphdmFWaWV3ZXIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLlRleHRFZGl0b3IubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3Iuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvci5UZXh0RWRpdG9yIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzRXhhbXBsZSIKLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjUyZTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19hZGRyZXNzYm9vay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTGFzdF9uYW1lID0gTGFzdCBOYW1lCi1GaXJzdF9uYW1lID0gRmlyc3QgTmFtZQotQnVzaW5lc3NfcGhvbmUgPSBCdXNpbmVzcyBQaG9uZQotSG9tZV9waG9uZSA9IEhvbWUgUGhvbmUKLUVtYWlsID0gRW1haWwKLUZheCA9IEZheAotQ2xvc2Vfc2F2ZSA9IFRoZSBhZGRyZXNzIGJvb2sgY29udGVudHMgaGF2ZSBjaGFuZ2VkLlxuRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLU5ld190aXRsZSA9IFVudGl0bGVkCi1Db2x1bW4gPSBDb2x1bW46Ci1Cb29rX2V4dGVuc2lvbiA9IC5hZHIKLUJvb2tfZmlsdGVyX25hbWUgPSBBZGRyZXNzIEJvb2tzCi1BbGxfZmlsdGVyX25hbWUgPSBBbGwgRmlsZXMKLUZpbGUgPSBGaWxlIAotRG9lc19ub3RfZXhpc3QgPSBkb2VzIG5vdCBleGlzdC4KLUZpbGVfbm90X2ZvdW5kID0gRmlsZSBub3QgZm91bmQ6Ci1JT19lcnJvcl9yZWFkID0gSU8gZXJyb3IgcmVhZGluZyB0ZXh0IGZpbGU6Ci1JT19lcnJvcl93cml0ZSA9IElPIGVycm9yIHdyaXRpbmcgdGV4dCBmaWxlOgotSU9fZXJyb3JfY2xvc2UgPSBJTyBlcnJvciBjbG9zaW5nIHRleHQgZmlsZToKLVRpdGxlX2JhciA9IEFkZHJlc3MgQm9vayAtIAotU2F2ZV9hc190aXRsZSA9IFNhdmUgQXMKLVF1ZXJ5X292ZXJ3cml0ZSA9IGFscmVhZHkgZXhpc3RzLlxuRG8geW91IHdhbnQgdG8gcmVwbGFjZSBpdD8KLUZpbGVfbWVudV90aXRsZSA9ICZGaWxlCi1OZXdfY29udGFjdCA9ICZOZXcgQ29udGFjdC4uLlx0Q3RybCtOCi1FZGl0X2NvbnRhY3QgPSAmRWRpdCBDb250YWN0Li4uXHRDdHJsK0UKLU5ld19hZGRyZXNzX2Jvb2sgPSBOZXcgQWRkcmVzcyAmQm9va1x0Q3RybCtCCi1PcGVuX2FkZHJlc3NfYm9vayA9ICZPcGVuIEFkZHJlc3MgQm9vay4uLlx0Q3RybCtPCi1TYXZlX2FkZHJlc3NfYm9vayA9ICZTYXZlIEFkZHJlc3MgQm9va1x0Q3RybCtTCi1TYXZlX2Jvb2tfYXMgPSBTYXZlICZBZGRyZXNzIEJvb2sgQXMuLi5cdEN0cmwrQQotRXhpdCA9IEUmeGl0Ci1FZGl0X21lbnVfdGl0bGUgPSAmRWRpdAotRWRpdCA9ICZFZGl0Li4uXHRDdHJsK0UKLUNvcHkgPSAmQ29weVx0Q3RybCtDCi1QYXN0ZSA9ICZQYXN0ZVx0Q3RybCtWCi1EZWxldGUgPSBEZSZsZXRlXHREZWwKLVNvcnQgPSAmU29ydAotU2VhcmNoX21lbnVfdGl0bGUgPSAmU2VhcmNoCi1GaW5kID0gJkZpbmQuLi5cdEN0cmwrRgotRmluZF9uZXh0ID0gRmluZCAmTmV4dC4uLlx0RjMKLVBvcF91cF9uZXcgPSAmTmV3Li4uCi1Qb3BfdXBfZWRpdCA9ICZFZGl0Li4uCi1Qb3BfdXBfY29weSA9ICZDb3B5Ci1Qb3BfdXBfcGFzdGUgPSAmUGFzdGUKLVBvcF91cF9kZWxldGUgPSAmRGVsZXRlCi1Qb3BfdXBfZmluZCA9ICZGaW5kLi4uCi1IZWxwX21lbnVfdGl0bGUgPSAmSGVscAotQWJvdXQgPSAmQWJvdXQgQWRkcmVzcyBCb29rLi4uCi1BYm91dF8xID0gQWJvdXQgCi1BYm91dF8yID0gXG52ZXJzaW9uIDEuMAotT0sgPSBPSwotQ2FuY2VsID0gQ2FuY2VsCi1TZWFyY2hfZGlhbG9nX3RpdGxlID0gRmluZAotRGlhbG9nX2ZpbmRfd2hhdCA9IEZpJm5kIHdoYXQ6Ci1EaWFsb2dfbWF0Y2hfY2FzZSA9IE1hdGNoICZjYXNlCi1EaWFsb2dfbWF0Y2hfd29yZCA9IE1hdGNoICZ3aG9sZSB3b3JkCi1EaWFsb2dfZGlyZWN0aW9uID0gRGlyZWN0aW9uCi1EaWFsb2dfZGlyX3VwID0gJlVwCi1EaWFsb2dfZGlyX2Rvd24gPSAmRG93bgotRGlhbG9nX2ZpbmQgPSAmRmluZAotQ2Fubm90X2ZpbmQgPSBDYW5ub3QgZmluZCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2Jyb3dzZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc3OTkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgQnJvd3NlcgotCi1CYWNrCQkJCT0gQmFjawotQnJvd3Nlck5vdENyZWF0ZWQJPSBFcnJvciAtIFRoZSBCcm93c2VyIHdpZGdldCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLiBQbGVhc2UgY2hlY2sgdGhlIEJyb3dzZXIgd2lkZ2V0IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLiBTdXBwb3J0ZWQgcGxhdGZvcm1zIGFuZCBzb2Z0d2FyZSByZXF1aXJlbWVudHMgZm9yIHRoZSBCcm93c2VyIHdpZGdldCBhcmUgbGlzdGVkIG9uIHRoZSBTV1QgRkFRIHdlYiBwYWdlLgotRm9yd2FyZAkJCQk9IEZvcndhcmQKLVN0b3AJCQkJPSBTdG9wCi1SZWZyZXNoCQkJCT0gUmVmcmVzaAotR28JCQkJCT0gR28KLVN0YXJ0dXAJCQkJPSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2NvbnRyb2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZmZGQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIENvbnRyb2xzCi1jdXN0b20ud2luZG93LnRpdGxlID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1UZXh0X0J1dHRvbnMJCT0gVGV4dCBCdXR0b25zCi1TaXplIAkJCQk9IFNpemUKLUFsaWdubWVudAkJCT0gQWxpZ25tZW50Ci1MZWZ0CQkJCT0gTGVmdAotUmlnaHQJCQkJPSBSaWdodAotVXAJCQkJCT0gVXAKLURvd24JCQkJPSBEb3duCi1DZW50ZXIJCQkJPSBDZW50ZXIKLU9uZQkJCQkJPSBPbmUKLVR3bwkJCQkJPSBUd28KLVRocmVlCQkJCT0gVGhyZWUKLUltYWdlX0J1dHRvbnMJCT0gSW1hZ2UgQnV0dG9ucwotSW1hZ2VfVGV4dF9CdXR0b25zCT0gSW1hZ2UgYW5kIFRleHQgQnV0dG9ucwotQ29udHJvbF9FeGFtcGxlCQk9IENvbnRyb2wgRXhhbXBsZQotUGFyYW1ldGVycwkJCT0gUGFyYW1ldGVycwotT3RoZXIJCQkJPSBPdGhlcgotRW5hYmxlZAkJCQk9IEVuYWJsZWQKLVZpc2libGUJCQkJPSBWaXNpYmxlCi1CYWNrZ3JvdW5kQ29sb3IJCT0gQmFja2dyb3VuZCBDb2xvcgotQmFja2dyb3VuZEltYWdlCQk9IEJhY2tncm91bmQgSW1hZ2UKLVBvcHVwTWVudQkJCT0gUG9wdXAgTWVudQotUHJlZmVycmVkIAkJCT0gUHJlZmVycmVkCi1TdHlsZXMJIAkJCT0gU3R5bGVzCi1NZW51X1N0eWxlcwkgCQk9IE1lbnUgU3R5bGVzCi1NZW51SXRlbV9TdHlsZXMJIAk9IE1lbnVJdGVtIFN0eWxlcwotQmFja2dyb3VuZF9Nb2RlCQk9IEJhY2tncm91bmQgTW9kZSBvbiBQYXJlbnQKLUxpc3RlbmVycwkJCT0gTGlzdGVuZXJzCi1TZWxlY3RfTGlzdGVuZXJzCT0gU2VsZWN0IExpc3RlbmVycwotTGlzdGVuCQkJCT0gTGlzdGVuCi1DbGVhcgkJCQk9IENsZWFyCi1TZXRfR2V0CQkJCT0gU2V0L0dldCBBUEkKLVBhcmFtZXRlcl9JbmZvCQk9IHswfSAgIGUuZy4gezF9IAotSW5mb19pbnQJCQk9IDQKLUluZm9faW50QQkJCT0gMCwxLDIKLUluZm9fbG9uZwkJCT0gNAotSW5mb19sb25nQQkJCT0gMCwxLDIKLUluZm9fY2hhcgkJCT0gYwotSW5mb19jaGFyQQkJCT0gYSxiLGMKLUluZm9fYm9vbGVhbgkJPSB0cnVlCi1JbmZvX2Jvb2xlYW5BCQk9IHRydWUsdHJ1ZSxmYWxzZQotSW5mb19TdHJpbmcJCQk9IGhlbGxvCi1JbmZvX1N0cmluZ0EJCT0gaGVsbG8sdGhlcmUKLUluZm9fUG9pbnQJCQk9IDAsMAotSW5mb19UYWJJdGVtCQk9IFRhYiAwCi1JbmZvX1RhYkl0ZW1BCQk9IFRhYiAwLFRhYiAyCi1JbmZvX1RhYmxlSXRlbQkJPSBJbmRleDoyCi1JbmZvX1RhYmxlSXRlbUEJCT0gSW5kZXg6MixJbmRleDo0Ci1JbmZvX1RyZWVJdGVtCQk9IE5vZGUgMQotSW5mb19UcmVlSXRlbUEJCT0gTm9kZSAxLE5vZGUgMwotU2VsZWN0X0FsbAkJCT0gU2VsZWN0IEFsbAotRGVzZWxlY3RfQWxsCQk9IERlc2VsZWN0IEFsbAotT0sJCQkJCT0gT0sKLUZpbGxEYW1hZ2UJCQk9IEZpbGwgRGFtYWdlZCBBcmVhIFdpdGggQ29sb3IKLVRpdGxlX1RleHQJCQk9IFRpdGxlIFRleHQKLVRleHRfTGFiZWxzCQkJPSBUZXh0IExhYmVscwotSW1hZ2VfTGFiZWxzCQk9IEltYWdlIExhYmVscwotQ3VzdG9tX0xhYmVscwkJPSBDdXN0b20gTGFiZWxzCi1DdXN0b21fQ29tYm8JCT0gQ3VzdG9tIENvbWJvCi1PbmVfVHdvX1RocmVlCQk9IE9uZSBUd28gVGhyZWUKLVRleHRfVG9vbEJhciAJCT0gVGV4dCBUb29sQmFyCi1JbWFnZV9Ub29sQmFyIAkJPSBJbWFnZSBUb29sQmFyCi1JbWFnZVRleHRfVG9vbEJhcgk9IEltYWdlIGFuZCBUZXh0IFRvb2xCYXIKLU1heGltdW0JCQkJPSBNYXhpbXVtCi1NaW5pbXVtCQkJCT0gTWluaW11bQotU2VsZWN0aW9uCQkJPSBTZWxlY3Rpb24KLUluY3JlbWVudAkJCT0gSW5jcmVtZW50Ci1QYWdlX0luY3JlbWVudAkJPSBQYWdlIEluY3JlbWVudAotVGh1bWIJCQkJPSBUaHVtYgotRGlnaXRzCQkJCT0gRGlnaXRzCi1UcmVlX1dpdGhfSW1hZ2VzCT0gVHJlZSBXaXRoIEltYWdlcwotRGlhbG9nX1R5cGUJCQk9IERpYWxvZyBUeXBlCi1DcmVhdGVfRGlhbG9nCQk9IENyZWF0ZSBEaWFsb2cKLUJ1dHRvbl9TdHlsZXMJCT0gQnV0dG9uIFN0eWxlcwotSWNvbl9TdHlsZXMJCQk9IEljb24gU3R5bGVzCi1Nb2RhbF9TdHlsZXMJCT0gTW9kYWwgU3R5bGVzCi1GaWxlX0RpYWxvZ19TdHlsZXMJPSBGaWxlIERpYWxvZyBTdHlsZXMKLUl0ZW1fU3R5bGVzCQkJPSBJdGVtIFN0eWxlcwotRGlhbG9nX1Jlc3VsdAkJPSBEaWFsb2cgUmVzdWx0Ci1Db2xvckRpYWxvZwkJCT0gQ29sb3JEaWFsb2cKLURpcmVjdG9yeURpYWxvZwkJPSBEaXJlY3RvcnlEaWFsb2cKLUZpbGVEaWFsb2cJCQk9IEZpbGVEaWFsb2cKLUZvbnREaWFsb2cJCQk9IEZvbnREaWFsb2cKLVByaW50RGlhbG9nCQkJPSBQcmludERpYWxvZwotTWVzc2FnZUJveAkJCT0gTWVzc2FnZUJveAotTXVsdGlfbGluZQkJCT0gQSBtdWx0aSBsaW5lIHRleHQgd2lkZ2V0LgotRXhhbXBsZV9zdHJpbmcJCT0gVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4KLUhlYWRlcl9WaXNpYmxlCQk9IEhlYWRlciBWaXNpYmxlCi1Tb3J0X0luZGljYXRvcgkJPSBTb3J0IEluZGljYXRvcgotSGVhZGVyX0ltYWdlcwkJPSBIZWFkZXIgSW1hZ2VzCi1TdWJfSW1hZ2VzCQkJPSBTdWIgSW1hZ2VzCi1MaW5lc19WaXNpYmxlCQk9IExpbmVzIFZpc2libGUKLU1vdmVhYmxlX0NvbHVtbnMJPSBNb3ZlYWJsZSBDb2x1bW5zCi1SZXNpemFibGVfQ29sdW1ucwk9IFJlc2l6YWJsZSBDb2x1bW5zCi1NdWx0aXBsZV9Db2x1bW5zCT0gTXVsdGlwbGUgQ29sdW1ucwotTG9ja2VkCQkJCT0gTG9ja2VkCi1Db21ib19jaGlsZAkJCT0gQ29tYm8gQ2hpbGQKLU5vZGVfMQkJCQk9IE5vZGUgMQotTm9kZV8yCQkJCT0gTm9kZSAyCi1Ob2RlXzMJCQkJPSBOb2RlIDMKLU5vZGVfNAkJCQk9IE5vZGUgNAotTm9kZV8xXzEJCQk9IE5vZGUgMS4xCi1Ob2RlXzJfMQkJCT0gTm9kZSAyLjEKLU5vZGVfM18xCQkJPSBOb2RlIDMuMQotTm9kZV8yXzIJCQk9IE5vZGUgMi4yCi1Ob2RlXzJfMl8xCQkJPSBOb2RlIDIuMi4xCi1QYXJlbnQJCQkJPSBQYXJlbnQKLU5vX1BhcmVudAkJCT0gTm8gUGFyZW50Ci1EZWNvcmF0aW9uX1N0eWxlcwk9IERlY29yYXRpb24gU3R5bGVzCi1DcmVhdGVfU2hlbGwJCT0gQ3JlYXRlIFNoZWxsCi1DbG9zZV9BbGxfU2hlbGxzCT0gQ2xvc2UgQWxsIFNoZWxscwotUHVzaAkJCQk9IFB1c2gKLVJhZGlvCQkJCT0gUmFkaW8KLUNoZWNrCQkJCT0gQ2hlY2sKLUNhc2NhZGUJCQkJPSBDYXNjYWRlCi1Ecm9wX0Rvd24JCQk9IERyb3AgRG93bgotSW1hZ2VzX2ZhaWxlZAkJPSBXYXJuaW5nOiBGYWlsZWQgdG8gbG9hZCBpbWFnZXMKLXJlYWRtZV90eHQJCQk9IHJlYWRtZS50eHQKLUluZGV4CQkJCT0gSW5kZXg6Ci1UaXRsZQkJCQk9IFRpdGxlOgotQ2xvc2UJCQkJPSBDbG9zZQotUmVzdWx0CQkJCT0gUmVzdWx0OiB7MH0KLUZpbHRlck5hbWVfMAkJPSBUZXh0IEZpbGVzCi1GaWx0ZXJOYW1lXzEJCT0gQmF0Y2ggRmlsZXMKLUZpbHRlck5hbWVfMgkJPSBEb2MgRmlsZXMKLUZpbHRlck5hbWVfMwkJPSBBbGwgRmlsZXMKLVRhYmxlVGl0bGVfMAkJPSBOYW1lCi1UYWJsZVRpdGxlXzEJCT0gVHlwZQotVGFibGVUaXRsZV8yCQk9IFNpemUKLVRhYmxlVGl0bGVfMwkJPSBNb2RpZmllZAotVGFibGVMaW5lMF8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTBfMQkJPSBjbGFzc2VzCi1UYWJsZUxpbmUwXzIJCT0gMAotVGFibGVMaW5lMF8zCQk9IHRvZGF5Ci1UYWJsZUxpbmUxXzAJCT0gPGVtcHR5PgotVGFibGVMaW5lMV8xCQk9IGRhdGFiYXNlcwotVGFibGVMaW5lMV8yCQk9IDI1NTYKLVRhYmxlTGluZTFfMwkJPSB0b21vcnJvdwotVGFibGVMaW5lMl8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTJfMQkJPSBpbWFnZXMKLVRhYmxlTGluZTJfMgkJPSA5MTU3MQotVGFibGVMaW5lMl8zCQk9IHllc3RlcmRheQotTGlzdERhdGEwXzAJCQk9IExpbmUgMQotTGlzdERhdGEwXzEJCQk9IExpbmUgMgotTGlzdERhdGEwXzIJCQk9IExpbmUgMwotTGlzdERhdGEwXzMJCQk9IExpbmUgNAotTGlzdERhdGEwXzQJCQk9IExpbmUgNQotTGlzdERhdGEwXzUJCQk9IExpbmUgNgotTGlzdERhdGEwXzYJCQk9IExpbmUgNwotTGlzdERhdGEwXzcJCQk9IExpbmUgOAotTGlzdERhdGEwXzgJCQk9IExvbmdlc3QgTGluZSBJbiBMaXN0Ci1MaXN0RGF0YTFfMAkJCT0gQXBwbGVzCi1MaXN0RGF0YTFfMQkJCT0gT3JhbmdlcwotTGlzdERhdGExXzIJCQk9IEJhbmFuYXMKLUxpc3REYXRhMV8zCQkJPSBHcmFwZWZydWl0Ci1MaXN0RGF0YTFfNAkJCT0gUGVhY2hlcwotTGlzdERhdGExXzUJCQk9IEtpd2kKLUxpc3REYXRhMV82CQkJPSBBcHJpY290cwotTGlzdERhdGExXzcJCQk9IFN0cmF3YmVycmllcwotTGlzdERhdGExXzgJCQk9IFRoZSBMb25nZXN0IFN0cmluZwotRHJvcERvd25EYXRhXzAJCT0gQXBwbGVzCi1Ecm9wRG93bkRhdGFfMQkJPSBPcmFuZ2VzCi1Ecm9wRG93bkRhdGFfMgkJPQotRHJvcERvd25EYXRhXzMJCT0gR3JhcGVmcnVpdAotRHJvcERvd25EYXRhXzQJCT0gUGVhY2hlcwotRHJvcERvd25EYXRhXzUJCT0gS2l3aQotRHJvcERvd25EYXRhXzYJCT0KLURyb3BEb3duRGF0YV83CQk9IFN0cmF3YmVycmllcwotRHJvcERvd25EYXRhXzgJCT0gVGhlIExvbmdlc3QgU3RyaW5nCi1Db2xvcnMgCQkJCT0gQ29sb3JzIGFuZCBGb250Ci1DaGFuZ2UJCQkJPSAmQ2hhbmdlLi4uCi1EZWZhdWx0cwkJCT0gJkRlZmF1bHRzCi1Gb3JlZ3JvdW5kX0NvbG9yCT0gRm9yZWdyb3VuZCBDb2xvcgotQmFja2dyb3VuZF9Db2xvcgk9IEJhY2tncm91bmQgQ29sb3IKLUZvbnQJCQkJPSBGb250Ci1JdGVtX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgRm9yZWdyb3VuZCBDb2xvcgotSXRlbV9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIEJhY2tncm91bmQgQ29sb3IKLUl0ZW1fRm9udAkJCQk9IEl0ZW0gMCBGb250Ci1DZWxsX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgQ29sIDEgRm9yZWdyb3VuZCBDb2xvcgotQ2VsbF9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIENvbCAxIEJhY2tncm91bmQgQ29sb3IKLUNlbGxfRm9udAkJCQk9IEl0ZW0gMCBDb2wgMSBGb250Ci1XcmFwX1RleHQJCQk9IEphY2sgYW5kIEppbGwgd2VudCB1cCB0aGUgaGlsbCB0byBmZXRjaCBhIHBhaWwgb2Ygd2F0ZXIsIFwKLQkJCQkJICBKYWNrIGZlbGwgZG93biBhbmQgYnJva2UgaGlzIGNyb3duIGFuZCBKaWxsIGNhbWUgdHVtYmxpbmcgYWZ0ZXIhCi1Gb3JlZ3JvdW5kX1N0eWxlCT0gRm9yZWdyb3VuZAotQmFja2dyb3VuZF9TdHlsZSAJPSBCYWNrZ3JvdW5kCi1TdHlsZWRUZXh0X1N0eWxlcwk9IFRleHQgU3R5bGVzCi1TdHlsZWRUZXh0X1N0eWxlX0luc3RydWN0aW9ucwk9IFNlbGVjdCB0ZXh0LCB0aGVuIHN0eWxlLgotQm9sZAkJCQk9IEJvbGQKLUl0YWxpYwkJCQk9IEl0YWxpYwotVW5kZXJsaW5lCQkJPSBVbmRlcmxpbmUKLVN0cmlrZW91dAkJCT0gU3RyaWtlb3V0Ci1GaWxsX1gJCQkJPSBIb3Jpem9udGFsIEZpbGwKLUZpbGxfWQkJCQk9IFZlcnRpY2FsIEZpbGwKLVBhY2tfQ29sdW1ucwkJPSBQYWNrIENvbHVtbnMKLVRhYkl0ZW0xXzAJCQk9IFRhYiAwCi1UYWJJdGVtMV8xCQkJPSBUYWIgMQotVGFiSXRlbTFfMgkJCT0gVGFiIDIKLVRhYkl0ZW1fY29udGVudAkJPSBUYWJJdGVtIENvbnRlbnQKLUNUYWJJdGVtMV8wCQkJPSBDVGFiSXRlbSAwCi1DVGFiSXRlbTFfMQkJCT0gQ1RhYkl0ZW0gMQotQ1RhYkl0ZW0xXzIJCQk9IENUYWJJdGVtIDIgaGFzIGEgbG9uZyBuYW1lCi1DSXRlbV9Db2xvcnMJCT0gQ1RhYkl0ZW0gQ29sb3JzCi1DVGFiSXRlbV9jb250ZW50CT0gQ1RhYkl0ZW0gQ29udGVudAotU2V0X1NpbXBsZV9UYWJzCQk9IFNpbXBsZSBUYWJzCi1TZXRfU2luZ2xlX1RhYnMJCT0gU2luZ2xlIFRhYgotU2V0X01pbl9WaXNpYmxlICAgICA9IE1pbmltaXplCi1TZXRfTWF4X1Zpc2libGUgICAgID0gTWF4aW1pemUKLVNldF9VbnNlbGVjdGVkX0Nsb3NlX1Zpc2libGUgPSBDbG9zZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUgPSBJbWFnZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEZvcmVncm91bmQgQ29sb3IKLVNlbGVjdGlvbl9CYWNrZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEJhY2tncm91bmQgQ29sb3IKLVNldF9JbWFnZQkJCT0gU2V0IEltYWdlCi1UYWJsZVRyZWVfY29sdW1uCT0gQ29sdW1uCi1NZW51SXRlbV9DdXQJCT0gQ3UmdAlDdHJsK1gKLU1lbnVJdGVtX0NvcHkJCT0gJkNvcHkJQ3RybCtDCi1NZW51SXRlbV9QYXN0ZQkJPSAmUGFzdGUJQ3RybCtWCi1NZW51SXRlbV9TZWxlY3RBbGwJPSBTZWxlY3QgJkFsbAlDdHJsK0EKLU9yaWVudGF0aW9uIAkJPSBPcmllbnRhdGlvbgotRGVmYXVsdCAJCQk9IERlZmF1bHQgKEluaGVyaXQpCi1JbWFnZXMJCQkJPSBJbWFnZXMKLUFjY2VsZXJhdG9ycwkJPSBBY2NlbGVyYXRvcnMKLU1uZW1vbmljcwkJCT0gTW5lbW9uaWNzCi1TdWJNZW51CQkJCT0gU3ViLU1lbnUKLVN1YlN1Yk1lbnUJCQk9IFN1Yi1TdWItTWVudQotMVJhZGlvCQkJCT0gUmFkaW8xCi0yUmFkaW8JCQkJPSBSYWRpbzIKLTFSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjEKLTJSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjIKLVB1c2hXaXRoTW5lbW9uaWMJPSAmUHVzaAotUmFkaW9XaXRoTW5lbW9uaWMJPSAmUmFkaW8KLUNoZWNrV2l0aE1uZW1vbmljCT0gJkNoZWNrCi1DYXNjYWRlV2l0aE1uZW1vbmljCT0gQyZhc2NhZGUKLVBvcHVwTWVudUhlcmUJCT0gUG9wdXAgTWVudSBIZXJlCi1MaW5rVGV4dD1WaXNpdCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1wiPkVjbGlwc2Uub3JnPC9BPiBwcm9qZWN0IGFuZCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1xcc3d0Ij5TV1Q8L0E+IGhvbWVwYWdlLgotVG9vbHRpcAkJCQk9IFRvb2x0aXA6ICB7MH0KLUl0ZW0xX1RleHQJCQk9IFdoYXQgaXMgeW91ciBmYXZvcml0ZSBidXR0b24/Ci1JdGVtMl9UZXh0CQkJPSBXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbj8KLVRvb2xUaXBfVGl0bGUJCT0gRm94ZXMgdnMuIERvZ3MKLU5vX0ljb24JCQkJPSBObyBJY29uCi1TaG93X0luX1RyYXkJCT0gU2hvdyBJbiBUcmF5CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZmlsZXZpZXdlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk0MmUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfZmlsZXZpZXdlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGl0bGUgPSBTV1QgRmlsZVZpZXdlciAtIHswfQotCi1tZW51LkZpbGUudGV4dCA9ICZGaWxlCi1tZW51LkZpbGUuQ2xvc2UudGV4dCA9ICZDbG9zZQotbWVudS5GaWxlLlNpbXVsYXRlT25seS50ZXh0ID0gU2ltdWxhdGUgRmlsZSBPcGVyYXRpb25zCi1tZW51LkhlbHAudGV4dCA9ICZIZWxwCi1tZW51LkhlbHAuQWJvdXQudGV4dCA9ICZBYm91dAotCi10b29sLkN1dC50aXB0ZXh0ID0gQ3V0Ci10b29sLkNvcHkudGlwdGV4dCA9IENvcHkKLXRvb2wuRGVsZXRlLnRpcHRleHQgPSBEZWxldGUKLXRvb2wuUGFyZW50LnRpcHRleHQgPSBQYXJlbnQKLXRvb2wuUGFzdGUudGlwdGV4dCA9IFBhc3RlCi10b29sLlByaW50LnRpcHRleHQgPSBQcmludAotdG9vbC5SZWZyZXNoLnRpcHRleHQgPSBSZWZyZXNoCi10b29sLlJlbmFtZS50aXB0ZXh0ID0gUmVuYW1lCi10b29sLlNlYXJjaC50aXB0ZXh0ID0gU2VhcmNoCi0KLWRldGFpbHMuQWxsRm9sZGVycy50ZXh0ID0gQWxsIEZvbGRlcnMKLWRldGFpbHMuQ29udGVudHNPZi50ZXh0ID0gQ29udGVudHMgb2YgJyd7MH0nJwotZGV0YWlscy5GaWxlU2l6ZS50ZXh0ID0gezB9IGJ5dGVzCi1kZXRhaWxzLkRpck51bWJlck9mT2JqZWN0cy50ZXh0ID0gezB9IG9iamVjdChzKQotZGV0YWlscy5OdW1iZXJPZlNlbGVjdGVkRmlsZXMudGV4dCA9IHswfSBvYmplY3Qocykgc2VsZWN0ZWQKLQotdGFibGUuTmFtZS50aXRsZSA9IE5hbWUKLXRhYmxlLlNpemUudGl0bGUgPSBTaXplCi10YWJsZS5UeXBlLnRpdGxlID0gVHlwZQotdGFibGUuTW9kaWZpZWQudGl0bGUgPSBNb2RpZmllZAotCi1maWxldHlwZS5Vbmtub3duID0gezB9IEZpbGUKLWZpbGV0eXBlLk5vbmUgPSBGaWxlCi1maWxldHlwZS5Gb2xkZXIgPSBGb2xkZXIKLWZpbGVzaXplLktCID0gezB9IGtiCi0KLWRpYWxvZy5BYm91dC50aXRsZSA9IEFib3V0IFNXVCBGaWxlVmlld2VyCi1kaWFsb2cuQWJvdXQuZGVzY3JpcHRpb24gPSBTV1QgRmlsZVZpZXdlclxuXG5WZXJzaW9uOiAwLjlcblxuUnVubmluZyBvbjogezB9Ci0KLWRpYWxvZy5Ob3RJbXBsZW1lbnRlZC50aXRsZSA9IE5vdCBJbXBsZW1lbnRlZAotZGlhbG9nLkFjdGlvbk5vdEltcGxlbWVudGVkLmRlc2NyaXB0aW9uID0gU29ycnkhICBUaGUgYWN0aW9uIHlvdSBzZWxlY3RlZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuCi0KLWRpYWxvZy5GYWlsZWRDb3B5LnRpdGxlID0gQ29weSBGaWxlcyBFcnJvcgotZGlhbG9nLkZhaWxlZENvcHkuZGVzY3JpcHRpb24gPSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjb3B5ICJ7MH0iIHRvICJ7MX0iLgotCi1kaWFsb2cuRmFpbGVkRGVsZXRlLnRpdGxlID0gRGVsZXRlIEZpbGVzIEVycm9yCi1kaWFsb2cuRmFpbGVkRGVsZXRlLmRlc2NyaXB0aW9uID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gZGVsZXRlICJ7MH0iLgotCi1wcm9ncmVzc0RpYWxvZy5jYW5jZWxCdXR0b24udGV4dCA9IENhbmNlbAotcHJvZ3Jlc3NEaWFsb2cuQ29weS50aXRsZSA9IENvcHkgRmlsZXMKLXByb2dyZXNzRGlhbG9nLkNvcHkuZGVzY3JpcHRpb24gPSBDb3B5aW5nIGZpbGVzLgotcHJvZ3Jlc3NEaWFsb2cuQ29weS5vcGVyYXRpb24gPSBDb3B5aW5nLi4uIHswfQotcHJvZ3Jlc3NEaWFsb2cuTW92ZS50aXRsZSA9IE1vdmUgRmlsZXMKLXByb2dyZXNzRGlhbG9nLk1vdmUuZGVzY3JpcHRpb24gPSBNb3ZpbmcgZmlsZXMuCi1wcm9ncmVzc0RpYWxvZy5EZWxldGUub3BlcmF0aW9uID0gRGVsZXRpbmcuLi4gezB9Ci0KLXNpbXVsYXRlLkNvcHlGcm9tVG8udGV4dCA9IFNpbXVsYXRlZCBjb3B5IGZyb20gInswfSIgdG8gInsxfSIuCi1zaW11bGF0ZS5EaXJlY3Rvcmllc0NyZWF0ZWQudGV4dCA9IFNpbXVsYXRlZCBkaXJlY3RvcmllcyBjcmVhdGVkIGZvciAiezB9Ii4KLXNpbXVsYXRlLkRlbGV0ZS50ZXh0ID0gU2ltdWxhdGVkIGRlbGV0ZSBvZiAiezB9Ii4KLQotZXJyb3IuRmFpbGVkTGF1bmNoLm1lc3NhZ2UgPSBDb3VsZCBub3QgbGF1bmNoICJ7MH0iCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTRiMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ncmFwaGljcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkdmFuY2VkR3JhcGhpY3M9QWR2YW5jZWQgR3JhcGhpY3MKLVNXVEdyYXBoaWNzPVNXVCBHcmFwaGljcwotV2FybmluZz1XYXJuaW5nCi1MaWJOb3RGb3VuZD1BZHZhbmNlZCBncmFwaGljcyBsaWJyYXJ5IG5vdCBmb3VuZC4gU29tZSBleGFtcGxlcyB3aWxsIG5vdCBkaXNwbGF5LgotU2V0dGluZ3M9U2V0dGluZ3MKLVBsYXk9UGxheQotUGF1c2U9UGF1c2UKLUJhY2tncm91bmQ9QmFja2dyb3VuZAotRG91YmxlQnVmZmVyPURvdWJsZSBCdWZmZXIKLVdoaXRlPVdoaXRlCi1CbGFjaz1CbGFjawotUmVkPVJlZAotR3JlZW49R3JlZW4KLUJsdWU9Qmx1ZQotQ3lhbj1DeWFuCi1ZZWxsb3c9WWVsbG93CQotQ3VzdG9tQ29sb3I9Q3VzdG9tIENvbG9yCi1DdXN0b21QYXR0ZXJuPUN1c3RvbSBQYXR0ZXJuCi1QYXR0ZXJuMT1QaW5rIExvc2FuZ2UKLVBhdHRlcm4yPVB1cnBsZSBDaGVja2VycwotUGF0dGVybjM9Qmx1ZSBQZW50YWdvbgotQW5pbWF0aW9uPUFuaW1hdGlvbgotU3RhclBvbHlnb249U3RhciBQb2x5Z29uCi1MaW5lPUxpbmUKLUJsYWNrSG9sZT1CbGFjayBIb2xlCi1GaWxsUnVsZT1GaWxsIFJ1bGU6Ci1Qb2x5Z29ucz1Qb2x5Z29ucwotSW50cm9kdWN0aW9uPUludHJvZHVjdGlvbgotU1dUPVNXVAotQm91bmNlPUJvdW5jZQotRm9udD1Gb250Ci1NaXNjPU1pc2MKLUNvdW50ZG93bj1Db3VudGRvd24KLUxpbmVXaWR0aD1MaW5lIFdpZHRoCi1BbnRpYWxpYXNpbmc9QW50aWFsaWFzaW5nCi1MaW5lQ2FwPUxpbmUgQ2FwCi1TcGlyYWw9U3BpcmFsCi1QZXRhbHM9UGV0YWxzCi1HcmFkaWVudD1HcmFkaWVudAotR3JhZEltYWdlPUdyYWRpZW50IEltYWdlCi1Td2FwQ29sb3JzPVN3YXAgQ29sb3JzCi1DdXJ2ZXM9Q3VydmVzCi1DdWJpYz1DdWJpYwotUXVhZHJhdGljPVF1YWRyYXRpYwotTGluZXM9TGluZXMKLUZsYXQ9RmxhdAotU3F1YXJlPVNxdWFyZQotUm91bmQ9Um91bmQKLUxpbmVTdHlsZXM9TGluZSBTdHlsZXMKLUdyYWRpZW50RGxnTXNnPVBsZWFzZSBzZWxlY3QgdHdvIGNvbG9yczoKLUdyYWRpZW50RGxnQnV0dG9uMT1Db2xvciAxCi1HcmFkaWVudERsZ0J1dHRvbjI9Q29sb3IgMgotR3JhZGllbnRUYWJJdGVtMT1Db2xvciAxCi1HcmFkaWVudFRhYkl0ZW0yPUNvbG9yIDIKLUFscGhhPUFscGhhCi1DdXN0b21Gb250PUN1c3RvbSBGb250Ci1SZWd1bGFyPVJlZ3VsYXIKLUl0YWxpYz1JdGFsaWMKLUJvbGQ9Qm9sZAotQm9sZEl0YWxpYz1Cb2xkIEl0YWxpYwotRm9udEZhY2U9RmFjZQotRm9udFN0eWxlPVN0eWxlCi1Gb250U2l6ZT1TaXplCi1Db2xvcj1Db2xvcgotQ2xpcHBpbmc9Q2xpcHBpbmcKLVBhdGhDbGlwcGluZz1QYXRoIENsaXBwaW5nCi1DaXJjbGVzPUNpcmNsZXMKLVJlY3RhbmdsZT1SZWN0YW5nbGUKLU92YWw9T3ZhbAotV29yZD1Xb3JkCi1TdGFyPVN0YXIKLVRyaWFuZ2xlcz1UcmlhbmdsZXMKLURlZmF1bHQ9RGVmYXVsdAotUmVnaW9uQ2xpcHBpbmc9UmVnaW9uIENsaXBwaW5nCi1SZWdpb24xPVJlZ2lvbiAxCi1SZWdpb24yPVJlZ2lvbiAyCi1BZGQ9QWRkCi1TdWI9U3Vic3RyYWN0Ci1JbnRlcj1JbnRlcnNlY3QKLUludGVycG9sYXRpb249SW50ZXJwb2xhdGlvbgotSW1hZ2U9SW1hZ2UKLU9yaWdpbmFsSW1nPU9yaWdpbmFsIEltYWdlCi1Ib3VzZT1Ib3VzZQotUXVlc3Rpb249UXVlc3Rpb24KLVRhc2s9VGFzawotQ3ViZT1DdWJlCi1PdmFscz1PdmFscwotTm9uZT1Ob25lCi1Mb3c9TG93Ci1EZWZhdWx0PURlZmF1bHQKLUhpZ2g9SGlnaAotVHJhbnNmb3JtPVRyYW5zZm9ybQotQ2FyZHM9Q2FyZHMKLVNvbGlkPVNvbGlkCi1EYXNoPURhc2gKLURvdD1Eb3QKLURhc2hEb3Q9RGFzaCBEb3QKLURhc2hEb3REb3Q9RGFzaCBEb3QgRG90Ci1MaW5lSm9pbj1MaW5lIEpvaW4KLWJldmVsPUJFVkVMCi1taXRlcj1NSVRFUgotcm91bmQ9Uk9VTkQKLUJhbGw9QmFsbAotQ3VzdG9tQWxwaGE9Q3VzdG9tIEFscGhhCi1NYXplPU1hemUKLXJnYj1SR0IKLUdyYXBoaWNzPUdyYXBoaWNzCi1GbGlwPUZsaXAKLVJvdGF0ZT1Sb3RhdGUKLXhzY2FsZT1YLVNjYWxlCi15c2NhbGU9WS1TY2FsZQotSW52ZXJ0PUludmVydAotUGF0aD1QYXRoCi1QYXRoT3Blcj1QYXRoIE9wZXJhdGlvbnMKLURyYXdQYXRoPURyYXcgUGF0aAotRmlsbFBhdGg9RmlsbCBQYXRoCi1DbG9zZVBhdGg9Q2xvc2UgUGF0aAotRmlsbENvbG9yPUZpbGwgQ29sb3IKLVRleHQ9VGV4dAotU2hhcGVzPVNoYXBlcwotTmV4dD1OZXh0Ci1CYWNrPUJhY2sKLUFuaW1QYXRoQ2xpcHBpbmc9QW5pbWF0ZWQgUGF0aCBDbGlwcGluZwotIyMjIyMgLS0tLS0tLS0tLS0tLS0tLS0tIFRhYiBEZXNjcmlwdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tICMjIyMjCi1BbHBoYURlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyBhbHBoYSBibGVuZGluZy4gSXQgZHJhd3MgdmFyaW91cyBzaGFwZXMgYW5kIGltYWdlcyBhcyBhbHBoYSB2YWx1ZXMgY2hhbmdlLgotQmFsbERlc2NyaXB0aW9uPVRoaXMgdGFiIHVzZXMgYWxwaGEgYmxlbmRpbmcgdG8gc2ltdWxhdGUgXCJnaG9zdGluZ1wiIG9mIGEgYmFsbCBpbiBtb3ZlbWVudC4KLUJsYWNrSG9sZURlc2NyaXB0aW9uPVRoaXMgaXMgYSBtaXNjZWxsYW5lb3VzIGRlbW9uc3RyYXRpb24gdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIGZpbGxPdmFsKCkgb3BlcmF0aW9uIHRvIHNpbXVsYXRlIGEgYmxhY2sgaG9sZS4KLUNhcmRzRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgdHJhbnNsYXRpb24uCi1Db3VudGRvd25EZXNjcmlwdGlvbj1UaGlzIG1pc2NlbGxhbmVvdXMgdGFiIHByZXNlbnRzIGEgY291bnQgZG93biBmcm9tIDUgdG8gMSwgdGhlbiBkaXNwbGF5cyBTV1QuCi1DdXJ2ZXNTV1REZXNjcmlwdGlvbj1UaGlzIHRhYiBwcmVzZW50cyBjdWJpYyBhbmQgcXVhZHJhdGljIGN1cnZlcyB0aGF0IGNhbiBiZSBkcmF3bi4gIEFzIGEgZGVtb25zdHJhdGlvbiwgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgYXJlIHVzZWQgdG8gc3BlbGwgb3V0IFwiU1dUXCIuICBUaGUgdXNlciBtYXkgcmVwb3NpdGlvbiB0aGUgY3ViaWMgYW5kIHF1YWRyYXRpYyBoYW5kbGVzLgotQ3VydmVzRGVzY3JpcHRpb249VGhpcyB0YWIgcHJlc2VudHMgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgdGhhdCBjYW4gYmUgZHJhd24uICBUaGUgdXNlciBtYXkgcmVwb3NpdGlvbiB0aGUgY3ViaWMgYW5kIHF1YWRyYXRpYyBoYW5kbGVzCi1DdXN0b21BbHBoYURlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGFscGhhIGJsZW5kaW5nLiAgSXQgYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IGEgY3VzdG9tIGFscGhhIHZhbHVlLgotQ3VzdG9tRm9udERlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIHRleHQgZm9udHMuICBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSBmb250IHBhcmFtZXRlcnMgc3VjaCBhcyBmYWNlLCBzdHlsZSBhbmQgc2l6ZS4KLUZvbnRCb3VuY2VEZXNjcmlwdGlvbj1UaGlzIHRhYiBpcyBhbiBhbmltYXRlZCBncmFwaGljLiBJdCBwcmVzZW50cyB0aGUgd29yZCBTV1QgaW4gZGlmZmVyZW50IGZvbnRzIGFzIGl0IGJvdW5jZXMgYXJvdW5kIHRoZSBzY3JlZW4uCi1HcmFkaWVudEltYWdlRGVzY3JpcHRpb249VGhpcyB0YWIgaXMgYW4gYW5pbWF0ZWQgZ3JhcGhpYy4gSXQgcHJlc2VudHMgdGhlIHdvcmQgU1dUIGluIGRpZmZlcmVudCBmb250cyBhcyBpdCBib3VuY2VzIGFyb3VuZCB0aGUgc2NyZWVuLgotQW50aWFsaWFzaW5nR3JhcGhpY3NEZXNjPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyBhbnRpYWxpYXNpbmcgZm9yIGdyYXBoaWNzLiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3Igc21vb3RoaW5nIGphZ2dlZCBlZGdlcyBpbiBncmFwaGljcy4gVGhpcyB0YWIgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUgZWZmZWN0cyBvZiBkaWZmZXJlbnQgYW50aWFsaWFzaW5nIHZhbHVlcy4KLUZsaXBEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IGFuIGltYWdlIGNhbiBiZSBmbGlwcGVkIGluIHZhcmlvdXMgZmFzaGlvbnMuCi1UcmFuc2Zvcm1JbWdEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgaW52ZXJ0LiAgSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdmFsdWVzIGZvciBzY2FsaW5nIGFuZCByb3RhdGlvbi4KLUltYWdlSW50ZXJwb2xhdGlvbkRlc2M9VGhpcyB0YWIgc2hvd3MgdGhlIGVmZmVjdHMgb2YgYXBwbHlpbmcgdmFyaW91cyBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobXMgdG8gaW1hZ2VzIHRoYXQgaGF2ZSBiZWVuIHN0cmV0Y2hlZCBvciBzaHJ1bmsuCi1JbnRyb2R1Y3Rpb25EZXNjcmlwdGlvbj1UaGlzIGlzIHRoZSBpbnRyb2R1Y3Rpb24gdGFiLiAgVGhpcyBkZW1vbnN0cmF0aW9uIG1ha2VzIHVzZSBvZiBhIHBhdGggY2xpcHBpbmcuCi1MaW5lQ2FwRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgbGluZSBjYXBzIGFwcGxpY2FibGUgdG8gYSBsaW5lLgotTGluZUpvaW5EZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyBsaW5lIGpvaW5zLiBJdCBhbGxvd3MgYSB1c2VyIHRvIGNob29zZSBmcm9tIGJldmVsLCBtaXRlciBhbmQgcm91bmQuCi1MaW5lU3R5bGVzRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIGxpbmUgc3R5bGVzIGFwcGxpY2FibGUgdG8gYSBsaW5lLiAgSXQgc2hvd3MgdGhlIHVzZSBvZiB0aGUgc2V0TGluZVN0eWxlKCkgbWV0aG9kLgotTGluZURlc2NyaXB0aW9uPVRoaXMgdGFiIGRyYXdzIHR3byBsaW5lcy4KLU1hemVEZXNjcmlwdGlvbj1UaGlzIGlzIGEgbWlzY2VsbGFuZW91cyBkZW1vbnN0cmF0aW9uLiAgVGhyZWUgb2JqZWN0cyBtb3ZlIHRocm91Z2ggdGhlIG1hemUsIGVhY2ggZm9sbG93aW5nIGEgZGlmZmVyZW50IHBhdGguICBPbmx5IG9uZSBvZiB0aGUgdGhyZWUgZm9sbG93cyB0aGUgY29ycmVjdCBwYXRoLgotQW5pbVBhdGhDbGlwcGluZ0Rlc2M9VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgcGF0aCBjbGlwcGluZy4gIEEgY2xpcHBpbmcgaXMgdGhlIGFyZWEgb250byB3aGljaCBhIGRyYXdpbmcgaXMgbWFkZSB2aXNpYmxlLiAgVGhlIGRlZmF1bHQgY2xpcHBpbmcgaXMgdGhlIGVudGlyZSBjYW52YXMgKGFsbCB0aGUgc3BhY2UgaW4gdGhlIHJpZ2h0IHBhbmVsKS4gIEhvd2V2ZXIsIG9uZSBjYW4gc2V0IHRoZSBjbGlwcGluZyB0byBiZSBzb21ldGhpbmcgZGlmZmVyZW50LiAgSW4gdGhpcyB0YWIsIHRoZSBjbGlwcGluZyBpcyB0aGUgc2V0IG9mIHRyaWFuZ2xlcywgcmVjdGFuZ2xlcyBhbmQgdGhlIGNpcmNsZS4gIFdoZW4gdGhlIGJsdWUgcmVjdGFuZ2xlIGlzIGRyYXduLCBvbmx5IHRoZSBwb3J0aW9ucyBvZiB0aGUgYmx1ZSByZWN0YW5nbGUgYXBwZWFyaW5nIGluIHRoZSBjbGlwcGluZyBhcmUgdmlzaWJsZS4KLVBhdGhDbGlwcGluZ0Rlc2M9VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgcGF0aCBjbGlwcGluZy4gIEEgY2xpcHBpbmcgaXMgdGhlIGFyZWEgb250byB3aGljaCBhIGRyYXdpbmcgaXMgbWFkZSB2aXNpYmxlLiAgVGhlIGRlZmF1bHQgY2xpcHBpbmcgaXMgdGhlIGVudGlyZSBjYW52YXMgKGFsbCB0aGUgc3BhY2UgaW4gdGhlIHJpZ2h0IHBhbmVsKS4gIEhvd2V2ZXIsIG9uZSBjYW4gc2V0IHRoZSBjbGlwcGluZyB0byBiZSBzb21ldGhpbmcgZGlmZmVyZW50LgotUGF0aE9wZXJEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBwYXRocy4gSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBmaWxsaW5nLCBkcmF3aW5nIGFuZCBjbG9zaW5nIHBhdGhzLgotcmdiRGVzY3JpcHRpb249TWlzY2VsbGFuZW91cyB0YWIgdGhhdCBkZW1vbnN0cmF0ZXMgZW1lcmdpbmcgY29sb3JzIGZyb20gbGF5ZXJpbmcgb3RoZXIgY29sb3JzLgotUmVnaW9uQ2xpcHBpbmdEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IHRvIGFwcGx5IGEgcmVnaW9uIGNsaXBwaW5nIGFuZCB0aGUgZWZmZWN0cyBvZiBhcHBseWluZyBvbmUuICBJdCBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIGJldHdlZW4gdHdvIHJlZ2lvbnMuCi1TaGFwZXNEZXNjcmlwdGlvbj1UaGlzIHRhYiBkcmF3cyAzRCBzaGFwZXMgKGluIDJEKSB1c2luZyB2YXJpb3VzIGxpbmUgc3R5bGVzLgotU3BpcmFsRGVzY3JpcHRpb249TWlzY2VsbGFuZW91cyB0YWIgdGhhdCBwcmVzZW50cyBhIHNwaXJhbCBjb25zaXN0aW5nIG9mIHRoZSBudW1iZXIgb2YgcGV0YWxzIHNwZWNpZmllZC4KLVN0YXJQb2x5Z29uRGVzY3JpcHRpb249VGhpcyB0YWIgZHJhd3MgYSBwb2x5Z29uIGFuZCBzaG93cyB0aGUgZWZmZWN0cyBvZiBzZXR0aW5nIGRpZmZlcmVudCBmaWxsIHJ1bGVzOiBTV1QuRklMTF9XSU5ESU5HIG9yIFNXVC5GSUxMX0VWRU5fT0RECi1BbnRpYWxpYXNpbmdUZXh0RGVzYz1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciB0ZXh0LiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3Igc21vb3RoaW5nIGphZ2dlZCBlZGdlcyBpbiBncmFwaGljcy4gVGhpcyB0YWIgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUgZWZmZWN0cyBvZiBkaWZmZXJlbnQgYW50aWFsaWFzaW5nIHZhbHVlcy4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19oZWxsb3dvcmxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDBhMTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19oZWxsb3dvcmxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1IZWxsb193b3JsZCA9IEhlbGxvIFdvcmxkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ob3ZlcmhlbHAucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2E2M2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ob3ZlcmhlbHAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcyA6IHswfQotCi1Ub29sSXRlbS50ZXh0ID0gVG9vbEl0ZW0gezB9Ci1Ub29sSXRlbS50b29sdGlwID0gVG9vbHRpcCBmb3IgezB9LiBUcnkgRjEgb24gbWUuCi1Ub29sSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLVRhYmxlSXRlbS50ZXh0ID0gVGFibGVJdGVtIHswfQotVGFibGVJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBGMSBvbiBtZS4KLVRhYmxlSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLVRyZWVJdGVtLnRleHQgPSBUcmVlSXRlbSB7MH0KLVRyZWVJdGVtLnRvb2x0aXAgPSBUb29sdGlwIGZvciB7MH0uIFRyeSBGMSBvbiBtZS4KLVRyZWVJdGVtLmhlbHAgPSBIZWxwIHRleHQgZm9yIHswfS4KLQotSGVsbG8udGV4dCA9IEhlbGxvCi1IZWxsby50b29sdGlwID0gR3JlZXRpbmdzIQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19pbWFnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzI1Y2VhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW1hZ2VfYW5hbHl6ZXIgCQkJCT0gSW1hZ2UgQW5hbHl6ZXIKLU5vbmUgCQkJCQkJPSBOb25lCi1XaGl0ZSAJCQkJCQk9IFdoaXRlCi1CbGFjayAJCQkJCQk9IEJsYWNrCi1SZWQgCQkJCQkJPSBSZWQKLUdyZWVuIAkJCQkJCT0gR3JlZW4KLUJsdWUgCQkJCQkJPSBCbHVlCi1YX3NjYWxlIAkJCQkJPSBYIFNjYWxlCi1ZX3NjYWxlIAkJCQkJPSBZIFNjYWxlCi1BbHBoYV9LIAkJCQkJPSBBbHBoYS1LCi1EaXNwbGF5IAkJCQkJPSBEaXNwbGF5Ci1JbmNyZW1lbnRhbCAJCQkJPSBJbmNyZW1lbnRhbAotVHJhbnNwYXJlbnQgCQkJCT0gVHJhbnNwYXJlbnQKLVRyYW5zcGFyZW50X2xjIAkJCQk9IHRyYW5zcGFyZW50Ci1NYXNrIAkJCQkJCT0gTWFzawotQmFja2dyb3VuZCAJCQkJCT0gQmFja2dyb3VuZAotQW5pbWF0aW9uIAkJCQkJPSBBbmltYXRpb24KLVByZXZpb3VzIAkJCQkJPSA8ICZQcmV2aW91cwotTmV4dCAJCQkJCQk9ICZOZXh0ID4KLUFuaW1hdGUgCQkJCQk9ICZBbmltYXRlCi1UeXBlX2luaXRpYWwgCQkJCT0gVHlwZToKLVR5cGVfc3RyaW5nIAkJCQk9IFR5cGU6IHswfQotVHlwZV9pbmRleCAJCQkJCT0gVHlwZTogezB9IFt7MSxudW1iZXIsaW50ZWdlcn0gb2YgezIsbnVtYmVyLGludGVnZXJ9XQotU2l6ZV9pbml0aWFsIAkJCQk9IFNpemU6Ci1TaXplX3ZhbHVlIAkJCQkJPSBTaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLURlcHRoX2luaXRpYWwgCQkJCT0gRGVwdGg6Ci1EZXB0aF92YWx1ZSAJCQkJPSBEZXB0aDogezB9Ci1UcmFuc3BhcmVudF9waXhlbF9pbml0aWFsIAk9IFRyYW5zcGFyZW50IHBpeGVsOgotVHJhbnNwYXJlbnRfcGl4ZWxfdmFsdWUJCT0gVHJhbnNwYXJlbnQgcGl4ZWw6IHswfQotVGltZV90b19sb2FkX2luaXRpYWwgCQk9IFRpbWUgdG8gbG9hZDoKLVRpbWVfdG9fbG9hZF92YWx1ZQkJCT0gVGltZSB0byBsb2FkOiB7MH0gbXMKLUFuaW1hdGlvbl9zaXplX2luaXRpYWwgCQk9IEFuaW1hdGlvbiBzaXplOgotQW5pbWF0aW9uX3NpemVfdmFsdWUgCQk9IEFuaW1hdGlvbiBzaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLUJhY2tncm91bmRfcGl4ZWxfaW5pdGlhbCAJPSBCYWNrZ3JvdW5kIHBpeGVsOgotQmFja2dyb3VuZF9waXhlbF92YWx1ZSAJCT0gQmFja2dyb3VuZCBwaXhlbDogezB9Ci1JbWFnZV9sb2NhdGlvbl9pbml0aWFsIAkJPSBJbWFnZSBsb2NhdGlvbjoKLUltYWdlX2xvY2F0aW9uX3ZhbHVlIAkJPSBJbWFnZSBsb2NhdGlvbjogKHswLG51bWJlcixpbnRlZ2VyfSwgezEsbnVtYmVyLGludGVnZXJ9KQotRGlzcG9zYWxfaW5pdGlhbCAJCQk9IERpc3Bvc2FsOgotRGlzcG9zYWxfdmFsdWUgCQkJCT0gRGlzcG9zYWw6IHswLG51bWJlcixpbnRlZ2VyfSAoezF9KQotRGVsYXlfaW5pdGlhbCAJCQkJPSBEZWxheToKLURlbGF5X3ZhbHVlIAkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMgKHVzaW5nIHsxLG51bWJlcixpbnRlZ2VyfSBtcykKLURlbGF5X3VzZWQgCQkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMKLVJlcGVhdHNfaW5pdGlhbCAJCQk9IFJlcGVhdHM6Ci1SZXBlYXRzX3ZhbHVlIAkJCQk9IFJlcGVhdHM6IHswLG51bWJlcixpbnRlZ2VyfQotUmVwZWF0c19mb3JldmVyIAkJCT0gUmVwZWF0czogezAsbnVtYmVyLGludGVnZXJ9IChmb3JldmVyKQotUGFsZXR0ZV9pbml0aWFsIAkJCT0gUGFsZXR0ZToKLVBhbGV0dGVfZGlyZWN0IAkJCQk9IFBhbGV0dGU6IERpcmVjdAotUGFsZXR0ZV92YWx1ZSAJCQkJPSBQYWxldHRlIHNpemU6IHswLG51bWJlcixpbnRlZ2VyfQotTWF4X2xlbmd0aF9zdHJpbmcgCQkJPSBUcmFuc3BhcmVudCBwaXhlbDogLTEgKG5vbmUpCi1QaXhlbF9kYXRhX2luaXRpYWwgCQkJPSBQaXhlbCBkYXRhOgotUGl4ZWxfZGF0YV92YWx1ZSAJCQk9IFBpeGVsIGRhdGE6ICBCeXRlcyBwZXIgbGluZTogezAsbnVtYmVyLGludGVnZXJ9ICBcCi0JCQkJCQkJICBTY2FubGluZSBwYWQ6IHsxLG51bWJlcixpbnRlZ2VyfSB7Mn0gIHszfQotRGVwdGhfaW5mbyAJCQkJCT0gRGVwdGg6IHswLG51bWJlcixpbnRlZ2VyfSAtLSB7MX0KLU9uZV9ieXRlIAkJCQkJPSAxIGJ5dGUgcGVyIHBpeGVsCi1NdWx0aV9ieXRlcyAJCQkJPSB7MCxudW1iZXIsaW50ZWdlcn0gYnl0ZXMgcGVyIHBpeGVsCi1NdWx0aV9waXhlbHMgCQkJCT0gezAsbnVtYmVyLGludGVnZXJ9IHBpeGVscyBwZXIgYnl0ZSB7MX0KLVNjcm9sbF9mb3JfYWxwaGEJCQk9IChTY3JvbGwgZG93biB0byBzZWUgYWxwaGEgZGF0YSkKLUZpbGUgCQkJCQkJPSAmRmlsZQotT3BlbkZpbGUgCQkJCQk9ICZPcGVuIEZpbGUuLi5cdEN0cmwrTwotT3BlblVSTAkJCQkJCT0gT3BlbiAmVVJMLi4uXHRDdHJsK1UKLVJlb3BlbiAJCQkJCQk9ICZSZW9wZW4KLUxvYWRGaWxlIAkJCQkJPSAmTG9hZCBGaWxlLi4uXHRDdHJsK0wKLVNhdmUgCQkJCQkJPSAmU2F2ZVx0Q3RybCtTCi1TYXZlX2FzIAkJCQkJPSBTYXZlICZBcy4uLgotU2F2ZV9tYXNrX2FzIAkJCQk9IFNhdmUgJk1hc2sgQXMuLi4KLVByaW50IAkJCQkJCT0gJlByaW50XHRDdHJsK1AKLUV4aXQgCQkJCQkJPSBFJnhpdAotQWxwaGEgCQkJCQkJPSBBbHBoYQotT3BlblVSTERpYWxvZwkJCQk9IE9wZW4gVVJMCi1FbnRlclVSTAkJCQkJPSBFbnRlciB0aGUgVVJMIGZvciBhbiBpbWFnZSAoYm1wLCBnaWYsIGljbywgamZpZiwganBlZywganBnLCBwbmcsIHRpZiwgdGlmZik6Ci1BbGxfaW1hZ2VzIAkJCQkJPSBBbGwgSW1hZ2UgRmlsZXMKLUxvYWRpbmdfbGMgCQkJCQk9IGxvYWRpbmcKLVNhdmluZ19sYyAJCQkJCT0gc2F2aW5nCi1Vbmtub3duX2V4dGVuc2lvbiAJCQk9IFVua25vd24gZmlsZSBleHRlbnNpb246IHswfVxuUGxlYXNlIHVzZSBibXAsIGdpZiwgaWNvLCBqZmlmLCBqcGVnLCBqcGcsIHBuZywgdGlmLCBvciB0aWZmLgotT3ZlcndyaXRlIAkJCQkJPSBPdmVyd3JpdGUgezB9PwotU2F2ZV9hbGwJCQkJCT0gU2F2ZSBhbGwgezB9IGltYWdlcyBpbnRvIGEgbXVsdGktaW1hZ2UgZmlsZT8KLUFuYWx5emVyX29uIAkJCQk9IEltYWdlIEFuYWx5emVyIG9uOiB7MH0KLVJlbG9hZGluZ19sYyAJCQkJPSByZWxvYWRpbmcKLUNvbG9yX2F0IAkJCQkJPSBJbWFnZSBjb2xvciBhdCAoezAsbnVtYmVyLGludGVnZXJ9LCB7MSxudW1iZXIsaW50ZWdlcn0pIFwKLQkJCQkJCQkgIC0gcGl4ZWwgezIsbnVtYmVyLGludGVnZXJ9IFsweHszfV0gLSBpcyB7NH0gWzB4ezV9XSB7Nn0KLVJHQgkJCQkJCQk9IFJHQiAneyd7MH0sIHsxfSwgezJ9J30nCi1SR0JBCQkJCQkJPSBSR0JBICd7J3swfSwgezF9LCB7Mn0sIHszfSd9JwotQ29sb3JfYXRfdHJhbnNwYXJlbnQJCT0gKHRyYW5zcGFyZW50KQotQ3JlYXRpbmdfaW1hZ2UgCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgIyB7MCxudW1iZXIsaW50ZWdlcn0gZnJvbSAKLU9LCQkJCQkJCT0gT0sKLUNhbmNlbAkJCQkJCT0gQ2FuY2VsCi1TdG9wIAkJCQkJCT0gJlN0b3AKLUNyZWF0aW5nX2Zyb20gCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgcmVhZCBmcm9tCi1QYWxldHRlX2RpcmVjdCAJCQkJPSBQYWxldHRlOiBEaXJlY3QKLVBhbGV0dGVfc2l6ZSAJCQkJPSBQYWxldHRlIHNpemU6IHswLG51bWJlcixpbnRlZ2VyfQotQnl0ZXNfcGVyX2xpbmUgCQkJCT0gQnl0ZXMgcGVyIGxpbmU6Ci1TY2FubGluZV9wYWQgCQkJCT0gU2NhbmxpbmUgcGFkOgotUHJpbnRpbmdfZXJyb3IJCQkJPSBQcmludGluZyBlcnJvcjogCi1FcnJvciAJCQkJCQk9IEVycm9yIHswfSBmaWxlXG57MX1cblxuCi1VbnN1cHBvcnRlZF9sYyAJCQkJPSB1bnN1cHBvcnRlZAotTm9uZV9sYyAJCQkJCT0gbm9uZQotQmFja2dyb3VuZF9sYyAJCQkJPSBiYWNrZ3JvdW5kCi1QcmV2aW91c19sYyAJCQkJPSBwcmV2aW91cwotVW5zcGVjaWZpZWRfbGMgCQkJCT0gdW5zcGVjaWZpZWQKLVVua25vd25fYWMgCQkJCQk9IFVOS05PV04KLUZvcmV2ZXJfbGMgCQkJCQk9IGZvcmV2ZXIKLVNhdmVfYXNfdHlwZQkJCQk9IFNhdmUgQXMgQk1QIFR5cGUuLi4KLVNhdmVfYXNfdHlwZV9sYWJlbAkJCT0gU2VsZWN0IHRoZSB0eXBlIG9mIEJNUCB0byBzYXZlIGFzOgotU2F2ZV9hc190eXBlX25vX2NvbXByZXNzCT0gTm8gQ29tcHJlc3Npb24KLVNhdmVfYXNfdHlwZV9ybGVfY29tcHJlc3MJPSBSTEUgQ29tcHJlc3Npb24KLVNhdmVfYXNfdHlwZV9vczIJCQk9IE9TLzIgQk1QCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2phdmF2aWV3ZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FmYzczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotT3Blbl9tZW51aXRlbT0mT3Blbi4uLlx0Q3RybCtPCi1FeGl0X21lbnVpdGVtPUUmeGl0Ci1GaWxlX21lbnVpdGVtPSZGaWxlCi1XaW5kb3dfdGl0bGU9U1dUIEphdmEgVmlld2VyCi1FcnJfZmlsZV9ub19leGlzdD1GaWxlIHswfSBkb2VzIG5vdCBleGlzdC4KLUVycl9maWxlX2lvPUlPIGVycm9yIHJlYWRpbmcgZmlsZTpcbnswfQotRXJyX2ZpbGVfbm90X2ZvdW5kPUZpbGUgbm90IGZvdW5kOlxuezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfbGF5b3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTljODAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXdpbmRvdy50aXRsZSA9IFNXVCBMYXlvdXRzCi0KLUFkZAkJCQkJPSAmQWRkCi1EZWxldGUJIAkJCT0gJkRlbGV0ZQotQ2xlYXIJCQkJPSAmQ2xlYXIKLUNoaWxkcmVuCQkJPSBDaGlsZHJlbgotVHlwZQkJCQk9IFR5cGUKLUxheW91dAkJCQk9IExheW91dAotUHJlZmVycmVkX1NpemUJCT0gUHJlZmVycmVkIFNpemUKLUNvZGUJCQkJPSBDJm9kZQotR2VuZXJhdGVkX0NvZGUJCT0gR2VuZXJhdGVkIENvZGUKLVBhcmFtZXRlcnMJCQk9IFBhcmFtZXRlcnMKLVByb3BlcnRpZXMJCQk9IFByb3BlcnRpZXMKLU1hcmdpbnMJCQkJPSBNYXJnaW5zCi1NYXJnaW5zX1NwYWNpbmcJCT0gTWFyZ2lucyBhbmQgU3BhY2luZwotQ29sdW1ucwkJCQk9IENvbHVtbnMKLUF0dGFjaF9FZGl0CQkJPSBFZGl0Ci1MZWZ0X0F0dGFjaG1lbnQJCT0gRWRpdCBMZWZ0IEF0dGFjaG1lbnQKLVJpZ2h0X0F0dGFjaG1lbnQJPSBFZGl0IFJpZ2h0IEF0dGFjaG1lbnQKLVRvcF9BdHRhY2htZW50CQk9IEVkaXQgVG9wIEF0dGFjaG1lbnQKLUJvdHRvbV9BdHRhY2htZW50CT0gRWRpdCBCb3R0b20gQXR0YWNobWVudAotUG9zaXRpb24JCQk9IFBvc2l0aW9uCi1Db250cm9sCQkJCT0gQ29udHJvbAotT2Zmc2V0CQkJCT0gT2Zmc2V0IFsrLy1dCi1JdGVtCQkJCT0gSXRlbSB7MH0KLUNvbWJvX0luZGV4CQkJPSBDb21ibyB7MH0KLUdyb3VwX0luZGV4CQkJPSBHcm91cCB7MH0KLUxhYmVsX0luZGV4CQkJPSBMYWJlbCB7MH0KLUJ1dHRvbl9JbmRleAkJPSBCdXR0b24gezB9Ci1TdHlsZWRUZXh0X0luZGV4CT0gU3R5bGVkVGV4dCB7MH0KLVRleHRfSW5kZXgJCQk9IFRleHQgezB9Ci1PSwkJCQkJPSBPSwotQ2FuY2VsCQkJCT0gQ2FuY2VsCi1FZGl0CQkJCT0gJkVkaXQKLVNlbGVjdF9BbGwJCQk9IFNlbGVjdCAmQWxsXHRDdHJsK0EKLUNvcHkJCQkJPSAmQ29weVx0Q3RybCtDCi1FeGl0CQkJCT0gRSZ4aXQKLU5hbWVfVGl0bGUJCQk9IEVudGVyIE5hbWVzCi1OYW1lX0xhYmVsCQkJPSBFbnRlciBuYW1lcyBmb3IgeW91ciBjb250cm9scwotSW52YWxpZF9OYW1lIAkJPSBJbnZhbGlkIE5hbWUgLSBQbGVhc2UgZW50ZXIgdmFsaWQgdmFyaWFibGUgbmFtZXMgZm9yIHlvdXIgY29udHJvbHMKLURlZmF1bHQJCQkJPSBEZWZhdWx0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVjZWM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfcGFpbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMKLXdpbmRvdy50aXRsZSA9IFBhaW50Ci0KLW1lbnUuVG9vbHMubGFiZWwgPSBUb29scwotbWVudS5PcHRpb25zLmxhYmVsID0gT3B0aW9ucwotCi10b29sLlBlbmNpbC5sYWJlbCA9IFBlbmNpbAotdG9vbC5QZW5jaWwudG9vbHRpcCA9IFBlbmNpbCB0b29sCi10b29sLlBlbmNpbC5pbWFnZSA9IHRvb2xfcGVuY2lsLmdpZgotdG9vbC5QZW5jaWwuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBQZW5jaWwgdG9vbC4KLQotdG9vbC5BaXJicnVzaC5sYWJlbCA9IEFpcmJydXNoCi10b29sLkFpcmJydXNoLnRvb2x0aXAgPSBBaXJicnVzaCB0b29sCi10b29sLkFpcmJydXNoLmltYWdlID0gdG9vbF9haXJicnVzaC5naWYKLXRvb2wuQWlyYnJ1c2guZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBBaXJicnVzaCB0b29sLgotCi10b29sLkxpbmUubGFiZWwgPSBMaW5lCi10b29sLkxpbmUudG9vbHRpcCA9IExpbmUgdG9vbAotdG9vbC5MaW5lLmltYWdlID0gdG9vbF9saW5lLmdpZgotdG9vbC5MaW5lLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgTGluZSB0b29sLgotCi10b29sLlBvbHlMaW5lLmxhYmVsID0gUG9seWdvbgotdG9vbC5Qb2x5TGluZS50b29sdGlwID0gUG9seWdvbiB0b29sCi10b29sLlBvbHlMaW5lLmltYWdlID0gdG9vbF9wb2x5bGluZS5naWYKLXRvb2wuUG9seUxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBQb2x5TGluZSB0b29sLgotCi10b29sLlJlY3RhbmdsZS5sYWJlbCA9IFJlY3RhbmdsZQotdG9vbC5SZWN0YW5nbGUudG9vbHRpcCA9IFJlY3RhbmdsZSB0b29sCi10b29sLlJlY3RhbmdsZS5pbWFnZSA9IHRvb2xfcmVjdGFuZ2xlLmdpZgotdG9vbC5SZWN0YW5nbGUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBSZWN0YW5nbGUgdG9vbC4KLQotdG9vbC5FbGxpcHNlLmxhYmVsID0gRWxsaXBzZQotdG9vbC5FbGxpcHNlLnRvb2x0aXAgPSBFbGxpcHNlIHRvb2wKLXRvb2wuRWxsaXBzZS5pbWFnZSA9IHRvb2xfZWxsaXBzZS5naWYKLXRvb2wuRWxsaXBzZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIEVsbGlwc2UgdG9vbC4KLQotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmxhYmVsID0gUm91bmRlZCBSZWN0YW5nbGUKLXRvb2wuUm91bmRlZFJlY3RhbmdsZS50b29sdGlwID0gUm91bmRlZCBSZWN0YW5nbGUgdG9vbAotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmltYWdlID0gdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgUm91bmRlZCBSZWN0YW5nbGUgdG9vbC4KLQotdG9vbC5UZXh0LmxhYmVsID0gVGV4dAotdG9vbC5UZXh0LnRvb2x0aXAgPSBUZXh0IHRvb2wKLXRvb2wuVGV4dC5pbWFnZSA9IHRvb2xfdGV4dC5naWYKLXRvb2wuVGV4dC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFRleHQgdG9vbC4KLXRvb2wuVGV4dC5zZXR0aW5ncy5kZWZhdWx0dGV4dCA9IEhlbGxvIQotdG9vbC5UZXh0LmRpYWxvZy50aXRsZSA9IFRleHQgVG9vbCBTZXR0aW5ncwotdG9vbC5UZXh0LmRpYWxvZy5tZXNzYWdlID0gUGxlYXNlIGVudGVyIHRoZSBuZXcgdGV4dCBzdHJpbmcgdG8gYmUgcGFpbnRlZC4KLQotdG9vbC5OdWxsLmxhYmVsID0gPG5vbmU+Ci0KLWZpbGwuTm9uZS5sYWJlbCA9IE5vIEZpbGwKLWZpbGwuTm9uZS50b29sdGlwID0gTm8gZmlsbCBtb2RlCi1maWxsLk5vbmUuaW1hZ2UgPSBmaWxsX25vbmUuZ2lmCi1maWxsLk5vbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIE5vIEZpbGwgbW9kZS4KLQotZmlsbC5PdXRsaW5lLmxhYmVsID0gT3V0bGluZSBGaWxsCi1maWxsLk91dGxpbmUudG9vbHRpcCA9IE91dGxpbmUgZmlsbCBtb2RlCi1maWxsLk91dGxpbmUuaW1hZ2UgPSBmaWxsX291dGxpbmUuZ2lmCi1maWxsLk91dGxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIE91dGxpbmUgRmlsbCBtb2RlLgotCi1maWxsLlNvbGlkLmxhYmVsID0gU29saWQgRmlsbAotZmlsbC5Tb2xpZC50b29sdGlwID0gU29saWQgZmlsbCBtb2RlCi1maWxsLlNvbGlkLmltYWdlID0gZmlsbF9zb2xpZC5naWYKLWZpbGwuU29saWQuZGVzY3JpcHRpb24gPSBTZWxlY3RzIFNvbGlkIEZpbGwgbW9kZS4KLQotbGluZXN0eWxlLlNvbGlkLmxhYmVsID0gU29saWQgTGluZQotbGluZXN0eWxlLlNvbGlkLnRvb2x0aXAgPSBTb2xpZCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuU29saWQuaW1hZ2UgPSBsaW5lc3R5bGVfc29saWQuZ2lmCi1saW5lc3R5bGUuU29saWQuZGVzY3JpcHRpb24gPSBTZWxlY3QgU29saWQgTGluZSBzdHlsZS4KLQotbGluZXN0eWxlLkRvdC5sYWJlbCA9IERvdHRlZCBMaW5lCi1saW5lc3R5bGUuRG90LnRvb2x0aXAgPSBEb3R0ZWQgbGluZSBzdHlsZQotbGluZXN0eWxlLkRvdC5pbWFnZSA9IGxpbmVzdHlsZV9kb3QuZ2lmCi1saW5lc3R5bGUuRG90LmRlc2NyaXB0aW9uID0gU2VsZWN0IERvdHRlZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRGFzaC5sYWJlbCA9IERhc2hlZCBMaW5lCi1saW5lc3R5bGUuRGFzaC50b29sdGlwID0gRGFzaGVkIGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5EYXNoLmltYWdlID0gbGluZXN0eWxlX2Rhc2guZ2lmCi1saW5lc3R5bGUuRGFzaC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBEYXNoZWQgTGluZSBzdHlsZS4KLQotbGluZXN0eWxlLkRhc2hEb3QubGFiZWwgPSBEYXNoLURvdCBMaW5lCi1saW5lc3R5bGUuRGFzaERvdC50b29sdGlwID0gRGFzaC1Eb3QgbGluZSBzdHlsZQotbGluZXN0eWxlLkRhc2hEb3QuaW1hZ2UgPSBsaW5lc3R5bGVfZGFzaGRvdC5naWYKLWxpbmVzdHlsZS5EYXNoRG90LmRlc2NyaXB0aW9uID0gU2VsZWN0IERhc2gtRG90IExpbmUgc3R5bGUuCi0KLW9wdGlvbnMuRm9udC5sYWJlbCA9IFRleHQgVG9vbCBGb250Ci1vcHRpb25zLkZvbnQudG9vbHRpcCA9IFNlbGVjdCBUZXh0IFRvb2wgZm9udAotb3B0aW9ucy5Gb250LmltYWdlID0gb3B0aW9uc19mb250LmdpZgotb3B0aW9ucy5Gb250LmRlc2NyaXB0aW9uID0gU2VsZWN0cyBUZXh0IFRvb2wgZm9udC4KLW9wdGlvbnMuRm9udC5kaWFsb2cudGl0bGUgPSBUZXh0IFRvb2wgRm9udAotCi1zZXR0aW5ncy5BaXJicnVzaFJhZGl1cy50ZXh0ID0gQWlyYnJ1c2ggUmFkaXVzCi1zZXR0aW5ncy5BaXJicnVzaEludGVuc2l0eS50ZXh0ID0gQWlyYnJ1c2ggSW50ZW5zaXR5Ci0KLXNlc3Npb24uTnVsbC5tZXNzYWdlID0gU2VsZWN0IGEgdG9vbC4uLgotc2Vzc2lvbi5Db250aW51b3VzUGFpbnQubWVzc2FnZSA9IENsaWNrIGFuZCBkcmFnIHRvIGRyYXcuLi4KLXNlc3Npb24uRHJhZ0ludGVyYWN0aXZlUGFpbnQubWVzc2FnZSA9IENsaWNrIGFuZCBkcmFnIHRvIHByZXZpZXcsIHJlbGVhc2UgdG8gZHJhdywgcmlnaHQtY2xpY2sgdG8gY2FuY2VsLi4uCi1zZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5hbmNob3JNb2RlID0gQ2xpY2sgdG8gc2V0IGFuY2hvci4uLgotc2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuaW50ZXJhY3RpdmVNb2RlID0gQ2xpY2sgdG8gZHJhdywgZG91YmxlLWNsaWNrIHRvIGNsb3NlIGZpZ3VyZSwgcmlnaHQtY2xpY2sgdG8gY2FuY2VsLi4uCi1zZXNzaW9uLlRleHQubWVzc2FnZSA9IENsaWNrIHRvIGRyYXcgdGV4dCwgcmlnaHQtY2xpY2sgdG8gZWRpdCB0ZXh0Li4uCi0KLXN0YXR1cy5Db29yZC5mb3JtYXQgPSAoezB9LCB7MX0pCi1zdGF0dXMuQ29vcmRSYW5nZS5mb3JtYXQgPSAoezB9LCB7MX0pIC0gKHsyfSwgezN9KQotc3RhdHVzLkJhci5mb3JtYXQgPSB7MH0gOiB7MX0gICB7Mn0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfdGV4dGVkaXRvci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWQ1MzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FeGl0X21lbnVpdGVtPUUmeGl0Ci1DdXRfbWVudWl0ZW09Q3UmdFx0Q3RybCtYCi1Db3B5X21lbnVpdGVtPSZDb3B5XHRDdHJsK0MKLVBhc3RlX21lbnVpdGVtPSZQYXN0ZVx0Q3RybCtWCi1XaW5kb3dfdGl0bGU9U1dUIFRleHQgRWRpdG9yCi1Gb250X21lbnVpdGVtPVNldCAmRm9udC4uLgotRWRpdF9tZW51aXRlbT0mRWRpdAotRmlsZV9tZW51aXRlbT0mRmlsZQotQm9sZD1Cb2xkCi1JdGFsaWM9SXRhbGljCi1VbmRlcmxpbmU9VW5kZXJsaW5lCi1TdHJpa2VvdXQ9U3RyaWtlb3V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzkzN2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+Ci12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmElQWRkcmVzc0Jvb2sgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YSVDb250cm9sRXhhbXBsZSA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YSVGaWxlVmlld2VyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YSVIZWxsb1dvcmxkMSA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmElSGVsbG9Xb3JsZDIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhJUhlbGxvV29ybGQzID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDQuamF2YSVIZWxsb1dvcmxkNCA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ1LmphdmElSGVsbG9Xb3JsZDUgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhJUhvdmVySGVscCA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YSVJbWFnZUFuYWx5emVyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhJUphdmFWaWV3ZXIgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmElVGV4dEVkaXRvciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+IgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlNzE2MWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rOwotCi0KLS8qIEltcG9ydHMgKi8KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQWRkcmVzc0Jvb2tFeGFtcGxlIGlzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIGFkZHJlc3MgYm9vay4gIFRoaXMgYXBwbGljYXRpb24gaGFzIAotICogc2F2ZSwgbG9hZCwgc29ydGluZywgYW5kIHNlYXJjaGluZyBmdW5jdGlvbnMgY29tbW9uCi0gKiB0byBiYXNpYyBhZGRyZXNzIGJvb2tzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2sgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzQWRkcmVzc0Jvb2sgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2FkZHJlc3Nib29rIik7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgU2VhcmNoRGlhbG9nIHNlYXJjaERpYWxvZzsKLQkKLQlwcml2YXRlIEZpbGUgZmlsZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZDsKLQkKLQlwcml2YXRlIFN0cmluZ1tdIGNvcHlCdWZmZXI7Ci0KLQlwcml2YXRlIGludCBsYXN0U29ydENvbHVtbj0gLTE7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJcdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7cmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJMYXN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpcnN0X25hbWUiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJ1c2luZXNzX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJIb21lX3Bob25lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFbWFpbCIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmF4Iil9OwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQWRkcmVzc0Jvb2sgYXBwbGljYXRpb24gPSBuZXcgQWRkcmVzc0Jvb2soKTsKLQlTaGVsbCBzaGVsbCA9IGFwcGxpY2F0aW9uLm9wZW4oZGlzcGxheSk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJZS5kb2l0ID0gY2xvc2VBZGRyZXNzQm9vaygpOwotCQl9Ci0JfSk7Ci0JCi0JY3JlYXRlTWVudUJhcigpOwotCi0Jc2VhcmNoRGlhbG9nID0gbmV3IFNlYXJjaERpYWxvZyhzaGVsbCk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFOYW1lcyhjb2x1bW5OYW1lcyk7Ci0Jc2VhcmNoRGlhbG9nLnNldFNlYXJjaEFyZWFMYWJlbChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNvbHVtbiIpKTsKLQlzZWFyY2hEaWFsb2cuYWRkRmluZExpc3RlbmVyKG5ldyBGaW5kTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgYm9vbGVhbiBmaW5kKCkgewotCQkJcmV0dXJuIGZpbmRFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCQkJCQotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsJCi0JdGFibGUuc2V0TWVudShjcmVhdGVQb3BVcE1lbnUoKSk7CQotCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwKSBlZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0JZm9yKGludCBpID0gMDsgaSA8IGNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChjb2x1bW5OYW1lc1tpXSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBpOwotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbkluZGV4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JbmV3QWRkcmVzc0Jvb2soKTsKLQotCXNoZWxsLnNldFNpemUodGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZUFkZHJlc3NCb29rKCkgewotCWlmKGlzTW9kaWZpZWQpIHsKLQkJLy9hc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc2F2ZSBjdXJyZW50IGFkZHJlc3MgYm9vawotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQlib3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNsb3NlX3NhdmUiKSk7Ci0JCi0JCWludCBjaG9pY2UgPSBib3gub3BlbigpOwotCQlpZihjaG9pY2UgPT0gU1dULkNBTkNFTCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYoY2hvaWNlID09IFNXVC5ZRVMpIHsKLQkJCWlmICghc2F2ZSgpKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCQotCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArKykgewotCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JfQotCQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBDcmVhdGVzIHRoZSBtZW51IGF0IHRoZSB0b3Agb2YgdGhlIHNoZWxsIHdoZXJlIG1vc3QKLSAqIG9mIHRoZSBwcm9ncmFtcyBmdW5jdGlvbmFsaXR5IGlzIGFjY2Vzc2VkLgotICoKLSAqIEByZXR1cm4JCVRoZSA8Y29kZT5NZW51PC9jb2RlPiB3aWRnZXQgdGhhdCB3YXMgY3JlYXRlZAotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlTWVudUJhcigpIHsKLQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkKLQkvL2NyZWF0ZSBlYWNoIGhlYWRlciBhbmQgc3ViTWVudSBmb3IgdGhlIG1lbnVCYXIKLQljcmVhdGVGaWxlTWVudShtZW51QmFyKTsKLQljcmVhdGVFZGl0TWVudShtZW51QmFyKTsKLQljcmVhdGVTZWFyY2hNZW51KG1lbnVCYXIpOwotCWNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQotCXJldHVybiBtZW51QmFyOwotfQotCi0vKioKLSAqIENvbnZlcnRzIGFuIGVuY29kZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhIFN0cmluZyBhcnJheSByZXByZXNlbnRpbmcgYSB0YWJsZSBlbnRyeS4KLSAqLwotcHJpdmF0ZSBTdHJpbmdbXSBkZWNvZGVMaW5lKFN0cmluZyBsaW5lKSB7Ci0JaWYobGluZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlTdHJpbmdbXSBwYXJzZWRMaW5lID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgcGFyc2VkTGluZS5sZW5ndGggLSAxOyBpKyspIHsKLQkJaW50IGluZGV4ID0gbGluZS5pbmRleE9mKERFTElNSVRFUik7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlwYXJzZWRMaW5lW2ldID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgREVMSU1JVEVSLmxlbmd0aCgpLCBsaW5lLmxlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCWlmIChsaW5lLmluZGV4T2YoREVMSU1JVEVSKSAhPSAtMSkgcmV0dXJuIG51bGw7Ci0JCi0JcGFyc2VkTGluZVtwYXJzZWRMaW5lLmxlbmd0aCAtIDFdID0gbGluZTsKLQotCXJldHVybiBwYXJzZWRMaW5lOwotfQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLXByaXZhdGUgdm9pZCBlZGl0RW50cnkoVGFibGVJdGVtIGl0ZW0pIHsKLQlEYXRhRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IERhdGFFbnRyeURpYWxvZyhzaGVsbCk7Ci0JZGlhbG9nLnNldExhYmVscyhjb2x1bW5OYW1lcyk7Ci0JU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtLmdldFRleHQoaSk7Ci0JfQotCWRpYWxvZy5zZXRWYWx1ZXModmFsdWVzKTsKLQl2YWx1ZXMgPSBkaWFsb2cub3BlbigpOwotCWlmICh2YWx1ZXMgIT0gbnVsbCkgewotCQlpdGVtLnNldFRleHQodmFsdWVzKTsKLQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JfQotfQotcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTGluZShTdHJpbmdbXSB0YWJsZUl0ZW1zKSB7Ci0JU3RyaW5nIGxpbmUgPSAiIjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCWxpbmUgKz0gdGFibGVJdGVtc1tpXSArIERFTElNSVRFUjsKLQl9Ci0JbGluZSArPSB0YWJsZUl0ZW1zW3RhYmxlSXRlbXMubGVuZ3RoIC0gMV0gKyAiXG4iOwotCQotCXJldHVybiBsaW5lOwotfQotcHJpdmF0ZSBib29sZWFuIGZpbmRFbnRyeSgpIHsKLQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3Ioc2hlbGwuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpOwotCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkKLQlib29sZWFuIG1hdGNoQ2FzZSA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaENhc2UoKTsKLQlib29sZWFuIG1hdGNoV29yZCA9IHNlYXJjaERpYWxvZy5nZXRNYXRjaFdvcmQoKTsKLQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoRGlhbG9nLmdldFNlYXJjaFN0cmluZygpOwotCWludCBjb2x1bW4gPSBzZWFyY2hEaWFsb2cuZ2V0U2VsZWN0ZWRTZWFyY2hBcmVhKCk7Ci0JCi0Jc2VhcmNoU3RyaW5nID0gbWF0Y2hDYXNlID8gc2VhcmNoU3RyaW5nIDogc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCi0JYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCWlmIChzZWFyY2hEaWFsb2cuZ2V0U2VhcmNoRG93bigpKSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOyBpIDwgdGFibGUuZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvcihpbnQgaSA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKGZvdW5kID0gZmluZE1hdGNoKHNlYXJjaFN0cmluZywgdGFibGUuZ2V0SXRlbShpKSwgY29sdW1uLCBtYXRjaFdvcmQsIG1hdGNoQ2FzZSkpewotCQkJCXRhYmxlLnNldFNlbGVjdGlvbihpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0Jd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCXJldHVybiBmb3VuZDsKLX0KLXByaXZhdGUgYm9vbGVhbiBmaW5kTWF0Y2goU3RyaW5nIHNlYXJjaFN0cmluZywgVGFibGVJdGVtIGl0ZW0sIGludCBjb2x1bW4sIGJvb2xlYW4gbWF0Y2hXb3JkLCBib29sZWFuIG1hdGNoQ2FzZSkgewotCQotCVN0cmluZyB0YWJsZVRleHQgPSBtYXRjaENhc2UgPyBpdGVtLmdldFRleHQoY29sdW1uKSA6IGl0ZW0uZ2V0VGV4dChjb2x1bW4pLnRvTG93ZXJDYXNlKCk7Ci0JaWYgKG1hdGNoV29yZCkgewotCQlpZiAodGFibGVUZXh0ICE9IG51bGwgJiYgdGFibGVUZXh0LmVxdWFscyhzZWFyY2hTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQl9IGVsc2UgewotCQlpZih0YWJsZVRleHQhPSBudWxsICYmIHRhYmxlVGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZykgIT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXByaXZhdGUgdm9pZCBuZXdBZGRyZXNzQm9vaygpIHsJCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpICsgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfdGl0bGUiKSk7Ci0JZmlsZSA9IG51bGw7Ci0JaXNNb2RpZmllZCA9IGZhbHNlOwotfQotcHJpdmF0ZSB2b2lkIG5ld0VudHJ5KCkgewotCURhdGFFbnRyeURpYWxvZyBkaWFsb2cgPSBuZXcgRGF0YUVudHJ5RGlhbG9nKHNoZWxsKTsKLQlkaWFsb2cuc2V0TGFiZWxzKGNvbHVtbk5hbWVzKTsKLQlTdHJpbmdbXSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoZGF0YSk7Ci0JCWlzTW9kaWZpZWQgPSB0cnVlOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIG9wZW5BZGRyZXNzQm9vaygpIHsJCi0JRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAiKi4qIn0pOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkJvb2tfZmlsdGVyX25hbWUiKSArICIgKCouYWRyKSIsIAotCQkJCQkJCQkJCQlyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFsbF9maWx0ZXJfbmFtZSIpICsgIiAoKi4qKSJ9KTsKLQlTdHJpbmcgbmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0JaWYobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKStmaWxlLmdldE5hbWUoKSsiICIrcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEb2VzX25vdF9leGlzdCIpKTsgCi0JCXJldHVybjsKLQl9Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKLQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7Ci0JU3RyaW5nW10gZGF0YSA9IG5ldyBTdHJpbmdbMF07Ci0JdHJ5IHsKLQkJZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmaWxlUmVhZGVyKTsKLQkJU3RyaW5nIG5leHRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJd2hpbGUgKG5leHRMaW5lICE9IG51bGwpewotCQkJU3RyaW5nW10gbmV3RGF0YSA9IG5ldyBTdHJpbmdbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBuZXh0TGluZTsKLQkJCWRhdGEgPSBuZXdEYXRhOwotCQkJbmV4dExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQl9Ci0JfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX25vdF9mb3VuZCIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUgKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIklPX2Vycm9yX3JlYWQiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybjsKLQl9IGZpbmFsbHkgewkKLQkJCi0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCi0JCWlmKGZpbGVSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlUmVhZGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl9jbG9zZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JU3RyaW5nW11bXSB0YWJsZUluZm8gPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoXVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlpbnQgd3JpdGVJbmRleCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZ1tdIGxpbmUgPSBkZWNvZGVMaW5lKGRhdGFbaV0pOwotCQlpZiAobGluZSAhPSBudWxsKSB0YWJsZUluZm9bd3JpdGVJbmRleCsrXSA9IGxpbmU7Ci0JfQotCWlmICh3cml0ZUluZGV4ICE9IGRhdGEubGVuZ3RoKSB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t3cml0ZUluZGV4XVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0YWJsZUluZm8sIDAsIHJlc3VsdCwgMCwgd3JpdGVJbmRleCk7Ci0JCXRhYmxlSW5mbyA9IHJlc3VsdDsKLQl9Ci0JQXJyYXlzLnNvcnQodGFibGVJbmZvLCBuZXcgUm93Q29tcGFyYXRvcigwKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSW5mby5sZW5ndGg7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KHRhYmxlSW5mb1tpXSk7Ci0JfQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKStmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCWlzTW9kaWZpZWQgPSBmYWxzZTsKLQl0aGlzLmZpbGUgPSBmaWxlOwotfQotcHJpdmF0ZSBib29sZWFuIHNhdmUoKSB7Ci0JaWYoZmlsZSA9PSBudWxsKSByZXR1cm4gc2F2ZUFzKCk7Ci0JCi0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCVN0cmluZ1tdIGxpbmVzID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmdbXSBpdGVtVGV4dCA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaXRlbVRleHQubGVuZ3RoOyBqKyspIHsKLQkJCWl0ZW1UZXh0W2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCQlsaW5lc1tpXSA9IGVuY29kZUxpbmUoaXRlbVRleHQpOwotCX0KLQkJCi0JRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbnVsbDsKLQl0cnkgeyAKLQkJZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJZmlsZVdyaXRlci53cml0ZShsaW5lc1tpXSk7Ci0JCX0KLQl9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGVfbm90X2ZvdW5kIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlICkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl93cml0ZSIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZmluYWxseSB7Ci0JCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCQotCQlpZihmaWxlV3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZVdyaXRlci5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3JfY2xvc2UiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlRpdGxlX2JhciIpK2ZpbGUuZ2V0TmFtZSgpKTsKLQlpc01vZGlmaWVkID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcml2YXRlIGJvb2xlYW4gc2F2ZUFzKCkgewotCQkKLQlGaWxlRGlhbG9nIHNhdmVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCXNhdmVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmFkcjsiLCAgIiouKiJ9KTsKLQlzYXZlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7IkFkZHJlc3MgQm9va3MgKCouYWRyKSIsICJBbGwgRmlsZXMgIn0pOwotCQotCXNhdmVEaWFsb2cub3BlbigpOwotCVN0cmluZyBuYW1lID0gc2F2ZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCQkKLQlpZihuYW1lLmVxdWFscygiIikpIHJldHVybiBmYWxzZTsKLQotCWlmKG5hbWUuaW5kZXhPZigiLmFkciIpICE9IG5hbWUubGVuZ3RoKCkgLSA0KSB7Ci0JCW5hbWUgKz0gIi5hZHIiOwotCX0KLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNhdmVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBuYW1lKTsKLQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuWUVTIHwgU1dULk5PKTsKLQkJYm94LnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FzX3RpdGxlIikpOwotCQlib3guc2V0TWVzc2FnZShyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbGUiKSArIGZpbGUuZ2V0TmFtZSgpKyIgIityZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlF1ZXJ5X292ZXJ3cml0ZSIpKTsKLQkJaWYoYm94Lm9wZW4oKSAhPSBTV1QuWUVTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JdGhpcy5maWxlID0gZmlsZTsKLQlyZXR1cm4gc2F2ZSgpOwkKLX0KLXByaXZhdGUgdm9pZCBzb3J0KGludCBjb2x1bW4pIHsKLQlpZih0YWJsZS5nZXRJdGVtQ291bnQoKSA8PSAxKSByZXR1cm47Ci0KLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JU3RyaW5nW11bXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdW3RhYmxlLmdldENvbHVtbkNvdW50KCldOwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlmb3IoaW50IGogPSAwOyBqIDwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsgaisrKSB7Ci0JCQlkYXRhW2ldW2pdID0gaXRlbXNbaV0uZ2V0VGV4dChqKTsKLQkJfQotCX0KLQkKLQlBcnJheXMuc29ydChkYXRhLCBuZXcgUm93Q29tcGFyYXRvcihjb2x1bW4pKTsKLQkKLQlpZiAobGFzdFNvcnRDb2x1bW4gIT0gY29sdW1uKSB7Ci0JCXRhYmxlLnNldFNvcnRDb2x1bW4odGFibGUuZ2V0Q29sdW1uKGNvbHVtbikpOwotCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbaV0pOwotCQl9Ci0JCWxhc3RTb3J0Q29sdW1uID0gY29sdW1uOwotCX0gZWxzZSB7Ci0JCS8vIHJldmVyc2Ugb3JkZXIgaWYgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNlbGVjdGVkIGFnYWluCi0JCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQkJaW50IGogPSBkYXRhLmxlbmd0aCAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXS5zZXRUZXh0KGRhdGFbai0tXSk7Ci0JCX0KLQkJbGFzdFNvcnRDb2x1bW4gPSAtMTsKLQl9Ci0JCi19Ci0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBGaWxlIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhciBNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBGaWxlIHN1Ym1lbnUuCi0gKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL0ZpbGUgbWVudS4KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX21lbnVfdGl0bGUiKSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uc2V0TWVudShtZW51KTsKLQkvKiogCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaXRlbXNbMV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApOyAvLyBlZGl0IGNvbnRhY3QKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoKGZpbGUgIT0gbnVsbCkgJiYgaXNNb2RpZmllZCk7IC8vIHNhdmUKLQkJCWl0ZW1zWzZdLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIHNhdmUgYXMKLQkJfQotCX0pOwotCi0KLQkvL0ZpbGUgLT4gTmV3IENvbnRhY3QKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfY29udGFjdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ04nKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9jb250YWN0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCQotCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkKLQkvL0ZpbGUgLT4gTmV3IEFkZHJlc3MgQm9vawotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk5ld19hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdCJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW5ld0FkZHJlc3NCb29rKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCS8vRmlsZSAtPiBPcGVuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiT3Blbl9hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNsb3NlQWRkcmVzc0Jvb2soKSkgewotCQkJCW9wZW5BZGRyZXNzQm9vaygpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQkvL0ZpbGUgLT4gU2F2ZS4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2FkZHJlc3NfYm9vayIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzYXZlKCk7Ci0JCX0KLQl9KTsKLQkKLQkvL0ZpbGUgLT4gU2F2ZSBBcy4KLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTYXZlX2Jvb2tfYXMiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdBJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2F2ZUFzKCk7Ci0JCX0KLQl9KTsKLQotCQkKLQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCi0JLy9GaWxlIC0+IEV4aXQuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRXhpdCIpKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEVkaXQgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyIE1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEVkaXQgc3VibWVudS4KLSAqCi0gKiBAc2VlCSNjcmVhdGVTb3J0TWVudSgpCi0gKi8KLXByaXZhdGUgTWVudUl0ZW0gY3JlYXRlRWRpdE1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9FZGl0IG1lbnUuCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdF9tZW51X3RpdGxlIikpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUobWVudSk7Ci0JCi0JLyoqIAotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIGhhbmRsZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIAotCSAqIHNvbWUgaXRlbXMgaW4gdGhlIEVkaXQgc3VibWVudS4KLQkgKi8KLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzBdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzFdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbNV0uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gc29ydAotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IEVkaXQKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJFZGl0IikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnRScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCS8vRWRpdCAtPiBDb3B5Ci0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ29weSIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0MnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9FZGl0IC0+IFBhc3RlCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUGFzdGUiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdWJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNvcHlCdWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoY29weUJ1ZmZlcik7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBEZWxldGUKLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEZWxldGUiKSk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJaXRlbXNbMF0uZGlzcG9zZSgpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7CQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQotCS8vRWRpdCAtPiBTb3J0KENhc2NhZGUpCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU29ydCIpKTsKLQlNZW51IHN1Ym1lbnUgPSBjcmVhdGVTb3J0TWVudSgpOwotCXN1Ykl0ZW0uc2V0TWVudShzdWJtZW51KTsKLQkKLQlyZXR1cm4gaXRlbTsKLQkKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgU29ydCBjYXNjYWRpbmcgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY2FzY2FkaW5nIG1lbnUgd2l0aCBhbGwgdGhlIHNvcnQgbWVudSBpdGVtcyBvbiBpdC4KLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZVNvcnRNZW51KCkgewotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlNZW51SXRlbSBzdWJpdGVtOwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQlzdWJpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuTk9ORSk7Ci0JCXN1Yml0ZW0uc2V0VGV4dChjb2x1bW5OYW1lcyBbaV0pOwotCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJc3ViaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0KGNvbHVtbik7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXJldHVybiBzdWJtZW51OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBTZWFyY2ggc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIFNlYXJjaCBzdWJtZW51LgotICovCi1wcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWVudShNZW51IG1lbnVCYXIpIHsKLQkvL1NlYXJjaCBtZW51LgotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNlYXJjaF9tZW51X3RpdGxlIikpOwotCU1lbnUgc2VhcmNoTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUoc2VhcmNoTWVudSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kLi4uCi0JaXRlbSA9IG5ldyBNZW51SXRlbShzZWFyY2hNZW51LCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmluZCIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0YnKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0TWF0Y2hDYXNlKGZhbHNlKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRNYXRjaFdvcmQoZmFsc2UpOwotCQkJc2VhcmNoRGlhbG9nLnNldFNlYXJjaERvd24odHJ1ZSk7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0U2VhcmNoU3RyaW5nKCIiKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRTZWxlY3RlZFNlYXJjaEFyZWEoMCk7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci0KLQkvL1NlYXJjaCAtPiBGaW5kIE5leHQKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHNlYXJjaE1lbnUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaW5kX25leHQiKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuRjMpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLX0KLQotLyoqIAotICogQ3JlYXRlcyBhbGwgaXRlbXMgbG9jYXRlZCBpbiB0aGUgcG9wdXAgbWVudSBhbmQgYXNzb2NpYXRlcwotICogYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUgZnVuY3Rpb25zLgotICoKLSAqIEByZXR1cm4JTWVudQotICoJCQlUaGUgY3JlYXRlZCBwb3B1cCBtZW51LgotICovCi1wcml2YXRlIE1lbnUgY3JlYXRlUG9wVXBNZW51KCkgewotCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVApOwotCi0JLyoqIAotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JcG9wVXBNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJTWVudSBtZW51ID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQlNZW51SXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaW50IGNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJCWl0ZW1zWzJdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGVkaXQKLQkJCWl0ZW1zWzNdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGNvcHkKLQkJCWl0ZW1zWzRdLnNldEVuYWJsZWQoY29weUJ1ZmZlciAhPSBudWxsKTsgLy8gcGFzdGUKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQoY291bnQgIT0gMCk7IC8vIGRlbGV0ZQotCQkJaXRlbXNbN10uc2V0RW5hYmxlZCh0YWJsZS5nZXRJdGVtQ291bnQoKSAhPSAwKTsgLy8gZmluZAotCQl9Ci0JfSk7Ci0KLQkvL05ldwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX25ldyIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQluZXdFbnRyeSgpOwotCQl9Ci0JfSk7Ci0JCi0JbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlNFUEFSQVRPUik7CQotCQotCS8vRWRpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2VkaXQiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJZWRpdEVudHJ5KGl0ZW1zWzBdKTsKLQkJfQotCX0pOwotCi0JLy9Db3B5Ci0JaXRlbSA9IG5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJQb3BfdXBfY29weSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQljb3B5QnVmZmVyID0gbmV3IFN0cmluZ1t0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29weUJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWNvcHlCdWZmZXJbaV0gPSBpdGVtc1swXS5nZXRUZXh0KGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9QYXN0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX3Bhc3RlIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjb3B5QnVmZmVyID09IG51bGwpIHJldHVybjsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KGNvcHlCdWZmZXIpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQkvL0RlbGV0ZQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2RlbGV0ZSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQlpdGVtc1swXS5kaXNwb3NlKCk7Ci0JCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQkKLQkvL0ZpbmQuLi4KLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9maW5kIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNlYXJjaERpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9KTsKLQotCXJldHVybiBwb3BVcE1lbnU7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIEhlbHAgc3VibWVudSBhbmQKLSAqIGFzc29jaWF0ZSBhbGwgdGhlIG1lbnUgaXRlbXMgd2l0aCB0aGVpciBhcHByb3ByaWF0ZQotICogZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbQltZW51QmFyCU1lbnUKLSAqCQkJCXRoZSA8Y29kZT5NZW51PC9jb2RlPiB0aGF0IGZpbGUgY29udGFpbgotICoJCQkJdGhlIEhlbHAgc3VibWVudS4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlbHBNZW51KE1lbnUgbWVudUJhcikgewotCQotCS8vSGVscCBNZW51Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSGVscF9tZW51X3RpdGxlIikpOwkKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KG1lbnUpOwotCQotCS8vSGVscCAtPiBBYm91dCBUZXh0IEVkaXRvcgotCU1lbnVJdGVtIHN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0IikpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5OT05FKTsKLQkJCWJveC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMSIpICsgc2hlbGwuZ2V0VGV4dCgpKTsKLQkJCWJveC5zZXRNZXNzYWdlKHNoZWxsLmdldFRleHQoKSArIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQWJvdXRfMiIpKTsKLQkJCWJveC5vcGVuKCk7CQkKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIFRvIGNvbXBhcmUgZW50cmllcyAocm93cykgYnkgdGhlIGdpdmVuIGNvbHVtbgotICovCi1wcml2YXRlIGNsYXNzIFJvd0NvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQlwcml2YXRlIGludCBjb2x1bW47Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvd0NvbXBhcmF0b3IgZ2l2ZW4gdGhlIGNvbHVtbiBpbmRleAotCSAqIEBwYXJhbSBjb2wgVGhlIGluZGV4IChzdGFydGluZyBhdCB6ZXJvKSBvZiB0aGUgY29sdW1uCi0JICovCi0JcHVibGljIFJvd0NvbXBhcmF0b3IoaW50IGNvbCkgewotCQljb2x1bW4gPSBjb2w7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHR3byByb3dzICh0eXBlIFN0cmluZ1tdKSB1c2luZyB0aGUgc3BlY2lmaWVkCi0JICogY29sdW1uIGVudHJ5LgotCSAqIEBwYXJhbSBvYmoxIEZpcnN0IHJvdyB0byBjb21wYXJlCi0JICogQHBhcmFtIG9iajIgU2Vjb25kIHJvdyB0byBjb21wYXJlCi0JICogQHJldHVybiBuZWdhdGl2ZSBpZiBvYmoxIGxlc3MgdGhhbiBvYmoyLCBwb3NpdGl2ZSBpZgotCSAqIAkJCW9iajEgZ3JlYXRlciB0aGFuIG9iajIsIGFuZCB6ZXJvIGlmIGVxdWFsLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJU3RyaW5nW10gcm93MSA9IChTdHJpbmdbXSlvYmoxOwotCQlTdHJpbmdbXSByb3cyID0gKFN0cmluZ1tdKW9iajI7Ci0JCQotCQlyZXR1cm4gcm93MVtjb2x1bW5dLmNvbXBhcmVUbyhyb3cyW2NvbHVtbl0pOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiZjM0YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRGF0YUVudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBEYXRhRW50cnlEaWFsb2cgY2xhc3MgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIGRpYWxvZyB0aGF0IGFjY2VwdHMgYmFzaWMgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhdAotICogaXMgYWRkZWQgdG8gYSA8Y29kZT5UYWJsZTwvY29kZT4gd2lkZ2V0IG9yIGVkaXRzIGEgPGNvZGU+VGFibGVJdGVtPC9jb2RlPiBlbnRyeSAKLSAqIHRvIHJlcHJlc2VudCB0aGUgZW50ZXJlZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgRGF0YUVudHJ5RGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0FkZHJlc3NCb29rID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19hZGRyZXNzYm9vayIpOwotCQotCVNoZWxsIHNoZWxsOwotCVN0cmluZ1tdIHZhbHVlczsKLQlTdHJpbmdbXSBsYWJlbHM7Ci0JCi1wdWJsaWMgRGF0YUVudHJ5RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsJCQotfQotCi1wcml2YXRlIHZvaWQgYWRkVGV4dExpc3RlbmVyKGZpbmFsIFRleHQgdGV4dCkgewotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKSh0ZXh0LmdldERhdGEoImluZGV4IikpOwotCQkJdmFsdWVzW2luZGV4LmludFZhbHVlKCldID0gdGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQl9KTsKLX0KLXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQnV0dG9ucygpIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQotCUJ1dHRvbiBva0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk9LIikpOwotCW9rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl2YWx1ZXMgPSBudWxsOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnNldERlZmF1bHRCdXR0b24ob2tCdXR0b24pOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGV4dFdpZGdldHMoKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlpZiAodmFsdWVzID09IG51bGwpCi0JCXZhbHVlcyA9IG5ldyBTdHJpbmdbbGFiZWxzLmxlbmd0aF07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsc1tpXSk7CQotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KHZhbHVlc1tpXSk7Ci0JCX0KLQkJdGV4dC5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKGkpKTsKLQkJYWRkVGV4dExpc3RlbmVyKHRleHQpOwkKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmdbXSBnZXRMYWJlbHMoKSB7Ci0JcmV0dXJuIGxhYmVsczsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JcmV0dXJuIHNoZWxsLmdldFRleHQoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldHMgaW4gdGhlIGRpYWxvZyBpbiBhIAotICogPGNvZGU+U3RyaW5nPC9jb2RlPiBhcnJheS4KLSAqCi0gKiBAcmV0dXJuCVN0cmluZ1tdCQotICoJCQlUaGUgY29udGVudHMgb2YgdGhlIHRleHQgd2lkZ2V0cyBvZiB0aGUgZGlhbG9nLgotICoJCQlNYXkgcmV0dXJuIG51bGwgaWYgYWxsIHRleHQgd2lkZ2V0cyBhcmUgZW1wdHkuCi0gKi8gCi1wdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCXJldHVybiB2YWx1ZXM7Ci19Ci0vKiogCi0gKiBPcGVucyB0aGUgZGlhbG9nIGluIHRoZSBnaXZlbiBzdGF0ZS4gIFNldHMgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IGNvbnRlbnRzIAotICogYW5kIGRpYWxvZyBiZWhhdmlvdXIgYWNjb3JkaW5nbHkuCi0gKgotICogQHBhcmFtIAlkaWFsb2dTdGF0ZQlpbnQKLSAqCQkJCQlUaGUgc3RhdGUgdGhlIGRpYWxvZyBzaG91bGQgYmUgb3BlbmVkIGluLgotICovCi1wdWJsaWMgU3RyaW5nW10gb3BlbigpIHsKLQljcmVhdGVUZXh0V2lkZ2V0cygpOwotCWNyZWF0ZUNvbnRyb2xCdXR0b25zKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSl7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkKLQlyZXR1cm4gZ2V0VmFsdWVzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRMYWJlbHMoU3RyaW5nW10gbGFiZWxzKSB7Ci0JdGhpcy5sYWJlbHMgPSBsYWJlbHM7Ci19Ci1wdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLX0KLS8qKgotICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXRzIG9mIHRoZSBkaWFsb2cgdG8KLSAqIHRoZSB2YWx1ZXMgc3VwcGxpZWQgaW4gdGhlIHBhcmFtZXRlciBhcnJheS4KLSAqCi0gKiBAcGFyYW0JaXRlbUluZm8JU3RyaW5nW10KLSAqIAkJCQkJCVRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhlIGRpYWxvZyBjb250ZW50cyB3aWxsIGJlIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIGl0ZW1JbmZvKSB7Ci0JaWYgKGxhYmVscyA9PSBudWxsKSByZXR1cm47Ci0JCi0JaWYgKHZhbHVlcyA9PSBudWxsKQotCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotCi0JaW50IG51bUl0ZW1zID0gTWF0aC5taW4odmFsdWVzLmxlbmd0aCwgaXRlbUluZm8ubGVuZ3RoKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotCQl2YWx1ZXNbaV0gPSBpdGVtSW5mb1tpXTsKLQl9CQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTczMjUwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9GaW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotcHVibGljIGludGVyZmFjZSBGaW5kTGlzdGVuZXIgewotCi1wdWJsaWMgYm9vbGVhbiBmaW5kKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0YjY2ZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svU2VhcmNoRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBTZWFyY2hEaWFsb2cgaXMgYSBzaW1wbGUgY2xhc3MgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgYmFzaWMgc2VhcmNoIGRpYWxvZy4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaERpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNBZGRyZXNzQm9vayA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWRkcmVzc2Jvb2siKTsKLQotCVNoZWxsIHNoZWxsOwotCVRleHQgc2VhcmNoVGV4dDsKLQlDb21ibyBzZWFyY2hBcmVhOwotCUxhYmVsIHNlYXJjaEFyZWFMYWJlbDsKLQlCdXR0b24gbWF0Y2hDYXNlOwotCUJ1dHRvbiBtYXRjaFdvcmQ7Ci0JQnV0dG9uIGZpbmRCdXR0b247Ci0JQnV0dG9uIGRvd247Ci0JRmluZExpc3RlbmVyIGZpbmRIYW5kbGVyOwotCi0vKioKLSAqIENsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgcGFyZW50IHNoZWxsIGFuZCB0aGUgdGFibGUgd2lkZ2V0IHRoYXQKLSAqIHRoZSBkaWFsb2cgd2lsbCBzZWFyY2guCi0gKgotICogQHBhcmFtIHBhcmVudAlTaGVsbCAKLSAqCQkJVGhlIHNoZWxsIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUgZGlhbG9nLgotICovCi1wdWJsaWMgU2VhcmNoRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCXNoZWxsID0gbmV3IFNoZWxsKHBhcmVudCwgU1dULkNMT1NFIHwgU1dULkJPUkRFUiB8IFNXVC5USVRMRSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2VhcmNoX2RpYWxvZ190aXRsZSIpKTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKXsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkvLyBkb24ndCBkaXNwb3NlIG9mIHRoZSBzaGVsbCwganVzdCBoaWRlIGl0IGZvciBsYXRlciB1c2UKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQkJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlsYWJlbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmRfd2hhdCIpKTsJCi0Jc2VhcmNoVGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQlzZWFyY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCXNlYXJjaFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gZW5hYmxlRmluZCA9IChzZWFyY2hUZXh0LmdldENoYXJDb3VudCgpICE9IDApOwotCQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZUZpbmQpOwotCQl9Ci0JfSk7Ci0KLQlzZWFyY2hBcmVhTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5MRUZUKTsKLQlzZWFyY2hBcmVhID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0Jc2VhcmNoQXJlYS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQltYXRjaENhc2UgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCW1hdGNoQ2FzZS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX21hdGNoX2Nhc2UiKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JbWF0Y2hDYXNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCW1hdGNoV29yZCA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JbWF0Y2hXb3JkLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfbWF0Y2hfd29yZCIpKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQltYXRjaFdvcmQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCi0JR3JvdXAgZGlyZWN0aW9uID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGlyZWN0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCWRpcmVjdGlvbi5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsJCi0JZGlyZWN0aW9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyZWN0aW9uIikpOwotCQotCUJ1dHRvbiB1cCA9IG5ldyBCdXR0b24oZGlyZWN0aW9uLCBTV1QuUkFESU8pOwotCXVwLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX3VwIikpOwotCXVwLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQotCWRvd24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbiwgU1dULlJBRElPKTsKLQlkb3duLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJEaWFsb2dfZGlyX2Rvd24iKSk7Ci0JZG93bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JZmluZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JZmluZEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2ZpbmQiKSk7Ci0JZmluZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCWZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JZmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKCFmaW5kSGFuZGxlci5maW5kKCkpewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LIHwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCWJveC5zZXRUZXh0KHNoZWxsLmdldFRleHQoKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5ub3RfZmluZCIpICsgIlwiIiArIHNlYXJjaFRleHQuZ2V0VGV4dCgpICsgIlwiIik7Ci0JCQkJYm94Lm9wZW4oKTsJCi0JCQl9CQkKLQkJfQotCX0pOwotCQkJCi0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDYW5jZWwiKSk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnBhY2soKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoQXJlYUxhYmVsKFN0cmluZyBsYWJlbCkgewotCXJldHVybiBzZWFyY2hBcmVhTGFiZWwuZ2V0VGV4dCgpOwotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0c2VhcmNoQXJlYU5hbWVzKCkgewotCXJldHVybiBzZWFyY2hBcmVhLmdldEl0ZW1zKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaENhc2UoKSB7Ci0JcmV0dXJuIG1hdGNoQ2FzZS5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBib29sZWFuIGdldE1hdGNoV29yZCgpIHsKLQlyZXR1cm4gbWF0Y2hXb3JkLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JcmV0dXJuIHNlYXJjaFRleHQuZ2V0VGV4dCgpOwotfQotcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoRG93bigpewotCXJldHVybiBkb3duLmdldFNlbGVjdGlvbigpOwotfQotcHVibGljIGludCBnZXRTZWxlY3RlZFNlYXJjaEFyZWEoKSB7Ci0JcmV0dXJuIHNlYXJjaEFyZWEuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLX0KLXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JaWYgKHNoZWxsLmlzVmlzaWJsZSgpKSB7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JfSBlbHNlIHsKLQkJc2hlbGwub3BlbigpOwotCX0KLQlzZWFyY2hUZXh0LnNldEZvY3VzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTmFtZXMoU3RyaW5nW10gbmFtZXMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNlYXJjaEFyZWEuYWRkKG5hbWVzW2ldKTsKLQl9Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoMCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hBcmVhTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0Jc2VhcmNoQXJlYUxhYmVsLnNldFRleHQobGFiZWwpOwotfQotcHVibGljIHZvaWQgc2V0TWF0Y2hDYXNlKGJvb2xlYW4gbWF0Y2gpIHsKLQltYXRjaENhc2Uuc2V0U2VsZWN0aW9uKG1hdGNoKTsKLX0KLXB1YmxpYyB2b2lkIHNldE1hdGNoV29yZChib29sZWFuIG1hdGNoKSB7Ci0JbWF0Y2hXb3JkLnNldFNlbGVjdGlvbihtYXRjaCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hEb3duKGJvb2xlYW4gc2VhcmNoRG93bil7Ci0JZG93bi5zZXRTZWxlY3Rpb24oc2VhcmNoRG93bik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTZWFyY2hTdHJpbmcoU3RyaW5nIHNlYXJjaFN0cmluZykgewotCXNlYXJjaFRleHQuc2V0VGV4dChzZWFyY2hTdHJpbmcpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFNlYXJjaEFyZWEoaW50IGluZGV4KSB7Ci0Jc2VhcmNoQXJlYS5zZWxlY3QoaW5kZXgpOwotfQotcHVibGljIHZvaWQgYWRkRmluZExpc3RlbmVyKEZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCXRoaXMuZmluZEhhbmRsZXIgPSBsaXN0ZW5lcjsJCi19Ci1wdWJsaWMgdm9pZCByZW1vdmVGaW5kTGlzdGVuZXIoRmluZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JdGhpcy5maW5kSGFuZGxlciA9IG51bGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMjAxNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlckV4YW1wbGUgewotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYnJvd3NlciIpOwotCWludCBpbmRleDsKLQlib29sZWFuIGJ1c3k7Ci0JSW1hZ2UgaW1hZ2VzW107Ci0JSW1hZ2UgaWNvbiA9IG51bGw7Ci0JYm9vbGVhbiB0aXRsZSA9IGZhbHNlOwotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JVGV4dCBsb2NhdGlvbkJhcjsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JVG9vbEJhciB0b29sYmFyOwotCUNhbnZhcyBjYW52YXM7Ci0JVG9vbEl0ZW0gaXRlbUJhY2ssIGl0ZW1Gb3J3YXJkOwotCUxhYmVsIHN0YXR1czsKLQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQlTV1RFcnJvciBlcnJvciA9IG51bGw7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCQkiZWNsaXBzZTAxLmJtcCIsICJlY2xpcHNlMDIuYm1wIiwgImVjbGlwc2UwMy5ibXAiLCAiZWNsaXBzZTA0LmJtcCIsICJlY2xpcHNlMDUuYm1wIiwKLQkJCSJlY2xpcHNlMDYuYm1wIiwgImVjbGlwc2UwNy5ibXAiLCAiZWNsaXBzZTA4LmJtcCIsICJlY2xpcHNlMDkuYm1wIiwgImVjbGlwc2UxMC5ibXAiLAotCQkJImVjbGlwc2UxMS5ibXAiLCAiZWNsaXBzZTEyLmJtcCIsfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIGljb25Mb2NhdGlvbiA9ICJkb2N1bWVudC5naWYiOwotCQkKLQlwdWJsaWMgQnJvd3NlckV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB0b3ApIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJZXJyb3IgPSBlOwotCQkJLyogQnJvd3NlciB3aWRnZXQgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAqLwotCQkJcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJyb3dzZXJOb3RDcmVhdGVkIikpOwotCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbml0UmVzb3VyY2VzKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCWJyb3dzZXIuc2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIsIHRoaXMpOwotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCWlmIChpY29uICE9IG51bGwpIHNoZWxsLnNldEltYWdlKGljb24pOwotCQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyRXhhbXBsZSBhcHAgPSBuZXcgQnJvd3NlckV4YW1wbGUoc2hlbGwsIGZhbHNlKTsKLQkJCQlhcHAuc2V0U2hlbGxEZWNvcmF0aW9uKGljb24sIHRydWUpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBhcHAuZ2V0QnJvd3NlcigpOwotCQkJfQotCQl9KTsKLQkJaWYgKHRvcCkgewotCQkJYnJvd3Nlci5zZXRVcmwoZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXJ0dXAiKSk7Ci0JCQlzaG93KGZhbHNlLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBlKSB7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZSkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcillLndpZGdldDsKLQkJCQkJQnJvd3NlckV4YW1wbGUgYXBwID0gKEJyb3dzZXJFeGFtcGxlKWJyb3dzZXIuZ2V0RGF0YSgib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLkJyb3dzZXJBcHBsaWNhdGlvbiIpOwotCQkJCQlhcHAuc2hvdyh0cnVlLCBlLmxvY2F0aW9uLCBlLnNpemUsIGUuYWRkcmVzc0JhciwgZS5tZW51QmFyLCBlLnN0YXR1c0JhciwgZS50b29sQmFyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIEJyb3dzZXJBcHBsaWNhdGlvbi4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQkKLQlwdWJsaWMgU1dURXJyb3IgZ2V0RXJyb3IoKSB7IHJldHVybiBlcnJvcjsgfQotCQotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7IHJldHVybiBicm93c2VyOyB9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hlbGxEZWNvcmF0aW9uKEltYWdlIGljb24sIGJvb2xlYW4gdGl0bGUpIHsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQkKLQl2b2lkIHNob3coYm9vbGVhbiBvd25lZCwgUG9pbnQgbG9jYXRpb24sIFBvaW50IHNpemUsIGJvb2xlYW4gYWRkcmVzc0JhciwgYm9vbGVhbiBtZW51QmFyLCBib29sZWFuIHN0YXR1c0JhciwgYm9vbGVhbiB0b29sQmFyKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQlpZiAob3duZWQpIHsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQlpZiAoc2l6ZSAhPSBudWxsKSBzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCX0KLQkJRm9ybURhdGEgZGF0YSA9IG51bGw7Ci0JCWlmICh0b29sQmFyKSB7Ci0JCQl0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1CYWNrLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2siKSk7Ci0JCQlpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtRm9yd2FyZC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJGb3J3YXJkIikpOwotCQkJZmluYWwgVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbVN0b3Auc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU3RvcCIpKTsKLQkJCWZpbmFsIFRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1SZWZyZXNoLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZnJlc2giKSk7Ci0JCQlmaW5hbCBUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbUdvLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkdvIikpOwotCQkJCi0JCQlpdGVtQmFjay5zZXRFbmFibGVkKGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpKTsKLQkJCWl0ZW1Gb3J3YXJkLnNldEVuYWJsZWQoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJCWlmIChpdGVtID09IGl0ZW1CYWNrKSBicm93c2VyLmJhY2soKTsgCi0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUZvcndhcmQpIGJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1TdG9wKSBicm93c2VyLnN0b3AoKTsKLQkJCQkJZWxzZSBpZiAoaXRlbSA9PSBpdGVtUmVmcmVzaCkgYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbUdvKSBicm93c2VyLnNldFVybChsb2NhdGlvbkJhci5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX07Ci0JCQlpdGVtQmFjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtUmVmcmVzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCi0JCQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS53aWR0aCA9IDI0OwotCQkJZGF0YS5oZWlnaHQgPSAyNDsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlc1swXS5nZXRCb3VuZHMoKTsKLQkJCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCVBvaW50IHB0ID0gKChDYW52YXMpZS53aWRnZXQpLmdldFNpemUoKTsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2VzW2luZGV4XSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHB0LngsIHB0LnkpOwkJCQotCQkJCX0KLQkJCX0pOwotCQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGdldFJlc291cmNlU3RyaW5nKCJTdGFydHVwIikpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJaWYgKGJ1c3kpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlpZiAoaW5kZXggPT0gaW1hZ2VzLmxlbmd0aCkgaW5kZXggPSAwOwotCQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKDE1MCwgdGhpcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGFkZHJlc3NCYXIpIHsKLQkJCWxvY2F0aW9uQmFyID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sYmFyLCAwLCBTV1QuVE9QKTsKLQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbGJhciwgNSwgU1dULlJJR0hUKTsKLQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNhbnZhcywgLTUsIFNXVC5ERUZBVUxUKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsJCQkKLQkJCX0KLQkJCWxvY2F0aW9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsb2NhdGlvbkJhci5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJYnJvd3Nlci5zZXRVcmwobG9jYXRpb25CYXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoc3RhdHVzQmFyKSB7Ci0JCQlzdGF0dXMgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcm9ncmVzc0JhciwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCQlzdGF0dXMuc2V0VGV4dChldmVudC50ZXh0KTsJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlDb250cm9sIGFib3ZlQnJvd3NlciA9IHRvb2xCYXIgPyAoQ29udHJvbCljYW52YXMgOiAoYWRkcmVzc0JhciA/IChDb250cm9sKWxvY2F0aW9uQmFyIDogbnVsbCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IGFib3ZlQnJvd3NlciAhPSBudWxsID8gbmV3IEZvcm1BdHRhY2htZW50KGFib3ZlQnJvd3NlciwgNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gc3RhdHVzICE9IG51bGwgPyBuZXcgRm9ybUF0dGFjaG1lbnQoc3RhdHVzLCAtNSwgU1dULkRFRkFVTFQpIDogbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQlpZiAoc3RhdHVzQmFyIHx8IHRvb2xCYXIpIHsKLQkJCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LnRvdGFsID09IDApIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWludCByYXRpbyA9IGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbDsKLQkJCQkJaWYgKHByb2dyZXNzQmFyICE9IG51bGwpIHByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQkJCWJ1c3kgPSBldmVudC5jdXJyZW50ICE9IGV2ZW50LnRvdGFsOwotCQkJCQlpZiAoIWJ1c3kpIHsKLQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChwcm9ncmVzc0JhciAhPSBudWxsKSBwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCWJ1c3kgPSBmYWxzZTsKLQkJCQkJaW5kZXggPSAwOwotCQkJCQlpZiAoY2FudmFzICE9IG51bGwpIHsKLQkJCQkJCWl0ZW1CYWNrLnNldEVuYWJsZWQoYnJvd3Nlci5pc0JhY2tFbmFibGVkKCkpOwotCQkJCQkJaXRlbUZvcndhcmQuc2V0RW5hYmxlZChicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKSk7Ci0JCQkJCQljYW52YXMucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoYWRkcmVzc0JhciB8fCBzdGF0dXNCYXIgfHwgdG9vbEJhcikgewotCQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQlidXN5ID0gdHJ1ZTsKLQkJCQkJaWYgKGV2ZW50LnRvcCAmJiBsb2NhdGlvbkJhciAhPSBudWxsKSBsb2NhdGlvbkJhci5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmICh0aXRsZSkgewotCQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCQlzaGVsbC5zZXRUZXh0KGV2ZW50LnRpdGxlKyIgLSAiK2dldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJaWYgKG93bmVkKSBzaGVsbC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1cygpIHsKLQkJaWYgKGxvY2F0aW9uQmFyICE9IG51bGwpIGxvY2F0aW9uQmFyLnNldEZvY3VzKCk7Ci0JCWVsc2UgaWYgKGJyb3dzZXIgIT0gbnVsbCkgYnJvd3Nlci5zZXRGb2N1cygpOwotCQllbHNlIHBhcmVudC5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWltYWdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJZmluYWwgQ2xhc3MgY2xhenogPSB0aGlzLmdldENsYXNzKCk7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJCQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YShzb3VyY2VTdHJlYW0pOwotCQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQkJaW1hZ2VzW2ldID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVycm9yID0gKHJlc291cmNlQnVuZGxlICE9IG51bGwpID8gZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDogIlVuYWJsZSB0byBsb2FkIHJlc291cmNlcyI7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXJyb3IpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IEJyb3dzZXJFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oaWNvbkxvY2F0aW9uKTsKLQkJSW1hZ2UgaWNvbiA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQlzaGVsbC5zZXRJbWFnZShpY29uKTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUJyb3dzZXJFeGFtcGxlIGFwcCA9IG5ldyBCcm93c2VyRXhhbXBsZShzaGVsbCwgdHJ1ZSk7Ci0JCWFwcC5zZXRTaGVsbERlY29yYXRpb24oaWNvbiwgdHJ1ZSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWNvbi5kaXNwb3NlKCk7Ci0JCWFwcC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2RvY3VtZW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2RvY3VtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDEuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMTZlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDEuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAyLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjA0ZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmM3YjEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0MDY1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA1LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDVhOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA1LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE4ODhhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDcuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlMjIyMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDcuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA4LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWMyOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA4LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFmODMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTAuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlNzliMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTAuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTExLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzI0YTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTExLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FlNzFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmZGM3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkRXhhbXBsZSB7Ci0KLQlDbGlwYm9hcmQgY2xpcGJvYXJkOwotCVNoZWxsIHNoZWxsOwotCVRleHQgY29weVRleHQ7Ci0JVGV4dCBwYXN0ZVRleHQ7Ci0JVGV4dCBjb3B5UnRmVGV4dDsKLQlUZXh0IHBhc3RlUnRmVGV4dDsKLQlUZXh0IGNvcHlIdG1sVGV4dDsKLQlUZXh0IHBhc3RlSHRtbFRleHQ7Ci0JVGFibGUgY29weUZpbGVUYWJsZTsKLQlUYWJsZSBwYXN0ZUZpbGVUYWJsZTsKLQlUZXh0IHRleHQ7Ci0JQ29tYm8gY29tYm87Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCUxhYmVsIHN0YXR1czsKLQlzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA2MDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQluZXcgQ2xpcGJvYXJkRXhhbXBsZSgpLm9wZW4oZGlzcGxheSk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1wdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNXVCBDbGlwYm9hcmQiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQlzYy5zZXRDb250ZW50KHBhcmVudCk7Ci0JcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCi0JR3JvdXAgY29weUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWNvcHlHcm91cC5zZXRUZXh0KCJDb3B5IEZyb206Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWNvcHlHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWNvcHlHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkKLQlHcm91cCBwYXN0ZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCXBhc3RlR3JvdXAuc2V0VGV4dCgiUGFzdGUgVG86Iik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCXBhc3RlR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwYXN0ZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQotCUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQljb250cm9sR3JvdXAuc2V0VGV4dCgiQ29udHJvbCBBUEk6Iik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkKLQlHcm91cCB0eXBlc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCXR5cGVzR3JvdXAuc2V0VGV4dCgiQXZhaWxhYmxlIFR5cGVzIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCXR5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl0eXBlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCXN0YXR1cyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQlkYXRhLmhlaWdodEhpbnQgPSA2MDsKLQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQljcmVhdGVUZXh0VHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVSVEZUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUhUTUxUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUZpbGVUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZU15VHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVDb250cm9sVHJhbnNmZXIoY29udHJvbEdyb3VwKTsKLQljcmVhdGVBdmFpbGFibGVUeXBlcyh0eXBlc0dyb3VwKTsKLQkKLQlzYy5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVJlY3RhbmdsZSBtb25pdG9yQXJlYSA9IHNoZWxsLmdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0Jc2hlbGwuc2V0U2l6ZShNYXRoLm1pbihzaXplLngsIG1vbml0b3JBcmVhLndpZHRoIC0gMjApLCBNYXRoLm1pbihzaXplLnksIG1vbml0b3JBcmVhLmhlaWdodCAtIDIwKSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotfQotdm9pZCBjcmVhdGVUZXh0VHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCkgewotCQotCS8vIFRleHRUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiVGV4dFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JY29weVRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5VGV4dC5zZXRUZXh0KCJzb21lXG5wbGFpblxudGV4dCIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JY29weVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2RhdGF9LCBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiVGV4dFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JcGFzdGVUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlwYXN0ZVRleHQuc2V0VGV4dCgiYmVnaW4gcGFzdGU+IitkYXRhKyI8ZW5kIHBhc3RlIik7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLXZvaWQgY3JlYXRlUlRGVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JUlRGIFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJSVEZUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWNvcHlSdGZUZXh0ID0gbmV3IFRleHQoY29weVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JY29weVJ0ZlRleHQuc2V0VGV4dCgic29tZVxucnRmXG50ZXh0Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5UnRmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSBjb3B5UnRmVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJZGF0YSA9ICJ7XFxydGYxe1xcY29sb3J0Ymw7XFxyZWQyNTVcXGdyZWVuMFxcYmx1ZTA7fVxcdWMxXFxiXFxpICIgKyBkYXRhICsgIn0iOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2RhdGF9LCBuZXcgVHJhbnNmZXJbXSB7UlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBjb3B5Iik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkgIAotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlJURlRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JcGFzdGVSdGZUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlUnRmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljbGlwYm9hcmQuZ2V0Q29udGVudHMoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlUnRmVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVIVE1MVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JSFRNTCBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JY29weUh0bWxUZXh0ID0gbmV3IFRleHQoY29weVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JY29weUh0bWxUZXh0LnNldFRleHQoIjxiPkhlbGxvIFdvcmxkPC9iPiIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JY29weUh0bWxUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvcHlQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IGNvcHlIdG1sVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7ZGF0YX0sIG5ldyBUcmFuc2ZlcltdIHtIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBjb3B5Iik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkgIAotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkhUTUxUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCXBhc3RlSHRtbFRleHQgPSBuZXcgVGV4dChwYXN0ZVBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JcGFzdGVIdG1sVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljbGlwYm9hcmQuZ2V0Q29udGVudHMoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlwYXN0ZUh0bWxUZXh0LnNldFRleHQoInN0YXJ0IHBhc3RlPiIrZGF0YSsiPGVuZCBwYXN0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZUZpbGVUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KXsKLQkvL0ZpbGUgVHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkZpbGVUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCQotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JYy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWNvcHlGaWxlVGFibGUgPSBuZXcgVGFibGUoYywgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQljb3B5RmlsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlNlbGVjdCBmaWxlKHMpIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4gfCBTV1QuTVVMVEkpOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCl7Ci0JCQkJLy9jb3B5RmlsZVRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJCVN0cmluZ1tdIG5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvcHlGaWxlVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJaXRlbS5zZXRUZXh0KHBhdGgrc2VwYXJhdG9yK25hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZGlyZWN0b3J5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCS8vY29weUZpbGVUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29weUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dChyZXN1bHQpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29weUZpbGVUYWJsZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlTdHJpbmdbXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQlkYXRhW2ldID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCX0KLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0ZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkZpbGVUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCXBhc3RlRmlsZVRhYmxlID0gbmV3IFRhYmxlKHBhc3RlUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlRmlsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nW10gZGF0YSA9IChTdHJpbmdbXSljbGlwYm9hcmQuZ2V0Q29udGVudHMoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVGaWxlVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwYXN0ZUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQoZGF0YVtpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7CSAKLX0KLXZvaWQgY3JlYXRlTXlUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KXsKLQkvLwlNeVR5cGUgVHJhbnNmZXIKLQkvLyBUT0RPCi19Ci12b2lkIGNyZWF0ZUNvbnRyb2xUcmFuc2ZlcihDb21wb3NpdGUgcGFyZW50KXsKLQlMYWJlbCBsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiVGV4dDoiKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDdXQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl0ZXh0LmN1dCgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGV4dC5jb3B5KCk7Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGV4dC5wYXN0ZSgpOwotCQl9Ci0JfSk7Ci0JdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkNvbWJvOiIpOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ3V0Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJY29tYm8uY3V0KCk7Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQljb21iby5jb3B5KCk7Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJY29tYm8ucGFzdGUoKTsKLQkJfQotCX0pOwotCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ikl0ZW0gMSIsICJJdGVtIDIiLCAiSXRlbSAzIiwgIkEgbG9uZ2VyIEl0ZW0ifSk7Ci0JCi0JbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlN0eWxlZFRleHQ6Iik7Ci0JbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFZpc2libGUoZmFsc2UpOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXN0eWxlZFRleHQuY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXN0eWxlZFRleHQucGFzdGUoKTsKLQkJfQotCX0pOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0Jc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotfQotdm9pZCBjcmVhdGVBdmFpbGFibGVUeXBlcyhDb21wb3NpdGUgcGFyZW50KXsKLQlmaW5hbCBMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlkYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkdldCBBdmFpbGFibGUgVHlwZXMiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlsaXN0LnJlbW92ZUFsbCgpOwotCQkJU3RyaW5nW10gbmFtZXMgPSBjbGlwYm9hcmQuZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbGlzdC5hZGQobmFtZXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNkZmNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotCi1wdWJsaWMgY2xhc3MgTXlUeXBlIHsKLQlTdHJpbmcgZmlyc3ROYW1lOwotCVN0cmluZyBsYXN0TmFtZTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDllM2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL015VHlwZVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotCi1wdWJsaWMgY2xhc3MgTXlUeXBlVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRU5BTUUgPSAibmFtZV9saXN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEVJRCA9IHJlZ2lzdGVyVHlwZShNWVRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVR5cGVUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUeXBlVHJhbnNmZXIoKTsKLQkKLXB1YmxpYyBzdGF0aWMgTXlUeXBlVHJhbnNmZXIgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQl9Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSkgb2JqZWN0OwkKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbXlUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7ICBpKyspewotCQkJYnl0ZVtdIGJ1ZmZlciA9IG15VHlwZXNbaV0uZmlyc3ROYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQlidWZmZXIgPSBteVR5cGVzW2ldLmZpcnN0TmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQl9Ci0JCWJ5dGVbXSBidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsJCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewkKLQlpZiAoaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCi0JCWJ5dGVbXSBidWZmZXIgPSAoYnl0ZVtdKXN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpOwotCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCQkKLQkJTXlUeXBlW10gbXlEYXRhID0gbmV3IE15VHlwZVswXTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlcik7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCQl3aGlsZShyZWFkSW4uYXZhaWxhYmxlKCkgPiAyMCkgewotCQkJCU15VHlwZSBkYXR1bSA9IG5ldyBNeVR5cGUoKTsKLQkJCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQkJYnl0ZVtdIG5hbWUgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCQlyZWFkSW4ucmVhZChuYW1lKTsKLQkJCQlkYXR1bS5maXJzdE5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOwotCQkJCXNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJCW5hbWUgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCQlyZWFkSW4ucmVhZChuYW1lKTsKLQkJCQlkYXR1bS5sYXN0TmFtZSA9IG5ldyBTdHJpbmcobmFtZSk7Ci0JCQkJTXlUeXBlW10gbmV3TXlEYXRhID0gbmV3IE15VHlwZVtteURhdGEubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShteURhdGEsIDAsIG5ld015RGF0YSwgMCwgbXlEYXRhLmxlbmd0aCk7Ci0JCQkJbmV3TXlEYXRhW215RGF0YS5sZW5ndGhdID0gZGF0dW07Ci0JCQkJbXlEYXRhID0gbmV3TXlEYXRhOwotCQkJfQotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbXlEYXRhOwotCX0KLQotCXJldHVybiBudWxsOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuZXcgU3RyaW5nW117TVlUWVBFTkFNRX07Ci19Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCXJldHVybiBuZXcgaW50W10ge01ZVFlQRUlEfTsKLX0KLWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCAhKG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZVtdKSB8fCAoKE15VHlwZVtdKW9iamVjdCkubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsKLQlNeVR5cGVbXSBteVR5cGVzID0gKE15VHlwZVtdKW9iamVjdDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG15VHlwZXNbaV0gPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlyc3ROYW1lID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpcnN0TmFtZS5sZW5ndGgoKSA9PSAwIHx8Ci0JCQlteVR5cGVzW2ldLmxhc3ROYW1lID09IG51bGwgfHwKLQkJCW15VHlwZXNbaV0ubGFzdE5hbWUubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQWxpZ25hYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmNWYyZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQWxpZ25hYmxlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLS8qKgotICogPGNvZGU+QWxpZ25hYmxlVGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3QKLSAqIHN1cGVyY2xhc3Mgb2YgZXhhbXBsZSBjb250cm9scyB0aGF0IGNhbiBiZQotICogYWxpZ25lZC4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQWxpZ25hYmxlVGFiIGV4dGVuZHMgVGFiIHsKLQotCS8qIEFsaWdubWVudCBDb250cm9scyAqLwotCUJ1dHRvbiBsZWZ0QnV0dG9uLCByaWdodEJ1dHRvbiwgY2VudGVyQnV0dG9uOwotCi0JLyogQWxpZ25tZW50IEdyb3VwICovCi0JR3JvdXAgYWxpZ25tZW50R3JvdXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQWxpZ25hYmxlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlhbGlnbm1lbnRHcm91cCA9IG5ldyBHcm91cCAob3RoZXJHcm91cCwgU1dULk5PTkUpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8Ci0JCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWFsaWdubWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbGlnbm1lbnQiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJbGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMZWZ0IikpOwotCQljZW50ZXJCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJY2VudGVyQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNlbnRlciIpKTsKLQkJcmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJpZ2h0IikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24gKCkpIHJldHVybjsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpOwotCQkJfQotCQl9OwotCQlsZWZ0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWNlbnRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlyaWdodEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmICh3aWRnZXRzLmxlbmd0aCAhPSAwKSB7Ci0JCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQkJY2VudGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9CdXR0b25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2FmYjNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotLyoqCi0gKiA8Y29kZT5CdXR0b25UYWI8L2NvZGU+IGlzIHRoZSBjbGFzcyB0aGF0Ci0gKiBkZW1vbnN0cmF0ZXMgU1dUIGJ1dHRvbnMuCi0gKi8KLWNsYXNzIEJ1dHRvblRhYiBleHRlbmRzIEFsaWduYWJsZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUJ1dHRvbiBidXR0b24xLCBidXR0b24yLCBidXR0b24zLCBidXR0b240LCBidXR0b241LCBidXR0b242LCBidXR0b243LCBidXR0b244LCBidXR0b245OwotCUdyb3VwIHRleHRCdXR0b25Hcm91cCwgaW1hZ2VCdXR0b25Hcm91cCwgaW1hZ2V0ZXh0QnV0dG9uR3JvdXA7Ci0KLQkvKiBBbGlnbm1lbnQgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JQnV0dG9uIHVwQnV0dG9uLCBkb3duQnV0dG9uOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBwdXNoQnV0dG9uLCBjaGVja0J1dHRvbiwgcmFkaW9CdXR0b24sIHRvZ2dsZUJ1dHRvbiwgYXJyb3dCdXR0b24sIGZsYXRCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUJ1dHRvblRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJdXBCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJdXBCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlVwIikpOwotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRvd25CdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRvd24iKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpIHJldHVybjsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpOwotCQkJfQotCQl9OwotCQl1cEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGV4dCBidXR0b25zICovCi0JCXRleHRCdXR0b25Hcm91cCA9IG5ldyBHcm91cChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCXRleHRCdXR0b25Hcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXRleHRCdXR0b25Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0QnV0dG9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfQnV0dG9ucyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBidXR0b25zICovCi0JCWltYWdlQnV0dG9uR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbWFnZUJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VCdXR0b25Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbWFnZUJ1dHRvbkdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZV9CdXR0b25zIikpOwotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgYW5kIHRleHQgYnV0dG9ucyAqLwotCQlpbWFnZXRleHRCdXR0b25Hcm91cCA9IG5ldyBHcm91cChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWltYWdldGV4dEJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2V0ZXh0QnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2V0ZXh0QnV0dG9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlX1RleHRfQnV0dG9ucyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHB1c2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5QVVNIOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKHJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUkFESU87Ci0JCWlmICh0b2dnbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5UT0dHTEU7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5MRUZUOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkJaWYgKGFycm93QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuQVJST1c7IAotCQkJaWYgKHVwQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVVA7Ci0JCQlpZiAoZG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkRPV047Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwkJCQotCQl9Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWJ1dHRvbjEgPSBuZXcgQnV0dG9uKHRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b24xLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJYnV0dG9uMiA9IG5ldyBCdXR0b24odGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlidXR0b24zID0gbmV3IEJ1dHRvbih0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uMy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHJlZSIpKTsKLQkJYnV0dG9uNCA9IG5ldyBCdXR0b24oaW1hZ2VCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b240LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlidXR0b241ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjUuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlidXR0b242ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjYuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWJ1dHRvbjcgPSBuZXcgQnV0dG9uKGltYWdldGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjcuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lIikpOwotCQlidXR0b243LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlidXR0b244ID0gbmV3IEJ1dHRvbihpbWFnZXRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b244LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlR3byIpKTsKLQkJYnV0dG9uOC5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWJ1dHRvbjkgPSBuZXcgQnV0dG9uKGltYWdldGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjkuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGhyZWUiKSk7Ci0JCWJ1dHRvbjkuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcHVzaEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXB1c2hCdXR0b24uc2V0VGV4dCgiU1dULlBVU0giKTsKLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCAoIlNXVC5SQURJTyIpOwotCQl0b2dnbGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQl0b2dnbGVCdXR0b24uc2V0VGV4dCAoIlNXVC5UT0dHTEUiKTsKLQkJYXJyb3dCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlhcnJvd0J1dHRvbi5zZXRUZXh0ICgiU1dULkFSUk9XIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7YnV0dG9uMSwgYnV0dG9uMiwgYnV0dG9uMywgYnV0dG9uNCwgYnV0dG9uNSwgYnV0dG9uNiwgYnV0dG9uNywgYnV0dG9uOCwgYnV0dG9uOX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJCdXR0b24iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlpZiAodXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuVVA7Ci0JCWlmIChkb3duQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkRPV047Ci0JCWJ1dHRvbjEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b24yLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uMy5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjQuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b241LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNi5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjcuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b244LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uOS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKGFycm93QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQljZW50ZXJCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXVwQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl9Ci0JCXVwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuVVApICE9IDApOwotCQlkb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuRE9XTikgIT0gMCk7Ci0JCXB1c2hCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5QVVNIKSAhPSAwKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApOwotCQl0b2dnbGVCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5UT0dHTEUpICE9IDApOwotCQlhcnJvd0J1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkFSUk9XKSAhPSAwKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NDb21ib1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NjU4NGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDQ29tYm9UYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDQ29tYm8gY29tYm8xOwotCUdyb3VwIGNvbWJvR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBmbGF0QnV0dG9uLCByZWFkT25seUJ1dHRvbjsKLQkKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzIiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzUiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzgiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ0NvbWJvVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjb21ibyBib3ggKi8KLQkJY29tYm9Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tYm9Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0NvbWJvIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQljb21ibzEgPSBuZXcgQ0NvbWJvIChjb21ib0dyb3VwLCBzdHlsZSk7Ci0JCWNvbWJvMS5zZXRJdGVtcyAoTGlzdERhdGEpOwotCQlpZiAoTGlzdERhdGEubGVuZ3RoID49IDMpIHsKLQkJCWNvbWJvMS5zZXRUZXh0KExpc3REYXRhIFsyXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2NvbWJvMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRWRpdGFibGUiLCAiSXRlbXMiLCAiU2VsZWN0aW9uIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlZpc2libGVJdGVtQ291bnQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDQ29tYm8iOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NMYWJlbFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2JlYmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDTGFiZWxUYWIgZXh0ZW5kcyBBbGlnbmFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ0xhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDM7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNoYWRvd0luQnV0dG9uLCBzaGFkb3dPdXRCdXR0b24sIHNoYWRvd05vbmVCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNMYWJlbFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCBsYWJlbHMgKi8KLQkJdGV4dExhYmVsR3JvdXAgPSBuZXcgR3JvdXAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0TGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tX0xhYmVscyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaGFkb3dJbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfSU47Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWxhYmVsMS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsMiA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWxhYmVsMyA9IG5ldyBDTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsMy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpICsgIlxuIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmVfVHdvX1RocmVlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtsYWJlbDEsIGxhYmVsMiwgbGFiZWwzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiQ0xhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJY2VudGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChsYWJlbDEuZ2V0U3R5bGUgKCkgJiAoU1dULlNIQURPV19JTiB8IFNXVC5TSEFET1dfT1VUKSkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjczMzE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NUYWJGb2xkZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDVGFiRm9sZGVyVGFiIGV4dGVuZHMgVGFiIHsKLQlpbnQgbGFzdFNlbGVjdGVkVGFiID0gMDsKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cCwgaXRlbUdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gdG9wQnV0dG9uLCBib3R0b21CdXR0b24sIGZsYXRCdXR0b24sIGNsb3NlQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBDVGFiSXRlbXMxID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbTFfMiIpfTsKLQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJGb250cyIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9GT1JFR1JPVU5EX0NPTE9SID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9CQUNLR1JPVU5EX0NPTE9SID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9OVCA9IDU7Ci0JQ29sb3Igc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yLCBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBpdGVtRm9udDsKLQkKLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIHNpbXBsZVRhYkJ1dHRvbiwgc2luZ2xlVGFiQnV0dG9uLCBpbWFnZUJ1dHRvbiwgc2hvd01pbkJ1dHRvbiwgc2hvd01heEJ1dHRvbiwgdW5zZWxlY3RlZENsb3NlQnV0dG9uLCB1bnNlbGVjdGVkSW1hZ2VCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ1RhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3Rpb25fRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0aW9uX0JhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fRm9udCIpKTsKLQotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHNlbGVjdGlvbkZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCXNlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZUZvbnRPckNvbG9yKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIFNFTEVDVElPTl9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yOwotCQkJCXNlbGVjdGlvbkZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIFNFTEVDVElPTl9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOwotCQkJCXNlbGVjdGlvbkJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIElURU1fRk9OVDogewotCQkJCUZvbnQgb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJGb2xkZXIxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRJdGVtRm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJc2ltcGxlVGFiQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2ltcGxlVGFiQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfU2ltcGxlX1RhYnMiKSk7Ci0JCXNpbXBsZVRhYkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNpbXBsZVRhYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U2ltcGxlVGFicygpOwotCQkJfQotCQl9KTsKLQkJCQkKLQkJc2luZ2xlVGFiQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2luZ2xlVGFiQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfU2luZ2xlX1RhYnMiKSk7Ci0JCXNpbmdsZVRhYkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzaW5nbGVUYWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFNpbmdsZVRhYnMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaG93TWluQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2hvd01pbkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X01pbl9WaXNpYmxlIikpOwotCQlzaG93TWluQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNob3dNaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldE1pbmltaXplVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dNYXhCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaG93TWF4QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfTWF4X1Zpc2libGUiKSk7Ci0JCXNob3dNYXhCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2hvd01heEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0TWF4aW1pemVWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X0ltYWdlIikpOwotCQlpbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0SW1hZ2VzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdW5zZWxlY3RlZEltYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfVW5zZWxlY3RlZF9JbWFnZV9WaXNpYmxlIikpOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2V0X1Vuc2VsZWN0ZWRfQ2xvc2VfVmlzaWJsZSIpKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgQ1RhYkZvbGRlciAqLwotCQl0YWJGb2xkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJGb2xkZXJHcm91cC5zZXRUZXh0ICgiQ1RhYkZvbGRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHRvcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5UT1A7Ci0JCWlmIChib3R0b21CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9UVE9NOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNMT1NFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRhYkZvbGRlcjEgPSBuZXcgQ1RhYkZvbGRlciAodGFiRm9sZGVyR3JvdXAsIHN0eWxlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlcjEsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChDVGFiSXRlbXMxW2ldKTsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlcjEsIFNXVC5SRUFEX09OTFkpOwotCQkJdGV4dC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDVGFiSXRlbV9jb250ZW50IikgKyAiOiAiICsgaSk7Ci0JCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JCX0KLQkJdGFiRm9sZGVyMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWxhc3RTZWxlY3RlZFRhYiA9IHRhYkZvbGRlcjEuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uKGxhc3RTZWxlY3RlZFRhYik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPUCIpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3R0b21CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlib3R0b21CdXR0b24uc2V0VGV4dCAoIlNXVC5CT1RUT00iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJDVGFiRm9sZGVyRXZlbnQifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiB0YWJGb2xkZXIxLmdldEl0ZW1zKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3RhYkZvbGRlcjF9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDVGFiRm9sZGVyIjsKLQl9Ci0KLQkvKioKLQkgKiBIb29rcyB0aGUgY3VzdG9tIGxpc3RlbmVyIHNwZWNpZmllZCBieSBldmVudE5hbWUuCi0JICovCi0Jdm9pZCBob29rQ3VzdG9tTGlzdGVuZXIgKGZpbmFsIFN0cmluZyBldmVudE5hbWUpIHsKLQkJaWYgKGV2ZW50TmFtZSA9PSAiQ1RhYkZvbGRlckV2ZW50IikgewotCQkJdGFiRm9sZGVyMS5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyIChuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZSAoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgZm9udAotCSAqIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqIEFsc28gc2V0cyBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBOb2RlIDEKLQkgKiBUcmVlSXRlbXMgdG8gZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIHJlc2V0Q29sb3JzQW5kRm9udHMgKCkgewotCQlzdXBlci5yZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQlDb2xvciBvbGRDb2xvciA9IHNlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsKLQkJc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JCXNlbGVjdGlvbkJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldFNlbGVjdGlvbkJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGl0ZW1Gb250OwotCQlpdGVtRm9udCA9IG51bGw7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlKCk7Ci0JCXNldFNpbXBsZVRhYnMoKTsKLQkJc2V0U2luZ2xlVGFicygpOwotCQlzZXRJbWFnZXMoKTsKLQkJc2V0TWluaW1pemVWaXNpYmxlKCk7Ci0JCXNldE1heGltaXplVmlzaWJsZSgpOwotCQlzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKCk7Ci0JCXNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUoKTsKLQkJc2V0U2VsZWN0aW9uQmFja2dyb3VuZCAoKTsKLQkJc2V0U2VsZWN0aW9uRm9yZWdyb3VuZCAoKTsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNoYXBlIHRoYXQgdGhlIENUYWJGb2xkZXIgd2lsbCB1c2UgdG8gcmVuZGVyIGl0c2VsZi4gCi0JICovCi0Jdm9pZCBzZXRTaW1wbGVUYWJzICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRTaW1wbGUgKHNpbXBsZVRhYkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgdGFicyB0aGF0IHRoZSBDVGFiRm9sZGVyIHNob3VsZCBkaXNwbGF5LgotCSAqLwotCXZvaWQgc2V0U2luZ2xlVGFicyAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0U2luZ2xlIChzaW5nbGVUYWJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyBhbiBpbWFnZSBpbnRvIGVhY2ggaXRlbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRJbWFnZXMgKCkgewotCQlib29sZWFuIHNldEltYWdlID0gaW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlDVGFiSXRlbSBpdGVtc1tdID0gdGFiRm9sZGVyMS5nZXRJdGVtcyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNldEltYWdlKSB7Ci0JCQkJaXRlbXNbaV0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtc1tpXS5zZXRJbWFnZSAobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG1pbmltaXplIGJ1dHRvbgotCSAqLwotCXZvaWQgc2V0TWluaW1pemVWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRNaW5pbWl6ZVZpc2libGUoc2hvd01pbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtYXhpbWl6ZSBidXR0b24KLQkgKi8KLQl2b2lkIHNldE1heGltaXplVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0TWF4aW1pemVWaXNpYmxlKHNob3dNYXhCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY2xvc2UgYnV0dG9uIG9uIHVuc2VsZWN0ZWQgdGFicwotCSAqLwotCXZvaWQgc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSAoKSB7Ci0JCXRhYkZvbGRlcjEuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZSh1bnNlbGVjdGVkQ2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW1hZ2Ugb24gdW5zZWxlY3RlZCB0YWJzCi0JICovCi0Jdm9pZCBzZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKHVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIENUYWJJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJGb2xkZXIxLnNldFNlbGVjdGlvbkJhY2tncm91bmQoc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0aW9uLgotCQlDb2xvciBjb2xvciA9IHNlbGVjdGlvbkJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oU0VMRUNUSU9OX0JBQ0tHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIENUYWJJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJGb2xkZXIxLnNldFNlbGVjdGlvbkZvcmVncm91bmQoc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiBmb3JlZ3JvdW5kIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0aW9uLgotCQlDb2xvciBjb2xvciA9IHNlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oU0VMRUNUSU9OX0ZPUkVHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIENUYWJJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFiRm9sZGVyMS5nZXRJdGVtICgwKS5zZXRGb250IChpdGVtRm9udCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBpdGVtRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGFiRm9sZGVyMS5nZXRJdGVtICgwKS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ2FudmFzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DYW52YXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0NGZiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DYW52YXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIENhbnZhc1RhYiBleHRlbmRzIFRhYiB7Ci0Jc3RhdGljIGZpbmFsIGludCBjb2xvcnMgW10gPSB7Ci0JCVNXVC5DT0xPUl9SRUQsCi0JCVNXVC5DT0xPUl9HUkVFTiwKLQkJU1dULkNPTE9SX0JMVUUsCi0JCVNXVC5DT0xPUl9NQUdFTlRBLAotCQlTV1QuQ09MT1JfWUVMTE9XLAotCQlTV1QuQ09MT1JfQ1lBTiwKLQkJU1dULkNPTE9SX0RBUktfUkVELAotCQlTV1QuQ09MT1JfREFSS19HUkVFTiwKLQkJU1dULkNPTE9SX0RBUktfQkxVRSwKLQkJU1dULkNPTE9SX0RBUktfTUFHRU5UQSwKLQkJU1dULkNPTE9SX0RBUktfWUVMTE9XLAotCQlTV1QuQ09MT1JfREFSS19DWUFOCi0JfTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIGNhbnZhc1N0cmluZyA9ICJDYW52YXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDYW52YXMgY2FudmFzOwotCUdyb3VwIGNhbnZhc0dyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgbm9CYWNrZ3JvdW5kQnV0dG9uLCBub0ZvY3VzQnV0dG9uLCAKLQlub01lcmdlUGFpbnRzQnV0dG9uLCBub1JlZHJhd1Jlc2l6ZUJ1dHRvbiwgZG91YmxlQnVmZmVyZWRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGNhcmV0QnV0dG9uLCBmaWxsRGFtYWdlQnV0dG9uOwotCi0JaW50IHBhaW50Q291bnQ7Ci0JaW50IGN4LCBjeTsKLQlpbnQgbWF4WCwgbWF4WTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ2FudmFzVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQljYXJldEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhcmV0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYXJldCIpKTsKLQkJZmlsbERhbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZpbGxEYW1hZ2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxEYW1hZ2UiKSk7Ci0JCQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY2FyZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENhcmV0ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjYW52YXMgd2lkZ2V0ICovCi0JCWNhbnZhc0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY2FudmFzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNhbnZhc0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNhbnZhc0dyb3VwLnNldFRleHQgKCJDYW52YXMiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobm9CYWNrZ3JvdW5kQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX0JBQ0tHUk9VTkQ7Ci0JCWlmIChub0ZvY3VzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX0ZPQ1VTOwotCQlpZiAobm9NZXJnZVBhaW50c0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19NRVJHRV9QQUlOVFM7Ci0JCWlmIChub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OT19SRURSQVdfUkVTSVpFOwotCQlpZiAoZG91YmxlQnVmZmVyZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRE9VQkxFX0JVRkZFUkVEOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXBhaW50Q291bnQgPSAwOyBjeCA9IDA7IGN5ID0gMDsKLQkJY2FudmFzID0gbmV3IENhbnZhcyAoY2FudmFzR3JvdXAsIHN0eWxlKTsKLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCXBhaW50Q291bnQrKzsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJaWYgKGZpbGxEYW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCUNvbG9yIGNvbG9yID0gZS5kaXNwbGF5LmdldFN5c3RlbUNvbG9yIChjb2xvcnMgW3BhaW50Q291bnQgJSBjb2xvcnMubGVuZ3RoXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlKGUueCwgZS55LCBlLndpZHRoLCBlLmhlaWdodCk7Ci0JCQkJfQotCQkJCVBvaW50IHNpemUgPSBjYW52YXMuZ2V0U2l6ZSAoKTsKLQkJCQlnYy5kcmF3QXJjKGN4ICsgMSwgY3kgKyAxLCBzaXplLnggLSAyLCBzaXplLnkgLSAyLCAwLCAzNjApOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUoY3ggKyAoc2l6ZS54IC0gMTApIC8gMiwgY3kgKyAoc2l6ZS55IC0gMTApIC8gMiwgMTAsIDEwKTsKLQkJCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KGNhbnZhc1N0cmluZyk7Ci0JCQkJZ2MuZHJhd1N0cmluZyhjYW52YXNTdHJpbmcsIGN4ICsgKHNpemUueCAtIGV4dGVudC54KSAvIDIsIGN5IC0gZXh0ZW50LnkgKyAoc2l6ZS55IC0gMTApIC8gMiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQljYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCVBvaW50IHNpemUgPSBjYW52YXMuZ2V0U2l6ZSAoKTsKLQkJCQltYXhYID0gc2l6ZS54ICogMyAvIDI7IG1heFkgPSBzaXplLnkgKiAzIC8gMjsKLQkJCQlyZXNpemVTY3JvbGxCYXJzICgpOwotCQkJfQotCQl9KTsKLQkJU2Nyb2xsQmFyIGJhciA9IGNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJaG9va0xpc3RlbmVycyAoYmFyKTsKLQkJCWJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzY3JvbGxIb3Jpem9udGFsICgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJYmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJaG9va0xpc3RlbmVycyAoYmFyKTsKLQkJCWJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzY3JvbGxWZXJ0aWNhbCAoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fQkFDS0dST1VORCIpOwotCQlub0ZvY3VzQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9Gb2N1c0J1dHRvbi5zZXRUZXh0ICgiU1dULk5PX0ZPQ1VTIik7Ci0JCW5vTWVyZ2VQYWludHNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub01lcmdlUGFpbnRzQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fTUVSR0VfUEFJTlRTIik7Ci0JCW5vUmVkcmF3UmVzaXplQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9SZWRyYXdSZXNpemVCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19SRURSQVdfUkVTSVpFIik7Ci0JCWRvdWJsZUJ1ZmZlcmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZG91YmxlQnVmZmVyZWRCdXR0b24uc2V0VGV4dCAoIlNXVC5ET1VCTEVfQlVGRkVSRUQiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2NhbnZhc307Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDYW52YXMiOwotCX0KLQkKLQkvKioKLQkgKiBSZXNpemVzIHRoZSBtYXhpbXVtIGFuZCB0aHVtYiBvZiBib3RoIHNjcm9sbGJhcnMuCi0JICovCi0Jdm9pZCByZXNpemVTY3JvbGxCYXJzICgpIHsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlTY3JvbGxCYXIgYmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaWYgKGJhciAhPSBudWxsKSB7Ci0JCQliYXIuc2V0TWF4aW11bShtYXhYKTsKLQkJCWJhci5zZXRUaHVtYihjbGllbnRBcmVhLndpZHRoKTsKLQkJCWJhci5zZXRQYWdlSW5jcmVtZW50KGNsaWVudEFyZWEud2lkdGgpOwotCQl9Ci0JCWJhciA9IGNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRNYXhpbXVtKG1heFkpOwotCQkJYmFyLnNldFRodW1iKGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCWJhci5zZXRQYWdlSW5jcmVtZW50KGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNjcm9sbHMgdGhlIGNhbnZhcyBob3Jpem9udGFsbHkuCi0JICogCi0JICogQHBhcmFtIHNjcm9sbEJhcgotCSAqLwotCXZvaWQgc2Nyb2xsSG9yaXpvbnRhbCAoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHggPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoeCArIG1heFggPCBib3VuZHMud2lkdGgpIHsKLQkJCXggPSBib3VuZHMud2lkdGggLSBtYXhYOwotCQl9Ci0JCWNhbnZhcy5zY3JvbGwoeCwgY3ksIGN4LCBjeSwgbWF4WCwgbWF4WSwgZmFsc2UpOwotCQljeCA9IHg7Ci0JfQotCi0JLyoqCi0JICogU2Nyb2xscyB0aGUgY2FudmFzIHZlcnRpY2FsbHkuCi0JICogCi0JICogQHBhcmFtIHNjcm9sbEJhcgotCSAqLwotCXZvaWQgc2Nyb2xsVmVydGljYWwgKFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB5ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHkgKyBtYXhZIDwgYm91bmRzLmhlaWdodCkgewotCQkJeSA9IGJvdW5kcy5oZWlnaHQgLSBtYXhZOwotCQl9Ci0JCWNhbnZhcy5zY3JvbGwoY3gsIHksIGN4LCBjeSwgbWF4WCwgbWF4WSwgZmFsc2UpOwotCQljeSA9IHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBvciBjbGVhcnMgdGhlIGNhcmV0IGluIHRoZSAiRXhhbXBsZSIgd2lkZ2V0LgotCSAqLwotCXZvaWQgc2V0Q2FyZXQgKCkgewotCQlDYXJldCBvbGRDYXJldCA9IGNhbnZhcy5nZXRDYXJldCAoKTsKLQkJaWYgKGNhcmV0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ2FyZXQgbmV3Q2FyZXQgPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTk9ORSk7Ci0JCQlGb250IGZvbnQgPSBjYW52YXMuZ2V0Rm9udCgpOwotCQkJbmV3Q2FyZXQuc2V0Rm9udChmb250KTsKLQkJCUdDIGdjID0gbmV3IEdDKGNhbnZhcyk7Ci0JCQlnYy5zZXRGb250KGZvbnQpOwotCQkJbmV3Q2FyZXQuc2V0Qm91bmRzKDEsIDEsIDEsIGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCkpOwotCQkJZ2MuZGlzcG9zZSgpOwotCQkJY2FudmFzLnNldENhcmV0IChuZXdDYXJldCk7Ci0JCQljYW52YXMuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCWNhbnZhcy5zZXRDYXJldCAobnVsbCk7Ci0JCX0KLQkJaWYgKG9sZENhcmV0ICE9IG51bGwpIG9sZENhcmV0LmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuSF9TQ1JPTEwpICE9IDApOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCW5vQmFja2dyb3VuZEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fQkFDS0dST1VORCkgIT0gMCk7Ci0JCW5vRm9jdXNCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULk5PX0ZPQ1VTKSAhPSAwKTsKLQkJbm9NZXJnZVBhaW50c0J1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fTUVSR0VfUEFJTlRTKSAhPSAwKTsKLQkJbm9SZWRyYXdSZXNpemVCdXR0b24uc2V0U2VsZWN0aW9uICgoY2FudmFzLmdldFN0eWxlICgpICYgU1dULk5PX1JFRFJBV19SRVNJWkUpICE9IDApOwotCQlkb3VibGVCdWZmZXJlZEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuRE9VQkxFX0JVRkZFUkVEKSAhPSAwKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSBzZXRDYXJldCAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29tYm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNlMTc5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgQ29tYm9UYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDb21ibyBjb21ibzE7Ci0JR3JvdXAgY29tYm9Hcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGRyb3BEb3duQnV0dG9uLCByZWFkT25seUJ1dHRvbiwgc2ltcGxlQnV0dG9uOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDb21ib1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgY29tYm8gYm94ICovCi0JCWNvbWJvR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQljb21ib0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljb21ib0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNvbWJvR3JvdXAuc2V0VGV4dCAoIkNvbWJvIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRFJPUF9ET1dOOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTVBMRTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWNvbWJvMSA9IG5ldyBDb21ibyAoY29tYm9Hcm91cCwgc3R5bGUpOwotCQljb21ibzEuc2V0SXRlbXMgKExpc3REYXRhKTsKLQkJaWYgKExpc3REYXRhLmxlbmd0aCA+PSAzKSB7Ci0JCQljb21ibzEuc2V0VGV4dChMaXN0RGF0YSBbMl0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJZHJvcERvd25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlzaW1wbGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaW1wbGVCdXR0b24uc2V0VGV4dCgiU1dULlNJTVBMRSIpOwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2NvbWJvMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiSXRlbXMiLCAiT3JpZW50YXRpb24iLCAiU2VsZWN0aW9uIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlZpc2libGVJdGVtQ291bnQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDb21ibyI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJZHJvcERvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkRST1BfRE9XTikgIT0gMCk7Ci0JCXNpbXBsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuU0lNUExFKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldEVuYWJsZWQoIXNpbXBsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbnRyb2xFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYThkZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENvbnRyb2xFeGFtcGxlIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9Ci0JCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfY29udHJvbCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTaGVsbFRhYiBzaGVsbFRhYjsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JcHJpdmF0ZSBUYWIgW10gdGFiczsKLQlJbWFnZSBpbWFnZXNbXTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgY2lDbG9zZWRGb2xkZXIgPSAwLCBjaU9wZW5Gb2xkZXIgPSAxLCBjaVRhcmdldCA9IDIsIGNpQmFja2dyb3VuZCA9IDMsIGNpUGFyZW50QmFja2dyb3VuZCA9IDQ7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkiY2xvc2VkRm9sZGVyLmdpZiIsIAkJCS8vJE5PTi1OTFMtMSQKLQkJIm9wZW5Gb2xkZXIuZ2lmIiwgCQkJCS8vJE5PTi1OTFMtMSQKLQkJInRhcmdldC5naWYiLCAJCQkJCS8vJE5PTi1OTFMtMSQKLQkJImJhY2tncm91bmRJbWFnZS5wbmciLCAJCQkvLyROT04tTkxTLTEkCi0JCSJwYXJlbnRCYWNrZ3JvdW5kSW1hZ2UucG5nIn07IAkvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIGludFtdIGltYWdlVHlwZXMgPSB7Ci0JCVNXVC5JQ09OLAotCQlTV1QuSUNPTiwKLQkJU1dULklDT04sCi0JCVNXVC5CSVRNQVAsCi0JCVNXVC5CSVRNQVB9OwotCi0JYm9vbGVhbiBzdGFydHVwID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBDb250cm9sRXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0UmVzb3VyY2VzKCk7Ci0JCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIgKHBhcmVudCwgU1dULk5PTkUpOwotCQl0YWJzID0gY3JlYXRlVGFicygpOwotCQlmb3IgKGludCBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykgewotCQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkgICAgaXRlbS5zZXRUZXh0ICh0YWJzIFtpXS5nZXRUYWJUZXh0ICgpKTsKLQkJICAgIGl0ZW0uc2V0Q29udHJvbCAodGFicyBbaV0uY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKSk7Ci0JCSAgICBpdGVtLnNldERhdGEgKHRhYnMgW2ldKTsKLQkJfQotCQlzdGFydHVwID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB0aGUgc2V0IG9mIGV4YW1wbGUgVGFicwotCSAqLwotCVRhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JCXJldHVybiBuZXcgVGFiIFtdIHsKLQkJCW5ldyBCdXR0b25UYWIgKHRoaXMpLAotCQkJbmV3IENhbnZhc1RhYiAodGhpcyksCi0JCQluZXcgQ29tYm9UYWIgKHRoaXMpLAotCQkJbmV3IENvb2xCYXJUYWIgKHRoaXMpLAotCQkJbmV3IERhdGVUaW1lVGFiICh0aGlzKSwKLQkJCW5ldyBEaWFsb2dUYWIgKHRoaXMpLAotCQkJbmV3IEV4cGFuZEJhclRhYiAodGhpcyksCi0JCQluZXcgR3JvdXBUYWIgKHRoaXMpLAotCQkJbmV3IExhYmVsVGFiICh0aGlzKSwKLQkJCW5ldyBMaW5rVGFiICh0aGlzKSwKLQkJCW5ldyBMaXN0VGFiICh0aGlzKSwKLQkJCW5ldyBNZW51VGFiICh0aGlzKSwKLQkJCW5ldyBQcm9ncmVzc0JhclRhYiAodGhpcyksCi0JCQluZXcgU2FzaFRhYiAodGhpcyksCi0JCQluZXcgU2NhbGVUYWIgKHRoaXMpLAotCQkJc2hlbGxUYWIgPSBuZXcgU2hlbGxUYWIodGhpcyksCi0JCQluZXcgU2xpZGVyVGFiICh0aGlzKSwKLQkJCW5ldyBTcGlubmVyVGFiICh0aGlzKSwKLQkJCW5ldyBUYWJGb2xkZXJUYWIgKHRoaXMpLAotCQkJbmV3IFRhYmxlVGFiICh0aGlzKSwKLQkJCW5ldyBUZXh0VGFiICh0aGlzKSwKLQkJCW5ldyBUb29sQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBUb29sVGlwVGFiICh0aGlzKSwKLQkJCW5ldyBUcmVlVGFiICh0aGlzKSwKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLQkgKiBpbnN0YW5jZSBvZiB0aGUgQ29udHJvbEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8qCi0JCSAqIERlc3Ryb3kgYW55IHNoZWxscyB0aGF0IG1heSBoYXZlIGJlZW4gY3JlYXRlZAotCQkgKiBieSB0aGUgU2hlbGxzIHRhYi4gIFdoZW4gYSBzaGVsbCBpcyBkaXNwb3NlZCwKLQkJICogYWxsIGNoaWxkIHNoZWxscyBhcmUgYWxzbyBkaXNwb3NlZC4gIFRoZXJlZm9yZQotCQkgKiBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgZm9yIGRpc3Bvc2VkIHNoZWxscwotCQkgKiBpbiB0aGUgc2hlbGxzIGxpc3QgdG8gYXZvaWQgZGlzcG9zaW5nIGEgc2hlbGwKLQkJICogdHdpY2UuCi0JCSAqLwotCQlpZiAoc2hlbGxUYWIgIT0gbnVsbCkgc2hlbGxUYWIuY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCXNoZWxsVGFiID0gbnVsbDsKLQkJdGFiRm9sZGVyID0gbnVsbDsKLQkJZnJlZVJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzCi0JICovCi0Jdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlmaW5hbCBDbGFzcyBjbGF6eiA9IENvbnRyb2xFeGFtcGxlLmNsYXNzOwotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHNvdXJjZVN0cmVhbSk7Ci0JCQkJCQlpZiAoaW1hZ2VUeXBlc1tpXSA9PSBTV1QuSUNPTikgewotCQkJCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW1hZ2VzW2ldID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyb3IgPSAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPwotCQkJZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDoKLQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXJyb3IpOwotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBuZXcgQ29udHJvbEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNldFNoZWxsU2l6ZShpbnN0YW5jZSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl0YWJGb2xkZXIuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgc2hlbGwgdG8gaXQncyAicGFja2VkIiBzaXplLAotCSAqIHVubGVzcyB0aGF0IG1ha2VzIGl0IGxhcmdlciB0aGFuIHRoZSBtb25pdG9yIGl0IGlzIGJlaW5nIGRpc3BsYXllZCBvbiwKLQkgKiBpbiB3aGljaCBjYXNlIGp1c3Qgc2V0IHRoZSBzaGVsbCBzaXplIHRvIGJlIHNsaWdodGx5IHNtYWxsZXIgdGhhbiB0aGUgbW9uaXRvci4KLQkgKi8KLQlzdGF0aWMgdm9pZCBzZXRTaGVsbFNpemUoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UsIFNoZWxsIHNoZWxsKSB7Ci0JCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlSZWN0YW5nbGUgbW9uaXRvckFyZWEgPSBzaGVsbC5nZXRNb25pdG9yKCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkvKiBXb3JrYXJvdW5kOiBpZiB0aGUgdGFiIGZvbGRlciBpcyB3aWRlciB0aGFuIHRoZSBzY3JlZW4sCi0JCSAqIGNhcmJvbiBjbGlwcyBpbnN0ZWFkIG9mIHNvbWVob3cgc2Nyb2xsaW5nIHRoZSB0YWIgaXRlbXMuCi0JCSAqIFdlIHRyeSB0byByZWNvdmVyIHNvbWUgd2lkdGggYnkgdXNpbmcgc2hvcnRlciB0YWIgbmFtZXMuICovCi0JCWlmIChzaXplLnggPiBtb25pdG9yQXJlYS53aWR0aCAmJiBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImNhcmJvbiIpKSB7Ci0JCQlUYWJJdGVtIFtdIHRhYkl0ZW1zID0gaW5zdGFuY2UudGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8dGFiSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQl0YWJJdGVtc1tpXS5zZXRUZXh0IChpbnN0YW5jZS50YWJzIFtpXS5nZXRTaG9ydFRhYlRleHQgKCkpOwotCQkJfQotCQkJc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZShNYXRoLm1pbihzaXplLngsIG1vbml0b3JBcmVhLndpZHRoKSwgTWF0aC5taW4oc2l6ZS55LCBtb25pdG9yQXJlYS5oZWlnaHQpKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Nvb2xCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Nvb2xCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3Y2UzZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db29sQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgQ29vbEJhclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cCB0aGF0IGNvbnRhaW5zIHRoZW0gKi8KLQlDb29sQmFyIGNvb2xCYXI7Ci0JQ29vbEl0ZW0gcHVzaEl0ZW0sIGRyb3BEb3duSXRlbSwgcmFkaW9JdGVtLCBjaGVja0l0ZW0sIHRleHRJdGVtOwotCUdyb3VwIGNvb2xCYXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uOwotCUJ1dHRvbiBkcm9wRG93bkJ1dHRvbiwgZmxhdEJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbG9ja2VkQnV0dG9uOwotCQotCVBvaW50W10gc2l6ZXM7Ci0JaW50W10gd3JhcEluZGljZXM7Ci0JaW50W10gb3JkZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNvb2xCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlsb2NrZWRCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsb2NrZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxvY2tlZCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbG9ja2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRMb2NrZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCWNvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY29vbEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNvb2xCYXJHcm91cC5zZXRUZXh0ICgiQ29vbEJhciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCksIGl0ZW1TdHlsZSA9IDA7Ci0KLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0LCBpdGVtLCBhbmQgaXRlbSB0b29sQmFyIHN0eWxlcyAqLwotCQlpbnQgdG9vbEJhclN0eWxlID0gU1dULkZMQVQ7Ci0JCWJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJCXRvb2xCYXJTdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJfQotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCQl0b29sQmFyU3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQkJdmVydGljYWwgPSB0cnVlOwotCQl9Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtU3R5bGUgfD0gU1dULkRST1BfRE9XTjsKLQkKLQkJLyoKLQkJKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkJKi8KLQkJY29vbEJhciA9IG5ldyBDb29sQmFyIChjb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgcHVzaCBidXR0b24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsJCQotCQlwdXNoSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJcHVzaEl0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCXB1c2hJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCQkKLQkJLyogQ3JlYXRlIHRoZSBkcm9wZG93biB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlkcm9wRG93bkl0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCWRyb3BEb3duSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJZHJvcERvd25JdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkvKiBDcmVhdGUgdGhlIHJhZGlvIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCXJhZGlvSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJcmFkaW9JdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQlyYWRpb0l0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBjaGVjayBidXR0b24gdG9vbGJhciBjb29sIGl0ZW0gKi8KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCB0b29sQmFyU3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJY2hlY2tJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQljaGVja0l0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCWNoZWNrSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIHRleHQgY29vbCBpdGVtICovCi0JCWlmICghdmVydGljYWwpIHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0IChjb29sQmFyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCQl0ZXh0SXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJCXRleHRJdGVtLnNldENvbnRyb2wgKHRleHQpOwotCQkJdGV4dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJUG9pbnQgdGV4dFNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQl0ZXh0U2l6ZSA9IHRleHRJdGVtLmNvbXB1dGVTaXplKHRleHRTaXplLngsIHRleHRTaXplLnkpOwotCQkJdGV4dEl0ZW0uc2V0TWluaW11bVNpemUodGV4dFNpemUpOwotCQkJdGV4dEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0ZXh0U2l6ZSk7Ci0JCQl0ZXh0SXRlbS5zZXRTaXplKHRleHRTaXplKTsKLQkJfQotCi0JCS8qIFNldCB0aGUgc2l6ZXMgYWZ0ZXIgYWRkaW5nIGFsbCBjb29sIGl0ZW1zICovCi0JCUNvb2xJdGVtW10gY29vbEl0ZW1zID0gY29vbEJhci5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvb2xJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBjb29sSXRlbXNbaV07Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JCQlQb2ludCBzaXplID0gY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRvb2xCYXIpIHsKLQkJCQlUb29sQmFyIGJhciA9IChUb29sQmFyKWNvbnRyb2w7Ci0JCQkJaWYgKGJhci5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQkJCQlzaXplLnkgPSBiYXIuZ2V0SXRlbSgwKS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzaXplLnggPSBiYXIuZ2V0SXRlbSgwKS5nZXRXaWR0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29vbEl0ZW0uc2V0TWluaW11bVNpemUoc2l6ZSk7Ci0JCQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLQkJCWNvb2xJdGVtLnNldFNpemUoY29vbFNpemUpOwotCQl9Ci0JCQotCQkvKiBJZiB3ZSBoYXZlIHNhdmVkIHN0YXRlLCByZXN0b3JlIGl0ICovCi0JCWlmIChvcmRlciAhPSBudWxsICYmIG9yZGVyLmxlbmd0aCA9PSBjb29sQmFyLmdldEl0ZW1Db3VudCgpKSB7Ci0JCQljb29sQmFyLnNldEl0ZW1MYXlvdXQob3JkZXIsIHdyYXBJbmRpY2VzLCBzaXplcyk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sQmFyLnNldFdyYXBJbmRpY2VzKG5ldyBpbnRbXSB7MSwgM30pOwotCQl9Ci0JCQotCQkvKiBBZGQgYSBsaXN0ZW5lciB0byByZXNpemUgdGhlIGdyb3VwIGJveCB0byBtYXRjaCB0aGUgY29vbGJhciAqLwotCQljb29sQmFyLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZUdyb3VwLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCWZsYXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmbGF0QnV0dG9uLnNldFRleHQgKCJTV1QuRkxBVCIpOwotCQlHcm91cCBpdGVtR3JvdXAgPSBuZXcgR3JvdXAoc3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlpdGVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWl0ZW1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJaXRlbUdyb3VwLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW1fU3R5bGVzIikpOwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKGl0ZW1Hcm91cCwgU1dULkNIRUNLKTsKLQkJZHJvcERvd25CdXR0b24uc2V0VGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSB0b29sYmFyIGlmIGFwcGxpY2FibGUgKi8KLQkJaWYgKGNvb2xCYXIgIT0gbnVsbCkgewotCQkJc2l6ZXMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotCQkJd3JhcEluZGljZXMgPSBjb29sQmFyLmdldFdyYXBJbmRpY2VzKCk7Ci0JCQlvcmRlciA9IGNvb2xCYXIuZ2V0SXRlbU9yZGVyKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUV4YW1wbGVXaWRnZXRzKCk7CQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gY29vbEJhci5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtjb29sQmFyfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiQ0IiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvb2xCYXIiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb29sQmFyLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5GTEFUKSAhPSAwKTsKLQkJZHJvcERvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRJdGVtKDApLmdldFN0eWxlICgpICYgU1dULkRST1BfRE9XTikgIT0gMCk7Ci0JCWxvY2tlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29vbEJhci5nZXRMb2NrZWQoKSk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0V2lkZ2V0TG9ja2VkICgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXIgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRMb2NrZWQgKCkgewotCQljb29sQmFyLnNldExvY2tlZCAobG9ja2VkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbnMgdG8gd2lkZ2V0U2VsZWN0ZWQoKSBldmVudHMgb24gU1dULkRST1BfRE9XTiB0eXBlIFRvb2xJdGVtcwotCSAqIGFuZCBvcGVucy9jbG9zZXMgYSBtZW51IHdoZW4gYXBwcm9wcmlhdGUuCi0JICovCi0JY2xhc3MgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gQ3JlYXRlIHRoZSBtZW51IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCWlmIChtZW51ID09IG51bGwpIHsKLQkJCQkvLyBMYXp5IGNyZWF0ZSB0aGUgbWVudS4KLQkJCQltZW51ID0gbmV3IE1lbnUoc2hlbGwpOwotCQkJCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJCQkJdmlzaWJsZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kpIHsKLQkJCQkJZmluYWwgU3RyaW5nIHRleHQgPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcERvd25EYXRhXyIgKyBpKTsKLQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCQkJbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBBZGQgYSBtZW51IHNlbGVjdGlvbiBsaXN0ZW5lciBzbyB0aGF0IHRoZSBtZW51IGlzIGhpZGRlbgotCQkJCQkJICogd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuCi0JCQkJCQkgKi8KLQkJCQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKioKLQkJCSAqIEEgc2VsZWN0aW9uIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiBhIGRyb3AgZG93biB0b29sCi0JCQkgKiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBtYWluIGFyZWEgYW5kIGluIHRoZSBkcm9wCi0JCQkgKiBkb3duIGFycm93LiAgRXhhbWluZSB0aGUgZXZlbnQgZGV0YWlsIHRvIGRldGVybWluZQotCQkJICogd2hlcmUgdGhlIHdpZGdldCB3YXMgc2VsZWN0ZWQuCi0JCQkgKi8JCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBkcm9wIGRvd24gYXJyb3cgd2FzIHNlbGVjdGVkLgotCQkJCSAqLwotCQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJCS8vIEhpZGUgdGhlIG1lbnUgdG8gZ2l2ZSB0aGUgQXJyb3cgdGhlIGFwcGVhcmFuY2Ugb2YgYmVpbmcgYSB0b2dnbGUgYnV0dG9uLgotCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJfSBlbHNlIHsJCi0JCQkJCS8vIFBvc2l0aW9uIHRoZSBtZW51IGJlbG93IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZWQgd2l0aCB0aGUgdGhlIGRyb3AgZG93biB0b29sIGJ1dHRvbi4KLQkJCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJCQkKLQkJCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xJdGVtQm91bmRzLngsIHRvb2xJdGVtQm91bmRzLnkpKTsKLQkJCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCQkJc2V0TWVudVZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIE1haW4gYXJlYSBvZiBkcm9wIGRvd24gdG9vbCBpdGVtIHNlbGVjdGVkLgotCQkJCSAqIEFuIGFwcGxpY2F0aW9uIHdvdWxkIGludm9rZSB0aGUgY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSB0b29sIGl0ZW0uCi0JCQkJICovCi0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldE1lbnVWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJbWVudS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gd2lkZ2V0U2VsZWN0ZWQoKSBldmVudHMgb24gU1dULkRST1BfRE9XTiB0eXBlIENvb2xJdGVtcwotCSAqIGFuZCBvcGVucy9jbG9zZXMgYSBtZW51IHdoZW4gYXBwcm9wcmlhdGUuCi0JICovCi0JY2xhc3MgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLyoqCi0JCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gdGhlIGNvb2wgaXRlbQotCQkJICogaXMgc2VsZWN0ZWQgYnkgaXRzIGdyaXBwZXIgb3IgaWYgdGhlIGRyb3AgZG93biBhcnJvdwotCQkJICogKG9yICdjaGV2cm9uJykgaXMgc2VsZWN0ZWQuIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbAotCQkJICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkJICovCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qIElmIHRoZSBwb3B1cCBtZW51IGlzIGFscmVhZHkgdXAgKGkuZS4gdXNlciBwcmVzc2VkIGFycm93IHR3aWNlKSwKLQkJCQkgKiB0aGVuIGRpc3Bvc2UgaXQuCi0JCQkJICovCi0JCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCQltZW51LmRpc3Bvc2UoKTsKLQkJCQkJbWVudSA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogR2V0IHRoZSBjb29sIGl0ZW0gYW5kIGNvbnZlcnQgaXRzIGJvdW5kcyB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLiAqLwotCQkJCUNvb2xJdGVtIGNvb2xJdGVtID0gKENvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBjb29sSXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJaXRlbUJvdW5kcy53aWR0aCA9IGV2ZW50LnggLSBpdGVtQm91bmRzLng7Ci0JCQkJUG9pbnQgcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQgKGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCQotCQkJCS8qIEdldCB0aGUgdG9vbGJhciBmcm9tIHRoZSBjb29sIGl0ZW0uICovCi0JCQkJVG9vbEJhciB0b29sQmFyID0gKFRvb2xCYXIpIGNvb2xJdGVtLmdldENvbnRyb2wgKCk7Ci0JCQkJVG9vbEl0ZW1bXSB0b29scyA9IHRvb2xCYXIuZ2V0SXRlbXMgKCk7Ci0JCQkJaW50IHRvb2xDb3VudCA9IHRvb2xzLmxlbmd0aDsKLQkJCQkJCQkJCi0JCQkJLyogQ29udmVydCB0aGUgYm91bmRzIG9mIGVhY2ggdG9vbCBpdGVtIHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMsCi0JCQkJICogYW5kIGRldGVybWluZSB3aGljaCBvbmVzIGFyZSBwYXN0IHRoZSBib3VuZHMgb2YgdGhlIGNvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKGkgPCB0b29sQ291bnQpIHsKLQkJCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJCXB0ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xCb3VuZHMueCwgdG9vbEJvdW5kcy55KSk7Ci0JCQkJCXRvb2xCb3VuZHMueCA9IHB0Lng7Ci0JCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCQkgIAkJUmVjdGFuZ2xlIGludGVyc2VjdGlvbiA9IGl0ZW1Cb3VuZHMuaW50ZXJzZWN0aW9uICh0b29sQm91bmRzKTsKLQkJCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJCSAgCQlpKys7Ci0JCQkJfQotCQkJCQotCQkJCS8qIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLiAqLwotCQkJCW1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29sQ291bnQ7IGorKykgewotCQkJCQlUb29sSXRlbSB0b29sID0gdG9vbHNbal07Ci0JCQkJCUltYWdlIGltYWdlID0gdG9vbC5nZXRJbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgodG9vbC5nZXRTdHlsZSgpICYgU1dULkRST1BfRE9XTikgIT0gMCkgewotCQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JCQkJCQkJbWVudUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCQkJCVN0cmluZyB0ZXh0ID0gdG9vbC5nZXRUb29sVGlwVGV4dCgpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIG1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCQkJTWVudSBtID0gbmV3IE1lbnUobWVudSk7Ci0JCQkJCQkJbWVudUl0ZW0uc2V0TWVudShtKTsKLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IDk7ICsraykgewotCQkJCQkJCQl0ZXh0ID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BEb3duRGF0YV8iICsgayk7Ci0JCQkJCQkJCWlmICh0ZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtKG0sIFNXVC5OT05FKTsKLQkJCQkJCQkJCW1pLnNldFRleHQodGV4dCk7Ci0JCQkJCQkJCQkvKiBBcHBsaWNhdGlvbiBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHN1Ym1lbnUgaXRlbSB3b3VsZCBnbyBoZXJlLiAqLwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJbmV3IE1lbnVJdGVtKG0sIFNXVC5TRVBBUkFUT1IpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCQkJCW1lbnVJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSBtZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJfQotCQkJCQkJLyogQXBwbGljYXRpb24gY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSBtZW51IGl0ZW0gd291bGQgZ28gaGVyZS4gKi8KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvKiBEaXNwbGF5IHRoZSBwb3AtdXAgbWVudSBhdCB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGFycm93IGJ1dHRvbi4KLQkJCQkgKiBEaXNwb3NlIHRoZSBtZW51IHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIGl0LgotCQkJCSAqLwotCQkJCXB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQltZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJCXdoaWxlIChtZW51ICE9IG51bGwgJiYgIW1lbnUuaXNEaXNwb3NlZCgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQkJfQotCQkJCWlmIChtZW51ICE9IG51bGwpIHsKLQkJCQkJbWVudS5kaXNwb3NlICgpOwotCQkJCQltZW51ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ3VzdG9tQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4OTk4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DdXN0b21Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db250cm9sRXhhbXBsZSBleHRlbmRzIENvbnRyb2xFeGFtcGxlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBDdXN0b21Db250cm9sRXhhbXBsZSBlbWJlZGRlZAotCSAqIGluc2lkZSB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ29udHJvbEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlciAocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VycyB0aGUgc2V0IG9mIGV4YW1wbGUgVGFicwotCSAqLwotCVRhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JCXJldHVybiBuZXcgVGFiIFtdIHsKLQkJCW5ldyBDQ29tYm9UYWIgKHRoaXMpLAotCQkJbmV3IENMYWJlbFRhYiAodGhpcyksCi0JCQluZXcgQ1RhYkZvbGRlclRhYiAodGhpcyksCi0JCQluZXcgU2FzaEZvcm1UYWIgKHRoaXMpLAotCQkJbmV3IFN0eWxlZFRleHRUYWIgKHRoaXMpLAotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ3VzdG9tQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UgPSBuZXcgQ3VzdG9tQ29udHJvbEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJjdXN0b20ud2luZG93LnRpdGxlIikpOwotCQlzZXRTaGVsbFNpemUoaW5zdGFuY2UsIHNoZWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGF0ZVRpbWVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RhdGVUaW1lVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjQwMGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGF0ZVRpbWVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgRGF0ZVRpbWVUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JRGF0ZVRpbWUgZGF0ZVRpbWUxOwotCUdyb3VwIGRhdGVUaW1lR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBkYXRlQnV0dG9uLCB0aW1lQnV0dG9uLCBjYWxlbmRhckJ1dHRvbiwgc2hvcnRCdXR0b24sIG1lZGl1bUJ1dHRvbiwgbG9uZ0J1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JRGF0ZVRpbWVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGxpc3QgKi8KLQkJZGF0ZVRpbWVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRhdGVUaW1lR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWRhdGVUaW1lR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZGF0ZVRpbWVHcm91cC5zZXRUZXh0ICgiRGF0ZVRpbWUiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChkYXRlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkRBVEU7Ci0JCWlmICh0aW1lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlRJTUU7Ci0JCWlmIChjYWxlbmRhckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DQUxFTkRBUjsKLQkJaWYgKHNob3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIT1JUOwotCQlpZiAobWVkaXVtQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1FRElVTTsKLQkJaWYgKGxvbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTE9ORzsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCQkKLQkJZGF0ZVRpbWUxID0gbmV3IERhdGVUaW1lIChkYXRlVGltZUdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWRhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRhdGVCdXR0b24uc2V0VGV4dCgiU1dULkRBVEUiKTsKLQkJdGltZUJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdGltZUJ1dHRvbi5zZXRUZXh0KCJTV1QuVElNRSIpOwotCQljYWxlbmRhckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJY2FsZW5kYXJCdXR0b24uc2V0VGV4dCgiU1dULkNBTEVOREFSIik7Ci0JCUdyb3VwIGZvcm1hdEdyb3VwID0gbmV3IEdyb3VwKHN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJZm9ybWF0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzaG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oZm9ybWF0R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNob3J0QnV0dG9uLnNldFRleHQoIlNXVC5TSE9SVCIpOwotCQltZWRpdW1CdXR0b24gPSBuZXcgQnV0dG9uKGZvcm1hdEdyb3VwLCBTV1QuUkFESU8pOwotCQltZWRpdW1CdXR0b24uc2V0VGV4dCgiU1dULk1FRElVTSIpOwotCQlsb25nQnV0dG9uID0gbmV3IEJ1dHRvbihmb3JtYXRHcm91cCwgU1dULlJBRElPKTsKLQkJbG9uZ0J1dHRvbi5zZXRUZXh0KCJTV1QuTE9ORyIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0KCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2RhdGVUaW1lMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRGF5IiwgIkhvdXJzIiwgIk1pbnV0ZXMiLCAiTW9udGgiLCAiU2Vjb25kcyIsICJZZWFyIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkRhdGVUaW1lIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWRhdGVCdXR0b24uc2V0U2VsZWN0aW9uICgoZGF0ZVRpbWUxLmdldFN0eWxlICgpICYgU1dULkRBVEUpICE9IDApOwotCQl0aW1lQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5USU1FKSAhPSAwKTsKLQkJY2FsZW5kYXJCdXR0b24uc2V0U2VsZWN0aW9uICgoZGF0ZVRpbWUxLmdldFN0eWxlICgpICYgU1dULkNBTEVOREFSKSAhPSAwKTsKLQkJc2hvcnRCdXR0b24uc2V0U2VsZWN0aW9uICgoZGF0ZVRpbWUxLmdldFN0eWxlICgpICYgU1dULlNIT1JUKSAhPSAwKTsKLQkJbWVkaXVtQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5NRURJVU0pICE9IDApOwotCQlsb25nQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5MT05HKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGlhbG9nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4NmIzYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRGlhbG9nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBEaWFsb2dUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgZGlhbG9nU3R5bGVHcm91cCwgcmVzdWx0R3JvdXA7Ci0JVGV4dCB0ZXh0V2lkZ2V0OwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlDb21ibyBkaWFsb2dDb21ibzsKLQlCdXR0b24gY3JlYXRlQnV0dG9uOwotCUJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCUJ1dHRvbiB5ZXNCdXR0b24sIG5vQnV0dG9uOwotCUJ1dHRvbiByZXRyeUJ1dHRvbjsKLQlCdXR0b24gYWJvcnRCdXR0b24sIGlnbm9yZUJ1dHRvbjsKLQlCdXR0b24gaWNvbkVycm9yQnV0dG9uLCBpY29uSW5mb3JtYXRpb25CdXR0b24sIGljb25RdWVzdGlvbkJ1dHRvbjsKLQlCdXR0b24gaWNvbldhcm5pbmdCdXR0b24sIGljb25Xb3JraW5nQnV0dG9uLCBub0ljb25CdXR0b247Ci0JQnV0dG9uIHByaW1hcnlNb2RhbEJ1dHRvbiwgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiwgc3lzdGVtTW9kYWxCdXR0b247Ci0JQnV0dG9uIHNhdmVCdXR0b24sIG9wZW5CdXR0b24sIG11bHRpQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJFeHRlbnNpb25zCT0geyIqLnR4dCIsICIqLmJhdCIsICIqLmRvYyIsICIqIn07Ci0Jc3RhdGljIFN0cmluZyBbXSBGaWx0ZXJOYW1lcwkJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMCIpLAotCQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzEiKSwKLQkJCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsdGVyTmFtZV8yIiksCi0JCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMyIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlEaWFsb2dUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGJ1dHRvbiBzdHlsZSBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHNlbGVjdGlvbiBldmVudAotCSAqLwotCXZvaWQgYnV0dG9uU3R5bGVTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkvKgotCQkgKiBPbmx5IGNlcnRhaW4gY29tYmluYXRpb25zIG9mIGJ1dHRvbiBzdHlsZXMgYXJlCi0JCSAqIHN1cHBvcnRlZCBmb3IgdmFyaW91cyBkaWFsb2dzLiAgTWFrZSBzdXJlIHRoZQotCQkgKiBjb250cm9sIHdpZGdldCByZWZsZWN0cyBvbmx5IHZhbGlkIGNvbWJpbmF0aW9ucy4KLQkJICovCi0JCWJvb2xlYW4gb2sgPSBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCWJvb2xlYW4gY2FuY2VsID0gY2FuY2VsQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiB5ZXMgPSB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIG5vID0gbm9CdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGFib3J0ID0gYWJvcnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIHJldHJ5ID0gcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGlnbm9yZSA9IGlnbm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCQotCQlva0J1dHRvbi5zZXRFbmFibGVkICghKHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKCEoYWJvcnQgfHwgaWdub3JlIHx8ICh5ZXMgIT0gbm8pKSk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHJldHJ5IHx8IGFib3J0IHx8IGlnbm9yZSB8fCAoY2FuY2VsICYmICF5ZXMgJiYgIW5vKSkpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IHllcyB8fCBubykpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8pKTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKCEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubykpOwotCQkKLQkJY3JlYXRlQnV0dG9uLnNldEVuYWJsZWQgKAotCQkJCSEob2sgfHwgY2FuY2VsIHx8IHllcyB8fCBubyB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUpIHx8Ci0JCQkJb2sgfHwKLQkJCQkob2sgJiYgY2FuY2VsKSB8fAotCQkJCSh5ZXMgJiYgbm8pIHx8Ci0JCQkJKHllcyAmJiBubyAmJiBjYW5jZWwpIHx8Ci0JCQkJKHJldHJ5ICYmIGNhbmNlbCkgfHwKLQkJCQkoYWJvcnQgJiYgcmV0cnkgJiYgaWdub3JlKSk7Ci0JCQotCi0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgY3JlYXRlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAob2tCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBva0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5PSzsKLQkJaWYgKGNhbmNlbEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DQU5DRUw7Ci0JCWlmICh5ZXNCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiB5ZXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuWUVTOwotCQlpZiAobm9CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBub0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5OTzsKLQkJaWYgKHJldHJ5QnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgcmV0cnlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVUUlk7Ci0JCWlmIChhYm9ydEJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGFib3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFCT1JUOwotCQlpZiAoaWdub3JlQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWdub3JlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklHTk9SRTsKLQkJaWYgKGljb25FcnJvckJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25FcnJvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0VSUk9SOwotCQlpZiAoaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fSU5GT1JNQVRJT047Ci0JCWlmIChpY29uUXVlc3Rpb25CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uUXVlc3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9RVUVTVElPTjsKLQkJaWYgKGljb25XYXJuaW5nQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbldhcm5pbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XQVJOSU5HOwotCQlpZiAoaWNvbldvcmtpbmdCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uV29ya2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX1dPUktJTkc7Ci0JCWlmIChwcmltYXJ5TW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBwcmltYXJ5TW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUFJJTUFSWV9NT0RBTDsKLQkJaWYgKGFwcGxpY2F0aW9uTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkFQUExJQ0FUSU9OX01PREFMOwotCQlpZiAoc3lzdGVtTW9kYWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TWVNURU1fTU9EQUw7Ci0JCWlmIChzYXZlQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgc2F2ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TQVZFOwotCQlpZiAob3BlbkJ1dHRvbi5nZXRFbmFibGVkICgpICYmIG9wZW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuT1BFTjsKLQkJaWYgKG11bHRpQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgbXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCi0JCS8qIE9wZW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB0eXBlICovCi0JCVN0cmluZyBuYW1lID0gZGlhbG9nQ29tYm8uZ2V0VGV4dCAoKTsKLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yRGlhbG9nIikpKSB7Ci0JCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cgKHNoZWxsICxzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0UkdCIChuZXcgUkdCICgxMDAsIDEwMCwgMTAwKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJUkdCIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpcmVjdG9yeURpYWxvZyIpKSkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZSAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlyZWN0b3J5RGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpKSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRGaWxlTmFtZSAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInJlYWRtZV90eHQiKSk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMgKEZpbHRlck5hbWVzKTsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zIChGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIpOwotCQkJaWYgKChkaWFsb2cuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApIHsKLQkJCQlTdHJpbmcgW10gZmlsZXMgPSBkaWFsb2cuZ2V0RmlsZU5hbWVzICgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoIlx0IiArIGZpbGVzIFtpXSArIFRleHQuREVMSU1JVEVSKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RGlhbG9nIikpKSB7Ci0JCQlGb250RGlhbG9nIGRpYWxvZyA9IG5ldyBGb250RGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCUZvbnREYXRhIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RGlhbG9nIikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkgKyBUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHJpbnREaWFsb2ciKSkpIHsKLQkJCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCVByaW50ZXJEYXRhIHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQcmludERpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJaWYgKG5hbWUuZXF1YWxzKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikpKSB7Ci0JCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lc3NhZ2VCb3giKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCS8qCi0JCQkgKiBUaGUgcmVzdWx0aW5nIGludGVnZXIgZGVwZW5kcyBvbiB0aGUgb3JpZ2luYWwKLQkJCSAqIGRpYWxvZyBzdHlsZS4gIERlY29kZSB0aGUgcmVzdWx0IGFuZCBkaXNwbGF5IGl0LgotCQkJICovCi0JCQlzd2l0Y2ggKHJlc3VsdCkgewotCQkJCWNhc2UgU1dULk9LOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuT0sifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ZRVM6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5ZRVMifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5OTzoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULk5PIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuQ0FOQ0VMIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuQUJPUlQ6IAotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuQUJPUlQifSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5SRVRSWToKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULlJFVFJZIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuSUdOT1JFOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuSUdOT1JFIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyIiICsgcmVzdWx0fSkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXRleHRXaWRnZXQuYXBwZW5kIChUZXh0LkRFTElNSVRFUiArIFRleHQuREVMSU1JVEVSKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuIAotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkJICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiAgSXQgY29uc2lzdHMgb2YgdGhlCi0JCSAqIHN0eWxlIGdyb3VwLCB0aGUgZGlzcGxheSBncm91cCBhbmQgdGhlIHNpemUgZ3JvdXAuCi0JCSAqLwkJCQotCQljb250cm9sR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0PSBuZXcgR3JpZExheW91dCAoKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkJCi0JCS8qCi0JCSAqIENyZWF0ZSBhIGdyb3VwIHRvIGhvbGQgdGhlIGRpYWxvZyBzdHlsZSBjb21ibyBib3ggYW5kCi0JCSAqIGNyZWF0ZSBkaWFsb2cgYnV0dG9uLgotCQkgKi8KLQkJZGlhbG9nU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGlhbG9nU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCWRpYWxvZ1N0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpYWxvZ19UeXBlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGNvbWJvICovCi0JCVN0cmluZyBbXSBzdHJpbmdzID0gewotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yRGlhbG9nIiksIAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpcmVjdG9yeURpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHJpbnREaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IiksCi0JCX07Ci0JCWRpYWxvZ0NvbWJvID0gbmV3IENvbWJvIChkaWFsb2dTdHlsZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZGlhbG9nQ29tYm8uc2V0SXRlbXMgKHN0cmluZ3MpOwotCQlkaWFsb2dDb21iby5zZXRUZXh0IChzdHJpbmdzIFswXSk7Ci0JCWRpYWxvZ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoc3RyaW5ncy5sZW5ndGgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNyZWF0ZSBkaWFsb2cgYnV0dG9uICovCi0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nU3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9EaWFsb2ciKSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB2YXJpb3VzIGRpYWxvZyBidXR0b24gc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgYnV0dG9uU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvblN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWJ1dHRvblN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWJ1dHRvblN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJ1dHRvbl9TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgYnV0dG9uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJb2tCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlva0J1dHRvbi5zZXRUZXh0ICgiU1dULk9LIik7Ci0JCWNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkNBTkNFTCIpOwotCQl5ZXNCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl5ZXNCdXR0b24uc2V0VGV4dCAoIlNXVC5ZRVMiKTsKLQkJbm9CdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0J1dHRvbi5zZXRUZXh0ICgiU1dULk5PIik7Ci0JCXJldHJ5QnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmV0cnlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRVRSWSIpOwotCQlhYm9ydEJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWFib3J0QnV0dG9uLnNldFRleHQgKCJTV1QuQUJPUlQiKTsKLQkJaWdub3JlQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaWdub3JlQnV0dG9uLnNldFRleHQgKCJTV1QuSUdOT1JFIik7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaWNvbiBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBpY29uU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWljb25TdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpY29uU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJaWNvblN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkljb25fU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGljb24gc3R5bGUgYnV0dG9ucyAqLwotCQlpY29uRXJyb3JCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9FUlJPUiIpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCQlpY29uUXVlc3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuSUNPTl9RVUVTVElPTiIpOwotCQlpY29uV2FybmluZ0J1dHRvbiA9IG5ldyBCdXR0b24gKGljb25TdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fV0FSTklORyIpOwotCQlpY29uV29ya2luZ0J1dHRvbiA9IG5ldyBCdXR0b24gKGljb25TdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uV29ya2luZ0J1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fV09SS0lORyIpOwotCQlub0ljb25CdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbm9JY29uQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb19JY29uIikpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBtb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb2RhbF9TdHlsZXMiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbW9kYWwgc3R5bGUgYnV0dG9ucyAqLwotCQlwcmltYXJ5TW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXByaW1hcnlNb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlBSSU1BUllfTU9EQUwiKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFQUExJQ0FUSU9OX01PREFMIik7Ci0JCXN5c3RlbU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNZU1RFTV9NT0RBTCIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGZpbGUgZGlhbG9nIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGZpbGVEaWFsb2dTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZmlsZURpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWZpbGVEaWFsb2dTdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlmaWxlRGlhbG9nU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZV9EaWFsb2dfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGZpbGUgZGlhbG9nIHN0eWxlIGJ1dHRvbnMgKi8KLQkJb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZURpYWxvZ1N0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9wZW5CdXR0b24uc2V0VGV4dCgiU1dULk9QRU4iKTsKLQkJc2F2ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzYXZlQnV0dG9uLnNldFRleHQgKCJTV1QuU0FWRSIpOwotCQltdWx0aUJ1dHRvbiA9IG5ldyBCdXR0b24oZmlsZURpYWxvZ1N0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpQnV0dG9uLnNldFRleHQoIlNXVC5NVUxUSSIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG9yaWVudGF0aW9uIGdyb3VwICovCi0JCWlmIChSVExfU1VQUE9SVF9FTkFCTEUpIHsKLQkJCWNyZWF0ZU9yaWVudGF0aW9uR3JvdXAoKTsKLQkJfQotCQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJZGlhbG9nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWRpYWxvZ1NlbGVjdGVkIChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkIChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25TdHlsZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYnV0dG9uU3R5bGVTZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9OwotCQlva0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCXllc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCW5vQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJcmV0cnlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlhYm9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCWlnbm9yZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igc3R5bGUgYnV0dG9ucyAqLwotCQlva0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW5vQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlub0ljb25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlzYXZlQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJb3BlbkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW9wZW5CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJbXVsdGlCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlub0ljb25CdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCi0JCS8qCi0JCSAqIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB3aWRnZXQgdG8gZGlzcGxheQotCQkgKiB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgZXhhbXBsZSBkaWFsb2dzLgotCQkgKi8KLQkJcmVzdWx0R3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlyZXN1bHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJcmVzdWx0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcmVzdWx0R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpYWxvZ19SZXN1bHQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgYSBtdWx0aSBsaW5lZCwgc2Nyb2xsZWQgdGV4dCB3aWRnZXQgZm9yIG91dHB1dC4KLQkJICovCi0JCXRleHRXaWRnZXQgPSBuZXcgVGV4dChyZXN1bHRHcm91cCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl0ZXh0V2lkZ2V0LnNldExheW91dERhdGEgKGdyaWREYXRhKTsJCi0JfQotCQotCS8qKgotCSAqIFRoZSBwbGF0Zm9ybSBkaWFsb2dzIGRvIG5vdCBoYXZlIFNXVCBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBjcmVhdGVMaXN0ZW5lcnNHcm91cCAoKSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGlhbG9nIHR5cGUgY29tYm8gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGRpYWxvZ1NlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKiBFbmFibGUvRGlzYWJsZSB0aGUgYnV0dG9ucyAqLwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZ0NvbWJvLmdldFRleHQgKCk7Ci0JCWJvb2xlYW4gaXNNZXNzYWdlQm94ID0gbmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikpOwotCQlib29sZWFuIGlzRmlsZURpYWxvZyA9IG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsZURpYWxvZyIpKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCXllc0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlyZXRyeUJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlhYm9ydEJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpZ25vcmVCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uUXVlc3Rpb25CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJbm9JY29uQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCXNhdmVCdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkJb3BlbkJ1dHRvbi5zZXRFbmFibGVkIChpc0ZpbGVEaWFsb2cpOwotCQltdWx0aUJ1dHRvbi5zZXRFbmFibGVkIChpc0ZpbGVEaWFsb2cpOwotCQotCQkvKiBVbnNlbGVjdCB0aGUgYnV0dG9ucyAqLwotCQlpZiAoIWlzTWVzc2FnZUJveCkgewotCQkJb2tCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQljYW5jZWxCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl5ZXNCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlub0J1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXJldHJ5QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJYWJvcnRCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlpZ25vcmVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkRpYWxvZyI7Ci0JfQotCQotCS8qKgotCSAqIFJlY3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCByZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJaWYgKHRleHRXaWRnZXQgPT0gbnVsbCkgewotCQkJc3VwZXIucmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJfSAKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9FeHBhbmRCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0V4cGFuZEJhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTUwMmQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0V4cGFuZEJhclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBFeHBhbmRCYXJUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JRXhwYW5kQmFyIGV4cGFuZEJhcjE7Ci0JR3JvdXAgZXhwYW5kQmFyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwkKLQlCdXR0b24gdmVydGljYWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JRXhwYW5kQmFyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWV4cGFuZEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJZXhwYW5kQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWV4cGFuZEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWV4cGFuZEJhckdyb3VwLnNldFRleHQgKCJFeHBhbmRCYXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8JCQotCQlleHBhbmRCYXIxID0gbmV3IEV4cGFuZEJhciAoZXhwYW5kQmFyR3JvdXAsIHN0eWxlKTsKLQkJCi0JCS8vIEZpcnN0IGl0ZW0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGV4cGFuZEJhcjEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlBVU0gpLnNldFRleHQoIlNXVC5QVVNIIik7Ci0JCW5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlJBRElPKS5zZXRUZXh0KCJTV1QuUkFESU8iKTsKLQkJbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuQ0hFQ0spLnNldFRleHQoIlNXVC5DSEVDSyIpOwotCQluZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5UT0dHTEUpLnNldFRleHQoIlNXVC5UT0dHTEUiKTsKLQkJRXhwYW5kSXRlbSBpdGVtID0gbmV3IEV4cGFuZEl0ZW0gKGV4cGFuZEJhcjEsIFNXVC5OT05FLCAwKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJdGVtMV9UZXh0IikpOwotCQlpdGVtLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCQotCQkvLyBTZWNvbmQgaXRlbQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChleHBhbmRCYXIxLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7CQotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJTV1QuSUNPTl9FUlJPUiIpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORykpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSk7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU1dULklDT05fUVVFU1RJT04iKTsKLQkJaXRlbSA9IG5ldyBFeHBhbmRJdGVtIChleHBhbmRCYXIxLCBTV1QuTk9ORSwgMSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRlbTJfVGV4dCIpKTsKLQkJaXRlbS5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZfU0NST0xMIik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtleHBhbmRCYXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTcGFjaW5nIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiRUIiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkV4cGFuZEJhciI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCl7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA1YmY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBHcm91cFRhYiBleHRlbmRzIFRhYiB7Ci0JQnV0dG9uIHRpdGxlQnV0dG9uOwotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgZ3JvdXAxOwotCUdyb3VwIGdyb3VwR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBzaGFkb3dFdGNoZWRJbkJ1dHRvbiwgc2hhZG93RXRjaGVkT3V0QnV0dG9uLCBzaGFkb3dJbkJ1dHRvbiwgc2hhZG93T3V0QnV0dG9uLCBzaGFkb3dOb25lQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUdyb3VwVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFRpdGxlVGV4dCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgR3JvdXAgKi8KLQkJZ3JvdXBHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZ3JvdXBHcm91cC5zZXRUZXh0ICgiR3JvdXAiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaGFkb3dFdGNoZWRJbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfRVRDSEVEX0lOOwotCQlpZiAoc2hhZG93RXRjaGVkT3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19FVENIRURfT1VUOwotCQlpZiAoc2hhZG93SW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0lOOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlncm91cDEgPSBuZXcgR3JvdXAgKGdyb3VwR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2hhZG93RXRjaGVkSW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dFdGNoZWRJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19FVENIRURfSU4iKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfRVRDSEVEX09VVCIpOwotCQlzaGFkb3dJbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0lOIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfTk9ORSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Z3JvdXAxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyb3VwIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0ZXh0IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFRpdGxlVGV4dCAoKSB7Ci0JCWlmICh0aXRsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCWdyb3VwMS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkJfSBlbHNlIHsKLQkJCWdyb3VwMS5zZXRUZXh0ICgiIik7Ci0JCX0KLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzaGFkb3dFdGNoZWRJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9JTikgIT0gMCk7Ci0JCXNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9PVVQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGdyb3VwMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX05PTkUpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0VGl0bGVUZXh0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MYWJlbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjMzMzI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExhYmVsVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDY7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXAsIGltYWdlTGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgc2VwYXJhdG9yQnV0dG9uLCBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGFiZWxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgbGFiZWxzICovCi0JCXRleHRMYWJlbEdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfTGFiZWxzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGxhYmVscyAqLwotCQlpbWFnZUxhYmVsR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULlNIQURPV19OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlpbWFnZUxhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlTGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfTGFiZWxzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TRVBBUkFUT1I7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJbGFiZWwyID0gbmV3IExhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlsYWJlbDMgPSBuZXcgTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJbGFiZWwzLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJXcmFwX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbDMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQl9Ci0JCWxhYmVsNCA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNC5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsNSA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlsYWJlbDYgPSBuZXcgTGFiZWwoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlzZXBhcmF0b3JCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0VGV4dCAoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlHcm91cCBzdHlsZVN1Ykdyb3VwID0gbmV3IEdyb3VwIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlU3ViR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGFiZWwxLCBsYWJlbDIsIGxhYmVsMywgbGFiZWw0LCBsYWJlbDUsIGxhYmVsNn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw0LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw1LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw2LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlib29sZWFuIGlzU2VwYXJhdG9yID0gKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TRVBBUkFUT1IpICE9IDA7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlJJR0hUKSAhPSAwKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19JTikgIT0gMCk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX09VVCkgIT0gMCk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19OT05FKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7CQkKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlsZWZ0QnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlyaWdodEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwNTUwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaW5rVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgTGlua1RhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlMaW5rIGxpbmsxOwotCUdyb3VwIGxpbmtHcm91cDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGlua1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbGlzdCAqLwotCQlsaW5rR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlsaW5rR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWxpbmtHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlsaW5rR3JvdXAuc2V0VGV4dCAoIkxpbmsiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCXRyeSB7Ci0JCQlsaW5rMSA9IG5ldyBMaW5rIChsaW5rR3JvdXAsIHN0eWxlKTsKLQkJCWxpbmsxLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5rVGV4dCIpKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJLy8gdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGxpbmtHcm91cCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQgKCJMaW5rIHdpZGdldCBub3Qgc3Vwb3J0ZWQiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0KCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLS8vCQkgdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQlpZiAobGluazEgIT0gbnVsbCkgcmV0dXJuIG5ldyBXaWRnZXQgW10ge2xpbmsxfTsKLQkJcmV0dXJuIG5ldyBXaWRnZXRbXSB7fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpbmsiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMWViODAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpc3RUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBMaXN0VGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxpc3QgbGlzdDE7Ci0JR3JvdXAgbGlzdEdyb3VwOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlMaXN0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWxpc3RHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxpc3RHcm91cC5zZXRUZXh0ICgiTGlzdCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxpc3QxID0gbmV3IExpc3QgKGxpc3RHcm91cCwgc3R5bGUpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGlzdDF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ikl0ZW1zIiwgIlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZjgzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9NZW51VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBNZW51VGFiIGV4dGVuZHMgVGFiIHsJCi0JLyogV2lkZ2V0cyBhZGRlZCB0byB0aGUgIk1lbnUgU3R5bGUiLCAiTWVudUl0ZW0gU3R5bGUiIGFuZCAiT3RoZXIiIGdyb3VwcyAqLwotCUJ1dHRvbiBiYXJCdXR0b24sIGRyb3BEb3duQnV0dG9uLCBwb3BVcEJ1dHRvbiwgbm9SYWRpb0dyb3VwQnV0dG9uLCBsZWZ0VG9SaWdodEJ1dHRvbiwgcmlnaHRUb0xlZnRCdXR0b247Ci0JQnV0dG9uIGNoZWNrQnV0dG9uLCBjYXNjYWRlQnV0dG9uLCBwdXNoQnV0dG9uLCByYWRpb0J1dHRvbiwgc2VwYXJhdG9yQnV0dG9uOwotCUJ1dHRvbiBpbWFnZXNCdXR0b24sIGFjY2VsZXJhdG9yc0J1dHRvbiwgbW5lbW9uaWNzQnV0dG9uLCBzdWJNZW51QnV0dG9uLCBzdWJTdWJNZW51QnV0dG9uOwotCUJ1dHRvbiBjcmVhdGVCdXR0b24sIGNsb3NlQWxsQnV0dG9uOwotCUdyb3VwIG1lbnVJdGVtU3R5bGVHcm91cDsKLQotCS8qIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIHRoZSBvcGVuIHNoZWxscyAqLwotCWludCBzaGVsbENvdW50ID0gMDsKLQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGwgWzRdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlNZW51VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbGwgdGhlIGV4YW1wbGUgc2hlbGxzLgotCSAqLwotCXZvaWQgY2xvc2VBbGxTaGVsbHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHNoZWxsQ291bnQ7IGkrKykgewotCQkJaWYgKHNoZWxsc1tpXSAhPSBudWxsICYgIXNoZWxscyBbaV0uaXNEaXNwb3NlZCAoKSkgewotCQkJCXNoZWxscyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXNoZWxsQ291bnQgPSAwOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIENyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKgotCQkgKiBSZW1lbWJlciB0aGUgZXhhbXBsZSBzaGVsbHMgc28gdGhleQotCQkgKiBjYW4gYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlpZiAoc2hlbGxDb3VudCA+PSBzaGVsbHMubGVuZ3RoKSB7Ci0JCQlTaGVsbCBbXSBuZXdTaGVsbHMgPSBuZXcgU2hlbGwgW3NoZWxscy5sZW5ndGggKyA0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkgKHNoZWxscywgMCwgbmV3U2hlbGxzLCAwLCBzaGVsbHMubGVuZ3RoKTsKLQkJCXNoZWxscyA9IG5ld1NoZWxsczsKLQkJfQotCQotCQlpbnQgb3JpZW50YXRpb24gPSAwOwotCQlpZiAobGVmdFRvUmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotCQlpZiAocmlnaHRUb0xlZnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotCQlpbnQgcmFkaW9CZWhhdmlvciA9IDA7Ci0JCWlmIChub1JhZGlvR3JvdXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHJhZGlvQmVoYXZpb3IgfD0gU1dULk5PX1JBRElPX0dST1VQOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBzaGVsbCBhbmQgbWVudShzKSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoU1dULlNIRUxMX1RSSU0gfCBvcmllbnRhdGlvbik7Ci0JCXNoZWxscyBbc2hlbGxDb3VudF0gPSBzaGVsbDsKLQkJaWYgKGJhckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCS8qIENyZWF0ZSBtZW51IGJhci4gKi8KLQkJCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQkJaG9va0xpc3RlbmVycyhtZW51QmFyKTsKLQotCQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIGNhc2NhZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGluIG1lbnUgYmFyLiAqLwotCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJCQlNZW51IGRyb3BEb3duTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQkJaXRlbS5zZXRNZW51KGRyb3BEb3duTWVudSk7Ci0JCQkJaG9va0xpc3RlbmVycyhkcm9wRG93bk1lbnUpOwotCQotCQkJCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCQkJCWNyZWF0ZU1lbnVJdGVtcyhkcm9wRG93bk1lbnUsIHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCksIHN1YlN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocG9wVXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8qIENyZWF0ZSBwb3AtdXAgbWVudS4gKi8KLQkJCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVAgfCByYWRpb0JlaGF2aW9yKTsKLQkJCXNoZWxsLnNldE1lbnUocG9wVXBNZW51KTsKLQkJCWhvb2tMaXN0ZW5lcnMocG9wVXBNZW51KTsKLQotCQkJLyogQ3JlYXRlIHZhcmlvdXMgbWVudSBpdGVtcywgZGVwZW5kaW5nIG9uIHNlbGVjdGlvbnMuICovCi0JCQljcmVhdGVNZW51SXRlbXMocG9wVXBNZW51LCBzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpLCBzdWJTdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBzaXplLCB0aXRsZSBhbmQgb3BlbiB0aGUgc2hlbGwuICovCi0JCXNoZWxsLnNldFNpemUgKDMwMCwgMTAwKTsKLQkJc2hlbGwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikgKyBzaGVsbENvdW50KTsKLQkJc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQllLmdjLmRyYXdTdHJpbmcoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBvcHVwTWVudUhlcmUiKSwgMjAsIDIwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXNoZWxsQ291bnQrKzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEZvciBNZW51VGFiLCBpdCBjb25zaXN0cyBvZgotCQkgKiB0aGUgTWVudSBzdHlsZSBncm91cCwgdGhlIE1lbnVJdGVtIHN0eWxlIGdyb3VwIGFuZCB0aGUgJ290aGVyJyBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgaXRlbSBzdHlsZSBjb250cm9scyAqLwotCQltZW51SXRlbVN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1lbnVJdGVtU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1N0eWxlcyIpKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlICdvdGhlcicgY29udHJvbHMgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbWVudSBzdHlsZSBidXR0b25zICovCi0JCWJhckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJBUiIpOwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCXBvcFVwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcG9wVXBCdXR0b24uc2V0VGV4dCAoIlNXVC5QT1BfVVAiKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fUkFESU9fR1JPVVAiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0VG9SaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyaWdodFRvTGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0VG9MZWZ0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1lbnUgaXRlbSBzdHlsZSBidXR0b25zICovCi0JCWNhc2NhZGVCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0VGV4dCAoIlNXVC5DQVNDQURFIik7Ci0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCXB1c2hCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXB1c2hCdXR0b24uc2V0VGV4dCAoIlNXVC5QVVNIIik7Ci0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0ICgiU1dULlJBRElPIik7Ci0JCXNlcGFyYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2VwYXJhdG9yQnV0dG9uLnNldFRleHQgKCJTV1QuU0VQQVJBVE9SIik7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICdvdGhlcicgYnV0dG9ucyAqLwotCQlpbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlcyIpKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBY2NlbGVyYXRvcnMiKSk7Ci0JCW1uZW1vbmljc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1uZW1vbmljc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW5lbW9uaWNzIikpOwotCQlzdWJNZW51QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc3ViTWVudUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViTWVudSIpKTsKLQkJc3ViU3ViTWVudUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YlN1Yk1lbnVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1YlN1Yk1lbnUiKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICJjcmVhdGUiIGFuZCAiY2xvc2VBbGwiIGJ1dHRvbnMgKGFuZCBhICdmaWxsZXInIGxhYmVsIHRvIHBsYWNlIHRoZW0pICovCi0JCW5ldyBMYWJlbChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3JlYXRlX1NoZWxsIikpOwotCQljbG9zZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljbG9zZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbG9zZV9BbGxfU2hlbGxzIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3JlYXRlQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQljbG9zZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljbG9zZUFsbFNoZWxscyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1Yk1lbnVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJYmFyQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXBvcFVwQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcHVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlyYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCXZvaWQgY3JlYXRlTWVudUl0ZW1zKE1lbnUgbWVudSwgYm9vbGVhbiBjcmVhdGVTdWJNZW51LCBib29sZWFuIGNyZWF0ZVN1YlN1Yk1lbnUpIHsKLQkJTWVudUl0ZW0gaXRlbTsKLQkJaWYgKHB1c2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiUHVzaCIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICdQJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNoZWNrIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJ0MnKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkJCQotCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIjFSYWRpbyIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICcxJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQkJaXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCIyUmFkaW8iKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnMicpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCX0KLQotCQlpZiAoY3JlYXRlU3ViTWVudSAmJiBjYXNjYWRlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGZvciB0aGUgc3ViLW1lbnUuICovCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCQlNZW51IHN1Yk1lbnUgPSBuZXcgTWVudShtZW51LmdldFNoZWxsKCksIFNXVC5EUk9QX0RPV04pOwotCQkJaXRlbS5zZXRNZW51KHN1Yk1lbnUpOwotCQkJaG9va0xpc3RlbmVycyhzdWJNZW51KTsKLQkJCQotCQkJY3JlYXRlTWVudUl0ZW1zKHN1Yk1lbnUsIGNyZWF0ZVN1YlN1Yk1lbnUsIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0TWVudUl0ZW1UZXh0KFN0cmluZyBpdGVtKSB7Ci0JCWJvb2xlYW4gY2FzY2FkZSA9IGl0ZW0uZXF1YWxzKCJDYXNjYWRlIik7Ci0JCWJvb2xlYW4gbW5lbW9uaWMgPSBtbmVtb25pY3NCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gYWNjZWxlcmF0b3IgPSBhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWNoYXIgYWNjZWxlcmF0b3JLZXkgPSBpdGVtLmNoYXJBdCgwKTsKLQkJaWYgKG1uZW1vbmljICYmIGFjY2VsZXJhdG9yICYmICFjYXNjYWRlKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKSArICJcdEN0cmwrU2hpZnQrIiArIGFjY2VsZXJhdG9yS2V5OwotCQl9Ci0JCWlmIChhY2NlbGVyYXRvciAmJiAhY2FzY2FkZSkgewotCQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0pICsgIlx0Q3RybCtTaGlmdCsiICsgYWNjZWxlcmF0b3JLZXk7Ci0JCX0KLQkJaWYgKG1uZW1vbmljKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKTsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIk1lbnUiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Qcm9ncmVzc0JhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Y2UzOTM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFByb2dyZXNzQmFyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIxOwotCUdyb3VwIHByb2dyZXNzQmFyR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNtb290aEJ1dHRvbjsKLQlCdXR0b24gaW5kZXRlcm1pbmF0ZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlQcm9ncmVzc0JhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwcm9ncmVzcyBiYXIgKi8KLQkJcHJvZ3Jlc3NCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRUZXh0ICgiUHJvZ3Jlc3NCYXIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoaW5kZXRlcm1pbmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JTkRFVEVSTUlOQVRFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXByb2dyZXNzQmFyMSA9IG5ldyBQcm9ncmVzc0JhciAocHJvZ3Jlc3NCYXJHcm91cCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQgKCJTV1QuU01PT1RIIik7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmRldGVybWluYXRlQnV0dG9uLnNldFRleHQgKCJTV1QuSU5ERVRFUk1JTkFURSIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3Byb2dyZXNzQmFyMX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlBCIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJQcm9ncmVzc0JhciI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoaW5kZXRlcm1pbmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXNlbGVjdGlvblNwaW5uZXIuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJbWluaW11bVNwaW5uZXIuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJbWF4aW11bVNwaW5uZXIuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRFbmFibGVkICh0cnVlKTsKLQkJCW1pbmltdW1TcGlubmVyLnNldEVuYWJsZWQgKHRydWUpOwotCQkJbWF4aW11bVNwaW5uZXIuc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCX0KLQkJc21vb3RoQnV0dG9uLnNldFNlbGVjdGlvbiAoKHByb2dyZXNzQmFyMS5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCQlpbmRldGVybWluYXRlQnV0dG9uLnNldFNlbGVjdGlvbiAoKHByb2dyZXNzQmFyMS5nZXRTdHlsZSAoKSAmIFNXVC5JTkRFVEVSTUlOQVRFKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWF4aW11bSAoKSB7Ci0JCXJldHVybiBwcm9ncmVzc0JhcjEuZ2V0TWF4aW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWluaW11bSAoKSB7Ci0JCXJldHVybiBwcm9ncmVzc0JhcjEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gcHJvZ3Jlc3NCYXIxLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWF4aW11bSAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRNYXhpbXVtIChtYXhpbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTcGlubmVycyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1pbmltdW0gKCkgewotCQlwcm9ncmVzc0JhcjEuc2V0TWluaW11bSAobWluaW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQkJdXBkYXRlU3Bpbm5lcnMgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvblNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQkJdXBkYXRlU3Bpbm5lcnMgKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBTcGlubmVyIHdpZGdldHMgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlIHNldCAKLQkgKiBvbiB0aGUgIkV4YW1wbGUiIHdpZGdldC4KLQkgKi8KLQl2b2lkIHVwZGF0ZVNwaW5uZXJzICgpIHsKLQkJbWluaW11bVNwaW5uZXIuc2V0U2VsZWN0aW9uIChwcm9ncmVzc0JhcjEuZ2V0TWluaW11bSAoKSk7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0U2VsZWN0aW9uIChwcm9ncmVzc0JhcjEuZ2V0U2VsZWN0aW9uICgpKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0U2VsZWN0aW9uIChwcm9ncmVzc0JhcjEuZ2V0TWF4aW11bSAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUmFuZ2VUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1JhbmdlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4ZWYxNzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUmFuZ2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWFic3RyYWN0IGNsYXNzIFJhbmdlVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uOwotCWJvb2xlYW4gb3JpZW50YXRpb25CdXR0b25zID0gdHJ1ZTsKLQotCS8qIFNjYWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCVNwaW5uZXIgbWluaW11bVNwaW5uZXIsIHNlbGVjdGlvblNwaW5uZXIsIG1heGltdW1TcGlubmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVJhbmdlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDcmVhdGUgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWNyZWF0ZU1pbmltdW1Hcm91cCAoKTsKLQkJY3JlYXRlTWF4aW11bUdyb3VwICgpOwotCQljcmVhdGVTZWxlY3Rpb25Hcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBtYXhpbXVtCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU1heGltdW1Hcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBtYXhpbXVtR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltYXhpbXVtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1heGltdW1Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF4aW11bSIpKTsKLQkJbWF4aW11bUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIFNwaW5uZXIgd2lkZ2V0ICovCi0JCW1heGltdW1TcGlubmVyID0gbmV3IFNwaW5uZXIgKG1heGltdW1Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1heGltdW1TcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCW1heGltdW1TcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdE1heGltdW0oKSk7Ci0JCW1heGltdW1TcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCW1heGltdW1TcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCW1heGltdW1TcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCW1heGltdW1TcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldE1heGltdW0gKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIG1pbmltdW0KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlTWluaW11bUdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIG1pbmltdW1Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1pbmltdW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbWluaW11bUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaW5pbXVtIikpOwotCQltaW5pbXVtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIGEgU3Bpbm5lciB3aWRnZXQgKi8KLQkJbWluaW11bVNwaW5uZXIgPSBuZXcgU3Bpbm5lciAobWluaW11bUdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWluaW11bVNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJbWluaW11bVNwaW5uZXIuc2V0U2VsZWN0aW9uKGdldERlZmF1bHRNaW5pbXVtKCkpOwotCQltaW5pbXVtU3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQltaW5pbXVtU3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQltaW5pbXVtU3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCW1pbmltdW1TcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRNaW5pbXVtICgpOwotCQkJfQotCQl9KTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBzZWxlY3Rpb24KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlU2VsZWN0aW9uR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgc2VsZWN0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzZWxlY3Rpb25Hcm91cC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZWxlY3Rpb24iKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXNlbGVjdGlvblNwaW5uZXIgPSBuZXcgU3Bpbm5lciAoc2VsZWN0aW9uR3JvdXAsIFNXVC5CT1JERVIpOwotCQlzZWxlY3Rpb25TcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0U2VsZWN0aW9uKCkpOwotCQlzZWxlY3Rpb25TcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXNlbGVjdGlvblNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFNlbGVjdGlvbiAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlpZiAob3JpZW50YXRpb25CdXR0b25zKSB7Ci0JCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCX0KLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRXaWRnZXRNaW5pbXVtICgpOwotCQkJc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkJCXNldFdpZGdldFNlbGVjdGlvbiAoKTsKLQkJfQotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCkgewotCQkJaWYgKG9yaWVudGF0aW9uQnV0dG9ucykgewotCQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuVkVSVElDQUwpICE9IDApOwotCQkJfQotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdE1heGltdW0gKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdE1pbmltdW0gKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IGludCBnZXREZWZhdWx0U2VsZWN0aW9uICgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IHZvaWQgc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hGb3JtVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWU2YjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFNhc2hGb3JtVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIHNhc2hGb3JtR3JvdXA7Ci0JU2FzaEZvcm0gZm9ybTsKLQlMaXN0IGxpc3QxLCBsaXN0MjsKLQlUZXh0IHRleHQ7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc21vb3RoQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTAgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKX07IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICAKLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMSA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzAiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpfTsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2FzaEZvcm1UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2FzaGZvcm0gd2lkZ2V0ICovCi0JCXNhc2hGb3JtR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzYXNoRm9ybUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzYXNoRm9ybUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXNhc2hGb3JtR3JvdXAuc2V0VGV4dCAoIlNhc2hGb3JtIik7Ci0JfQotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoc21vb3RoQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNNT09USDsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWZvcm0gPSBuZXcgU2FzaEZvcm0gKHNhc2hGb3JtR3JvdXAsIHN0eWxlKTsKLQkJbGlzdDEgPSBuZXcgTGlzdCAoZm9ybSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QxLnNldEl0ZW1zIChMaXN0RGF0YTApOwotCQlsaXN0MiA9IG5ldyBMaXN0IChmb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJbGlzdDIuc2V0SXRlbXMgKExpc3REYXRhMSk7Ci0JCXRleHQgPSBuZXcgVGV4dCAoZm9ybSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpX2xpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7MSwgMSwgMX0pOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQgKCJTV1QuU01PT1RIIik7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtmb3JtfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaEZvcm0iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGZvcm0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTUyMDQyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTYXNoVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNhc2ggaFNhc2gsIHZTYXNoOwotCUNvbXBvc2l0ZSBzYXNoQ29tcDsKLQlHcm91cCBzYXNoR3JvdXA7Ci0JTGlzdCBsaXN0MSwgbGlzdDIsIGxpc3QzOwotCVRleHQgdGV4dDsKLQlCdXR0b24gc21vb3RoQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTAgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF84Iil9OwotCQkJCQkJCQkgIAotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qIENvbnN0YW50cyAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU0FTSF9XSURUSCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBTQVNIX0xJTUlUID0gMjA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2FzaFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNhc2ggd2lkZ2V0cyAqLwotCQlzYXNoR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlzYXNoR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNhc2hHcm91cC5zZXRUZXh0ICgiU2FzaCIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlIHBhZ2UuICBUaGlzIGV4YW1wbGUgZG9lcyBub3QgdXNlIGxheW91dHMuCi0JCSAqLwotCQlzYXNoQ29tcCA9IG5ldyBDb21wb3NpdGUoc2FzaEdyb3VwLCBTV1QuQk9SREVSKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBsaXN0IGFuZCB0ZXh0IHdpZGdldHMgKi8KLQkJbGlzdDEgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGEwKTsKLQkJbGlzdDIgPSBuZXcgTGlzdCAoc2FzaENvbXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Mi5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQkJdGV4dCA9IG5ldyBUZXh0IChzYXNoQ29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpX2xpbmUiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgc2FzaGVzICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc21vb3RoQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQl2U2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULlZFUlRJQ0FMIHwgc3R5bGUpOwotCQloU2FzaCA9IG5ldyBTYXNoIChzYXNoQ29tcCwgU1dULkhPUklaT05UQUwgfCBzdHlsZSk7Ci0JCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQloU2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZXZlbnQueSA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueSwgU0FTSF9MSU1JVCksIHJlY3QuaGVpZ2h0IC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQloU2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdlNhc2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gdlNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWV2ZW50LnggPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LngsIFNBU0hfTElNSVQpLCByZWN0LndpZHRoIC0gU0FTSF9MSU1JVCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQl2U2FzaC5zZXRCb3VuZHMgKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlsYXlvdXQgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2FzaENvbXAuYWRkQ29udHJvbExpc3RlbmVyIChuZXcgQ29udHJvbEFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQgKENvbnRyb2xFdmVudCBldmVudCkgewotCQkJCXJlc2l6ZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCQotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsJCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNtb290aEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNtb290aEJ1dHRvbi5zZXRUZXh0KCJTV1QuU01PT1RIIik7Ci0JfQotCQotCXZvaWQgZGlzcG9zZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJc2FzaENvbXAuZGlzcG9zZSgpOwotCQlzYXNoQ29tcCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7aFNhc2gsIHZTYXNofTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNhc2giOwotCX0KLQkKLQkvKioKLQkgKiBMYXlvdXQgdGhlIGxpc3QgYW5kIHRleHQgd2lkZ2V0cyBhY2NvcmRpbmcgdG8gdGhlIG5ldwotCSAqIHBvc2l0aW9ucyBvZiB0aGUgc2FzaGVzLi5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQl2b2lkIGxheW91dCAoKSB7Ci0JCQotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHNhc2hDb21wLmdldENsaWVudEFyZWEgKCk7Ci0JCVJlY3RhbmdsZSBoU2FzaEJvdW5kcyA9IGhTYXNoLmdldEJvdW5kcyAoKTsKLQkJUmVjdGFuZ2xlIHZTYXNoQm91bmRzID0gdlNhc2guZ2V0Qm91bmRzICgpOwotCQkKLQkJbGlzdDEuc2V0Qm91bmRzICgwLCAwLCB2U2FzaEJvdW5kcy54LCBoU2FzaEJvdW5kcy55KTsKLQkJbGlzdDIuc2V0Qm91bmRzICh2U2FzaEJvdW5kcy54ICsgdlNhc2hCb3VuZHMud2lkdGgsIDAsIGNsaWVudEFyZWEud2lkdGggLSAodlNhc2hCb3VuZHMueCArIHZTYXNoQm91bmRzLndpZHRoKSwgaFNhc2hCb3VuZHMueSk7Ci0JCXRleHQuc2V0Qm91bmRzICgwLCBoU2FzaEJvdW5kcy55ICsgaFNhc2hCb3VuZHMuaGVpZ2h0LCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCAtIChoU2FzaEJvdW5kcy55ICsgaFNhc2hCb3VuZHMuaGVpZ2h0KSk7Ci0JCi0JCS8qKgotCQkqIElmIHRoZSBob3Jpem9udGFsIHNhc2ggaGFzIGJlZW4gbW92ZWQgdGhlbiB0aGUgdmVydGljYWwKLQkJKiBzYXNoIGlzIGVpdGhlciB0b28gbG9uZyBvciB0b28gc2hvcnQgYW5kIGl0cyBzaXplIG11c3QKLQkJKiBiZSBhZGp1c3RlZC4KLQkJKi8KLQkJdlNhc2hCb3VuZHMuaGVpZ2h0ID0gaFNhc2hCb3VuZHMueTsKLQkJdlNhc2guc2V0Qm91bmRzICh2U2FzaEJvdW5kcyk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFNpemUgKCkgewotCQlzYXNoR3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgoaFNhc2guZ2V0U3R5bGUgKCkgJiBTV1QuU01PT1RIKSAhPSAwKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIHRoZSBzaGVsbCByZXNpemVkIGV2ZW50LgotCSAqLwotCXZvaWQgcmVzaXplZCAoKSB7Ci0JCi0JCS8qIEdldCB0aGUgY2xpZW50IGFyZWEgZm9yIHRoZSBzaGVsbCAqLwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHNhc2hDb21wLmdldENsaWVudEFyZWEgKCk7Ci0JCQotCQkvKgotCQkqIE1ha2UgbGlzdCAxIGhhbGYgdGhlIHdpZHRoIGFuZCBoYWxmIHRoZSBoZWlnaHQgb2YgdGhlIHRhYiBsZWF2aW5nIHJvb20gZm9yIHRoZSBzYXNoLgotCQkqIFBsYWNlIGxpc3QgMSBpbiB0aGUgdG9wIGxlZnQgcXVhZHJhbnQgb2YgdGhlIHRhYi4KLQkJKi8KLQkJUmVjdGFuZ2xlIGxpc3QxQm91bmRzID0gbmV3IFJlY3RhbmdsZSAoMCwgMCwgKGNsaWVudEFyZWEud2lkdGggLSBTQVNIX1dJRFRIKSAvIDIsIChjbGllbnRBcmVhLmhlaWdodCAtIFNBU0hfV0lEVEgpIC8gMik7Ci0JCWxpc3QxLnNldEJvdW5kcyAobGlzdDFCb3VuZHMpOwotCQotCQkvKgotCQkqIE1ha2UgbGlzdCAyIGhhbGYgdGhlIHdpZHRoIGFuZCBoYWxmIHRoZSBoZWlnaHQgb2YgdGhlIHRhYiBsZWF2aW5nIHJvb20gZm9yIHRoZSBzYXNoLgotCQkqIFBsYWNlIGxpc3QgMiBpbiB0aGUgdG9wIHJpZ2h0IHF1YWRyYW50IG9mIHRoZSB0YWIuCi0JCSovCi0JCWxpc3QyLnNldEJvdW5kcyAobGlzdDFCb3VuZHMud2lkdGggKyBTQVNIX1dJRFRILCAwLCBjbGllbnRBcmVhLndpZHRoIC0gKGxpc3QxQm91bmRzLndpZHRoICsgU0FTSF9XSURUSCksIGxpc3QxQm91bmRzLmhlaWdodCk7Ci0JCi0JCS8qCi0JCSogTWFrZSB0aGUgdGV4dCBhcmVhIHRoZSBmdWxsIHdpZHRoIGFuZCBoYWxmIHRoZSBoZWlnaHQgb2YgdGhlIHRhYiBsZWF2aW5nIHJvb20gZm9yIHRoZSBzYXNoLgotCQkqIFBsYWNlIHRoZSB0ZXh0IGFyZWEgaW4gdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSB0YWIuCi0JCSovCi0JCXRleHQuc2V0Qm91bmRzICgwLCBsaXN0MUJvdW5kcy5oZWlnaHQgKyBTQVNIX1dJRFRILCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCAtIChsaXN0MUJvdW5kcy5oZWlnaHQgKyBTQVNIX1dJRFRIKSk7Ci0JCi0JCS8qIFBvc2l0aW9uIHRoZSBzYXNoZXMgKi8KLQkJdlNhc2guc2V0Qm91bmRzIChsaXN0MUJvdW5kcy53aWR0aCwgMCwgU0FTSF9XSURUSCwgbGlzdDFCb3VuZHMuaGVpZ2h0KTsKLQkJaFNhc2guc2V0Qm91bmRzICgwLCBsaXN0MUJvdW5kcy5oZWlnaHQsIGNsaWVudEFyZWEud2lkdGgsIFNBU0hfV0lEVEgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NjYWxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TY2FsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmFiMTdhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NjYWxlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTY2FsZVRhYiBleHRlbmRzIFJhbmdlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNjYWxlIHNjYWxlMTsKLQlHcm91cCBzY2FsZUdyb3VwOwotCi0JLyogU3Bpbm5lciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTcGlubmVyIGluY3JlbWVudFNwaW5uZXIsIHBhZ2VJbmNyZW1lbnRTcGlubmVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTY2FsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNyZWF0ZUluY3JlbWVudEdyb3VwICgpOwotCQljcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2NhbGUgKi8KLQkJc2NhbGVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNjYWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNjYWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2NhbGVHcm91cC5zZXRUZXh0ICgiU2NhbGUiKTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXNjYWxlMSA9IG5ldyBTY2FsZSAoc2NhbGVHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBpbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5jcmVtZW50IikpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAoaW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0SW5jcmVtZW50KCkpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlpbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtzY2FsZTF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNjYWxlIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1heGltdW0gKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldE1heGltdW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1pbmltdW0gKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldE1pbmltdW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0U2VsZWN0aW9uICgpIHsKLQkJcmV0dXJuIHNjYWxlMS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldEluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldFBhZ2VJbmNyZW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldEluY3JlbWVudCAoKSB7Ci0JCXNjYWxlMS5zZXRJbmNyZW1lbnQgKGluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJc2NhbGUxLnNldE1heGltdW0gKG1heGltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXNjYWxlMS5zZXRNaW5pbXVtIChtaW5pbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBwYWdlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpIHsKLQkJc2NhbGUxLnNldFBhZ2VJbmNyZW1lbnQgKHBhZ2VJbmNyZW1lbnRTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlzY2FsZTEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWQ5YjVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Njcm9sbGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWFic3RyYWN0IGNsYXNzIFNjcm9sbGFibGVUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8JCi0JQnV0dG9uIHNpbmdsZUJ1dHRvbiwgbXVsdGlCdXR0b24sIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNjcm9sbGFibGVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNpbmdsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNpbmdsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNJTkdMRSIpOwotCQltdWx0aUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW11bHRpQnV0dG9uLnNldFRleHQgKCJTV1QuTVVMVEkiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IX1NDUk9MTCIpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmVydGljYWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlZfU0NST0xMIik7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJV2lkZ2V0IFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJaWYgKHdpZGdldHMubGVuZ3RoICE9IDApewotCQkJc2luZ2xlQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULlNJTkdMRSkgIT0gMCk7Ci0JCQltdWx0aUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULlZfU0NST0xMKSAhPSAwKTsKLQkJCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2hlbGxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NoZWxsVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzOTU5Y2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2hlbGxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFNoZWxsVGFiIGV4dGVuZHMgVGFiIHsJCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cHMsIGFuZCAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIG5vUGFyZW50QnV0dG9uLCBwYXJlbnRCdXR0b247Ci0JQnV0dG9uIG5vVHJpbUJ1dHRvbiwgY2xvc2VCdXR0b24sIHRpdGxlQnV0dG9uLCBtaW5CdXR0b24sIG1heEJ1dHRvbiwgYm9yZGVyQnV0dG9uLCByZXNpemVCdXR0b24sIG9uVG9wQnV0dG9uLCB0b29sQnV0dG9uOwotCUJ1dHRvbiBjcmVhdGVCdXR0b24sIGNsb3NlQWxsQnV0dG9uOwotCUJ1dHRvbiBtb2RlbGVzc0J1dHRvbiwgcHJpbWFyeU1vZGFsQnV0dG9uLCBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLCBzeXN0ZW1Nb2RhbEJ1dHRvbjsKLQlCdXR0b24gaW1hZ2VCdXR0b247Ci0JR3JvdXAgcGFyZW50U3R5bGVHcm91cCwgbW9kYWxTdHlsZUdyb3VwOwotCi0JLyogVmFyaWFibGVzIHVzZWQgdG8gdHJhY2sgdGhlIG9wZW4gc2hlbGxzICovCi0JaW50IHNoZWxsQ291bnQgPSAwOwotCVNoZWxsIFtdIHNoZWxscyA9IG5ldyBTaGVsbCBbNF07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNoZWxsVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbGwgdGhlIGV4YW1wbGUgc2hlbGxzLgotCSAqLwotCXZvaWQgY2xvc2VBbGxTaGVsbHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHNoZWxsQ291bnQ7IGkrKykgewotCQkJaWYgKHNoZWxsc1tpXSAhPSBudWxsICYgIXNoZWxscyBbaV0uaXNEaXNwb3NlZCAoKSkgewotCQkJCXNoZWxscyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXNoZWxsQ291bnQgPSAwOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIENyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKgotCQkgKiBSZW1lbWJlciB0aGUgZXhhbXBsZSBzaGVsbHMgc28gdGhleQotCQkgKiBjYW4gYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlpZiAoc2hlbGxDb3VudCA+PSBzaGVsbHMubGVuZ3RoKSB7Ci0JCQlTaGVsbCBbXSBuZXdTaGVsbHMgPSBuZXcgU2hlbGwgW3NoZWxscy5sZW5ndGggKyA0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkgKHNoZWxscywgMCwgbmV3U2hlbGxzLCAwLCBzaGVsbHMubGVuZ3RoKTsKLQkJCXNoZWxscyA9IG5ld1NoZWxsczsKLQkJfQotCQotCQkvKiBDb21wdXRlIHRoZSBzaGVsbCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBTV1QuTk9ORTsKLQkJaWYgKG5vVHJpbUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk5PX1RSSU07Ci0JCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkNMT1NFOwotCQlpZiAodGl0bGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5USVRMRTsKLQkJaWYgKG1pbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1JTjsKLQkJaWYgKG1heEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1BWDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKHJlc2l6ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlJFU0laRTsKLQkJaWYgKG9uVG9wQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuT05fVE9QOwotCQlpZiAodG9vbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlRPT0w7Ci0JCWlmIChtb2RlbGVzc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1PREVMRVNTOwotCQlpZiAocHJpbWFyeU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUFJJTUFSWV9NT0RBTDsKLQkJaWYgKGFwcGxpY2F0aW9uTW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQkJaWYgKHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU1lTVEVNX01PREFMOwotCQotCQkvKiBDcmVhdGUgdGhlIHNoZWxsIHdpdGggb3Igd2l0aG91dCBhIHBhcmVudCAqLwotCQlpZiAobm9QYXJlbnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlzaGVsbHMgW3NoZWxsQ291bnRdID0gbmV3IFNoZWxsIChzdHlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaGVsbHMgW3NoZWxsQ291bnRdID0gbmV3IFNoZWxsIChzaGVsbCwgc3R5bGUpOwotCQl9Ci0JCWZpbmFsIFNoZWxsIGN1cnJlbnRTaGVsbCA9IHNoZWxscyBbc2hlbGxDb3VudF07Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGN1cnJlbnRTaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0Qm91bmRzKDIwLCAyMCwgMTIwLCAzMCk7Ci0JCUJ1dHRvbiBjbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oY3VycmVudFNoZWxsLCBTV1QuUFVTSCk7Ci0JCWNsb3NlQnV0dG9uLnNldEJvdW5kcygxNjAsIDIwLCAxMjAsIDMwKTsKLQkJY2xvc2VCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xvc2UiKSk7Ci0JCWNsb3NlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJY3VycmVudFNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgc2l6ZSwgdGl0bGUsIGFuZCBpbWFnZSwgYW5kIG9wZW4gdGhlIHNoZWxsICovCi0JCWN1cnJlbnRTaGVsbC5zZXRTaXplICgzMDAsIDEwMCk7Ci0JCWN1cnJlbnRTaGVsbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSArIHNoZWxsQ291bnQpOwotCQlpZiAoaW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGN1cnJlbnRTaGVsbC5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaWYgKGJhY2tncm91bmRJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgY3VycmVudFNoZWxsLnNldEJhY2tncm91bmRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lCYWNrZ3JvdW5kXSk7Ci0JCWhvb2tMaXN0ZW5lcnMgKGN1cnJlbnRTaGVsbCk7Ci0JCWN1cnJlbnRTaGVsbC5vcGVuICgpOwotCQlzaGVsbENvdW50Kys7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sR3JvdXAgKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlICJDb250cm9sIiBncm91cC4gIFRoaXMgaXMgdGhlIGdyb3VwIG9uIHRoZQotCQkgKiByaWdodCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuICBJdCBjb25zaXN0cyBvZiB0aGUKLQkJICogc3R5bGUgZ3JvdXAsIHRoZSAnb3RoZXInIGdyb3VwIGFuZCB0aGUgc2l6ZSBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGRlY29yYXRpb24gc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMykpOwotCQlzdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWNvcmF0aW9uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBtb2RhbCBzdHlsZSBjb250cm9scyAqLwotCQltb2RhbFN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vZGFsX1N0eWxlcyIpKTsJCQotCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgJ290aGVyJyBjb250cm9scyAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwYXJlbnQgc3R5bGUgY29udHJvbHMgKi8KLQkJcGFyZW50U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlwYXJlbnRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJlbnQiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgcGFyZW50IHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9QYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlub1BhcmVudEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fUGFyZW50IikpOwotCQlwYXJlbnRCdXR0b24gPSBuZXcgQnV0dG9uIChwYXJlbnRTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwYXJlbnRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmVudCIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBkZWNvcmF0aW9uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbm9UcmltQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9UcmltQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fVFJJTSIpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNsb3NlQnV0dG9uLnNldFRleHQgKCJTV1QuQ0xPU0UiKTsKLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRJVExFIik7Ci0JCW1pbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1pbkJ1dHRvbi5zZXRUZXh0ICgiU1dULk1JTiIpOwotCQltYXhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXhCdXR0b24uc2V0VGV4dCAoIlNXVC5NQVgiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JCXJlc2l6ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFU0laRSIpOwotCQlvblRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW9uVG9wQnV0dG9uLnNldFRleHQgKCJTV1QuT05fVE9QIik7Ci0JCXRvb2xCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0b29sQnV0dG9uLnNldFRleHQgKCJTV1QuVE9PTCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJbW9kZWxlc3NCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFRleHQgKCJTV1QuTU9ERUxFU1MiKTsKLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAnb3RoZXInIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRJbWFnZSIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSAiY3JlYXRlIiBhbmQgImNsb3NlQWxsIiBidXR0b25zICovCi0JCWNyZWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljcmVhdGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNyZWF0ZV9TaGVsbCIpKTsKLQkJY2xvc2VBbGxCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlX0FsbF9TaGVsbHMiKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJY2xvc2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2xvc2VBbGxTaGVsbHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZGVjb3JhdGlvbkJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJbm9UcmltQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCW1pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJbWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlib3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCXJlc2l6ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlub1BhcmVudEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQltb2RlbGVzc0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlIGEgZGVjb3JhdGlvbiBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0aW9uQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogTWFrZSBzdXJlIGlmIHRoZSBtb2RhbCBzdHlsZSBpcyBTV1QuQVBQTElDQVRJT05fTU9EQUwgb3IgCi0JCSAqIFNXVC5TWVNURU1fTU9EQUwgdGhlIHN0eWxlIFNXVC5DTE9TRSBpcyBhbHNvIHNlbGVjdGVkLgotCQkgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBjYW4gY2xvc2UgdGhlIHNoZWxsLgotCQkgKi8KLQkJQnV0dG9uIHdpZGdldCA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJaWYgKHdpZGdldCA9PSBhcHBsaWNhdGlvbk1vZGFsQnV0dG9uIHx8IHdpZGdldCA9PSBzeXN0ZW1Nb2RhbEJ1dHRvbikgewotCQkJaWYgKHdpZGdldC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCQkJbm9UcmltQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJfSAKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lkZ2V0ID09IGNsb3NlQnV0dG9uKSB7Ci0JCQlpZiAoYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCBzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCQl9Ci0JCX0JCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSBpZiB0aGUgTm8gVHJpbSBidXR0b24gaXMgc2VsZWN0ZWQgdGhlbgotCQkgKiBhbGwgb3RoZXIgZGVjb3JhdGlvbiBidXR0b25zIGFyZSBkZXNlbGVjdGVkLgotCQkgKi8KLQkJaWYgKHdpZGdldC5nZXRTZWxlY3Rpb24oKSAmJiB3aWRnZXQgIT0gbm9UcmltQnV0dG9uKSB7Ci0JCQlub1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdpZGdldC5nZXRTZWxlY3Rpb24oKSAmJiB3aWRnZXQgPT0gbm9UcmltQnV0dG9uKSB7Ci0JCQlpZiAoYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCBzeXN0ZW1Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljbG9zZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXRpdGxlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJbWluQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJbWF4QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJcmVzaXplQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNoZWxsIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TbGlkZXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjEzMzBjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgU2xpZGVyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2xpZGVyIHNsaWRlcjE7Ci0JR3JvdXAgc2xpZGVyR3JvdXA7Ci0KLQkvKiBTcGlubmVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCVNwaW5uZXIgaW5jcmVtZW50U3Bpbm5lciwgcGFnZUluY3JlbWVudFNwaW5uZXIsIHRodW1iU3Bpbm5lcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2xpZGVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlVGh1bWJHcm91cCAoKTsKLQkJY3JlYXRlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzbGlkZXIgKi8KLQkJc2xpZGVyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzbGlkZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2xpZGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2xpZGVyR3JvdXAuc2V0VGV4dCAoIlNsaWRlciIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc2xpZGVyMSA9IG5ldyBTbGlkZXIoc2xpZGVyR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgaW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY3JlbWVudCIpKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQlpbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKGluY3JlbWVudEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdEluY3JlbWVudCgpKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJaW5jcmVtZW50U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQotCQkJCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgcGFnZSBpbmNyZW1lbnQKLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIHBhZ2VJbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYWdlX0luY3JlbWVudCIpKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lciA9IG5ldyBTcGlubmVyIChwYWdlSW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRQYWdlSW5jcmVtZW50KCkpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSB0aHVtYgotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVUaHVtYkdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIHRodW1iR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQl0aHVtYkdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0aHVtYkdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHVtYiIpKTsKLQkJdGh1bWJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBTcGlubmVyIHdpZGdldCAqLwotCQl0aHVtYlNwaW5uZXIgPSBuZXcgU3Bpbm5lciAodGh1bWJHcm91cCwgU1dULkJPUkRFUik7Ci0JCXRodW1iU3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQl0aHVtYlNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0VGh1bWIoKSk7Ci0JCXRodW1iU3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50ICgxMDApOwotCQl0aHVtYlNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJdGh1bWJTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGh1bWJTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRUaHVtYiAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3NsaWRlcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNsaWRlciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0VGh1bWIgKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1heGltdW0gKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRNYXhpbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNaW5pbXVtICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRJbmNyZW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBwYWdlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRQYWdlSW5jcmVtZW50ICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0UGFnZUluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRodW1iIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFRodW1iICgpIHsKLQkJcmV0dXJuIHNsaWRlcjEuZ2V0VGh1bWIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc2xpZGVyMS5zZXRJbmNyZW1lbnQgKGluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJc2xpZGVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1pbmltdW0gKCkgewotCQlzbGlkZXIxLnNldE1pbmltdW0gKG1pbmltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzbGlkZXIxLnNldFBhZ2VJbmNyZW1lbnQgKHBhZ2VJbmNyZW1lbnRTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlzbGlkZXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0aHVtYiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRUaHVtYiAoKSB7Ci0JCXNsaWRlcjEuc2V0VGh1bWIgKHRodW1iU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMTQxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TcGlubmVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBTcGlubmVyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTcGlubmVyIHNwaW5uZXIxOwotCUdyb3VwIHNwaW5uZXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHJlYWRPbmx5QnV0dG9uLCB3cmFwQnV0dG9uOwotCQotCS8qIFNwaW5uZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU3Bpbm5lciBpbmNyZW1lbnRTcGlubmVyLCBwYWdlSW5jcmVtZW50U3Bpbm5lciwgZGlnaXRzU3Bpbm5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTcGlubmVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNyZWF0ZUluY3JlbWVudEdyb3VwICgpOwotCQljcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZURpZ2l0c0dyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNwaW5uZXIgKi8KLQkJc3Bpbm5lckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3Bpbm5lckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzcGlubmVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3Bpbm5lckdyb3VwLnNldFRleHQgKCJTcGlubmVyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXNwaW5uZXIxID0gbmV3IFNwaW5uZXIgKHNwaW5uZXJHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBpbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5jcmVtZW50IikpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAoaW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0SW5jcmVtZW50KCkpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlpbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGRpZ2l0cwotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVEaWdpdHNHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBkaWdpdHNHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRpZ2l0c0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkaWdpdHNHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGlnaXRzIikpOwotCQlkaWdpdHNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWRpZ2l0c1NwaW5uZXIgPSBuZXcgU3Bpbm5lciAoZGlnaXRzR3JvdXAsIFNXVC5CT1JERVIpOwotCQlkaWdpdHNTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0RGlnaXRzKCkpOwotCQlkaWdpdHNTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJZGlnaXRzU3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlkaWdpdHNTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0RGlnaXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCW9yaWVudGF0aW9uQnV0dG9ucyA9IGZhbHNlOwotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7c3Bpbm5lcjF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlNwaW5uZXIiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKHNwaW5uZXIxLmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICgoc3Bpbm5lcjEuZ2V0U3R5bGUgKCkgJiBTV1QuV1JBUCkgIT0gMCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJCXNldFdpZGdldERpZ2l0cyAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNYXhpbXVtICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldE1heGltdW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1pbmltdW0gKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0SW5jcmVtZW50ICgpIHsKLQkJcmV0dXJuIHNwaW5uZXIxLmdldEluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0UGFnZUluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGRpZ2l0cyBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHREaWdpdHMgKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0RGlnaXRzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldEluY3JlbWVudCAoKSB7Ci0JCXNwaW5uZXIxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzcGlubmVyMS5zZXRNYXhpbXVtIChtYXhpbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1pbmltdW0gKCkgewotCQlzcGlubmVyMS5zZXRNaW5pbXVtIChtaW5pbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBwYWdlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpIHsKLQkJc3Bpbm5lcjEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlnaXRzIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldERpZ2l0cyAoKSB7Ci0JCXNwaW5uZXIxLnNldERpZ2l0cyAoZGlnaXRzU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0U2VsZWN0aW9uICgpIHsKLQkJc3Bpbm5lcjEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1N0eWxlZFRleHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNzEwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TdHlsZWRUZXh0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIFN0eWxlZFRleHRUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlHcm91cCBzdHlsZWRUZXh0R3JvdXAsIHN0eWxlZFRleHRTdHlsZUdyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB3cmFwQnV0dG9uLCByZWFkT25seUJ1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQkKLQkvKiBCdXR0b25zIGZvciBhZGRpbmcgU3R5bGVSYW5nZXMgdG8gU3R5bGVkVGV4dCAqLwotCUJ1dHRvbiBib2xkQnV0dG9uLCBpdGFsaWNCdXR0b24sIHJlZEJ1dHRvbiwgeWVsbG93QnV0dG9uLCB1bmRlcmxpbmVCdXR0b24sIHN0cmlrZW91dEJ1dHRvbjsKLQlJbWFnZSBib2xkSW1hZ2UsIGl0YWxpY0ltYWdlLCByZWRJbWFnZSwgeWVsbG93SW1hZ2UsIHVuZGVybGluZUltYWdlLCBzdHJpa2VvdXRJbWFnZTsKLQkKLQkvKiBWYXJpYWJsZXMgZm9yIHNhdmluZyBzdGF0ZS4gKi8KLQlTdHJpbmcgdGV4dDsKLQlTdHlsZVJhbmdlW10gc3R5bGVSYW5nZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU3R5bGVkVGV4dFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBiaXRtYXAgaW1hZ2UuIAotCSAqLwotCUltYWdlIGNyZWF0ZUJpdG1hcEltYWdlIChEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBuYW1lKSB7Ci0JCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IENvbnRyb2xFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKG5hbWUgKyAiLmJtcCIpOwotCQlJbnB1dFN0cmVhbSBtYXNrU3RyZWFtID0gQ29udHJvbEV4YW1wbGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAobmFtZSArICJfbWFzay5ibXAiKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEgKHNvdXJjZVN0cmVhbSk7Ci0JCUltYWdlRGF0YSBtYXNrID0gbmV3IEltYWdlRGF0YSAobWFza1N0cmVhbSk7Ci0JCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJdHJ5IHsKLQkJCXNvdXJjZVN0cmVhbS5jbG9zZSAoKTsKLQkJCW1hc2tTdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQkKLQkJLyogQWRkIGEgZ3JvdXAgZm9yIG1vZGlmeWluZyB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgKi8KLQkJY3JlYXRlU3R5bGVkVGV4dFN0eWxlR3JvdXAgKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQgKi8KLQkJc3R5bGVkVGV4dEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzdHlsZWRUZXh0R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldFRleHQgKCJTdHlsZWRUZXh0Iik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNJTkdMRTsKLQkJaWYgKG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc3R5bGVkVGV4dEdyb3VwLCBzdHlsZSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCQlzdHlsZWRUZXh0LmFwcGVuZCAoIlxuIik7Ci0JCXN0eWxlZFRleHQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lX1R3b19UaHJlZSIpKTsKLQkJCi0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJCXRleHQgPSBudWxsOwotCQl9Ci0JCWlmIChzdHlsZVJhbmdlcyAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2VzKHN0eWxlUmFuZ2VzKTsKLQkJCXN0eWxlUmFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5GVUxMX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGVkVGV4dCBTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZWRUZXh0U3R5bGVHcm91cCAoKSB7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHlsZWRUZXh0X1N0eWxlcyIpKTsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCg2LCBmYWxzZSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R5bGVkVGV4dFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQotCQkvKiBHZXQgaW1hZ2VzICovCi0JCWJvbGRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiYm9sZCIpOwotCQlpdGFsaWNJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiaXRhbGljIik7Ci0JCXJlZEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJyZWQiKTsKLQkJeWVsbG93SW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInllbGxvdyIpOwotCQl1bmRlcmxpbmVJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAidW5kZXJsaW5lIik7Ci0JCXN0cmlrZW91dEltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJzdHJpa2VvdXQiKTsKLQkJCi0JCS8qIENyZWF0ZSBjb250cm9scyB0byBtb2RpZnkgdGhlIFN0eWxlZFRleHQgKi8KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9TdHlsZV9JbnN0cnVjdGlvbnMiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDYsIDEpKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQm9sZCIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJYm9sZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJvbGRCdXR0b24uc2V0SW1hZ2UgKGJvbGRJbWFnZSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlVuZGVybGluZSIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJdW5kZXJsaW5lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5QVVNIKTsKLQkJdW5kZXJsaW5lQnV0dG9uLnNldEltYWdlICh1bmRlcmxpbmVJbWFnZSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfU3R5bGUiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXJlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJlZEJ1dHRvbi5zZXRJbWFnZSAocmVkSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGFsaWMiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWl0YWxpY0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWl0YWxpY0J1dHRvbi5zZXRJbWFnZSAoaXRhbGljSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTdHJpa2VvdXQiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZSAoc3RyaWtlb3V0SW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJCYWNrZ3JvdW5kX1N0eWxlIikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQl5ZWxsb3dCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQl5ZWxsb3dCdXR0b24uc2V0SW1hZ2UgKHllbGxvd0ltYWdlKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc3R5bGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCQkJZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJCQkJU3R5bGVSYW5nZSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoaSwgMSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGUud2lkZ2V0ID09IGJvbGRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuQk9MRDsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBpdGFsaWNCdXR0b24pIHsKLQkJCQkJCXN0eWxlLmZvbnRTdHlsZSBePSBTV1QuSVRBTElDOwkJCQkJCQotCQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHVuZGVybGluZUJ1dHRvbikgewotCQkJCQkJc3R5bGUudW5kZXJsaW5lID0gIXN0eWxlLnVuZGVybGluZTsKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBzdHJpa2VvdXRCdXR0b24pIHsKLQkJCQkJCXN0eWxlLnN0cmlrZW91dCA9ICFzdHlsZS5zdHJpa2VvdXQ7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsJCQkKLQkJCX0KLQkJfTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgY29sb3JMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2VsID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCQkJCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCQkJCUNvbG9yIGZnID0gbnVsbCwgYmcgPSBudWxsOwotCQkJCWlmIChlLndpZGdldCA9PSByZWRCdXR0b24pIHsKLQkJCQkJZmcgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQkJCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHllbGxvd0J1dHRvbikgewotCQkJCQliZyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQkJCX0KLQkJCQlTdHlsZVJhbmdlIHN0eWxlOwotCQkJCWZvciAoaW50IGkgPSBzZWwueDsgaTxzZWwueCtzZWwueTsgaSsrKSB7Ci0JCQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQkJCQlzdHlsZS5mb3JlZ3JvdW5kID0gc3R5bGUuZm9yZWdyb3VuZCAhPSBudWxsID8gbnVsbCA6IGZnOwotCQkJCQkJc3R5bGUuYmFja2dyb3VuZCA9IHN0eWxlLmJhY2tncm91bmQgIT0gbnVsbCA/IG51bGwgOiBiZzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKGksIDEsIGZnLCBiZywgU1dULk5PUk1BTCk7Ci0JCQkJCX0KLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLQkJCX0KLQkJfTsKLQkJYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJcmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbG9yTGlzdGVuZXIpOwotCQl5ZWxsb3dCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY29sb3JMaXN0ZW5lcik7Ci0JCXllbGxvd0J1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZCAoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlib2xkSW1hZ2UuZGlzcG9zZSgpOwotCQkJCWl0YWxpY0ltYWdlLmRpc3Bvc2UoKTsKLQkJCQlyZWRJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJeWVsbG93SW1hZ2UuZGlzcG9zZSgpOwotCQkJCXVuZGVybGluZUltYWdlLmRpc3Bvc2UoKTsKLQkJCQlzdHJpa2VvdXRJbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgc3R5bGVkVGV4dCBpZiBhcHBsaWNhYmxlICovCi0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlUmFuZ2VzID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCQkJdGV4dCA9IHN0eWxlZFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cygpOwkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtzdHlsZWRUZXh0fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDYXJldE9mZnNldCIsICJEb3VibGVDbGlja0VuYWJsZWQiLCAiRWRpdGFibGUiLCAiSG9yaXpvbnRhbEluZGV4IiwgIkhvcml6b250YWxQaXhlbCIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGFicyIsICJUZXh0IiwgIlRleHRMaW1pdCIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCIsICJUb3BQaXhlbCIsICJXb3JkV3JhcCJ9OwotCX0KLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlN0eWxlZFRleHQiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0U2VsZWN0aW9uICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWE4YzA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLS8qKgotICogPGNvZGU+VGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRlc2NyaWJlcyBhIGNvbnRyb2wuCi0gKgotICogQSBUYWIgaXRzZWxmIGlzIG5vdCBhIGNvbnRyb2wgYnV0IGluc3RlYWQgcHJvdmlkZXMgYQotICogaGllcmFyY2h5IHdpdGggd2hpY2ggdG8gc2hhcmUgY29kZSB0aGF0IGlzIGNvbW1vbiB0bwotICogZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICoKLSAqIEEgdHlwaWNhbCBwYWdlIGluIGEgVGFiIGNvbnRhaW5zIGEgdHdvIGNvbHVtbiBjb21wb3NpdGUuCi0gKiBUaGUgbGVmdCBjb2x1bW4gY29udGFpbnMgdGhlICJFeGFtcGxlIiBncm91cC4gIFRoZSByaWdodAotICogY29sdW1uIGNvbnRhaW5zICJDb250cm9sIiBncm91cC4gIFRoZSAiQ29udHJvbCIgZ3JvdXAKLSAqIGNvbnRhaW5zIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aAotICogdGhlIGV4YW1wbGUgY29udHJvbC4gIFRoZSAiQ29udHJvbCIgZ3JvdXAgdHlwaWNhbGx5Ci0gKiBjb250YWlucyBhICJTdHlsZSIsICJPdGhlciIgYW5kICJTaXplIiBncm91cC4gIFN1YmNsYXNzZXMKLSAqIGNhbiBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cyB0byBhdWdtZW50IGEgZ3JvdXAgb3Igc3RvcAotICogYSBncm91cCBmcm9tIGJlaW5nIGNyZWF0ZWQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRhYiB7Ci0JU2hlbGwgc2hlbGw7Ci0JRGlzcGxheSBkaXNwbGF5OwotCQotCS8qIENvbW1vbiBjb250cm9sIGJ1dHRvbnMgKi8KLQlCdXR0b24gYm9yZGVyQnV0dG9uLCBlbmFibGVkQnV0dG9uLCB2aXNpYmxlQnV0dG9uLCBiYWNrZ3JvdW5kSW1hZ2VCdXR0b24sIHBvcHVwTWVudUJ1dHRvbjsKLQlCdXR0b24gcHJlZmVycmVkQnV0dG9uLCB0b29TbWFsbEJ1dHRvbiwgc21hbGxCdXR0b24sIGxhcmdlQnV0dG9uLCBmaWxsSEJ1dHRvbiwgZmlsbFZCdXR0b247Ci0KLQkvKiBDb21tb24gZ3JvdXBzIGFuZCBjb21wb3NpdGVzICovCi0JQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JR3JvdXAgZXhhbXBsZUdyb3VwLCBjb250cm9sR3JvdXAsIGxpc3RlbmVyc0dyb3VwLCBvdGhlckdyb3VwLCBzaXplR3JvdXAsIHN0eWxlR3JvdXAsIGNvbG9yR3JvdXAsIGJhY2tncm91bmRNb2RlR3JvdXA7Ci0KLQkvKiBDb250cm9sbGluZyBpbnN0YW5jZSAqLwotCWZpbmFsIENvbnRyb2xFeGFtcGxlIGluc3RhbmNlOwotCi0JLyogU2l6aW5nIGNvbnN0YW50cyBmb3IgdGhlICJTaXplIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgVE9PX1NNQUxMX1NJWkUJPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFNNQUxMX1NJWkUJCT0gNTA7Ci0Jc3RhdGljIGZpbmFsIGludCBMQVJHRV9TSVpFCQk9IDEwMDsKLQkKLQkvKiBSaWdodC10by1sZWZ0IHN1cHBvcnQgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBSVExfU1VQUE9SVF9FTkFCTEUgPSBmYWxzZTsKLQlHcm91cCBvcmllbnRhdGlvbkdyb3VwOwotCUJ1dHRvbiBydGxCdXR0b24sIGx0ckJ1dHRvbiwgZGVmYXVsdE9yaWV0YXRpb25CdXR0b247Ci0KLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGZvciB0aGUgIkNvbG9ycyAmIEZvbnRzIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfU0laRSA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgRk9SRUdST1VORF9DT0xPUiA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBCQUNLR1JPVU5EX0NPTE9SID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IEZPTlQgPSAyOwotCVRhYmxlIGNvbG9yQW5kRm9udFRhYmxlOwotCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nOwotCUZvbnREaWFsb2cgZm9udERpYWxvZzsKLQlDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlGb250IGZvbnQ7Ci0JCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBmb3IgdGhlICJCYWNrZ3JvdW5kIE1vZGUiIGdyb3VwICovCi0JQ29tYm8gYmFja2dyb3VuZE1vZGVDb21ibzsKLQlCdXR0b24gYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbiwgYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbjsKLQotCS8qIEV2ZW50IGxvZ2dpbmcgdmFyaWFibGVzIGFuZCBjb250cm9scyAqLwotCVRleHQgZXZlbnRDb25zb2xlOwotCWJvb2xlYW4gbG9nZ2luZyA9IGZhbHNlOwotCWJvb2xlYW4gW10gZXZlbnRzRmlsdGVyOwotCQotCS8qIFNldC9HZXQgQVBJIGNvbnRyb2xzICovCi0JQ29tYm8gbmFtZUNvbWJvOwotCUxhYmVsIHJldHVyblR5cGVMYWJlbDsKLQlCdXR0b24gZ2V0QnV0dG9uLCBzZXRCdXR0b247Ci0JVGV4dCBzZXRUZXh0LCBnZXRUZXh0OwotCi0Jc3RhdGljIGZpbmFsIE9iamVjdCBbXVtdIEVWRU5UX05BTUVTID0gewotCQl7IkFjdGl2YXRlIiwgbmV3IEludGVnZXIoU1dULkFjdGl2YXRlKX0sIAotCQl7IkFybSIsIG5ldyBJbnRlZ2VyKFNXVC5Bcm0pfSwgCi0JCXsiQ2xvc2UiLCBuZXcgSW50ZWdlcihTV1QuQ2xvc2UpfSwKLQkJeyJDb2xsYXBzZSIsIG5ldyBJbnRlZ2VyKFNXVC5Db2xsYXBzZSl9LAotCQl7IkRlYWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuRGVhY3RpdmF0ZSl9LAotCQl7IkRlZmF1bHRTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuRGVmYXVsdFNlbGVjdGlvbil9LAotCQl7IkRlaWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWljb25pZnkpfSwgCi0JCXsiRGlzcG9zZSIsIG5ldyBJbnRlZ2VyKFNXVC5EaXNwb3NlKX0sCi0JCXsiRHJhZ0RldGVjdCIsIG5ldyBJbnRlZ2VyKFNXVC5EcmFnRGV0ZWN0KX0sIAotCQl7IkVyYXNlSXRlbSIsIG5ldyBJbnRlZ2VyKFNXVC5FcmFzZUl0ZW0pfSwKLQkJeyJFeHBhbmQiLCBuZXcgSW50ZWdlcihTV1QuRXhwYW5kKX0sIAotCQl7IkZvY3VzSW4iLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNJbil9LCAKLQkJeyJGb2N1c091dCIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c091dCl9LAotCQl7IkhhcmRLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULkhhcmRLZXlEb3duKX0sIAotCQl7IkhhcmRLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5IYXJkS2V5VXApfSwKLQkJeyJIZWxwIiwgbmV3IEludGVnZXIoU1dULkhlbHApfSwgCi0JCXsiSGlkZSIsIG5ldyBJbnRlZ2VyKFNXVC5IaWRlKX0sCi0JCXsiSWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5JY29uaWZ5KX0sIAotCQl7IktleURvd24iLCBuZXcgSW50ZWdlcihTV1QuS2V5RG93bil9LAotCQl7IktleVVwIiwgbmV3IEludGVnZXIoU1dULktleVVwKX0sCi0JCXsiTWVhc3VyZUl0ZW0iLCBuZXcgSW50ZWdlcihTV1QuTWVhc3VyZUl0ZW0pfSwKLQkJeyJNZW51RGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULk1lbnVEZXRlY3QpfSwKLQkJeyJNb2RpZnkiLCBuZXcgSW50ZWdlcihTV1QuTW9kaWZ5KX0sIAotCQl7Ik1vdXNlRG91YmxlQ2xpY2siLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3VibGVDbGljayl9LAotCQl7Ik1vdXNlRG93biIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZURvd24pfSwgCi0JCXsiTW91c2VFbnRlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUVudGVyKX0sIAotCQl7Ik1vdXNlRXhpdCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUV4aXQpfSwgCi0JCXsiTW91c2VIb3ZlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUhvdmVyKX0sCi0JCXsiTW91c2VNb3ZlIiwgbmV3IEludGVnZXIoU1dULk1vdXNlTW92ZSl9LCAKLQkJeyJNb3VzZVVwIiwgbmV3IEludGVnZXIoU1dULk1vdXNlVXApfSwgCi0JCXsiTW91c2VXaGVlbCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZVdoZWVsKX0sCi0JCXsiTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3ZlKX0sIAotCQl7IlBhaW50IiwgbmV3IEludGVnZXIoU1dULlBhaW50KX0sIAotCQl7IlBhaW50SXRlbSIsIG5ldyBJbnRlZ2VyKFNXVC5QYWludEl0ZW0pfSwKLQkJeyJSZXNpemUiLCBuZXcgSW50ZWdlcihTV1QuUmVzaXplKX0sIAotCQl7IlNlbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKFNXVC5TZWxlY3Rpb24pfSwgCi0JCXsiU2V0RGF0YSIsIG5ldyBJbnRlZ2VyKFNXVC5TZXREYXRhKX0sCi0vLwkJeyJTZXR0aW5ncyIsIG5ldyBJbnRlZ2VyKFNXVC5TZXR0aW5ncyl9LCAgLy8gbm90ZTogdGhpcyBldmVudCBvbmx5IGdvZXMgdG8gRGlzcGxheQotCQl7IlNob3ciLCBuZXcgSW50ZWdlcihTV1QuU2hvdyl9LCAKLQkJeyJUcmF2ZXJzZSIsIG5ldyBJbnRlZ2VyKFNXVC5UcmF2ZXJzZSl9LCAKLQkJeyJWZXJpZnkiLCBuZXcgSW50ZWdlcihTV1QuVmVyaWZ5KX0sCi0JfTsKLQkKLQlib29sZWFuIHNhbXBsZVBvcHVwID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGUgIkNvbnRyb2wiIGdyb3VwCi0JICogaXMgdHlwaWNhbGx5IHRoZSByaWdodCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkJICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiAgSXQgY29uc2lzdHMgb2YgdGhlCi0JCSAqICJTdHlsZSIgZ3JvdXAsIHRoZSAiT3RoZXIiIGdyb3VwIGFuZCB0aGUgIlNpemUiIGdyb3VwLgotCQkgKi8JCi0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSkpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkKLQkJLyogQ3JlYXRlIGluZGl2aWR1YWwgZ3JvdXBzIGluc2lkZSB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JCWNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCWNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCWNyZWF0ZVNldEdldEdyb3VwKCk7Ci0JCWNyZWF0ZVNpemVHcm91cCAoKTsKLQkJY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCk7Ci0JCWlmIChSVExfU1VQUE9SVF9FTkFCTEUpIHsKLQkJCWNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCk7Ci0JCX0KLQkKLQkJLyoKLQkJICogRm9yIGVhY2ggQnV0dG9uIGNoaWxkIGluIHRoZSBzdHlsZSBncm91cCwgYWRkIGEgc2VsZWN0aW9uCi0JCSAqIGxpc3RlbmVyIHRoYXQgd2lsbCByZWNyZWF0ZSB0aGUgZXhhbXBsZSBjb250cm9scy4gIElmIHRoZQotCQkgKiBzdHlsZSBncm91cCBidXR0b24gaXMgYSBSQURJTyBidXR0b24sIGVuc3VyZSB0aGF0IHRoZSByYWRpbwotCQkgKiBidXR0b24gaXMgc2VsZWN0ZWQgYmVmb3JlIHJlY3JlYXRpbmcgdGhlIGV4YW1wbGUgY29udHJvbHMuCi0JCSAqIFdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIFJBRElPIGJ1dHRvbiwgdGhlIGN1cnJlbnQgUkFESU8KLQkJICogYnV0dG9uIGluIHRoZSBncm91cCBpcyBkZXNlbGVjdGVkIGFuZCB0aGUgbmV3IFJBRElPIGJ1dHRvbgotCQkgKiBpcyBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LiAgVGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgZm9yCi0JCSAqIGJvdGggdGhlc2Ugb3BlcmF0aW9ucyBidXQgdHlwaWNhbGx5IG9ubHkgZG8gd29yayB3aGVuIGEgUkFESU8KLQkJICogYnV0dG9uIGlzIHNlbGVjdGVkLgotCQkgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoKGV2ZW50LndpZGdldC5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCX0KLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gc3R5bGVHcm91cC5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4gW2ldIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoaWxkcmVuIFtpXTsKLQkJCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuIFtpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQkvKiBMb29rIGRvd24gb25lIG1vcmUgbGV2ZWwgb2YgY2hpbGRyZW4gaW4gdGhlIHN0eWxlIGdyb3VwLiAqLwotCQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgY2hpbGRyZW4gW2ldOwotCQkJCQlDb250cm9sIFtdIGdyYW5kY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQkJCWZvciAoaW50IGo9MDsgajxncmFuZGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoZ3JhbmRjaGlsZHJlbiBbal0gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZ3JhbmRjaGlsZHJlbiBbal07Ci0JCQkJCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKFJUTF9TVVBQT1JUX0VOQUJMRSkgewotCQkJcnRsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7IAotCQkJbHRyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7CQkKLQkJCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRoZSBTZXQvR2V0IEFQSSBjb250cm9scyB0byB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNldEdldEdyb3VwKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBhY2Nlc3Mgc2V0L2dldCBBUEkgZnVuY3Rpb25hbGl0eS4KLQkJICovCi0JCWZpbmFsIFN0cmluZyBbXSBtZXRob2ROYW1lcyA9IGdldE1ldGhvZE5hbWVzICgpOwotCQlpZiAobWV0aG9kTmFtZXMgIT0gbnVsbCkgewotCQkJQnV0dG9uIHNldEdldEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5QVVNIKTsKLQkJCXNldEdldEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNldF9HZXQiKSk7Ci0JCQlzZXRHZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJc2V0R2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbillLndpZGdldDsKLQkJCQkJUG9pbnQgcHQgPSBidXR0b24uZ2V0TG9jYXRpb24oKTsKLQkJCQkJcHQgPSBlLmRpc3BsYXkubWFwKGJ1dHRvbiwgbnVsbCwgcHQpOwotCQkJCQljcmVhdGVTZXRHZXREaWFsb2cocHQueCwgcHQueSwgbWV0aG9kTmFtZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGF1Z21lbnQKLQkgKiB0aGUgc3RhbmRhcmQgY29udHJvbHMgY3JlYXRlZCBpbiB0aGUgIlN0eWxlIiwKLQkgKiAiT3RoZXIiIGFuZCAiU2l6ZSIgZ3JvdXBzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29sb3JzIGFuZCBGb250cyIgZ3JvdXAuIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICogYSBjaGlsZCBvZiB0aGUgIkNvbnRyb2wiIGdyb3VwLiBTdWJjbGFzc2VzIG92ZXJyaWRlCi0JICogdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIGNvbG9yIGFuZCBmb250IHNldHRpbmdzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCkgewotCQkvKiBDcmVhdGUgdGhlIGdyb3VwLiAqLwotCQljb2xvckdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIHRydWUpKTsKLQkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2xvcnMiKSk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlID0gbmV3IFRhYmxlKGNvbG9yR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQljb2xvckFuZEZvbnRUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLnNldFNlbGVjdGlvbigwKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRm9udCIpKTsKLQkJQnV0dG9uIGNoYW5nZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJY2hhbmdlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoYW5nZSIpKTsKLQkJY2hhbmdlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJQnV0dG9uIGRlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29sb3JHcm91cCwgU1dULlBVU0gpOwotCQlkZWZhdWx0c0J1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEZWZhdWx0cyIpKTsKLQkJZGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCi0JCS8qIEFkZCBsaXN0ZW5lcnMgdG8gc2V0L3Jlc2V0IGNvbG9ycyBhbmQgZm9udHMuICovCi0JCWNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nIChzaGVsbCk7Ci0JCWZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwpOwotCQljb2xvckFuZEZvbnRUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNoYW5nZUZvbnRPckNvbG9yIChjb2xvckFuZEZvbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWNoYW5nZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY2hhbmdlRm9udE9yQ29sb3IgKGNvbG9yQW5kRm9udFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCQl9KTsKLQkJZGVmYXVsdHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQkJCWZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQlmb250ID0gbnVsbDsJCQkJCi0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUltYWdlIGltYWdlID0gaXRlbXNbaV0uZ2V0SW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQl2b2lkIGNoYW5nZUZvbnRPckNvbG9yKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIEZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBjb2xvcgotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGZvcmVncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWNhc2UgQkFDS0dST1VORF9DT0xPUjogewotCQkJCUNvbG9yIG9sZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRDb2xvciA9IGNvbnRyb2xzIFswXS5nZXRCYWNrZ3JvdW5kICgpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQl9Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIGNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsgLy8gc2F2ZSBvbGQgYmFja2dyb3VuZCBjb2xvciB0byBkaXNwb3NlIHdoZW4gZG9uZQotCQkJCWJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZCAoKTsKLQkJCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkJY2FzZSBGT05UOiB7Ci0JCQkJRm9udCBvbGRGb250ID0gZm9udDsKLQkJCQlpZiAob2xkRm9udCA9PSBudWxsKSB7Ci0JCQkJCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCQkJCWlmIChjb250cm9scy5sZW5ndGggPiAwKSBvbGRGb250ID0gY29udHJvbHMgWzBdLmdldEZvbnQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIGZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGZvbnQKLQkJCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZEZvbnQgPSBmb250OyAvLyBkaXNwb3NlIG9sZCBmb250IHdoZW4gZG9uZQotCQkJCWZvbnQgPSBuZXcgRm9udCAoZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4gIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICogYSBjaGlsZCBvZiB0aGUgIkNvbnRyb2wiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlvdGhlckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPdGhlciIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQllbmFibGVkQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQllbmFibGVkQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkVuYWJsZWQiKSk7Ci0JCXZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZpc2libGVCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVmlzaWJsZSIpKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZEltYWdlIikpOwotCQlwb3B1cE1lbnVCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBvcHVwTWVudUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQb3B1cE1lbnUiKSk7Ci0JCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQllbmFibGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKTsKLQkJCX0KLQkJfSk7Ci0JCXZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJfQotCQl9KTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpOwotCQkJfQotCQl9KTsKLQkJcG9wdXBNZW51QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0UG9wdXBNZW51ICgpOwotCQkJfQotCQl9KTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCWVuYWJsZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2aXNpYmxlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXBvcHVwTWVudUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQmFja2dyb3VuZCBNb2RlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUJhY2tncm91bmRNb2RlR3JvdXAgKCkgewotCQkvLyBub3RlIHRoYXQgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY3JlYXRlRXhhbXBsZVdpZGdldHMKLQkJaWYgKGdldEV4YW1wbGVDb250cm9scyAoKS5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQliYWNrZ3JvdW5kTW9kZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJYmFja2dyb3VuZE1vZGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJYmFja2dyb3VuZE1vZGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJhY2tncm91bmRNb2RlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRfTW9kZSIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQliYWNrZ3JvdW5kTW9kZUNvbWJvID0gbmV3IENvbWJvKGJhY2tncm91bmRNb2RlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQliYWNrZ3JvdW5kTW9kZUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IlNXVC5JTkhFUklUX05PTkUiLCAiU1dULklOSEVSSVRfREVGQVVMVCIsICJTV1QuSU5IRVJJVF9GT1JDRSJ9KTsKLQkJYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYmFja2dyb3VuZE1vZGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWNrZ3JvdW5kSW1hZ2UiKSk7Ci0JCWJhY2tncm91bmRNb2RlQ29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGJhY2tncm91bmRNb2RlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhY2tncm91bmRNb2RlQ29sb3JCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZENvbG9yIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQliYWNrZ3JvdW5kTW9kZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kTW9kZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVHcm91cEJhY2tncm91bmRJbWFnZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWJhY2tncm91bmRNb2RlQ29sb3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVHcm91cEJhY2tncm91bmRDb2xvciAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQliYWNrZ3JvdW5kTW9kZUNvbWJvLnNldFRleHQoYmFja2dyb3VuZE1vZGVDb21iby5nZXRJdGVtKDApKTsKLQkJYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQliYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXZlbnQgY29uc29sZSBwb3B1cCBtZW51LgotCSAqLwotCXZvaWQgY3JlYXRlRXZlbnRDb25zb2xlUG9wdXAgKCkgewotCQlNZW51IHBvcHVwID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJZXZlbnRDb25zb2xlLnNldE1lbnUgKHBvcHVwKTsKLQotCQlNZW51SXRlbSBjdXQgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWN1dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fQ3V0IikpOwotCQljdXQuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuY3V0ICgpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gY29weSA9IG5ldyBNZW51SXRlbSAocG9wdXAsIFNXVC5QVVNIKTsKLQkJY29weS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fQ29weSIpKTsKLQkJY29weS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCWV2ZW50Q29uc29sZS5jb3B5ICgpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gcGFzdGUgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCXBhc3RlLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZW51SXRlbV9QYXN0ZSIpKTsKLQkJcGFzdGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUucGFzdGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuU0VQQVJBVE9SKTsKLQkJTWVudUl0ZW0gc2VsZWN0QWxsID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fU2VsZWN0QWxsIikpOwotCQlzZWxlY3RBbGwuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuc2VsZWN0QWxsICgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuICBUaGUgIkV4YW1wbGUiIGdyb3VwCi0JICogaXMgdHlwaWNhbGx5IHRoZSBsZWZ0IGhhbmQgY29sdW1uIGluIHRoZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlleGFtcGxlR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbiBvZiB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBwYXJ0aWN1bGFyCi0JICogZXhhbXBsZSBjb250cm9sLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBEbyBub3RoaW5nICovCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSAiTGlzdGVuZXIgc2VsZWN0aW9uIiBkaWFsb2cuCi0JICovCi0Jdm9pZCBjcmVhdGVMaXN0ZW5lclNlbGVjdGlvbkRpYWxvZyAoKSB7Ci0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoZGlhbG9nLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoKFN0cmluZylFVkVOVF9OQU1FU1tpXVswXSk7Ci0JCQlpdGVtLnNldENoZWNrZWQgKGV2ZW50c0ZpbHRlcltpXSk7Ci0JCX0KLQkJZmluYWwgU3RyaW5nIFtdIGN1c3RvbU5hbWVzID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0IChjdXN0b21OYW1lc1tpXSk7Ci0JCQlpdGVtLnNldENoZWNrZWQgKGV2ZW50c0ZpbHRlcltFVkVOVF9OQU1FUy5sZW5ndGggKyBpXSk7Ci0JCX0KLQkJQnV0dG9uIHNlbGVjdEFsbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9BbGwiKSk7Ci0JCXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpdGVtc1tFVkVOVF9OQU1FUy5sZW5ndGggKyBpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCUJ1dHRvbiBkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVzZWxlY3RfQWxsIikpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJCQlpdGVtc1tpXS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpdGVtc1tFVkVOVF9OQU1FUy5sZW5ndGggKyBpXS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7IC8qIEZpbGxlciAqLwotCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJb2suc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9LIikpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCW9rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWV2ZW50c0ZpbHRlcltpXSA9IGl0ZW1zW2ldLmdldENoZWNrZWQoKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlldmVudHNGaWx0ZXJbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0gPSBpdGVtc1tFVkVOVF9OQU1FUy5sZW5ndGggKyBpXS5nZXRDaGVja2VkKCk7Ci0JCQkJfQotCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cucGFjayAoKTsKLQkJZGlhbG9nLm9wZW4gKCk7Ci0JCXdoaWxlICghIGRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJMaXN0ZW5lcnMiIGdyb3VwLiAgVGhlICJMaXN0ZW5lcnMiIGdyb3VwCi0JICogZ29lcyBiZWxvdyB0aGUgIkV4YW1wbGUiIGFuZCAiQ29udHJvbCIgZ3JvdXBzLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCkgewotCQlsaXN0ZW5lcnNHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQlsaXN0ZW5lcnNHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgzLCBmYWxzZSkpOwotCQlsaXN0ZW5lcnNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlsaXN0ZW5lcnNHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkxpc3RlbmVycyIpKTsKLQotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBhY2Nlc3MgdGhlICdMaXN0ZW5lcnMnIGRpYWxvZy4KLQkJICovCi0JCUJ1dHRvbiBsaXN0ZW5lcnNCdXR0b24gPSBuZXcgQnV0dG9uIChsaXN0ZW5lcnNHcm91cCwgU1dULlBVU0gpOwotCQlsaXN0ZW5lcnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3RfTGlzdGVuZXJzIikpOwotCQlsaXN0ZW5lcnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljcmVhdGVMaXN0ZW5lclNlbGVjdGlvbkRpYWxvZyAoKTsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgY2hlY2tib3ggdG8gYWRkL3JlbW92ZSBsaXN0ZW5lcnMgdG8vZnJvbSB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCQkgKi8KLQkJZmluYWwgQnV0dG9uIGxpc3RlbkNoZWNrYm94ID0gbmV3IEJ1dHRvbiAobGlzdGVuZXJzR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWxpc3RlbkNoZWNrYm94LnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGlzdGVuIikpOwotCQlsaXN0ZW5DaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxvZ2dpbmcgPSBsaXN0ZW5DaGVja2JveC5nZXRTZWxlY3Rpb24gKCk7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBidXR0b24gdG8gY2xlYXIgdGhlIHRleHQuCi0JCSAqLwotCQlCdXR0b24gY2xlYXJCdXR0b24gPSBuZXcgQnV0dG9uIChsaXN0ZW5lcnNHcm91cCwgU1dULlBVU0gpOwotCQljbGVhckJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNsZWFyIikpOwotCQljbGVhckJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQljbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV2ZW50Q29uc29sZS5zZXRUZXh0ICgiIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLyogSW5pdGlhbGl6ZSB0aGUgZXZlbnRzRmlsdGVyIHRvIGxvZyBhbGwgZXZlbnRzLiAqLwotCQlpbnQgY3VzdG9tRXZlbnRDb3VudCA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCkubGVuZ3RoOwotCQlldmVudHNGaWx0ZXIgPSBuZXcgYm9vbGVhbiBbRVZFTlRfTkFNRVMubGVuZ3RoICsgY3VzdG9tRXZlbnRDb3VudF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoICsgY3VzdG9tRXZlbnRDb3VudDsgaSsrKSB7Ci0JCQlldmVudHNGaWx0ZXIgW2ldID0gdHJ1ZTsKLQkJfQotCi0JCS8qIENyZWF0ZSB0aGUgZXZlbnQgY29uc29sZSBUZXh0LiAqLwotCQlldmVudENvbnNvbGUgPSBuZXcgVGV4dCAobGlzdGVuZXJzR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCWV2ZW50Q29uc29sZS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJY3JlYXRlRXZlbnRDb25zb2xlUG9wdXAgKCk7Ci0JCWV2ZW50Q29uc29sZS5hZGRLZXlMaXN0ZW5lciAobmV3IEtleUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZCAoS2V5RXZlbnQgZSkgewotCQkJCWlmICgoZS5rZXlDb2RlID09ICdBJyB8fCBlLmtleUNvZGUgPT0gJ2EnKSAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuTU9EMSkgIT0gMCkgewotCQkJCQlldmVudENvbnNvbGUuc2VsZWN0QWxsICgpOwotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jdm9pZCBjcmVhdGVTZXRHZXREaWFsb2coaW50IHgsIGludCB5LCBTdHJpbmdbXSBtZXRob2ROYW1lcykgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuTU9ERUxFU1MpOwotCQlkaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRpYWxvZy5zZXRUZXh0KGdldFRhYlRleHQoKSArICIgIiArIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2V0X0dldCIpKTsKLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGRpYWxvZywgU1dULlJFQURfT05MWSk7Ci0JCW5hbWVDb21iby5zZXRJdGVtcyhtZXRob2ROYW1lcyk7Ci0JCW5hbWVDb21iby5zZXRUZXh0KG1ldGhvZE5hbWVzWzBdKTsKLQkJbmFtZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQobWV0aG9kTmFtZXMubGVuZ3RoKTsKLQkJbmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0TGFiZWxzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm5UeXBlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCXJldHVyblR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCXNldEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKSk7Ci0JCXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRWYWx1ZSgpOwotCQkJCXNldFRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJc2V0VGV4dC5zZXRGb2N1cygpOwotCQkJfQotCQl9KTsKLQkJc2V0VGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzZXRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJZ2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJZ2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0pOwotCQlnZXRUZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNDA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2V0VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXNldExhYmVscygpOwotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihzZXRCdXR0b24pOwotCQlkaWFsb2cucGFjaygpOwotCQlkaWFsb2cuc2V0TG9jYXRpb24oeCwgeSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0Jdm9pZCByZXNldExhYmVscygpIHsKLQkJU3RyaW5nIG1ldGhvZFJvb3QgPSBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlyZXR1cm5UeXBlTGFiZWwuc2V0VGV4dChwYXJhbWV0ZXJJbmZvKG1ldGhvZFJvb3QpKTsKLQkJc2V0QnV0dG9uLnNldFRleHQoc2V0TWV0aG9kTmFtZShtZXRob2RSb290KSk7Ci0JCWdldEJ1dHRvbi5zZXRUZXh0KCJnZXQiICsgbWV0aG9kUm9vdCk7Ci0JCXNldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFRleHQuc2V0VGV4dCgiIik7Ci0JCWdldFZhbHVlKCk7Ci0JCXNldFRleHQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlyZXR1cm4gInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCVN0cmluZyBwYXJhbWV0ZXJJbmZvKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlib29sZWFuIGlzQXJyYXkgPSByZXR1cm5UeXBlLmlzQXJyYXkoKTsKLQkJaWYgKGlzQXJyYXkpIHsKLQkJCXR5cGVOYW1lID0gcmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldE5hbWUoKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZTsKLQkJaW50IGluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4KzEgPCB0eXBlTmFtZS5sZW5ndGgoKSkgdHlwZU5hbWVTdHJpbmcgPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCVN0cmluZyBpbmZvID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkluZm9fIiArIHR5cGVOYW1lU3RyaW5nICsgKGlzQXJyYXkgPyAiQSIgOiAiIikpOwotCQlpZiAoaXNBcnJheSkgewotCQkJdHlwZU5hbWVTdHJpbmcgKz0gIltdIjsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcl9JbmZvIiwgbmV3IE9iamVjdFtdIHt0eXBlTmFtZVN0cmluZywgaW5mb30pOwotCX0KLQotCXZvaWQgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gImdldCIgKyBuYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlnZXRUZXh0LnNldFRleHQoIiIpOwotCQlXaWRnZXRbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSB3aWRnZXRzW2ldLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG51bGwpOwotCQkJCU9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKHdpZGdldHNbaV0sIG51bGwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlnZXRUZXh0LmFwcGVuZCgibnVsbCIpOwotCQkJCX0gZWxzZSBpZiAocmVzdWx0LmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJCWludCBsZW5ndGggPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXRMZW5ndGgocmVzdWx0KTsKLQkJCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlnZXRUZXh0LmFwcGVuZChyZXN1bHQuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkgKyAiWzBdIik7Ci0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewotCQkJCQkJZ2V0VGV4dC5hcHBlbmQoamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0KHJlc3VsdCxqKS50b1N0cmluZygpICsgIlxuIik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlnZXRUZXh0LmFwcGVuZChyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlnZXRUZXh0LmFwcGVuZChlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGkgKyAxIDwgd2lkZ2V0cy5sZW5ndGgpIHsKLQkJCQlnZXRUZXh0LmFwcGVuZCgiXG5cbiIpOwotCQkJfQotCQl9Ci0JfQotCi0JQ2xhc3MgZ2V0UmV0dXJuVHlwZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQlDbGFzcyByZXR1cm5UeXBlID0gbnVsbDsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIG1ldGhvZFJvb3Q7Ci0JCVdpZGdldFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQl0cnkgewotCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHdpZGdldHNbMF0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0JCQlyZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmV0dXJuVHlwZTsKLQl9Ci0JCi0Jdm9pZCBzZXRWYWx1ZSgpIHsKLQkJLyogVGhlIHBhcmFtZXRlciB0eXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGdldCBtZXRob2QncyByZXR1cm4gdHlwZSAqLwotCQlTdHJpbmcgbWV0aG9kUm9vdCA9IG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG1ldGhvZFJvb3QpOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHNldE1ldGhvZE5hbWUobWV0aG9kUm9vdCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHNldFRleHQuZ2V0VGV4dCgpOwotCQlXaWRnZXRbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSB3aWRnZXRzW2ldLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtyZXR1cm5UeXBlfSk7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gcmV0dXJuVHlwZS5nZXROYW1lKCk7Ci0JCQkJT2JqZWN0W10gcGFyYW1ldGVyID0gbnVsbDsKLQkJCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJpbnQiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImxvbmciKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBMb25nKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImNoYXIiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3ZhbHVlLmxlbmd0aCgpID09IDEgPyBuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSkgOiBuZXcgQ2hhcmFjdGVyKCdcMCcpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7bmV3IEJvb2xlYW4odmFsdWUpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiamF2YS5sYW5nLlN0cmluZyIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7dmFsdWV9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQiKSkgewotCQkJCQlTdHJpbmcgeHlbXSA9IHZhbHVlLnNwbGl0KCIsIik7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7bmV3IFBvaW50KG5ldyBJbnRlZ2VyKHh5WzBdKS5pbnRWYWx1ZSgpLG5ldyBJbnRlZ2VyKHh5WzFdKS5pbnRWYWx1ZSgpKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoIltJIikpIHsKLQkJCQkJU3RyaW5nIHN0cmluZ3NbXSA9IHZhbHVlLnNwbGl0KCIsIik7Ci0JCQkJCWludFtdIGludHMgPSBuZXcgaW50W3N0cmluZ3MubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdHJpbmdzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpbnRzW2pdID0gbmV3IEludGVnZXIoc3RyaW5nc1tqXSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge2ludHN9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJbTGphdmEubGFuZy5TdHJpbmc7IikpIHsKLQkJCQkJcGFyYW1ldGVyID0gbmV3IE9iamVjdFtdIHt2YWx1ZS5zcGxpdCgiLCIpfTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0c1tpXSk7Ci0JCQkJfQotCQkJCW1ldGhvZC5pbnZva2Uod2lkZ2V0c1tpXSwgcGFyYW1ldGVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZ2V0VGV4dC5zZXRUZXh0KGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLQl9Ci0KLQl2b2lkIGNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgT3JpZW50YXRpb24gZ3JvdXAqLwotCQlvcmllbnRhdGlvbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0KCkpOwotCQlvcmllbnRhdGlvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3JpZW50YXRpb24iKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJZGVmYXVsdE9yaWV0YXRpb25CdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHQiKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWx0ckJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWx0ckJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJcnRsQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJcnRsQnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlzaXplR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzaXplR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCgpKTsKLQkJc2l6ZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJc2l6ZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaXplIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCi0JCS8qCi0JCSAqIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgc2l6ZSByZXR1cm5lZAotCQkgKiBieSB3aWRnZXQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkuCi0JCSAqIFRoaXMgc2l6ZSBpcyBkZWZpbmVkIG9uIGEgd2lkZ2V0IGJ5IHdpZGdldCBiYXNpcy4KLQkJICogTWFueSB3aWRnZXRzIHdpbGwgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnRzLgotCQkgKi8KLQkJcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByZWZlcnJlZCIpKTsKLQkJdG9vU21hbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvb1NtYWxsQnV0dG9uLnNldFRleHQgKFRPT19TTUFMTF9TSVpFICsgIiBYICIgKyBUT09fU01BTExfU0laRSk7Ci0JCXNtYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNtYWxsQnV0dG9uLnNldFRleHQgKFNNQUxMX1NJWkUgKyAiIFggIiArIFNNQUxMX1NJWkUpOwotCQlsYXJnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULlJBRElPKTsKLQkJbGFyZ2VCdXR0b24uc2V0VGV4dCAoTEFSR0VfU0laRSArICIgWCAiICsgTEFSR0VfU0laRSk7Ci0JCWZpbGxIQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsSEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbF9YIikpOwotCQlmaWxsVkJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbFZCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxfWSIpKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfTsKLQkJcHJlZmVycmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdG9vU21hbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzbWFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWxhcmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmlsbEhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlmaWxsVkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlwcmVmZXJyZWRCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4gIFRoZSAiU3R5bGUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHN0eWxlIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4gIENoYW5naW5nIGEgd2lkZ2V0ICJTdHlsZSIgY2F1c2VzCi0JICogdGhlIHdpZGdldCB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0eWxlcyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDYWNoZSB0aGUgc2hlbGwgYW5kIGRpc3BsYXkuICovCi0JCXNoZWxsID0gdGFiRm9sZGVyLmdldFNoZWxsICgpOwotCQlkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIHR3byBjb2x1bW4gcGFnZS4gKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgIkV4YW1wbGUiIGFuZCAiQ29udHJvbCIgZ3JvdXBzLiAqLwotCQljcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCWNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgIkxpc3RlbmVycyIgZ3JvdXAgdW5kZXIgdGhlICJDb250cm9sIiBncm91cC4gKi8KLQkJY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV4YW1wbGUgYW5kIGNvbnRyb2wgd2lkZ2V0cy4gKi8KLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQljcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlQmFja2dyb3VuZE1vZGVHcm91cCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCQotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSgpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIENvbnRyb2wgY29udHJvbCA9IGNvbnRyb2xzIFtpXTsKLQkJCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkgICAgICAgIAlNZW51IG1lbnUgPSBjb250cm9sLmdldE1lbnUoKTsKLQkJICAgICAgICAJaWYgKG1lbnUgIT0gbnVsbCAmJiBzYW1wbGVQb3B1cCkgewotCQkgICAgICAgIAkJbWVudS5kaXNwb3NlKCk7Ci0JCSAgICAgICAgCQltZW51ID0gbnVsbDsKLQkJICAgICAgICAJfQotCQkgICAgICAgIAlpZiAobWVudSA9PSBudWxsICYmIHBvcHVwTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJICAgICAgICAJbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJCSAgICAgICAgCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJICAgICAgICAJaXRlbS5zZXRUZXh0KCJTYW1wbGUgcG9wdXAgbWVudSBpdGVtIik7Ci0JCQkgICAgICAgIAlzcGVjaWFsUG9wdXBNZW51SXRlbXMobWVudSwgZXZlbnQpOwotCQkJICAgICAgICAJY29udHJvbC5zZXRNZW51KG1lbnUpOwotCQkgICAgICAgIAkJc2FtcGxlUG9wdXAgPSB0cnVlOwotCQkgICAgICAgIAl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWFsUG9wdXBNZW51SXRlbXMoZmluYWwgTWVudSBtZW51LCBmaW5hbCBFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3aWRnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWRnZXRzIFtpXS5kaXNwb3NlICgpOwotCQl9Ci0JfQotCQotCUltYWdlIGNvbG9ySW1hZ2UgKENvbG9yIGNvbG9yKSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBJTUFHRV9TSVpFLCBJTUFHRV9TSVpFKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQlJbWFnZSBmb250SW1hZ2UgKEZvbnQgZm9udCkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgSU1BR0VfU0laRSwgSU1BR0VfU0laRSk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJRm9udERhdGEgZGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlpbnQgc3R5bGUgPSBkYXRhWzBdLmdldFN0eWxlKCk7Ci0JCXN3aXRjaCAoc3R5bGUpIHsKLQkJY2FzZSBTV1QuTk9STUFMOgotCQkJZ2MuZHJhd0xpbmUoMywgMywgMywgOCk7Ci0JCQlnYy5kcmF3TGluZSg0LCAzLCA3LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDgsIDMsIDgsIDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dULkJPTEQ6Ci0JCQlnYy5kcmF3TGluZSgzLCAyLCAzLCA5KTsKLQkJCWdjLmRyYXdMaW5lKDQsIDIsIDQsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNSwgMiwgNywgMik7Ci0JCQlnYy5kcmF3TGluZSg1LCAzLCA4LCAzKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDUsIDcsIDUpOwotCQkJZ2MuZHJhd0xpbmUoNSwgNiwgNywgNik7Ci0JCQlnYy5kcmF3TGluZSg1LCA4LCA4LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDUsIDksIDcsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNywgNCwgOCwgNCk7Ci0JCQlnYy5kcmF3TGluZSg3LCA3LCA4LCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg2LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDcsIDMsIDQsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNSwgOSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuQk9MRCB8IFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg1LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDMsIDgsIDMpOwotCQkJZ2MuZHJhd0xpbmUoNiwgNCwgNCwgNyk7Ci0JCQlnYy5kcmF3TGluZSg3LCA0LCA1LCA3KTsKLQkJCWdjLmRyYXdMaW5lKDMsIDgsIDYsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNiwgOSk7Ci0JCQlicmVhazsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciBhIHdpZGdldAotCSAqCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBzdHlsZSBiaXQKLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFN0eWxlICgpIHsKLQkJaWYgKGx0ckJ1dHRvbiAhPSBudWxsICYmIGx0ckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmV0dXJuIFNXVC5MRUZUX1RPX1JJR0hUOwotCQl9Ci0JCWlmIChydGxCdXR0b24gIT0gbnVsbCAmJiBydGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBTV1QuUklHSFRfVE9fTEVGVDsKLQkJfQotCQlyZXR1cm4gU1dULk5PTkU7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldHMKLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiBjb250cm9scy4KLQkgKiBUaGlzIGlzIHRoZSBzdWJzZXQgb2YgIkV4YW1wbGUiIHdpZGdldHMgdGhhdCBhcmUgY29udHJvbHMuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgY29udHJvbHMKLQkgKi8KLQlDb250cm9sIFtdIGdldEV4YW1wbGVDb250cm9scyAoKSB7Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBuZXcgQ29udHJvbCBbMF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHdpZGdldHNbaV0gaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJQ29udHJvbFtdIG5ld0NvbnRyb2xzID0gbmV3IENvbnRyb2xbY29udHJvbHMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShjb250cm9scywgMCwgbmV3Q29udHJvbHMsIDAsIGNvbnRyb2xzLmxlbmd0aCk7Ci0JCQkJY29udHJvbHMgPSBuZXdDb250cm9sczsKLQkJCQljb250cm9sc1tjb250cm9scy5sZW5ndGggLSAxXSA9IChDb250cm9sKXdpZGdldHNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRyb2xzOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGFiVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgYWxsIGxpc3RlbmVycyB0byBhbGwgZXhhbXBsZSBjb250cm9scwotCSAqIGFuZCBleGFtcGxlIGNvbnRyb2wgaXRlbXMuCi0JICovCi0Jdm9pZCBob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKSB7Ci0JCWlmIChsb2dnaW5nKSB7Ci0JCQlXaWRnZXRbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzICh3aWRnZXRzIFtpXSk7Ci0JCQl9Ci0JCQlJdGVtW10gZXhhbXBsZUl0ZW1zID0gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzIChleGFtcGxlSXRlbXMgW2ldKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0pIGhvb2tDdXN0b21MaXN0ZW5lciAoY3VzdG9tTmFtZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKi8KLQl2b2lkIGhvb2tDdXN0b21MaXN0ZW5lciAoU3RyaW5nIGV2ZW50TmFtZSkgewotCX0KLQkKLQkvKioKLQkgKiBIb29rcyBhbGwgbGlzdGVuZXJzIHRvIHRoZSBzcGVjaWZpZWQgd2lkZ2V0LgotCSAqLwotCXZvaWQgaG9va0xpc3RlbmVycyAoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAobG9nZ2luZykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbaV0pIHdpZGdldC5hZGRMaXN0ZW5lciAoKChJbnRlZ2VyKUVWRU5UX05BTUVTW2ldWzFdKS5pbnRWYWx1ZSgpLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9ncyBhbiB1bnR5cGVkIGV2ZW50IHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nKEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBFVkVOVF9OQU1FUy5sZW5ndGgpIHsKLQkJCWlmICgoKEludGVnZXIpRVZFTlRfTkFNRVNbaV1bMV0pLmludFZhbHVlKCkgPT0gZXZlbnQudHlwZSkgYnJlYWs7Ci0JCQlpKys7Ci0JCX0KLQkJU3RyaW5nIHRvU3RyaW5nID0gKFN0cmluZylFVkVOVF9OQU1FU1tpXVswXSArICIgWyIrZXZlbnQudHlwZSsiXTogIjsKLQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5LZXlEb3duOgotCQkJY2FzZSBTV1QuS2V5VXA6IHRvU3RyaW5nICs9IG5ldyBLZXlFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJY2FzZSBTV1QuTW91c2VEb3VibGVDbGljazoKLQkJCWNhc2UgU1dULk1vdXNlV2hlZWw6IAotCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogdG9TdHJpbmcgKz0gbmV3IE1vdXNlRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5QYWludDogdG9TdHJpbmcgKz0gbmV3IFBhaW50RXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb3ZlOgotCQkJY2FzZSBTV1QuUmVzaXplOiB0b1N0cmluZyArPSBuZXcgQ29udHJvbEV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuRGlzcG9zZTogdG9TdHJpbmcgKz0gbmV3IERpc3Bvc2VFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlNlbGVjdGlvbjoKLQkJCWNhc2UgU1dULkRlZmF1bHRTZWxlY3Rpb246IHRvU3RyaW5nICs9IG5ldyBTZWxlY3Rpb25FdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkZvY3VzSW46Ci0JCQljYXNlIFNXVC5Gb2N1c091dDogdG9TdHJpbmcgKz0gbmV3IEZvY3VzRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5FeHBhbmQ6Ci0JCQljYXNlIFNXVC5Db2xsYXBzZTogdG9TdHJpbmcgKz0gbmV3IFRyZWVFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkljb25pZnk6Ci0JCQljYXNlIFNXVC5EZWljb25pZnk6Ci0JCQljYXNlIFNXVC5DbG9zZToKLQkJCWNhc2UgU1dULkFjdGl2YXRlOgotCQkJY2FzZSBTV1QuRGVhY3RpdmF0ZTogdG9TdHJpbmcgKz0gbmV3IFNoZWxsRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJY2FzZSBTV1QuSGlkZTogdG9TdHJpbmcgKz0gKGV2ZW50LndpZGdldCBpbnN0YW5jZW9mIE1lbnUpID8gbmV3IE1lbnVFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpIDogZXZlbnQudG9TdHJpbmcoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb2RpZnk6IHRvU3RyaW5nICs9IG5ldyBNb2RpZnlFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlZlcmlmeTogdG9TdHJpbmcgKz0gbmV3IFZlcmlmeUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSGVscDogdG9TdHJpbmcgKz0gbmV3IEhlbHBFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkFybTogdG9TdHJpbmcgKz0gbmV3IEFybUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuVHJhdmVyc2U6IHRvU3RyaW5nICs9IG5ldyBUcmF2ZXJzZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSGFyZEtleURvd246Ci0JCQljYXNlIFNXVC5IYXJkS2V5VXA6Ci0JCQljYXNlIFNXVC5EcmFnRGV0ZWN0OgotCQkJY2FzZSBTV1QuTWVudURldGVjdDoKLQkJCWNhc2UgU1dULlNldERhdGE6Ci0JCQlkZWZhdWx0OiB0b1N0cmluZyArPSBldmVudC50b1N0cmluZyAoKTsKLQkJfQotCQlldmVudENvbnNvbGUuYXBwZW5kICh0b1N0cmluZyk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQkKLQkvKioKLQkgKiBMb2dzIGEgc3RyaW5nIHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nIChTdHJpbmcgc3RyaW5nKSB7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKHN0cmluZyk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB0eXBlZCBldmVudCB0byB0aGUgZXZlbnQgY29uc29sZS4KLQkgKi8KLQl2b2lkIGxvZyAoU3RyaW5nIGV2ZW50TmFtZSwgVHlwZWRFdmVudCBldmVudCkgewotCQlldmVudENvbnNvbGUuYXBwZW5kIChldmVudE5hbWUgKyAiOiAiKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoZXZlbnQudG9TdHJpbmcgKCkpOwotCQlldmVudENvbnNvbGUuYXBwZW5kICgiXG4iKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVjcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQlob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgZm9udAotCSAqIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCBpbiBvcmRlciB0byByZXNldCBvdGhlciBjb2xvcnMKLQkgKiBhbmQgZm9udHMgdG8gZGVmYXVsdCBzZXR0aW5ncyBhcyB3ZWxsLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQlmb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCWJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBmb250OwotCQlmb250ID0gbnVsbDsKLQkJc2V0RXhhbXBsZVdpZGdldEZvbnQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMnIHBhcmVudC4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVHcm91cEJhY2tncm91bmRDb2xvciAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kTW9kZUdyb3VwID09IG51bGwpIHJldHVybjsKLQkJZXhhbXBsZUdyb3VwLnNldEJhY2tncm91bmQgKGJhY2tncm91bmRNb2RlQ29sb3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkgOiBudWxsKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBpbWFnZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMnIHBhcmVudC4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVHcm91cEJhY2tncm91bmRJbWFnZSAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kTW9kZUdyb3VwID09IG51bGwpIHJldHVybjsKLQkJZXhhbXBsZUdyb3VwLnNldEJhY2tncm91bmRJbWFnZSAoYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkgPyBpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lQYXJlbnRCYWNrZ3JvdW5kXSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgbW9kZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMnIHBhcmVudC4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVHcm91cEJhY2tncm91bmRNb2RlICgpIHsKLQkJaWYgKGJhY2tncm91bmRNb2RlR3JvdXAgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgbW9kZVN0cmluZyA9IGJhY2tncm91bmRNb2RlQ29tYm8uZ2V0VGV4dCAoKTsKLQkJaW50IG1vZGUgPSBTV1QuSU5IRVJJVF9OT05FOwotCQlpZiAobW9kZVN0cmluZy5lcXVhbHMoIlNXVC5JTkhFUklUX0RFRkFVTFQiKSkgbW9kZSA9IFNXVC5JTkhFUklUX0RFRkFVTFQ7Ci0JCWlmIChtb2RlU3RyaW5nLmVxdWFscygiU1dULklOSEVSSVRfRk9SQ0UiKSkgbW9kZSA9IFNXVC5JTkhFUklUX0ZPUkNFOwotCQlleGFtcGxlR3JvdXAuc2V0QmFja2dyb3VuZE1vZGUgKG1vZGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCkgewotCQlpZiAoY29sb3JBbmRGb250VGFibGUgPT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbm5vdCBjaGFuZ2UgY29sb3IvZm9udCBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cm9sc1tpXS5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kQ29sb3IpOwotCQkJfQotCQl9Ci0JCS8vIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGV4YW1wbGUgd2lkZ2V0KHMpLgotCQlDb2xvciBjb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IGNvbnRyb2xzIFswXS5nZXRCYWNrZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlIChjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRFbmFibGVkICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0RW5hYmxlZCAoZW5hYmxlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvbnQgKCkgewotCQlpZiAoY29sb3JBbmRGb250VGFibGUgPT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbm5vdCBjaGFuZ2UgY29sb3IvZm9udCBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cm9sc1tpXS5zZXRGb250KGZvbnQpOwotCQkJfQotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgYW5kIGZvbnQgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0KHMpLiAqLwotCQlGb250IGZ0ID0gZm9udDsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IGNvbnRyb2xzIFswXS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oRk9OVCk7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChmb250SW1hZ2UgKGZ0KSk7Ci0JCWl0ZW0uc2V0Rm9udChmdCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmxheW91dCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0Rm9yZWdyb3VuZCAoKSB7Ci0JCWlmIChjb2xvckFuZEZvbnRUYWJsZSA9PSBudWxsKSByZXR1cm47IC8vIHVzZXIgY2Fubm90IGNoYW5nZSBjb2xvci9mb250IG9uIHRoaXMgdGFiCi0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJCWNvbnRyb2xzW2ldLnNldEZvcmVncm91bmQgKGZvcmVncm91bmRDb2xvcik7Ci0JCQl9Ci0JCX0KLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgZXhhbXBsZSB3aWRnZXQocykuICovCi0JCUNvbG9yIGNvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHJldHVybjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gY29udHJvbHMgWzBdLmdldEZvcmVncm91bmQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShGT1JFR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKSB7Ci0JCWludCBzaXplID0gU1dULkRFRkFVTFQ7Ci0JCWlmIChwcmVmZXJyZWRCdXR0b24gPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAocHJlZmVycmVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gU1dULkRFRkFVTFQ7Ci0JCWlmICh0b29TbWFsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IFRPT19TTUFMTF9TSVpFOwotCQlpZiAoc21hbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBTTUFMTF9TSVpFOwotCQlpZiAobGFyZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBMQVJHRV9TSVpFOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKHNpemUsIHNpemUpOyAKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmaWxsSEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmlsbFZCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gZmlsbEhCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBTV1QuRklMTCA6IFNXVC5MRUZUOwotCQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBmaWxsVkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA/IFNXVC5GSUxMIDogU1dULlRPUDsKLQkJCWNvbnRyb2xzIFtpXS5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCX0KLQkJdGFiRm9sZGVyUGFnZS5sYXlvdXQgKGNvbnRyb2xzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLiAgU3ViY2xhc3NlcwotCSAqIHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCAiRXhhbXBsZSIgd2lkZ2V0IHN0YXRlCi0JICogdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZE1vZGUgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQl9Ci0JCS8vVEVNUE9SQVJZIENPREUKLS8vCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotLy8JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotLy8JCQlsb2cgKCJDb250cm9sPSIgKyBjb250cm9scyBbaV0gKyAiLCBib3JkZXIgd2lkdGg9IiArIGNvbnRyb2xzIFtpXS5nZXRCb3JkZXJXaWR0aCAoKSk7Ci0vLwkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0VmlzaWJsZSAodmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBpbWFnZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0QmFja2dyb3VuZEltYWdlIChiYWNrZ3JvdW5kSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQmFja2dyb3VuZF0gOiBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzEzYTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFRhYkZvbGRlclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHRvcEJ1dHRvbiwgYm90dG9tQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBUYWJJdGVtczEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW0xXzAiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtMV8yIil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgVGFiRm9sZGVyICovCi0JCXRhYkZvbGRlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldFRleHQgKCJUYWJGb2xkZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmICh0b3BCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVE9QOwotCQlpZiAoYm90dG9tQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPVFRPTTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGFiRm9sZGVyMSA9IG5ldyBUYWJGb2xkZXIgKHRhYkZvbGRlckdyb3VwLCBzdHlsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIxLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoVGFiSXRlbXMxW2ldKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtUYWJJdGVtczFbaV19KSk7Ci0JCQlUZXh0IGNvbnRlbnQgPSBuZXcgVGV4dCh0YWJGb2xkZXIxLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSk7Ci0JCQljb250ZW50LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW1fY29udGVudCIpICsgIjogIiArIGkpOwotCQkJaXRlbS5zZXRDb250cm9sKGNvbnRlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPUCIpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3R0b21CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlib3R0b21CdXR0b24uc2V0VGV4dCAoIlNXVC5CT1RUT00iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiU2VsZWN0aW9uSW5kZXgifTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQkvKiBPdmVycmlkZSB0byBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGludCBnZXRTZWxlY3Rpb25JbmRleCgpL3NldFNlbGVjdGlvbihpbnQpICovCi0JCXJldHVybiAobWV0aG9kUm9vdC5lcXVhbHMoIlNlbGVjdGlvbkluZGV4IikpID8gInNldFNlbGVjdGlvbiIgOiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYkl0ZW1bMF19OwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtIikpIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCAoKFRhYkZvbGRlcikgd2lkZ2V0KS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gdmFsdWUuc3BsaXQoIiwiKTsKLQkJCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW3ZhbHVlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUYWJGb2xkZXIpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCB3aWRnZXQpOwotCX0KLQotCVRhYkl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUYWJJdGVtW10gaXRlbXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVGFiSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgcmV0dXJuIGl0ZW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJURiI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGFiRm9sZGVyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXRvcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULlRPUCkgIT0gMCk7Ci0JCWJvdHRvbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPVFRPTSkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhOTBjMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRhYmxlVGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJsZSB0YWJsZTE7Ci0JR3JvdXAgdGFibGVHcm91cDsKLQotCS8qIFNpemUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlNpemUiIGdyb3VwICovCi0JQnV0dG9uIHBhY2tDb2x1bW5zQnV0dG9uOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gY2hlY2tCdXR0b24sIGZ1bGxTZWxlY3Rpb25CdXR0b24sIGhpZGVTZWxlY3Rpb25CdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIG11bHRpcGxlQ29sdW1ucywgbW92ZWFibGVDb2x1bW5zLCByZXNpemFibGVDb2x1bW5zLCBoZWFkZXJWaXNpYmxlQnV0dG9uLCBzb3J0SW5kaWNhdG9yQnV0dG9uLCBoZWFkZXJJbWFnZXNCdXR0b24sIGxpbmVzVmlzaWJsZUJ1dHRvbiwgc3ViSW1hZ2VzQnV0dG9uOwotCQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9GT1JFR1JPVU5EX0NPTE9SID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fQkFDS0dST1VORF9DT0xPUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0ZPTlQgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfQkFDS0dST1VORF9DT0xPUiA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0ZPTlQgPSA4OwotCUNvbG9yIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IsIGl0ZW1CYWNrZ3JvdW5kQ29sb3IsIGNlbGxGb3JlZ3JvdW5kQ29sb3IsIGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBpdGVtRm9udCwgY2VsbEZvbnQ7Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBjb2x1bW5UaXRsZXMJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMCIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMiIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMyIpfTsKLQkJCQkJCQkJCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JUG9pbnQgbWVudU1vdXNlQ29vcmRzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb250IikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9Gb250IikpOwotCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEJhY2tncm91bmRDb2xvciAhPSBudWxsKSBjZWxsQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvcmVncm91bmRDb2xvciAhPSBudWxsKSBjZWxsRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvbnQgIT0gbnVsbCkgY2VsbEZvbnQuZGlzcG9zZSgpOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwkJCQotCQkJCWl0ZW1Gb250ID0gbnVsbDsKLQkJCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQljZWxsRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBJVEVNX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIElURU1fQkFDS0dST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKCk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSVRFTV9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCW9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXNldEl0ZW1Gb250ICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0QmFja2dyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBjZWxsRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoMSk7Ci0JCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRGb250ID0gY2VsbEZvbnQ7Ci0JCQljZWxsRm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQlzZXRDZWxsRm9udCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlsaW5lc1Zpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJbXVsdGlwbGVDb2x1bW5zLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9WaXNpYmxlIikpOwotCQlzb3J0SW5kaWNhdG9yQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU29ydF9JbmRpY2F0b3IiKSk7Ci0JCW1vdmVhYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW92ZWFibGVfQ29sdW1ucyIpKTsKLQkJcmVzaXphYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc2l6YWJsZV9Db2x1bW5zIikpOwotCQloZWFkZXJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9JbWFnZXMiKSk7Ci0JCXN1YkltYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YkltYWdlc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViX0ltYWdlcyIpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlsaW5lc1Zpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCW11bHRpcGxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzb3J0SW5kaWNhdG9yQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpOwotCQkJfQotCQl9KTsKLQkJbW92ZWFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zTW92ZWFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXNpemFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zUmVzaXphYmxlICgpOwotCQkJfQotCQl9KTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJc3ViSW1hZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0YWJsZSAqLwotCQl0YWJsZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJsZUdyb3VwLnNldFRleHQgKCJUYWJsZSIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAoZnVsbFNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GVUxMX1NFTEVDVElPTjsKLQkJaWYgKGhpZGVTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSElERV9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIHRhYmxlIHdpZGdldCAqLwotCQl0YWJsZTEgPSBuZXcgVGFibGUgKHRhYmxlR3JvdXAsIHN0eWxlKTsKLQkKLQkJLyogRmlsbCB0aGUgdGFibGUgd2l0aCBkYXRhICovCi0JCWJvb2xlYW4gbXVsdGlDb2x1bW4gPSBtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChtdWx0aUNvbHVtbikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTEsIFNXVC5OT05FKTsKLQkJCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtjb2x1bW5UaXRsZXNbaV19KSk7Ci0JCQkJaWYgKGhlYWRlckltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgdGFibGVDb2x1bW4uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzIFtpICUgM10pOwotCQkJfQotCQkJdGFibGUxLnNldFNvcnRDb2x1bW4odGFibGUxLmdldENvbHVtbigwKSk7Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUxLCBTV1QuTk9ORSk7Ci0JCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaXRlbS5zZXRJbWFnZShqLCBpbnN0YW5jZS5pbWFnZXMgW2kgJSAzXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlcyBbaSAlIDNdKTsKLQkJCX0KLQkJCXNldEl0ZW1UZXh0IChpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5kZXgiKSArIGkpOwotCQl9Ci0JCXBhY2tDb2x1bW5zKCk7Ci0JfQotCQotCXZvaWQgc2V0SXRlbVRleHQoVGFibGVJdGVtIGl0ZW0sIGludCBpLCBTdHJpbmcgbm9kZSkgewotCQlpbnQgaW5kZXggPSBpICUgMzsKLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJdGFibGVEYXRhIFtpbmRleF1bMF0gPSBub2RlOwotCQkJaXRlbS5zZXRUZXh0ICh0YWJsZURhdGEgW2luZGV4XSk7Ci0JCX0gZWxzZSB7Ci0JCQlpdGVtLnNldFRleHQgKG5vZGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTaXplR3JvdXAoKTsKLQkKLQkJcGFja0NvbHVtbnNCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5QVVNIKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhY2tfQ29sdW1ucyIpKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFja0NvbHVtbnMgKCk7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5ISURFX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJSXRlbSBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBpdGVtcyA9IHRhYmxlMS5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMubGVuZ3RoICsgaXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zLCAwLCBhbGxJdGVtcywgMCwgY29sdW1ucy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBhbGxJdGVtcywgY29sdW1ucy5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dGFibGUxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJJdGVtQ291bnQiLCAiU2VsZWN0aW9uIiwgIlNlbGVjdGlvbkluZGV4IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JU3RyaW5nIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZFJvb3QpIHsKLQkJLyogT3ZlcnJpZGUgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKS9zZXRTZWxlY3Rpb24oaW50KSAqLwotCQlyZXR1cm4gKG1ldGhvZFJvb3QuZXF1YWxzKCJTZWxlY3Rpb25JbmRleCIpKSA/ICJzZXRTZWxlY3Rpb24iIDogInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCXZvaWQgcGFja0NvbHVtbnMgKCkgewotCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZTEuZ2V0Q29sdW1uQ291bnQoKTsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZTEuZ2V0Q29sdW1uKGkpOwotCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQl9Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYmxlSXRlbVswXX07IC8vIGJ1ZyBpbiBUYWJsZT8KLQkJaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtIikpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVGFibGUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gdmFsdWUuc3BsaXQoIiwiKTsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBmaW5kSXRlbSh2YWx1ZXNbaV0sICgoVGFibGUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCB3aWRnZXQpOwotCX0KLQotCVRhYmxlSXRlbSBmaW5kSXRlbShTdHJpbmcgdmFsdWUsIFRhYmxlSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgcmV0dXJuIGl0ZW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGFibGUiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgZm9udAotCSAqIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cyB0byB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqIEFsc28gc2V0cyBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIG9mIFRhYmxlSXRlbSBbMF0KLQkgKiB0byBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCXN1cGVyLnJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJRm9udCBvbGRGb250ID0gZm9udDsKLQkJaXRlbUZvbnQgPSBudWxsOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWNlbGxCYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkRm9udCA9IGZvbnQ7Ci0JCWNlbGxGb250ID0gbnVsbDsKLQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBSb3cgMCBUYWJsZUl0ZW0gaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsQmFja2dyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEJhY2tncm91bmQgKDEsIGNlbGxCYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNlbGwuICovCi0JCUNvbG9yIGNvbG9yID0gY2VsbEJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgUm93IDAgVGFibGVJdGVtIGluIGNvbHVtbiAxLgotCSAqLwotCXZvaWQgc2V0Q2VsbEZvcmVncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRGb3JlZ3JvdW5kICgxLCBjZWxsRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb3JlZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIFJvdyAwIFRhYmxlSXRlbSBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxGb250ICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9udCAoMSwgY2VsbEZvbnQpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBjZWxsRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvbnQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdLgotCSAqLwotCXZvaWQgc2V0SXRlbUJhY2tncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRCYWNrZ3JvdW5kIChpdGVtQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBpdGVtLiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvcmVncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBpdGVtLiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb3JlZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT1JFR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiBUYWJsZUl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb250ICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9udCAoaXRlbUZvbnQpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBpdGVtRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShJVEVNX0ZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlKGZ0KSk7Ci0JCWl0ZW0uc2V0Rm9udChmdCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmxheW91dCAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb3ZlYWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNNb3ZlYWJsZSAoKSB7Ci0JCWJvb2xlYW4gc2VsZWN0aW9uID0gbW92ZWFibGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0TW92ZWFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc2l6YWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNSZXNpemFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IHJlc2l6YWJsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlMS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5zZXRSZXNpemFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQlzZXRDZWxsRm9yZWdyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJc2V0Q29sdW1uc01vdmVhYmxlICgpOwotCQkJc2V0Q29sdW1uc1Jlc2l6YWJsZSAoKTsKLQkJCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCQlzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpOwotCQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQl9Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgodGFibGUxLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJsZTEuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCQloaWRlU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5ISURFX1NFTEVDVElPTikgIT0gMCk7Ci0JCXRyeSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZTEuZ2V0Q29sdW1uKDApOwotCQkJbW92ZWFibGVDb2x1bW5zLnNldFNlbGVjdGlvbiAoY29sdW1uLmdldE1vdmVhYmxlKCkpOwotCQkJcmVzaXphYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRSZXNpemFibGUoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRhYmxlMS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0YWJsZTEuZ2V0TGluZXNWaXNpYmxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXIgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpIHsKLQkJdGFibGUxLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc29ydCBpbmRpY2F0b3Igc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKSB7Ci0JCWlmIChzb3J0SW5kaWNhdG9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJLyogUmVzZXQgdG8ga25vd24gc3RhdGU6ICdkb3duJyBvbiBjb2x1bW4gMC4gKi8KLQkJCXRhYmxlMS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuRE9XTik7Ci0JCQlUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCQkJaWYgKGkgPT0gMCkgdGFibGUxLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQkJCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlpbnQgc29ydERpcmVjdGlvbiA9IFNXVC5ET1dOOwotCQkJCQkJaWYgKGUud2lkZ2V0ID09IHRhYmxlMS5nZXRTb3J0Q29sdW1uKCkpIHsKLQkJCQkJCQkvKiBJZiB0aGUgc29ydCBjb2x1bW4gaGFzbid0IGNoYW5nZWQsIGN5Y2xlIGRvd24gLT4gdXAgLT4gbm9uZS4gKi8KLQkJCQkJCQlzd2l0Y2ggKHRhYmxlMS5nZXRTb3J0RGlyZWN0aW9uICgpKSB7Ci0JCQkJCQkJY2FzZSBTV1QuRE9XTjogc29ydERpcmVjdGlvbiA9IFNXVC5VUDsgYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVVA6IHNvcnREaXJlY3Rpb24gPSBTV1QuTk9ORTsgYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0YWJsZTEuc2V0U29ydENvbHVtbigoVGFibGVDb2x1bW4pZS53aWRnZXQpOwotCQkJCQkJfQotCQkJCQkJdGFibGUxLnNldFNvcnREaXJlY3Rpb24gKHNvcnREaXJlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCWNvbHVtbi5zZXREYXRhKCJTb3J0TGlzdGVuZXIiLCBsaXN0ZW5lcik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRhYmxlMS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuTk9ORSk7Ci0JCQlUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWNvbHVtbnNbaV0uZ2V0RGF0YSgiU29ydExpc3RlbmVyIik7CS8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgY29sdW1uc1tpXS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGluZXMgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCkgewotCQl0YWJsZTEuc2V0TGluZXNWaXNpYmxlIChsaW5lc1Zpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lhbFBvcHVwTWVudUl0ZW1zKE1lbnUgbWVudSwgRXZlbnQgZXZlbnQpIHsKLSAgICAJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0gICAgCWl0ZW0uc2V0VGV4dCgiZ2V0SXRlbShQb2ludCkgb24gbW91c2UgY29vcmRpbmF0ZXMiKTsKLSAgICAJbWVudU1vdXNlQ29vcmRzID0gdGFibGUxLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgIAlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgIAkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIAkJCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJnZXRJdGVtKFBvaW50KCIgKyBtZW51TW91c2VDb29yZHMgKyAiKSkgcmV0dXJuZWQ6ICIgKyB0YWJsZTEuZ2V0SXRlbShtZW51TW91c2VDb29yZHMpKTsKLSAgICAJCQlldmVudENvbnNvbGUuYXBwZW5kICgiXG4iKTsKLSAgICAJCX07Ci0gICAgCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RleHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RleHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA3ZjgxMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UZXh0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBUZXh0VGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUZXh0IHRleHQ7Ci0JR3JvdXAgdGV4dEdyb3VwOwotCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB3cmFwQnV0dG9uLCByZWFkT25seUJ1dHRvbiwgcGFzc3dvcmRCdXR0b24sIHNlYXJjaEJ1dHRvbiwgY2FuY2VsQnV0dG9uOwotCUJ1dHRvbiBsZWZ0QnV0dG9uLCBjZW50ZXJCdXR0b24sIHJpZ2h0QnV0dG9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUZXh0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgd2lkZ2V0ICovCi0JCXRleHRHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGV4dEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRHcm91cC5zZXRUZXh0ICgiVGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKHBhc3N3b3JkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlBBU1NXT1JEOwotCQlpZiAoc2VhcmNoQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNFQVJDSDsKLQkJaWYgKGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DQU5DRUw7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJJR0hUOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQl0ZXh0ID0gbmV3IFRleHQgKHRleHRHcm91cCwgc3R5bGUpOwotCQl0ZXh0LnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpICsgVGV4dC5ERUxJTUlURVIgKyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lX1R3b19UaHJlZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JCXBhc3N3b3JkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcGFzc3dvcmRCdXR0b24uc2V0VGV4dCAoIlNXVC5QQVNTV09SRCIpOwotCQlzZWFyY2hCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZWFyY2hCdXR0b24uc2V0VGV4dCAoIlNXVC5TRUFSQ0giKTsKLQkJY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQgKCJTV1QuQ0FOQ0VMIik7Ci0KLQkJQ29tcG9zaXRlIGFsaWdubWVudEdyb3VwID0gbmV3IENvbXBvc2l0ZSAoc3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlsZWZ0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxlZnRCdXR0b24uc2V0VGV4dCAoIlNXVC5MRUZUIik7Ci0JCWNlbnRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQljZW50ZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5DRU5URVIiKTsKLQkJcmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoIlNXVC5SSUdIVCIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dGV4dH07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiRG91YmxlQ2xpY2tFbmFibGVkIiwgIkVjaG9DaGFyIiwgIkVkaXRhYmxlIiwgIk9yaWVudGF0aW9uIiwgIlNlbGVjdGlvbiIsICJUYWJzIiwgIlRleHQiLCAiVGV4dExpbWl0IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGV4dCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULldSQVApICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlJFQURfT05MWSkgIT0gMCk7Ci0JCXBhc3N3b3JkQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUEFTU1dPUkQpICE9IDApOwotCQlzZWFyY2hCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TRUFSQ0gpICE9IDApOwotCQlsZWZ0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTEVGVCkgIT0gMCk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQkKLQkJLyogU3BlY2lhbCBjYXNlOiBDQU5DRUwgYW5kIEhfU0NST0xMIGhhdmUgdGhlIHNhbWUgdmFsdWUsCi0JCSAqIHNvIHRvIGF2b2lkIGNvbmZ1c2lvbiwgb25seSBzZXQgQ0FOQ0VMIGlmIFNFQVJDSCBpcyBzZXQuICovCi0JCWlmICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TRUFSQ0gpICE9IDApIHsKLQkJCWNhbmNlbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkNBTkNFTCkgIT0gMCk7Ci0JCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY2FuY2VsQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJfQotCi0JCXBhc3N3b3JkQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlNJTkdMRSkgIT0gMCk7Ci0JCXNlYXJjaEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TSU5HTEUpICE9IDApOwotCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0VBUkNIKSAhPSAwKTsKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5NVUxUSSkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbEJhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbEJhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTAxZjBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRvb2xCYXJUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVG9vbEJhciBpbWFnZVRvb2xCYXIsIHRleHRUb29sQmFyLCBpbWFnZVRleHRUb29sQmFyOwotCUdyb3VwIGltYWdlVG9vbEJhckdyb3VwLCB0ZXh0VG9vbEJhckdyb3VwLCBpbWFnZVRleHRUb29sQmFyR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgZmxhdEJ1dHRvbiwgc2hhZG93T3V0QnV0dG9uLCB3cmFwQnV0dG9uLCByaWdodEJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gY29tYm9DaGlsZEJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVG9vbEJhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSB0b29sIGJhciAqLwotCQlpbWFnZVRvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWltYWdlVG9vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbWFnZVRvb2xCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbWFnZVRvb2xCYXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfVG9vbEJhciIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0ZXh0IHRvb2wgYmFyICovCi0JCXRleHRUb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0ZXh0VG9vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0ZXh0VG9vbEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRUb29sQmFyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfVG9vbEJhciIpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgYW5kIHRleHQgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbWFnZVRleHRUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZVRleHRfVG9vbEJhciIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULldSQVA7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChzaGFkb3dPdXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkKLQkJLyoKLQkJKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkJKgotCQkqIEEgdG9vbCBiYXIgbXVzdCBjb25zaXN0IG9mIGFsbCBpbWFnZSB0b29sCi0JCSogaXRlbXMgb3IgYWxsIHRleHQgdG9vbCBpdGVtcyBidXQgbm90IGJvdGguCi0JCSovCi0JCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUb29sQmFyID0gbmV3IFRvb2xCYXIgKGltYWdlVG9vbEJhckdyb3VwLCBzdHlsZSk7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlNFUEFSQVRPUiIpOwotCQlpZiAoY29tYm9DaGlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChpbWFnZVRvb2xCYXIsIFNXVC5OT05FKTsKLQkJCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiMjUwIiwgIjUwMCIsICI3NTAifSk7Ci0JCQljb21iby5zZXRUZXh0IChjb21iby5nZXRJdGVtICgwKSk7Ci0JCQljb21iby5wYWNrICgpOwotCQkJaXRlbS5zZXRXaWR0aCAoY29tYm8uZ2V0U2l6ZSAoKS54KTsKLQkJCWl0ZW0uc2V0Q29udHJvbCAoY29tYm8pOwotCQl9Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIHRleHQgdG9vbCBiYXIgKi8KLQkJdGV4dFRvb2xCYXIgPSBuZXcgVG9vbEJhciAodGV4dFRvb2xCYXJHcm91cCwgc3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQdXNoIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQdXNoIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hlY2siKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaWYgKGNvbWJvQ2hpbGRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAodGV4dFRvb2xCYXIsIFNXVC5OT05FKTsKLQkJCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiMjUwIiwgIjUwMCIsICI3NTAifSk7Ci0JCQljb21iby5zZXRUZXh0IChjb21iby5nZXRJdGVtICgwKSk7Ci0JCQljb21iby5wYWNrICgpOwotCQkJaXRlbS5zZXRXaWR0aCAoY29tYm8uZ2V0U2l6ZSAoKS54KTsKLQkJCWl0ZW0uc2V0Q29udHJvbCAoY29tYm8pOwotCQl9Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRleHRUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcF9Eb3duIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLyogQ3JlYXRlIHRoZSBpbWFnZSBhbmQgdGV4dCB0b29sIGJhciAqLwotCQlpbWFnZVRleHRUb29sQmFyID0gbmV3IFRvb2xCYXIgKGltYWdlVGV4dFRvb2xCYXJHcm91cCwgc3R5bGUpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQdXNoIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQdXNoIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUFVTSCIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaGVjayIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuU0VQQVJBVE9SIik7Ci0JCWlmIChjb21ib0NoaWxkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5OT05FKTsKLQkJCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiMjUwIiwgIjUwMCIsICI3NTAifSk7Ci0JCQljb21iby5zZXRUZXh0IChjb21iby5nZXRJdGVtICgwKSk7Ci0JCQljb21iby5wYWNrICgpOwotCQkJaXRlbS5zZXRXaWR0aCAoY29tYm8uZ2V0U2l6ZSAoKS54KTsKLQkJCWl0ZW0uc2V0Q29udHJvbCAoY29tYm8pOwotCQl9Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRHJvcF9Eb3duIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuRFJPUF9ET1dOIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLyoKLQkJKiBEbyBub3QgYWRkIHRoZSBzZWxlY3Rpb24gZXZlbnQgZm9yIHRoaXMgZHJvcCBkb3duCi0JCSogdG9vbCBpdGVtLiAgV2l0aG91dCBob29raW5nIHRoZSBldmVudCwgdGhlIGRyb3AgZG93bgotCQkqIHdpZGdldCBkb2VzIG5vdGhpbmcgc3BlY2lhbCB3aGVuIHRoZSBkcm9wIGRvd24gYXJlYQotCQkqIGlzIHNlbGVjdGVkLgotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQljb21ib0NoaWxkQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJY29tYm9DaGlsZEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29tYm9fY2hpbGQiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWNvbWJvQ2hpbGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQkJcmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULlJJR0hUIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCUl0ZW0gW10gaW1hZ2VUb29sQmFySXRlbXMgPSBpbWFnZVRvb2xCYXIuZ2V0SXRlbXMoKTsKLQkJSXRlbSBbXSB0ZXh0VG9vbEJhckl0ZW1zID0gdGV4dFRvb2xCYXIuZ2V0SXRlbXMoKTsKLQkJSXRlbSBbXSBpbWFnZVRleHRUb29sQmFySXRlbXMgPSBpbWFnZVRleHRUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gYWxsSXRlbXMgPSBuZXcgSXRlbSBbaW1hZ2VUb29sQmFySXRlbXMubGVuZ3RoICsgdGV4dFRvb2xCYXJJdGVtcy5sZW5ndGggKyBpbWFnZVRleHRUb29sQmFySXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbWFnZVRvb2xCYXJJdGVtcywgMCwgYWxsSXRlbXMsIDAsIGltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGV4dFRvb2xCYXJJdGVtcywgMCwgYWxsSXRlbXMsIGltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCwgdGV4dFRvb2xCYXJJdGVtcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGltYWdlVGV4dFRvb2xCYXJJdGVtcywgMCwgYWxsSXRlbXMsIGltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCArIHRleHRUb29sQmFySXRlbXMubGVuZ3RoLCBpbWFnZVRleHRUb29sQmFySXRlbXMubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtpbWFnZVRvb2xCYXIsIHRleHRUb29sQmFyLCBpbWFnZVRleHRUb29sQmFyfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUQiI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVG9vbEJhciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51ICAgIG1lbnUgPSBudWxsOwotCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDk7ICsraSkgewotCQkJCQlmaW5hbCBTdHJpbmcgdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGkpOwotCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJCQltZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJLyoKLQkJCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkJCSAqLwotCQkJCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGEgZHJvcCBkb3duIHRvb2wKLQkJCSAqIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIG1haW4gYXJlYSBhbmQgaW4gdGhlIGRyb3AKLQkJCSAqIGRvd24gYXJyb3cuICBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwgdG8gZGV0ZXJtaW5lCi0JCQkgKiB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qCi0JCQkJICogVGhlIGRyb3AgZG93biBhcnJvdyB3YXMgc2VsZWN0ZWQuCi0JCQkJICovCi0JCQkJaWYgKHZpc2libGUpIHsKLQkJCQkJLy8gSGlkZSB0aGUgbWVudSB0byBnaXZlIHRoZSBBcnJvdyB0aGUgYXBwZWFyYW5jZSBvZiBiZWluZyBhIHRvZ2dsZSBidXR0b24uCi0JCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUgZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQotCQkJCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogTWFpbiBhcmVhIG9mIGRyb3AgZG93biB0b29sIGl0ZW0gc2VsZWN0ZWQuCi0JCQkJICogQW4gYXBwbGljYXRpb24gd291bGQgaW52b2tlIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBmb3IgdGhlIHRvb2wgaXRlbS4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0TWVudVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQltZW51LnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbFRpcFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbFRpcFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI5ZmI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xUaXBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFRvb2xUaXBUYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUb29sVGlwIHRvb2xUaXAxOwotCUdyb3VwIHRvb2xUaXBHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGJhbGxvb25CdXR0b24sIGljb25FcnJvckJ1dHRvbiwgaWNvbkluZm9ybWF0aW9uQnV0dG9uLCBpY29uV2FybmluZ0J1dHRvbiwgbm9JY29uQnV0dG9uOwotCQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gYXV0b0hpZGVCdXR0b24sIHNob3dJblRyYXlCdXR0b247Ci0JCi0JVHJheSB0cmF5OwotCVRyYXlJdGVtIHRyYXlJdGVtOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUb29sVGlwVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0b29sdGlwIHZpc2liaWxpdHkgY2hlY2sgYm94ICovCi0JCXRvb2xUaXBHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRvb2xUaXBHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdG9vbFRpcEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRvb2xUaXBHcm91cC5zZXRUZXh0ICgiVG9vbFRpcCIpOwotCQl2aXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbih0b29sVGlwR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZpc2libGVCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVmlzaWJsZSIpKTsKLQkJdmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFZpc2liaWxpdHkgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGJhbGxvb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQkFMTE9PTjsKLQkJaWYgKGljb25FcnJvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0VSUk9SOwotCQlpZiAoaWNvbkluZm9ybWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fSU5GT1JNQVRJT047Ci0JCWlmIChpY29uV2FybmluZ0J1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX1dBUk5JTkc7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQl0b29sVGlwMSA9IG5ldyBUb29sVGlwIChzaGVsbCwgc3R5bGUpOwotCQl0b29sVGlwMS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sVGlwX1RpdGxlIikpOwotCQl0b29sVGlwMS5zZXRNZXNzYWdlKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQliYWxsb29uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFsbG9vbkJ1dHRvbi5zZXRUZXh0ICgiU1dULkJBTExPT04iKTsKLQkJaWNvbkVycm9yQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldFRleHQoIlNXVC5JQ09OX0VSUk9SIik7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRUZXh0KCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCQlpY29uV2FybmluZ0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldFRleHQoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQkJbm9JY29uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbm9JY29uQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vX0ljb24iKSk7Ci0JfQotCQotCXZvaWQgY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCkgewotCQkvLyBUb29sVGlwIGRvZXMgbm90IG5lZWQgYSBjb2xvciBhbmQgZm9udCBncm91cC4KLQl9Ci0JCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlvdGhlckdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJb3RoZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCW90aGVyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk90aGVyIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWF1dG9IaWRlQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlhdXRvSGlkZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBdXRvSGlkZSIpKTsKLQkJc2hvd0luVHJheUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc2hvd0luVHJheUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaG93X0luX1RyYXkiKSk7Ci0JCXRyYXkgPSBkaXNwbGF5LmdldFN5c3RlbVRyYXkoKTsKLQkJc2hvd0luVHJheUJ1dHRvbi5zZXRFbmFibGVkKHRyYXkgIT0gbnVsbCk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJYXV0b0hpZGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRBdXRvSGlkZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNob3dJblRyYXlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNob3dFeGFtcGxlV2lkZ2V0SW5UcmF5ICgpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlkaXNwb3NlVHJheUl0ZW0oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCWF1dG9IaWRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewotCQkvLyBUb29sVGlwIGRvZXMgbm90IG5lZWQgYSBzaXplIGdyb3VwLgotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlkaXNwb3NlVHJheUl0ZW0oKTsKLQkJc3VwZXIuZGlzcG9zZUV4YW1wbGVXaWRnZXRzKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JLy8gVGFiIHVzZXMgdGhpcyBmb3IgbWFueSB0aGluZ3MgLSB3aWRnZXRzIHdvdWxkIG9ubHkgZ2V0IHNldC9nZXQsIGxpc3RlbmVycywgYW5kIGRpc3Bvc2UuCi0JV2lkZ2V0W10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dG9vbFRpcDF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ik1lc3NhZ2UiLCAiVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRvb2xUaXAiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzaG93RXhhbXBsZVdpZGdldEluVHJheSAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldEF1dG9IaWRlICgpOwotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWJhbGxvb25CdXR0b24uc2V0U2VsZWN0aW9uICgodG9vbFRpcDEuZ2V0U3R5bGUgKCkgJiBTV1QuQkFMTE9PTikgIT0gMCk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0b29sVGlwMS5nZXRTdHlsZSAoKSAmIFNXVC5JQ09OX0VSUk9SKSAhPSAwKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRvb2xUaXAxLmdldFN0eWxlICgpICYgU1dULklDT05fSU5GT1JNQVRJT04pICE9IDApOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0b29sVGlwMS5nZXRTdHlsZSAoKSAmIFNXVC5JQ09OX1dBUk5JTkcpICE9IDApOwotCQlub0ljb25CdXR0b24uc2V0U2VsZWN0aW9uICgodG9vbFRpcDEuZ2V0U3R5bGUgKCkgJiAoU1dULklDT05fRVJST1IgfCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5JQ09OX1dBUk5JTkcpKSA9PSAwKTsKLQkJYXV0b0hpZGVCdXR0b24uc2V0U2VsZWN0aW9uKHRvb2xUaXAxLmdldEF1dG9IaWRlKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFZpc2liaWxpdHkgKCkgewotCQl0b29sVGlwMS5zZXRWaXNpYmxlICh2aXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGF1dG9IaWRlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBdXRvSGlkZSAoKSB7Ci0JCXRvb2xUaXAxLnNldEF1dG9IaWRlKGF1dG9IaWRlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCXZvaWQgc2hvd0V4YW1wbGVXaWRnZXRJblRyYXkgKCkgewotCQlpZiAoc2hvd0luVHJheUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCWNyZWF0ZVRyYXlJdGVtKCk7Ci0JCQl0cmF5SXRlbS5zZXRUb29sVGlwKHRvb2xUaXAxKTsKLQkJfSBlbHNlIHsKLQkJCWRpc3Bvc2VUcmF5SXRlbSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBjcmVhdGVUcmF5SXRlbSgpIHsKLQkJaWYgKHRyYXlJdGVtID09IG51bGwpIHsKLQkJCXRyYXlJdGVtID0gbmV3IFRyYXlJdGVtKHRyYXksIFNXVC5OT05FKTsKLQkJCXRyYXlJdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQl9Ci0JfQotCQotCXZvaWQgZGlzcG9zZVRyYXlJdGVtKCkgewotCQlpZiAodHJheUl0ZW0gIT0gbnVsbCkgewotCQkJdHJheUl0ZW0uc2V0VG9vbFRpcChudWxsKTsKLQkJCXRyYXlJdGVtLmRpc3Bvc2UoKTsKLQkJCXRyYXlJdGVtID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UcmVlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UcmVlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0NTJiYTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgVHJlZVRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVHJlZSB0cmVlMSwgdHJlZTI7Ci0JVHJlZUl0ZW0gdGV4dE5vZGUxLCBpbWFnZU5vZGUxOwotCUdyb3VwIHRyZWVHcm91cCwgaW1hZ2VUcmVlR3JvdXAsIGl0ZW1Hcm91cDsKLQkKLQkvKiBTaXplIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTaXplIiBncm91cCAqLwotCUJ1dHRvbiBwYWNrQ29sdW1uc0J1dHRvbjsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGNoZWNrQnV0dG9uLCBmdWxsU2VsZWN0aW9uQnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBtdWx0aXBsZUNvbHVtbnMsIG1vdmVhYmxlQ29sdW1ucywgcmVzaXphYmxlQ29sdW1ucywgaGVhZGVyVmlzaWJsZUJ1dHRvbiwgc29ydEluZGljYXRvckJ1dHRvbiwgaGVhZGVySW1hZ2VzQnV0dG9uLCBzdWJJbWFnZXNCdXR0b24sIGxpbmVzVmlzaWJsZUJ1dHRvbjsKLQkKLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGFkZGVkIHRvIHRoZSAiQ29sb3JzIGFuZCBGb250cyIgZ3JvdXAgKi8KLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9SRUdST1VORF9DT0xPUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0JBQ0tHUk9VTkRfQ09MT1IgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9GT05UID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfRk9SRUdST1VORF9DT0xPUiA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0JBQ0tHUk9VTkRfQ09MT1IgPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9GT05UID0gODsKLQlDb2xvciBpdGVtRm9yZWdyb3VuZENvbG9yLCBpdGVtQmFja2dyb3VuZENvbG9yLCBjZWxsRm9yZWdyb3VuZENvbG9yLCBjZWxsQmFja2dyb3VuZENvbG9yOwotCUZvbnQgaXRlbUZvbnQsIGNlbGxGb250OwotCi0Jc3RhdGljIFN0cmluZyBbXSBjb2x1bW5UaXRsZXMJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMCIpLAotCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8xIiksCi0JCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzIiKSwKLQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMyIpfTsKLQkJICAgCi0Jc3RhdGljIFN0cmluZ1tdW10gdGFibGVEYXRhID0gewotCQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8wIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzEiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMiIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8zIikgfSwKLQkJCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMCIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8xIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzIiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMyIpIH0sCi0JCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzAiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMSIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8yIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzMiKSB9IH07Ci0KLQlQb2ludCBtZW51TW91c2VDb29yZHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVHJlZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbG9ycyBhbmQgRm9udHMiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVDb2xvckFuZEZvbnRHcm91cCgpOwotCQkKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9CYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0ZvbnQiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfRm9yZWdyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9CYWNrZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0ZvbnQiKSk7Ci0KLQkJc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaXRlbUJhY2tncm91bmRDb2xvciAhPSBudWxsKSBpdGVtQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoaXRlbUZvcmVncm91bmRDb2xvciAhPSBudWxsKSBpdGVtRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoaXRlbUZvbnQgIT0gbnVsbCkgaXRlbUZvbnQuZGlzcG9zZSgpOwotCQkJCWlmIChjZWxsQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGNlbGxCYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChjZWxsRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGNlbGxGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChjZWxsRm9udCAhPSBudWxsKSBjZWxsRm9udC5kaXNwb3NlKCk7Ci0JCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7CQkJCi0JCQkJaXRlbUZvbnQgPSBudWxsOwotCQkJCWNlbGxCYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWNlbGxGb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwkJCQotCQkJCWNlbGxGb250ID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jdm9pZCBjaGFuZ2VGb250T3JDb2xvcihpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQljYXNlIElURU1fRk9SRUdST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSVRFTV9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0ZXh0Tm9kZTEuZ2V0QmFja2dyb3VuZCAoKTsKLQkJCWNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBJVEVNX0ZPTlQ6IHsKLQkJCUZvbnQgb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgb2xkRm9udCA9IHRleHROb2RlMS5nZXRGb250ICgpOwotCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChvbGRGb250LmdldEZvbnREYXRhKCkpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQlpZiAoZm9udERhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkRm9udCA9IGl0ZW1Gb250OwotCQkJaXRlbUZvbnQgPSBuZXcgRm9udCAoZGlzcGxheSwgZm9udERhdGEpOwotCQkJc2V0SXRlbUZvbnQgKCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBDRUxMX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRGb3JlZ3JvdW5kICgxKTsKLQkJCWNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBDRUxMX0JBQ0tHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gY2VsbEJhY2tncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgxKTsKLQkJCWNvbG9yRGlhbG9nLnNldFJHQihvbGRDb2xvci5nZXRSR0IoKSk7Ci0JCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCQljZWxsQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJc2V0Q2VsbEJhY2tncm91bmQgKCk7Ci0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSAoKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBDRUxMX0ZPTlQ6IHsKLQkJCUZvbnQgb2xkRm9udCA9IGNlbGxGb250OwotCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgb2xkRm9udCA9IHRleHROb2RlMS5nZXRGb250ICgxKTsKLQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCW9sZEZvbnQgPSBjZWxsRm9udDsKLQkJCWNlbGxGb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXNldENlbGxGb250ICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzdXBlci5jaGFuZ2VGb250T3JDb2xvcihpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlsaW5lc1Zpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9WaXNpYmxlIikpOwotCQlzb3J0SW5kaWNhdG9yQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU29ydF9JbmRpY2F0b3IiKSk7Ci0JCW1vdmVhYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW92ZWFibGVfQ29sdW1ucyIpKTsKLQkJcmVzaXphYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc2l6YWJsZV9Db2x1bW5zIikpOwotCQloZWFkZXJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9JbWFnZXMiKSk7Ci0JCXN1YkltYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YkltYWdlc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViX0ltYWdlcyIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbGluZXNWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRMaW5lc1Zpc2libGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQltdWx0aXBsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJc29ydEluZGljYXRvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCX0KLQkJfSk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q29sdW1uc01vdmVhYmxlICgpOwotCQkJfQotCQl9KTsKLQkJcmVzaXphYmxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q29sdW1uc1Jlc2l6YWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWhlYWRlckltYWdlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1YkltYWdlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWVHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRyZWVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRyZWVHcm91cC5zZXRUZXh0ICgiVHJlZSIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIHRyZWUgKi8KLQkJaW1hZ2VUcmVlR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRyZWVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVfV2l0aF9JbWFnZXMiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DSEVDSzsKLQkJaWYgKGZ1bGxTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuRlVMTF9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCB0cmVlICovCi0JCXRyZWUxID0gbmV3IFRyZWUgKHRyZWVHcm91cCwgc3R5bGUpOwotCQlib29sZWFuIG11bHRpQ29sdW1uID0gbXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlpZiAobXVsdGlDb2x1bW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTEsIFNXVC5OT05FKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJfQotCQkJdHJlZTEuc2V0U29ydENvbHVtbih0cmVlMS5nZXRDb2x1bW4oMCkpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlMSwgU1dULk5PTkUpOwotCQkJc2V0SXRlbVRleHQoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkpKTsKLQkJCWlmIChpIDwgMykgewotCQkJCVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzZXRJdGVtVGV4dChzdWJpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSArICJfMSIpKTsKLQkJCX0KLQkJfQotCQlUcmVlSXRlbSB0cmVlUm9vdHNbXSA9IHRyZWUxLmdldEl0ZW1zICgpOwotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlUm9vdHNbMV0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yIikpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMl8xIikpOwkJCQkJCi0JCXRleHROb2RlMSA9IHRyZWVSb290c1swXTsKLQkJcGFja0NvbHVtbnModHJlZTEpOwotCQl0cnkgewotCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSB0cmVlMS5nZXRDb2x1bW4oMCk7Ci0JCQlyZXNpemFibGVDb2x1bW5zLnNldFNlbGVjdGlvbiAoY29sdW1uLmdldFJlc2l6YWJsZSgpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgdHJlZSAqLwkKLQkJdHJlZTIgPSBuZXcgVHJlZSAoaW1hZ2VUcmVlR3JvdXAsIHN0eWxlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdOwotCQlpZiAobXVsdGlDb2x1bW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5OT05FKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRleHQoY29sdW1uVGl0bGVzW2ldKTsKLQkJCQl0cmVlQ29sdW1uLnNldFRvb2xUaXBUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUb29sdGlwIiwgbmV3IFN0cmluZyBbXSB7Y29sdW1uVGl0bGVzW2ldfSkpOwotCQkJCWlmIChoZWFkZXJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHRyZWVDb2x1bW4uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlMiwgU1dULk5PTkUpOwotCQkJc2V0SXRlbVRleHQoaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkpKTsKLQkJCWlmIChtdWx0aUNvbHVtbiAmJiBzdWJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGorKykgewotCQkJCQlpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJfQotCQkJaWYgKGkgPCAzKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQkJCXNldEl0ZW1UZXh0KHN1Yml0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpICsgIl8xIikpOwotCQkJCWlmIChtdWx0aUNvbHVtbiAmJiBzdWJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCXN1Yml0ZW0uc2V0SW1hZ2UoaiwgaW1hZ2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3ViaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyZWVSb290cyA9IHRyZWUyLmdldEl0ZW1zICgpOwotCQlpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlUm9vdHNbMV0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yIikpOwotCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGorKykgewotCQkJCWl0ZW0uc2V0SW1hZ2UoaiwgaW1hZ2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCX0KLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQlzZXRJdGVtVGV4dChpdGVtLCAxLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8yXzJfMSIpKTsKLQkJaWYgKG11bHRpQ29sdW1uICYmIHN1YkltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl9Ci0JCWltYWdlTm9kZTEgPSB0cmVlUm9vdHNbMF07Ci0JCXBhY2tDb2x1bW5zKHRyZWUyKTsKLQl9Ci0JCi0Jdm9pZCBzZXRJdGVtVGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgaSwgU3RyaW5nIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gaSAlIDM7Ci0JCWlmIChtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRhYmxlRGF0YSBbaW5kZXhdWzBdID0gbm9kZTsKLQkJCWl0ZW0uc2V0VGV4dCAodGFibGVEYXRhIFtpbmRleF0pOwotCQl9IGVsc2UgewotCQkJaXRlbS5zZXRUZXh0IChub2RlKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTaXplR3JvdXAoKTsKLQkKLQkJcGFja0NvbHVtbnNCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5QVVNIKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhY2tfQ29sdW1ucyIpKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFja0NvbHVtbnMgKHRyZWUxKTsKLQkJCQlwYWNrQ29sdW1ucyAodHJlZTIpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQljaGVja0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQnV0dG9uLnNldFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5GVUxMX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJLyogTm90ZTogV2UgZG8gbm90IGJvdGhlciBjb2xsZWN0aW5nIHRoZSB0cmVlIGl0ZW1zCi0JCSAqIGJlY2F1c2UgdHJlZSBpdGVtcyBkb24ndCBoYXZlIGFueSBldmVudHMuIElmIGV2ZW50cwotCQkgKiBhcmUgZXZlciBhZGRlZCB0byBUcmVlSXRlbSwgdGhlbiB0aGlzIG5lZWRzIHRvIGNoYW5nZS4KLQkJICovCi0JCUl0ZW0gW10gY29sdW1uczEgPSB0cmVlMS5nZXRDb2x1bW5zKCk7Ci0JCUl0ZW0gW10gY29sdW1uczIgPSB0cmVlMi5nZXRDb2x1bW5zKCk7Ci0JCUl0ZW0gW10gYWxsSXRlbXMgPSBuZXcgSXRlbSBbY29sdW1uczEubGVuZ3RoICsgY29sdW1uczIubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zMSwgMCwgYWxsSXRlbXMsIDAsIGNvbHVtbnMxLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29sdW1uczIsIDAsIGFsbEl0ZW1zLCBjb2x1bW5zMS5sZW5ndGgsIGNvbHVtbnMyLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dHJlZTEsIHRyZWUyfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJTZWxlY3Rpb24iLCAiVG9vbFRpcFRleHQiLCAiVG9wSXRlbSJ9OwotCX0KLQotCU9iamVjdFtdIHBhcmFtZXRlckZvclR5cGUoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgdmFsdWUsIFdpZGdldCB3aWRnZXQpIHsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0iKSkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCAoKFRyZWUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOyIpKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOwotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlc1tpXSwgKChUcmVlKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJCWlmIChpdGVtID09IG51bGwpIGJyZWFrOwotCQkJCWl0ZW1zW2ldID0gaXRlbTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtc307Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBhcmFtZXRlckZvclR5cGUodHlwZU5hbWUsIHZhbHVlLCB3aWRnZXQpOwotCX0KLQotCVRyZWVJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVHJlZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlKSkgcmV0dXJuIGl0ZW07Ci0JCQlpdGVtID0gZmluZEl0ZW0odmFsdWUsIGl0ZW0uZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gaXRlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJUcmVlIjsKLQl9Ci0KLQl2b2lkIHBhY2tDb2x1bW5zIChUcmVlIHRyZWUpIHsKLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJVHJlZUNvbHVtbiB0cmVlQ29sdW1uID0gdHJlZS5nZXRDb2x1bW4oaSk7Ci0JCQkJdHJlZUNvbHVtbi5wYWNrKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbW92ZWFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zTW92ZWFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IG1vdmVhYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMxID0gdHJlZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMxLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMVtpXS5zZXRNb3ZlYWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zMiA9IHRyZWUyLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zMi5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uczJbaV0uc2V0TW92ZWFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc2l6YWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNSZXNpemFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IHJlc2l6YWJsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zMSA9IHRyZWUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zMS5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uczFbaV0uc2V0UmVzaXphYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMyLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMltpXS5zZXRSZXNpemFibGUoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogQWxzbyBzZXRzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMQotCSAqIFRyZWVJdGVtcyB0byBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCXN1cGVyLnJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaXRlbUZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1Gb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJRm9udCBvbGRGb250ID0gZm9udDsKLQkJaXRlbUZvbnQgPSBudWxsOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWNlbGxCYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkRm9udCA9IGZvbnQ7Ci0JCWNlbGxGb250ID0gbnVsbDsKLQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJfQotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUxLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTIuZ2V0U3R5bGUgKCkgJiBTV1QuQ0hFQ0spICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUxLmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJZnVsbFNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMi5nZXRTdHlsZSAoKSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCk7Ci0JCXRyeSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IHRyZWUxLmdldENvbHVtbigwKTsKLQkJCW1vdmVhYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRNb3ZlYWJsZSgpKTsKLQkJCXJlc2l6YWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uIChjb2x1bW4uZ2V0UmVzaXphYmxlKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cmVlMS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cmVlMS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsQmFja2dyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEJhY2tncm91bmQgKDEsIGNlbGxCYWNrZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRCYWNrZ3JvdW5kICgxLCBjZWxsQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9yZWdyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvcmVncm91bmQgKDEsIGNlbGxGb3JlZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRGb3JlZ3JvdW5kICgxLCBjZWxsRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRGb3JlZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMgaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvbnQgKDEsIGNlbGxGb250KTsKLQkJCWltYWdlTm9kZTEuc2V0Rm9udCAoMSwgY2VsbEZvbnQpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBjZWxsRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGV4dE5vZGUxLmdldEZvbnQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcy4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCQlpbWFnZU5vZGUxLnNldEJhY2tncm91bmQgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0ZXh0Tm9kZTEuZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9yZWdyb3VuZCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvcmVncm91bmQgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IpOwotCQkJaW1hZ2VOb2RlMS5zZXRGb3JlZ3JvdW5kIChpdGVtRm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvcmVncm91bmQgYnV0dG9uJ3MgY29sb3IgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGl0ZW0uICovCi0JCUNvbG9yIGNvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShJVEVNX0ZPUkVHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSBOb2RlIDEgVHJlZUl0ZW1zLgotCSAqLwotCXZvaWQgc2V0SXRlbUZvbnQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRleHROb2RlMS5zZXRGb250IChpdGVtRm9udCk7Ci0JCQlpbWFnZU5vZGUxLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gaXRlbUZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRleHROb2RlMS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldEhlYWRlclZpc2libGUgKGhlYWRlclZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJdHJlZTIuc2V0SGVhZGVyVmlzaWJsZSAoaGVhZGVyVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzb3J0IGluZGljYXRvciBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpIHsKLQkJaWYgKHNvcnRJbmRpY2F0b3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlpbml0aWFsaXplU29ydFN0YXRlICh0cmVlMSk7Ci0JCQlpbml0aWFsaXplU29ydFN0YXRlICh0cmVlMik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldFNvcnRTdGF0ZSAodHJlZTEpOwotCQkJcmVzZXRTb3J0U3RhdGUgKHRyZWUyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsIHNvcnQgaW5kaWNhdG9yIHN0YXRlIGFuZCBhZGRzIGEgbGlzdGVuZXIKLQkgKiB0byBjeWNsZSB0aHJvdWdoIHNvcnQgc3RhdGVzIGFuZCBjb2x1bW5zLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVNvcnRTdGF0ZSAoZmluYWwgVHJlZSB0cmVlKSB7Ci0JCS8qIFJlc2V0IHRvIGtub3duIHN0YXRlOiAnZG93bicgb24gY29sdW1uIDAuICovCi0JCXRyZWUuc2V0U29ydERpcmVjdGlvbiAoU1dULkRPV04pOwotCQlUcmVlQ29sdW1uIFtdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCQlpZiAoaSA9PSAwKSB0cmVlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpbnQgc29ydERpcmVjdGlvbiA9IFNXVC5ET1dOOwotCQkJCQlpZiAoZS53aWRnZXQgPT0gdHJlZS5nZXRTb3J0Q29sdW1uKCkpIHsKLQkJCQkJCS8qIElmIHRoZSBzb3J0IGNvbHVtbiBoYXNuJ3QgY2hhbmdlZCwgY3ljbGUgZG93biAtPiB1cCAtPiBub25lLiAqLwotCQkJCQkJc3dpdGNoICh0cmVlLmdldFNvcnREaXJlY3Rpb24gKCkpIHsKLQkJCQkJCWNhc2UgU1dULkRPV046IHNvcnREaXJlY3Rpb24gPSBTV1QuVVA7IGJyZWFrOwotCQkJCQkJY2FzZSBTV1QuVVA6IHNvcnREaXJlY3Rpb24gPSBTV1QuTk9ORTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cmVlLnNldFNvcnRDb2x1bW4oKFRyZWVDb2x1bW4pZS53aWRnZXQpOwotCQkJCQl9Ci0JCQkJCXRyZWUuc2V0U29ydERpcmVjdGlvbiAoc29ydERpcmVjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQljb2x1bW4uc2V0RGF0YSgiU29ydExpc3RlbmVyIiwgbGlzdGVuZXIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0U29ydFN0YXRlIChmaW5hbCBUcmVlIHRyZWUpIHsKLQkJdHJlZS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuTk9ORSk7Ci0JCVRyZWVDb2x1bW4gW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWNvbHVtbnNbaV0uZ2V0RGF0YSgiU29ydExpc3RlbmVyIik7CS8vJE5PTi1OTFMtMSQKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSBjb2x1bW5zW2ldLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5lcyB2aXNpYmxlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldExpbmVzVmlzaWJsZSAoKSB7Ci0JCXRyZWUxLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXRyZWUyLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lhbFBvcHVwTWVudUl0ZW1zKE1lbnUgbWVudSwgRXZlbnQgZXZlbnQpIHsKLSAgICAJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0gICAgCWl0ZW0uc2V0VGV4dCgiZ2V0SXRlbShQb2ludCkgb24gbW91c2UgY29vcmRpbmF0ZXMiKTsKLSAgICAJZmluYWwgVHJlZSB0ID0gKFRyZWUpIGV2ZW50LndpZGdldDsKLSAgICAJbWVudU1vdXNlQ29vcmRzID0gdC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAJCQlldmVudENvbnNvbGUuYXBwZW5kICgiZ2V0SXRlbShQb2ludCgiICsgbWVudU1vdXNlQ29vcmRzICsgIikpIHJldHVybmVkOiAiICsgdC5nZXRJdGVtKG1lbnVNb3VzZUNvb3JkcykpOwotICAgIAkJCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotICAgIAkJfTsKLSAgICAJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYmFja2dyb3VuZEltYWdlLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JhY2tncm91bmRJbWFnZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzJhZDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYmFja2dyb3VuZEltYWdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTM2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2MzQyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Nsb3NlZEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjBkMGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvY2xvc2VkRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA3MWY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpYy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWNfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjIzNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvb3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OTQzZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9vcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3BhcmVudEJhY2tncm91bmRJbWFnZS5wbmcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9wYXJlbnRCYWNrZ3JvdW5kSW1hZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY1NWM3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3BhcmVudEJhY2tncm91bmRJbWFnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1NjNmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzU5YzA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIxYjNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXRfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YjQ4ZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdGFyZ2V0LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3RhcmdldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDdhZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdGFyZ2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUyOGUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmVfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTVkOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvdy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTljMWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvd19tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvd19tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1OWMwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3dfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvRE5ERXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ROREV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiYTUzYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvRE5ERXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZDsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgRE5ERXhhbXBsZSB7Ci0JCi0JcHJpdmF0ZSBpbnQgZHJhZ09wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBUcmFuc2ZlcltdIGRyYWdUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQlwcml2YXRlIENvbnRyb2wgZHJhZ0NvbnRyb2w7Ci0JcHJpdmF0ZSBpbnQgZHJhZ0NvbnRyb2xUeXBlID0gMDsKLQlwcml2YXRlIERyYWdTb3VyY2UgZHJhZ1NvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YVRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFSVEY7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFIVE1MOwotCXByaXZhdGUgU3RyaW5nW10gZHJhZ0RhdGFGaWxlczsKLQlwcml2YXRlIExpc3QgZmlsZUxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRyYWdFbmFibGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZHJvcE9wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBpbnQgZHJvcEZlZWRiYWNrID0gMDsKLQlwcml2YXRlIGludCBkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IDA7Ci0JcHJpdmF0ZSBUcmFuc2ZlcltdIGRyb3BUeXBlcyA9IG5ldyBUcmFuc2ZlclswXTsKLQlwcml2YXRlIERyb3BUYXJnZXQgZHJvcFRhcmdldDsKLQlwcml2YXRlIENvbnRyb2wgZHJvcENvbnRyb2w7Ci0JcHJpdmF0ZSBpbnQgZHJvcENvbnRyb2xUeXBlID0gMDsKLQlwcml2YXRlIENvbXBvc2l0ZSBkZWZhdWx0UGFyZW50OwotCXByaXZhdGUgYm9vbGVhbiBkcm9wRW5hYmxlZCA9IGZhbHNlOwotCQotCXByaXZhdGUgVGV4dCBkcmFnQ29uc29sZTsKLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0V2ZW50RGV0YWlsID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXh0IGRyb3BDb25zb2xlOwotCXByaXZhdGUgYm9vbGVhbiBkcm9wRXZlbnREZXRhaWwgPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1RPR0dMRSA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9SQURJTyA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9DSEVDSyA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBUyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBQkVMID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVCA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFID0gNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJFRSA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFQgPSA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVFlMRURfVEVYVCA9IDk7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlETkRFeGFtcGxlIGV4YW1wbGUgPSBuZXcgRE5ERXhhbXBsZSgpOwotCWV4YW1wbGUub3BlbihkaXNwbGF5KTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2ZlcltkcmFnVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcmFnVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcmFnVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyYWdUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGFkZERyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JVHJhbnNmZXJbXSBuZXdUeXBlcyA9IG5ldyBUcmFuc2Zlcltkcm9wVHlwZXMubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBkcm9wVHlwZXMubGVuZ3RoKTsKLQluZXdUeXBlc1tkcm9wVHlwZXMubGVuZ3RoXSA9IHRyYW5zZmVyOwotCWRyb3BUeXBlcyA9IG5ld1R5cGVzOwotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdPcGVyYXRpb25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgQnV0dG9uIG1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQltb3ZlQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQltb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9NT1ZFOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCi0JQnV0dG9uIGNvcHlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQljb3B5QnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQljb3B5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfQ09QWTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9DT1BZOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JQnV0dG9uIGxpbmtCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQlsaW5rQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0xJTksiKTsKLQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTElOSzsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiA9IGRyYWdPcGVyYXRpb24gJn5ETkQuRFJPUF9MSU5LOwotCQkJCWlmIChkcmFnT3BlcmF0aW9uID09IDApIHsKLQkJCQkJZHJhZ09wZXJhdGlvbiA9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcmFnRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vaW5pdGlhbGl6ZSBzdGF0ZQotCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWRyYWdPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ1NvdXJjZSgpIHsKLQlpZiAoZHJhZ1NvdXJjZSAhPSBudWxsKSBkcmFnU291cmNlLmRpc3Bvc2UoKTsKLQlkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UoZHJhZ0NvbnRyb2wsIGRyYWdPcGVyYXRpb24pOwotCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIoZHJhZ1R5cGVzKTsKLQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWRyYWdDb25zb2xlLmFwcGVuZCgiPj5kcmFnRmluaXNoZWRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlkcmFnRGF0YVRleHQgPSBkcmFnRGF0YVJURiA9IGRyYWdEYXRhSFRNTCA9IG51bGw7Ci0JCQlkcmFnRGF0YUZpbGVzID0gbnVsbDsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXN3aXRjaChkcmFnQ29udHJvbFR5cGUpIHsKLQkJCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJCWNhc2UgQlVUVE9OX1RPR0dMRToKLQkJCQkJY2FzZSBCVVRUT05fUkFESU86IHsKLQkJCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcmFnQ29udHJvbDsKLQkJCQkJCWIuc2V0VGV4dCgiIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFNUWUxFRF9URVhUOiB7Ci0JCQkJCQlTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dClkcmFnQ29udHJvbDsKLQkJCQkJCXRleHQuaW5zZXJ0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgVEFCTEU6IHsKLQkJCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyYWdDb250cm9sOwotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFRFWFQ6IHsKLQkJCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyYWdDb250cm9sOwotCQkJCQkJdGV4dC5pbnNlcnQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCQlUcmVlIHRyZWUgPSAoVHJlZSlkcmFnQ29udHJvbDsKLQkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCQlkcmFnQ29udHJvbC5zZXREYXRhKCJTVFJJTkdTIiwgbnVsbCk7Ci0JCQkJCQlkcmFnQ29udHJvbC5yZWRyYXcoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTEFCRUw6IHsKLQkJCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyYWdDb250cm9sOwotCQkJCQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIExJU1Q6IHsKLQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyYWdDb250cm9sOwotCQkJCQkJaW50W10gaW5kaWNlcyA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQkJCQkJbGlzdC5yZW1vdmUoaW5kaWNlcyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZHJhZ0NvbnNvbGUuYXBwZW5kKCI+PmRyYWdTZXREYXRhXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFUZXh0OwotCQkJfQotCQkJaWYgKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YVJURjsKLQkJCX0KLQkJCWlmIChIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhSFRNTDsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhRmlsZXM7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlkcmFnQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ1N0YXJ0XG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJZHJhZ0RhdGFGaWxlcyA9IGZpbGVMaXN0LmdldEl0ZW1zKCk7Ci0JCQlzd2l0Y2goZHJhZ0NvbnRyb2xUeXBlKSB7Ci0JCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcmFnQ29udHJvbDsKLQkJCQkJZHJhZ0RhdGFUZXh0ID0gYi5nZXRTZWxlY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNUWUxFRF9URVhUOiB7Ci0JCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgcyA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRBQkxFOiB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyYWdDb250cm9sOwotCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAxICYmIGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEVYVDogewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHMgPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gczsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyYWdDb250cm9sOwotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJCQkJCQlpZiAoaXRlbXMubGVuZ3RoID4gMSAmJiBpIDwgaXRlbXMubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENBTlZBUzogewotCQkJCQlTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKWRyYWdDb250cm9sLmdldERhdGEoIlNUUklOR1MiKTsKLQkJCQkJaWYgKHN0cmluZ3MgPT0gbnVsbCB8fCBzdHJpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzdHJpbmdzW2ldKTsKLQkJCQkJCQlpZiAoc3RyaW5ncy5sZW5ndGggPiAxICYmIGkgPCBzdHJpbmdzLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMQUJFTDogewotCQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IGxhYmVsLmdldFRleHQoKTsKLQkJCQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzdHJpbmc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTElTVDogewotCQkJCQlMaXN0IGxpc3QgPSAoTGlzdClkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nW10gc2VsZWN0aW9uID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChzZWxlY3Rpb25baV0pOwotCQkJCQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMSAmJiBpIDwgc2VsZWN0aW9uLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQpOwotCQkJfQotCQkJaWYgKGRyYWdEYXRhVGV4dCAhPSBudWxsKSB7Ci0JCQkJZHJhZ0RhdGFSVEYgPSAie1xccnRmMXtcXGNvbG9ydGJsO1xccmVkMjU1XFxncmVlbjBcXGJsdWUwO31cXGNmMVxcYiAiK2RyYWdEYXRhVGV4dCsifSI7Ci0JCQkJZHJhZ0RhdGFIVE1MID0gIjxiPiIrZHJhZ0RhdGFUZXh0KyI8L2I+IjsKLQkJCX0KLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcmFnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgVGV4dFRyYW5zZmVyICYmIGRyYWdEYXRhVGV4dCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIFJURlRyYW5zZmVyICYmIGRyYWdEYXRhUlRGID09IG51bGwpIHsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoZHJhZ1R5cGVzW2ldIGluc3RhbmNlb2YgSFRNTFRyYW5zZmVyICYmIGRyYWdEYXRhSFRNTCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIEZpbGVUcmFuc2ZlciAmJiAoZHJhZ0RhdGFGaWxlcyA9PSBudWxsIHx8IGRyYWdEYXRhRmlsZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gdGV4dEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCXRleHRCdXR0b24uc2V0VGV4dCgiVGV4dCBUcmFuc2ZlciIpOwotCXRleHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJSVEYgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiSFRNTCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkZpbGUgVHJhbnNmZXIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiU2VsZWN0IEZpbGUocykiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZmlsZUxpc3QuZ2V0U2hlbGwoKSwgU1dULk9QRU4gfCBTV1QuTVVMVEkpOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCl7Ci0JCQkJZmlsZUxpc3QucmVtb3ZlQWxsKCk7Ci0JCQkJU3RyaW5nIHNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQkJCQlTdHJpbmcgcGF0aCA9IGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCk7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSBkaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlmaWxlTGlzdC5hZGQocGF0aCtzZXBhcmF0b3IrbmFtZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCWZpbGVMaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JZmlsZUxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkvLyBpbml0aWFsaXplIHN0YXRlCi0JdGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYWRkRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQljb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJUb2dnbGUgQnV0dG9uIiwgIlJhZGlvIEJ1dHRvbiIsICJDaGVja2JveCIsICJDYW52YXMiLCAiTGFiZWwiLCAiTGlzdCIsICJUYWJsZSIsICJUcmVlIiwgIlRleHQiLCAiU3R5bGVkVGV4dCJ9KTsKLQljb21iby5zZWxlY3QoTEFCRUwpOwotCWRyYWdDb250cm9sVHlwZSA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JZHJhZ0NvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJhZ0NvbnRyb2xUeXBlLCBwYXJlbnQsICJEcmFnIFNvdXJjZSIpOwotCQotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGRyYWdDb250cm9sLmdldExheW91dERhdGEoKTsKLQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBkcmFnQ29udHJvbC5nZXRQYXJlbnQoKTsKLQkJCWRyYWdDb250cm9sLmRpc3Bvc2UoKTsKLQkJCUNvbWJvIGMgPSAoQ29tYm8pZS53aWRnZXQ7IAotCQkJZHJhZ0NvbnRyb2xUeXBlID0gYy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZHJhZ0NvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJhZ0NvbnRyb2xUeXBlLCBwYXJlbnQsICJEcmFnIFNvdXJjZSIpOwotCQkJZHJhZ0NvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWlmIChkcmFnRW5hYmxlZCkgY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJcGFyZW50LmxheW91dCgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRyYWdTb3VyY2UiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlkcmFnRW5hYmxlZCA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoZHJhZ0VuYWJsZWQpIHsKLQkJCQljcmVhdGVEcmFnU291cmNlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcmFnU291cmNlICE9IG51bGwpewotCQkJCQlkcmFnU291cmNlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJZHJhZ1NvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQlkcmFnRW5hYmxlZCA9IHRydWU7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRyYWdDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIDEwKTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcm9wT3BlcmF0aW9ucyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCWZpbmFsIEJ1dHRvbiBtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JbW92ZUJ1dHRvbi5zZXRUZXh0KCJETkQuRFJPUF9NT1ZFIik7Ci0JbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX01PVkU7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX01PVkU7Ci0JCQkJaWYgKGRyb3BPcGVyYXRpb24gPT0gMCB8fCAoZHJvcERlZmF1bHRPcGVyYXRpb24gJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSB7Ci0JCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0KLQlmaW5hbCBCdXR0b24gY29weUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWNvcHlCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfQ09QWSIpOwotCWNvcHlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9DT1BZOwotCQkJCWlmIChkcm9wT3BlcmF0aW9uID09IDAgfHwgKGRyb3BEZWZhdWx0T3BlcmF0aW9uICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlmaW5hbCBCdXR0b24gbGlua0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWxpbmtCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9MSU5LOwotCQkJCWlmIChkcm9wT3BlcmF0aW9uID09IDAgfHwgKGRyb3BEZWZhdWx0T3BlcmF0aW9uICYgRE5ELkRST1BfTElOSykgIT0gMCkgewotCQkJCQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfTElOSzsKLQkJCQkJbGlua0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0RFRkFVTFQiKTsKLQlkZWZhdWx0UGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfREVGQVVMVDsKLQkJCQlkZWZhdWx0UGFyZW50LnNldFZpc2libGUodHJ1ZSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BPcGVyYXRpb24gPSBkcm9wT3BlcmF0aW9uICYgfkRORC5EUk9QX0RFRkFVTFQ7Ci0JCQkJZGVmYXVsdFBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWRlZmF1bHRQYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IDIwOwotCWRlZmF1bHRQYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGVmYXVsdFBhcmVudCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlZhbHVlIGZvciBkZWZhdWx0IG9wZXJhdGlvbiBpczoiKTsKLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTU9WRSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9NT1ZFOwotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTU9WRTsKLQkJCQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9DT1BZIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwotCQkJCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0KLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9MSU5LOwotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTElOSzsKLQkJCQlsaW5rQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKGRlZmF1bHRQYXJlbnQsIFNXVC5SQURJTyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9OT05FIik7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRGVmYXVsdE9wZXJhdGlvbiA9IERORC5EUk9QX05PTkU7Ci0JCQkJZHJvcE9wZXJhdGlvbiAmPSB+RE5ELkRST1BfREVGQVVMVDsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgc3RhdGUKLQltb3ZlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQljb3B5QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlsaW5rQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlkcm9wT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJvcFRhcmdldCgpIHsKLQlpZiAoZHJvcFRhcmdldCAhPSBudWxsKSBkcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQlkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZHJvcENvbnRyb2wsIGRyb3BPcGVyYXRpb24pOwotCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZHJvcFR5cGVzKTsKLQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ0VudGVyXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gZHJvcERlZmF1bHRPcGVyYXRpb247Ci0JCQl9Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyb3BGZWVkYmFjazsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ0xlYXZlXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdPcGVyYXRpb25DaGFuZ2VkXG4iKTsKLQkJCXByaW50RXZlbnQoZXZlbnQpOwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gZHJvcERlZmF1bHRPcGVyYXRpb247Ci0JCQl9Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyb3BGZWVkYmFjazsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnT3ZlclxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJvcEZlZWRiYWNrOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJvcFxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBudWxsOwotCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8Ci0JCQkgICAgUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fAotCQkJICAgIEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkgICAgc3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7KFN0cmluZylldmVudC5kYXRhfTsKLQkJCX0KLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCXN0cmluZ3MgPSAoU3RyaW5nW10pZXZlbnQuZGF0YTsKLQkJCX0KLQkJCWlmIChzdHJpbmdzID09IG51bGwgfHwgc3RyaW5ncy5sZW5ndGggPT0gMCkgewotCQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiISFJbnZhbGlkIGRhdGEgZHJvcHBlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKHN0cmluZ3MubGVuZ3RoID09IDEgJiYgKGRyb3BDb250cm9sVHlwZSA9PSBUQUJMRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gVFJFRSB8fCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wQ29udHJvbFR5cGUgPT0gTElTVCkpIHsKLQkJCQkvLyBjb252ZXJ0IHN0cmluZyBzZXBhcmF0ZWQgYnkgIlxuIiBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MgCi0JCQkJU3RyaW5nIHN0cmluZyA9IHN0cmluZ3NbMF07Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlpbnQgb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgMCk7Ci0JCQkJd2hpbGUgKG9mZnNldCA+IDApIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJb2Zmc2V0ID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgb2Zmc2V0ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQkJc3RyaW5ncyA9IG5ldyBTdHJpbmdbY291bnQgKyAxXTsKLQkJCQkJaW50IHN0YXJ0ID0gMDsKLQkJCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKCJcbiIpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCQkJCXN0cmluZ3NbaW5kZXgrK10gPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCQkJc3RhcnQgPSBlbmQgKyAxOwotCQkJCQkJZW5kID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgc3RhcnQpOwotCQkJCQkJaWYgKGVuZCA9PSAtMSkgZW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoKGRyb3BDb250cm9sVHlwZSkgewotCQkJCWNhc2UgQlVUVE9OX0NIRUNLOgotCQkJCWNhc2UgQlVUVE9OX1RPR0dMRToKLQkJCQljYXNlIEJVVFRPTl9SQURJTzogewotCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZHJvcENvbnRyb2w7Ci0JCQkJCWIuc2V0VGV4dChzdHJpbmdzWzBdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1RZTEVEX1RFWFQ6IHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpZHJvcENvbnRyb2w7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0ZXh0Lmluc2VydChzdHJpbmdzW2ldKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUQUJMRTogewotCQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSlkcm9wQ29udHJvbDsKLQkJCQkJUG9pbnQgcCA9IGV2ZW50LmRpc3BsYXkubWFwKG51bGwsIHRhYmxlLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJVGFibGVJdGVtIGRyb3BJdGVtID0gdGFibGUuZ2V0SXRlbShwKTsKLQkJCQkJaW50IGluZGV4ID0gZHJvcEl0ZW0gPT0gbnVsbCA/IHRhYmxlLmdldEl0ZW1Db3VudCgpIDogdGFibGUuaW5kZXhPZihkcm9wSXRlbSk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMCwgc3RyaW5nc1tpXSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoMSwgImRyb3BwZWQgaXRlbSIpOwotCQkJCQl9Ci0JCQkJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQljb2x1bW5zW2ldLnBhY2soKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBURVhUOiB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJdGV4dC5hcHBlbmQoc3RyaW5nc1tpXSsiXG4iKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBUUkVFOiB7Ci0JCQkJCVRyZWUgdHJlZSA9IChUcmVlKWRyb3BDb250cm9sOwotCQkJCQlQb2ludCBwID0gZXZlbnQuZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSB0cmVlLmdldEl0ZW0ocCk7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlUcmVlSXRlbSBpdGVtID0gcGFyZW50SXRlbSAhPSBudWxsID8gbmV3IFRyZWVJdGVtKHBhcmVudEl0ZW0sIFNXVC5OT05FKSA6IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJCQlpdGVtLnNldFRleHQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCWRyb3BDb250cm9sLnNldERhdGEoIlNUUklOR1MiLCBzdHJpbmdzKTsKLQkJCQkJZHJvcENvbnRyb2wucmVkcmF3KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyb3BDb250cm9sOwotCQkJCQlsYWJlbC5zZXRUZXh0KHN0cmluZ3NbMF0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyb3BDb250cm9sOwotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJbGlzdC5hZGQoc3RyaW5nc1tpXSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBTV1RFcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVEKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyb3BBY2NlcHRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUZlZWRiYWNrVHlwZXMoR3JvdXAgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TRUxFQ1QiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0VMRUNUOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TQ1JPTEwiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0NST0xMOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQkVGT1JFIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BGZWVkYmFjayAmPSB+RE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQUZURVIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19FWFBBTkQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19FWFBBTkQ7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiB0ZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JdGV4dEJ1dHRvbi5zZXRUZXh0KCJUZXh0IFRyYW5zZmVyIik7Ci0JdGV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlJURiBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJIVE1MIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRmlsZSBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJvcFRyYW5zZmVyKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgc3RhdGUKLQl0ZXh0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhZGREcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJvcFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IlRvZ2dsZSBCdXR0b24iLCAiUmFkaW8gQnV0dG9uIiwgIkNoZWNrYm94IiwgIkNhbnZhcyIsICJMYWJlbCIsICJMaXN0IiwgIlRhYmxlIiwgIlRyZWUiLCAiVGV4dCIsICJTdHlsZWRUZXh0In0pOwotCWNvbWJvLnNlbGVjdChMQUJFTCk7Ci0JZHJvcENvbnRyb2xUeXBlID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQlkcm9wQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcm9wQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyb3AgVGFyZ2V0Iik7Ci0JY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBkYXRhID0gZHJvcENvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCQkJQ29tcG9zaXRlIHBhcmVudCA9IGRyb3BDb250cm9sLmdldFBhcmVudCgpOwotCQkJZHJvcENvbnRyb2wuZGlzcG9zZSgpOwotCQkJQ29tYm8gYyA9IChDb21ibyllLndpZGdldDsKLQkJCWRyb3BDb250cm9sVHlwZSA9IGMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsgCi0JCQlkcm9wQ29udHJvbCA9IGNyZWF0ZVdpZGdldChkcm9wQ29udHJvbFR5cGUsIHBhcmVudCwgIkRyb3AgVGFyZ2V0Iik7Ci0JCQlkcm9wQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJaWYgKGRyb3BFbmFibGVkKSBjcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQlwYXJlbnQubGF5b3V0KCk7Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiRHJvcFRhcmdldCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWRyb3BFbmFibGVkID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCl7Ci0JCQkJCWRyb3BUYXJnZXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlkcm9wVGFyZ2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0pOwotCS8vIGluaXRpYWxpemUgc3RhdGUKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQlkcm9wRW5hYmxlZCA9IHRydWU7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ibywgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRyb3BDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIDEwKTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci19Ci0KLXByaXZhdGUgQ29udHJvbCBjcmVhdGVXaWRnZXQoaW50IHR5cGUsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgpewotCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEJVVFRPTl9DSEVDSzogewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJYnV0dG9uLnNldFRleHQocHJlZml4KyIgQ2hlY2sgYm94Iik7Ci0JCQlyZXR1cm4gYnV0dG9uOwotCQl9Ci0JCWNhc2UgQlVUVE9OX1RPR0dMRTogewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuVE9HR0xFKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHByZWZpeCsiIFRvZ2dsZSBidXR0b24iKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQkJY2FzZSBCVVRUT05fUkFESU86IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHByZWZpeCsiIFJhZGlvIGJ1dHRvbiIpOwotCQkJcmV0dXJuIGJ1dHRvbjsKLQkJfQotCQljYXNlIFNUWUxFRF9URVhUOiB7Ci0JCQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJdGV4dC5zZXRUZXh0KHByZWZpeCsiIFN0eWxlZCBUZXh0Iik7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQljYXNlIFRBQkxFOiB7Ci0JCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkJCWNvbHVtbjAuc2V0VGV4dCgiTmFtZSIpOwotCQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hUKTsKLQkJCWNvbHVtbjEuc2V0VGV4dCgiVmFsdWUiKTsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQkJY29sdW1uMi5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDAsIHByZWZpeCsiIG5hbWUgIitpKTsKLQkJCQlpdGVtLnNldFRleHQoMSwgcHJlZml4KyIgdmFsdWUgIitpKTsKLQkJCQlpdGVtLnNldFRleHQoMiwgcHJlZml4KyIgZGVzY3JpcHRpb24gIitpKTsKLQkJCX0KLQkJCWNvbHVtbjAucGFjaygpOwotCQkJY29sdW1uMS5wYWNrKCk7Ci0JCQljb2x1bW4yLnBhY2soKTsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCQljYXNlIFRFWFQ6IHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQl0ZXh0LnNldFRleHQocHJlZml4KyIgVGV4dCIpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJY2FzZSBUUkVFOiB7Ci0JCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQkJY29sdW1uMC5zZXRUZXh0KCJOYW1lIik7Ci0JCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQkJY29sdW1uMS5zZXRUZXh0KCJWYWx1ZSIpOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCQljb2x1bW4yLnNldFRleHQoIkRlc2NyaXB0aW9uIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHByZWZpeCsiIHZhbHVlICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCXN1Ykl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIraSsiICIraik7Ci0JCQkJCXN1Ykl0ZW0uc2V0VGV4dCgxLCBwcmVmaXgrIiB2YWx1ZSAiK2krIiAiK2opOwotCQkJCQlzdWJJdGVtLnNldFRleHQoMiwgcHJlZml4KyIgZGVzY3JpcHRpb24gIitpKyIgIitqKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLQkJCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDAsIHByZWZpeCsiIG5hbWUgIitpKyIgIitqKyIgIitrKTsKLQkJCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgxLCBwcmVmaXgrIiB2YWx1ZSAiK2krIiAiK2orIiAiK2spOwotCQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSsiICIraisiICIrayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb2x1bW4wLnBhY2soKTsKLQkJCWNvbHVtbjEucGFjaygpOwotCQkJY29sdW1uMi5wYWNrKCk7Ci0JCQlyZXR1cm4gdHJlZTsKLQkJfQotCQljYXNlIENBTlZBUzogewotCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWNhbnZhcy5zZXREYXRhKCJTVFJJTkdTIiwgbmV3IFN0cmluZ1tdIHtwcmVmaXgrIiBDYW52YXMgd2lkZ2V0In0pOwotCQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCQlDYW52YXMgYyA9IChDYW52YXMpZS53aWRnZXQ7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKWMuZ2V0RGF0YSgiSU1BR0UiKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCA1LCA1KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSAoU3RyaW5nW10pYy5nZXREYXRhKCJTVFJJTkdTIik7Ci0JCQkJCQlpZiAoc3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGUuZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJCQkJCQlpbnQgaGVpZ2h0ID0gbWV0cmljcy5nZXRIZWlnaHQoKTsKLQkJCQkJCQlpbnQgeSA9IDU7Ci0JCQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJZS5nYy5kcmF3U3RyaW5nKHN0cmluZ3NbaV0sIDUsIHkpOwotCQkJCQkJCQl5ICs9IGhlaWdodCArIDU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gY2FudmFzOwotCQl9Ci0JCWNhc2UgTEFCRUw6IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlsYWJlbC5zZXRUZXh0KHByZWZpeCsiIExhYmVsIik7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQkJY2FzZSBMSVNUOiB7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJbGlzdC5zZXRJdGVtcyhuZXcgU3RyaW5nW10ge3ByZWZpeCsiIEl0ZW0gYSIsIHByZWZpeCsiIEl0ZW0gYiIsICBwcmVmaXgrIiBJdGVtIGMiLCAgcHJlZml4KyIgSXRlbSBkIn0pOwotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBTV1RFcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVEKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiRHJhZyBhbmQgRHJvcCBFeGFtcGxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7Ci0Jc2Muc2V0Q29udGVudChwYXJlbnQpOwotCXBhcmVudC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCi0JTGFiZWwgZHJhZ0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCWRyYWdMYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZToiKTsKLQkKLQlHcm91cCBkcmFnV2lkZ2V0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JZHJhZ1dpZGdldEdyb3VwLnNldFRleHQoIldpZGdldCIpOwotCWNyZWF0ZURyYWdXaWRnZXQoZHJhZ1dpZGdldEdyb3VwKTsKLQkKLQlDb21wb3NpdGUgY0xlZnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNMZWZ0LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCUdyb3VwIGRyYWdPcGVyYXRpb25zR3JvdXAgPSBuZXcgR3JvdXAoY0xlZnQsIFNXVC5OT05FKTsKLQlkcmFnT3BlcmF0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JZHJhZ09wZXJhdGlvbnNHcm91cC5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbihzKToiKTsKLQljcmVhdGVEcmFnT3BlcmF0aW9ucyhkcmFnT3BlcmF0aW9uc0dyb3VwKTsKLQkKLQlHcm91cCBkcmFnVHlwZXNHcm91cCA9IG5ldyBHcm91cChjTGVmdCwgU1dULk5PTkUpOwotCWRyYWdUeXBlc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCWRyYWdUeXBlc0dyb3VwLnNldFRleHQoIlRyYW5zZmVyIFR5cGUocyk6Iik7Ci0JY3JlYXRlRHJhZ1R5cGVzKGRyYWdUeXBlc0dyb3VwKTsKLQkKLQlkcmFnQ29uc29sZSA9IG5ldyBUZXh0KGNMZWZ0LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUiB8U1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJKTsKLQlkcmFnQ29uc29sZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJDbGVhciIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWRyYWdDb25zb2xlLnNldFRleHQoIiIpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNIRUNLKTsKLQlpdGVtLnNldFRleHQgKCJTaG93IEV2ZW50IGRldGFpbCIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQlkcmFnRXZlbnREZXRhaWwgPSBpdGVtLmdldFNlbGVjdGlvbigpOwotCQl9Ci0JfSk7Ci0JZHJhZ0NvbnNvbGUuc2V0TWVudShtZW51KTsKLQkKLQlMYWJlbCBkcm9wTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JZHJvcExhYmVsLnNldFRleHQoIkRyb3AgVGFyZ2V0OiIpOwotCQotCUdyb3VwIGRyb3BXaWRnZXRHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQlkcm9wV2lkZ2V0R3JvdXAuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JY3JlYXRlRHJvcFdpZGdldChkcm9wV2lkZ2V0R3JvdXApOwotCQotCUNvbXBvc2l0ZSBjUmlnaHQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNSaWdodC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlHcm91cCBkcm9wT3BlcmF0aW9uc0dyb3VwID0gbmV3IEdyb3VwKGNSaWdodCwgU1dULk5PTkUpOwotCWRyb3BPcGVyYXRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UsIDEsIDIpKTsKLQlkcm9wT3BlcmF0aW9uc0dyb3VwLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9uKHMpOiIpOwotCWNyZWF0ZURyb3BPcGVyYXRpb25zKGRyb3BPcGVyYXRpb25zR3JvdXApOwotCQotCUdyb3VwIGRyb3BUeXBlc0dyb3VwID0gbmV3IEdyb3VwKGNSaWdodCwgU1dULk5PTkUpOwotCWRyb3BUeXBlc0dyb3VwLnNldFRleHQoIlRyYW5zZmVyIFR5cGUocyk6Iik7Ci0JY3JlYXRlRHJvcFR5cGVzKGRyb3BUeXBlc0dyb3VwKTsKLQkKLQlHcm91cCBmZWVkYmFja1R5cGVzR3JvdXAgPSBuZXcgR3JvdXAoY1JpZ2h0LCBTV1QuTk9ORSk7Ci0JZmVlZGJhY2tUeXBlc0dyb3VwLnNldFRleHQoIkZlZWRiYWNrIFR5cGUocyk6Iik7Ci0JY3JlYXRlRmVlZGJhY2tUeXBlcyhmZWVkYmFja1R5cGVzR3JvdXApOwotCQotCWRyb3BDb25zb2xlID0gbmV3IFRleHQoY1JpZ2h0LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUiB8U1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJKTsKLQlkcm9wQ29uc29sZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQltZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiQ2xlYXIiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlkcm9wQ29uc29sZS5zZXRUZXh0KCIiKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0JaXRlbS5zZXRUZXh0ICgiU2hvdyBFdmVudCBkZXRhaWwiKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKWUud2lkZ2V0OwotCQkJZHJvcEV2ZW50RGV0YWlsID0gaXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCX0pOwotCWRyb3BDb25zb2xlLnNldE1lbnUobWVudSk7Ci0JCi0JaWYgKGRyYWdFbmFibGVkKSBjcmVhdGVEcmFnU291cmNlKCk7Ci0JaWYgKGRyb3BFbmFibGVkKSBjcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCi0JaW50IGhlaWdodCA9IDIwMDsKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZHJhZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyYWdMYWJlbCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgLTEwKTsKLQlkYXRhLmhlaWdodCA9IGhlaWdodDsKLQlkcmFnV2lkZ2V0R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJhZ1dpZGdldEdyb3VwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAtMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQljTGVmdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xlZnQsIDEwKTsKLQlkcm9wTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJvcExhYmVsLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMZWZ0LCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5oZWlnaHQgPSBoZWlnaHQ7Ci0JZHJvcFdpZGdldEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRyb3BXaWRnZXRHcm91cCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGVmdCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQljUmlnaHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0Jc2Muc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0Jc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlSZWN0YW5nbGUgbW9uaXRvckFyZWEgPSBzaGVsbC5nZXRNb25pdG9yKCkuZ2V0Q2xpZW50QXJlYSgpOwotCXNoZWxsLnNldFNpemUoTWF0aC5taW4oc2l6ZS54LCBtb25pdG9yQXJlYS53aWR0aCAtIDIwKSwgTWF0aC5taW4oc2l6ZS55LCBtb25pdG9yQXJlYS5oZWlnaHQgLSAyMCkpOwotCXNoZWxsLm9wZW4oKTsKLQkJCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0JCi19Ci0KLXByaXZhdGUgdm9pZCBwcmludEV2ZW50KERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JaWYgKCFkcmFnRXZlbnREZXRhaWwpIHJldHVybjsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0Jc2IuYXBwZW5kKCJ3aWRnZXQ6ICIpOyBzYi5hcHBlbmQoZS53aWRnZXQpOwotCXNiLmFwcGVuZCgiLCB0aW1lOiAiKTsgc2IuYXBwZW5kKGUudGltZSk7Ci0Jc2IuYXBwZW5kKCIsIG9wZXJhdGlvbjogIik7IHNiLmFwcGVuZChlLmRldGFpbCk7Ci0Jc2IuYXBwZW5kKCIsIHR5cGU6ICIpOyBzYi5hcHBlbmQoZS5kYXRhVHlwZSAhPSBudWxsID8gZS5kYXRhVHlwZS50eXBlIDogMCk7Ci0Jc2IuYXBwZW5kKCIsIGRvaXQ6ICIpOyBzYi5hcHBlbmQoZS5kb2l0KTsKLQlzYi5hcHBlbmQoIiwgZGF0YTogIik7IHNiLmFwcGVuZChlLmRhdGEpOwotCXNiLmFwcGVuZCgiXG4iKTsKLQlkcmFnQ29uc29sZS5hcHBlbmQoc2IudG9TdHJpbmcoKSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBwcmludEV2ZW50KERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JaWYgKCFkcm9wRXZlbnREZXRhaWwpIHJldHVybjsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0Jc2IuYXBwZW5kKCJ3aWRnZXQ7ICIpOyBzYi5hcHBlbmQoZS53aWRnZXQpOwotCXNiLmFwcGVuZCgiLCB0aW1lOiAiKTsgc2IuYXBwZW5kKGUudGltZSk7Ci0Jc2IuYXBwZW5kKCIsIHg6ICIpOyBzYi5hcHBlbmQoZS54KTsKLQlzYi5hcHBlbmQoIiwgeTogIik7IHNiLmFwcGVuZChlLnkpOwotCXNiLmFwcGVuZCgiLCBpdGVtOiAiKTsgc2IuYXBwZW5kKGUuaXRlbSk7Ci0Jc2IuYXBwZW5kKCIsIG9wZXJhdGlvbnM6ICIpOyBzYi5hcHBlbmQoZS5vcGVyYXRpb25zKTsKLQlzYi5hcHBlbmQoIiwgb3BlcmF0aW9uOiAiKTsgc2IuYXBwZW5kKGUuZGV0YWlsKTsKLQlzYi5hcHBlbmQoIiwgZmVlZGJhY2s6ICIpOyBzYi5hcHBlbmQoZS5mZWVkYmFjayk7Ci0JaWYgKGUuZGF0YVR5cGVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlLmRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKCIsIGRhdGFUeXBlICIpOyBzYi5hcHBlbmQoaSk7IHNiLmFwcGVuZCgiOiAiKTsgc2IuYXBwZW5kKGUuZGF0YVR5cGVzW2ldLnR5cGUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2IuYXBwZW5kKCIsIGRhdGFUeXBlczogbm9uZSIpOwotCX0KLQlzYi5hcHBlbmQoIiwgY3VycmVudERhdGFUeXBlOiAiKTsgc2IuYXBwZW5kKGUuY3VycmVudERhdGFUeXBlKTsKLQlzYi5hcHBlbmQoIiwgZGF0YTogIik7IHNiLmFwcGVuZChlLmRhdGEpOwotCXNiLmFwcGVuZCgiXG4iKTsKLQlkcm9wQ29uc29sZS5hcHBlbmQoc2IudG9TdHJpbmcoKSk7Ci19Ci0KLXByaXZhdGUgdm9pZCByZW1vdmVEcmFnVHJhbnNmZXIoVHJhbnNmZXIgdHJhbnNmZXIpewotCWlmIChkcmFnVHlwZXMubGVuZ3RoID09IDEpIHsKLQkJZHJhZ1R5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCX0gZWxzZSB7Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgZHJhZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZHJhZ1R5cGVzW2ldID09IHRyYW5zZmVyKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2RyYWdUeXBlcy5sZW5ndGggLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZHJhZ1R5cGVzLCBpbmRleCArIDEsIG5ld1R5cGVzLCBpbmRleCwgZHJhZ1R5cGVzLmxlbmd0aCAtIGluZGV4IC0gMSk7Ci0JCWRyYWdUeXBlcyA9IG5ld1R5cGVzOwotCX0KLQlpZiAoZHJhZ1NvdXJjZSAhPSBudWxsKSB7Ci0JCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIoZHJhZ1R5cGVzKTsKLQl9Ci19Ci0KLXByaXZhdGUgdm9pZCByZW1vdmVEcm9wVHJhbnNmZXIoVHJhbnNmZXIgdHJhbnNmZXIpewotCWlmIChkcm9wVHlwZXMubGVuZ3RoID09IDEpIHsKLQkJZHJvcFR5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCX0gZWxzZSB7Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgZHJvcFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZHJvcFR5cGVzW2ldID09IHRyYW5zZmVyKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2Ryb3BUeXBlcy5sZW5ndGggLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZHJvcFR5cGVzLCBpbmRleCArIDEsIG5ld1R5cGVzLCBpbmRleCwgZHJvcFR5cGVzLmxlbmd0aCAtIGluZGV4IC0gMSk7Ci0JCWRyb3BUeXBlcyA9IG5ld1R5cGVzOwotCX0KLQlpZiAoZHJvcFRhcmdldCAhPSBudWxsKSB7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZHJvcFR5cGVzKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvSW1hZ2VUcmFuc2Zlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ltYWdlVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmN2VkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvSW1hZ2VUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQ7Ci0KLSAKLS8qKgotICogVHJhbnNmZXIgdHlwZSB0byB0cmFuc2ZlciBTV1QgSW1hZ2VEYXRhIG9iamVjdHMuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFTkFNRSA9ICJpbWFnZWRhdGEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFSUQgPSByZWdpc3RlclR5cGUoVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIEltYWdlVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IEltYWdlVHJhbnNmZXIoKTsKLQotcHVibGljIHN0YXRpYyBJbWFnZVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotCi1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoIWNoZWNrSW1hZ2Uob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCX0KLQlJbWFnZURhdGEgaW1kYXRhID0gKEltYWdlRGF0YSlvYmplY3Q7Ci0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YSBbXSB7aW1kYXRhfTsKLQkJbG9hZGVyLnNhdmUod3JpdGVPdXQsIFNXVC5JTUFHRV9CTVApOwotCQl3cml0ZU91dC5jbG9zZSgpOwotCQlieXRlW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JCW91dC5jbG9zZSgpOwotCX0gCi0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsJCi0JaWYgKCFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgcmV0dXJuIG51bGw7Ci0JCQotCWJ5dGVbXSBidWZmZXIgPSAoYnl0ZVtdKXN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpOwotCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JSW1hZ2VEYXRhIGltZGF0YTsKLQl0cnkgewotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCWltZGF0YSA9IG5ldyBJbWFnZURhdGEocmVhZEluKTsKLQkJcmVhZEluLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBpbWRhdGE7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCl7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXXtUWVBFTkFNRX07Ci19Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCXJldHVybiBuZXcgaW50W10ge1RZUEVJRH07Ci19Ci1ib29sZWFuIGNoZWNrSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCXJldHVybiAob2JqZWN0ICE9IG51bGwgICYmIG9iamVjdCBpbnN0YW5jZW9mIEltYWdlRGF0YSk7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrSW1hZ2Uob2JqZWN0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvRmlsZVZpZXdlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1NDViZDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBGaWxlIFZpZXdlciBleGFtcGxlCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVmlld2VyIHsgCi0gCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19maWxldmlld2VyIik7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFJJVkVfQSA9ICJhOiIgKyBGaWxlLnNlcGFyYXRvcjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFJJVkVfQiA9ICJiOiIgKyBGaWxlLnNlcGFyYXRvcjsKLQotCS8qIFVJIGVsZW1lbnRzICovIAkKLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheTsgCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFRvb2xCYXIgdG9vbEJhcjsKLQotCXByaXZhdGUgTGFiZWwgbnVtT2JqZWN0c0xhYmVsOwotCXByaXZhdGUgTGFiZWwgZGlza1NwYWNlTGFiZWw7Ci0JCi0JcHJpdmF0ZSBGaWxlIGN1cnJlbnREaXJlY3RvcnkgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsID0gdHJ1ZTsKLQkKLQkvKiBEcmFnIGFuZCBkcm9wIG9wdGltaXphdGlvbnMgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBpZiB0aGlzIGFwcCBpcyBkcmFnZ2luZwotCXByaXZhdGUgYm9vbGVhbiBpc0Ryb3BwaW5nID0gZmFsc2U7IC8vIGlmIHRoaXMgYXBwIGlzIGRyb3BwaW5nCi0KLQlwcml2YXRlIEZpbGVbXSAgcHJvY2Vzc2VkRHJvcEZpbGVzID0gbnVsbDsgLy8gc28gRHJhZyBvbmx5IGRlbGV0ZXMgd2hhdCBpdCBuZWVkcyB0bwotCXByaXZhdGUgRmlsZVtdICBkZWZlcnJlZFJlZnJlc2hGaWxlcyA9IG51bGw7ICAgICAgLy8gdG8gZGVmZXIgbm90aWZ5UmVmcmVzaEZpbGVzIHdoaWxlIHdlIGRvIERORAotCXByaXZhdGUgYm9vbGVhbiBkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQgPSBmYWxzZTsgLy8gdG8gZGVmZXIgbm90aWZ5UmVmcmVzaEZpbGVzIHdoaWxlIHdlIGRvIERORAotCXByaXZhdGUgUHJvZ3Jlc3NEaWFsb2cgcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOyAvLyBwcm9ncmVzcyBkaWFsb2cgZm9yIGxvY2FsbHktaW5pdGlhdGVkIG9wZXJhdGlvbnMKLQotCS8qIENvbWJvIHZpZXcgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQk9EQVRBX1JPT1RTID0gIkNvbWJvLnJvb3RzIjsKLQkJLy8gRmlsZVtdOiBBcnJheSBvZiBmaWxlcyB3aG9zZSBwYXRocyBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgY29tYm8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQk9EQVRBX0xBU1RURVhUID0gIkNvbWJvLmxhc3RUZXh0IjsKLQkJLy8gU3RyaW5nOiBQcmV2aW91cyBzZWxlY3Rpb24gdGV4dCBzdHJpbmcKLQotCXByaXZhdGUgQ29tYm8gY29tYm87Ci0KLQkvKiBUcmVlIHZpZXcgKi8KLQlwcml2YXRlIEljb25DYWNoZSBpY29uQ2FjaGUgPSBuZXcgSWNvbkNhY2hlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVJVEVNREFUQV9GSUxFID0gIlRyZWVJdGVtLmZpbGUiOwotCQkvLyBGaWxlOiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0cmVlIGl0ZW0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRUlURU1EQVRBX0lNQUdFRVhQQU5ERUQgPSAiVHJlZUl0ZW0uaW1hZ2VFeHBhbmRlZCI7Ci0JCS8vIEltYWdlOiBzaG93biB3aGVuIGl0ZW0gaXMgZXhwYW5kZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VEID0gIlRyZWVJdGVtLmltYWdlQ29sbGFwc2VkIjsKLQkJLy8gSW1hZ2U6IHNob3duIHdoZW4gaXRlbSBpcyBjb2xsYXBzZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRUlURU1EQVRBX1NUVUIgPSAiVHJlZUl0ZW0uc3R1YiI7Ci0JCS8vIE9iamVjdDogaWYgbm90IHByZXNlbnQgb3IgbnVsbCB0aGVuIHRoZSBpdGVtIGhhcyBub3QgYmVlbiBwb3B1bGF0ZWQKLQotCXByaXZhdGUgVHJlZSB0cmVlOwotCXByaXZhdGUgTGFiZWwgdHJlZVNjb3BlTGFiZWw7Ci0KLQkvKiBUYWJsZSB2aWV3ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKAotCQlEYXRlRm9ybWF0Lk1FRElVTSwgRGF0ZUZvcm1hdC5NRURJVU0pOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRUlURU1EQVRBX0ZJTEUgPSAiVGFibGVJdGVtLmZpbGUiOwotCQkvLyBGaWxlOiBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0YWJsZSByb3cKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVEQVRBX0RJUiA9ICJUYWJsZS5kaXIiOwotCQkvLyBGaWxlOiBDdXJyZW50bHkgdmlzaWJsZSBkaXJlY3RvcnkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSB0YWJsZVdpZHRocyA9IG5ldyBpbnRbXSB7MTUwLCA2MCwgNzUsIDE1MH07Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSB0YWJsZVRpdGxlcyA9IG5ldyBTdHJpbmcgW10gewotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5OYW1lLnRpdGxlIiksCi0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLlNpemUudGl0bGUiKSwKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuVHlwZS50aXRsZSIpLAotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5Nb2RpZmllZC50aXRsZSIpCi0JfTsKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgTGFiZWwgdGFibGVDb250ZW50c09mTGFiZWw7Ci0KLQkvKiBUYWJsZSB1cGRhdGUgd29ya2VyICovCi0JLy8gQ29udHJvbCBkYXRhCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgd29ya2VyTG9jayA9IG5ldyBPYmplY3QoKTsKLQkJLy8gTG9jayBmb3IgYWxsIHdvcmtlciBjb250cm9sIGRhdGEgYW5kIHN0YXRlCi0JcHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWQgIHdvcmtlclRocmVhZCA9IG51bGw7Ci0JCS8vIFRoZSB3b3JrZXIncyB0aHJlYWQKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gd29ya2VyU3RvcHBlZCA9IGZhbHNlOwotCQkvLyBUcnVlIGlmIHRoZSB3b3JrZXIgbXVzdCBleGl0IG9uIGNvbXBsZXRpb24gb2YgdGhlIGN1cnJlbnQgY3ljbGUKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gd29ya2VyQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCS8vIFRydWUgaWYgdGhlIHdvcmtlciBtdXN0IGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBwcmVtYXR1cmVseSBwZXJoYXBzIGR1ZSB0byBhIHN0YXRlIHVwZGF0ZQotCi0JLy8gV29ya2VyIHN0YXRlIGluZm9ybWF0aW9uIC0tIHRoaXMgaXMgd2hhdCBnZXRzIHN5bmNocm9uaXplZCBieSBhbiB1cGRhdGUKLQlwcml2YXRlIHZvbGF0aWxlIEZpbGUgd29ya2VyU3RhdGVEaXIgPSBudWxsOwotCi0JLy8gU3RhdGUgaW5mb3JtYXRpb24gdG8gdXNlIGZvciB0aGUgbmV4dCBjeWNsZQotCXByaXZhdGUgdm9sYXRpbGUgRmlsZSB3b3JrZXJOZXh0RGlyID0gbnVsbDsKLQotCS8qIFNpbXVsYXRlIG9ubHkgZmxhZyAqLwotCS8vIHdoZW4gdHJ1ZSwgZGlzYWJsZXMgYWN0dWFsIGZpbGVzeXN0ZW0gbWFuaXB1bGF0aW9ucyBhbmQgb3V0cHV0cyByZXN1bHRzIHRvIHN0YW5kYXJkIG91dAotCXByaXZhdGUgYm9vbGVhbiBzaW11bGF0ZU9ubHkgPSB0cnVlOwotCi0JLyoqCi0JICogUnVucyBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlGaWxlVmlld2VyIGFwcGxpY2F0aW9uID0gbmV3IEZpbGVWaWV3ZXIoKTsKLQkJU2hlbGwgc2hlbGwgPSBhcHBsaWNhdGlvbi5vcGVuKGRpc3BsYXkpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlhcHBsaWNhdGlvbi5jbG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbWFpbiBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTaGVsbCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewkJCi0JCS8vIENyZWF0ZSB0aGUgd2luZG93Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JCWljb25DYWNoZS5pbml0UmVzb3VyY2VzKGRpc3BsYXkpOwotCQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQljcmVhdGVTaGVsbENvbnRlbnRzKCk7Ci0JCW5vdGlmeVJlZnJlc2hGaWxlcyhudWxsKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0Jdm9pZCBjbG9zZSgpIHsKLQkJd29ya2VyU3RvcCgpOwotCQlpY29uQ2FjaGUuZnJlZVJlc291cmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHRoZSBVSQotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIgdGhlIFNoZWxsQ29udGFpbmVyIG1hbmFnaW5nIHRoZSBTaGVsbCB3ZSBhcmUgcmVuZGVyaW5nIGluc2lkZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTaGVsbENvbnRlbnRzKCkgewotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIsIG5ldyBPYmplY3RbXSB7ICIiIH0pKTsJCi0JCXNoZWxsLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuc2hlbGxJY29uXSk7Ci0JCU1lbnUgYmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKGJhcik7Ci0JCWNyZWF0ZUZpbGVNZW51KGJhcik7Ci0JCWNyZWF0ZUhlbHBNZW51KGJhcik7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDE4NTsKLQkJY3JlYXRlQ29tYm9WaWV3KHNoZWxsLCBncmlkRGF0YSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY3JlYXRlVG9vbEJhcihzaGVsbCwgZ3JpZERhdGEpOwotCi0JCVNhc2hGb3JtIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXNhc2hGb3JtLnNldE9yaWVudGF0aW9uKFNXVC5IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNyZWF0ZVRyZWVWaWV3KHNhc2hGb3JtKTsKLQkJY3JlYXRlVGFibGVWaWV3KHNhc2hGb3JtKTsKLQkJc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10geyAyLCA1IH0pOwotCi0JCW51bU9iamVjdHNMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxODU7Ci0JCW51bU9iamVjdHNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCWRpc2tTcGFjZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGlza1NwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEZpbGUgTWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IHBhcmVudCkgewotCQlNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCQlNZW51SXRlbSBoZWFkZXIgPSBuZXcgTWVudUl0ZW0ocGFyZW50LCBTV1QuQ0FTQ0FERSk7Ci0JCWhlYWRlci5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkZpbGUudGV4dCIpKTsKLQkJaGVhZGVyLnNldE1lbnUobWVudSk7Ci0KLQkJZmluYWwgTWVudUl0ZW0gc2ltdWxhdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DSEVDSyk7Ci0JCXNpbXVsYXRlSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkZpbGUuU2ltdWxhdGVPbmx5LnRleHQiKSk7Ci0JCXNpbXVsYXRlSXRlbS5zZXRTZWxlY3Rpb24oc2ltdWxhdGVPbmx5KTsKLQkJc2ltdWxhdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaW11bGF0ZU9ubHkgPSBzaW11bGF0ZUl0ZW0uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuRmlsZS5DbG9zZS50ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgSGVscCBNZW51LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBtZW51Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlbHBNZW51KE1lbnUgcGFyZW50KSB7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCU1lbnVJdGVtIGhlYWRlciA9IG5ldyBNZW51SXRlbShwYXJlbnQsIFNXVC5DQVNDQURFKTsKLQkJaGVhZGVyLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuSGVscC50ZXh0IikpOwotCQloZWFkZXIuc2V0TWVudShtZW51KTsKLQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJtZW51LkhlbHAuQWJvdXQudGV4dCIpKTsJCQotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyk7Ci0JCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5BYm91dC50aXRsZSIpKTsKLQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkFib3V0LmRlc2NyaXB0aW9uIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikgfSkpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvb2xiYXIKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsIG9uIHdoaWNoIHRvIGF0dGFjaCB0aGUgdG9vbGJhcgotCSAqIEBwYXJhbSBsYXlvdXREYXRhIHRoZSBsYXlvdXQgZGF0YQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKGZpbmFsIFNoZWxsIHNoZWxsLCBPYmplY3QgbGF5b3V0RGF0YSkgewotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFBhcmVudF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlBhcmVudC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb1BhcmVudCgpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRSZWZyZXNoXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUmVmcmVzaC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb1JlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCVNlbGVjdGlvbkFkYXB0ZXIgdW5pbXBsZW1lbnRlZExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuT0spOwotCQkJCWJveC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuTm90SW1wbGVtZW50ZWQudGl0bGUiKSk7Ci0JCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5BY3Rpb25Ob3RJbXBsZW1lbnRlZC5kZXNjcmlwdGlvbiIpKTsKLQkJCQlib3gub3BlbigpOwotCQkJfQotCQl9OwotCi0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kQ3V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuQ3V0LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRDb3B5XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuQ29weS50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUGFzdGVdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5QYXN0ZS50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWREZWxldGVdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5EZWxldGUudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFJlbmFtZV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlJlbmFtZS50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRTZWFyY2hdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5TZWFyY2gudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFByaW50XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUHJpbnQudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbWJvIGJveCB2aWV3LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbWJvVmlldyhDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgbGF5b3V0RGF0YSkgewotCQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgRmlsZVtdIHJvb3RzID0gKEZpbGVbXSkgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfUk9PVFMpOwotCQkJCWlmIChyb290cyA9PSBudWxsKSByZXR1cm47Ci0JCQkJaW50IHNlbGVjdGlvbiA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiA+PSAwICYmIHNlbGVjdGlvbiA8IHJvb3RzLmxlbmd0aCkgewotCQkJCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShyb290c1tzZWxlY3Rpb25dKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIFN0cmluZyBsYXN0VGV4dCA9IChTdHJpbmcpIGNvbWJvLmdldERhdGEoQ09NQk9EQVRBX0xBU1RURVhUKTsKLQkJCQlTdHJpbmcgdGV4dCA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGxhc3RUZXh0ICE9IG51bGwgJiYgbGFzdFRleHQuZXF1YWxzKHRleHQpKSByZXR1cm47Ci0JCQkJY29tYm8uc2V0RGF0YShDT01CT0RBVEFfTEFTVFRFWFQsIHRleHQpOwotCQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KG5ldyBGaWxlKHRleHQpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZmlsZSB0cmVlIHZpZXcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZVZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQl0cmVlU2NvcGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0cmVlU2NvcGVMYWJlbC5zZXRUZXh0KEZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuQWxsRm9sZGVycy50ZXh0IikpOwotCQl0cmVlU2NvcGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotCQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoICE9IDApIHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IHNlbGVjdGlvblswXTsKLQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJCi0JCQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCAhPSAwKSB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSBzZWxlY3Rpb25bMF07Ci0JCQkJCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQkJCXRyZWVFeHBhbmRJdGVtKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRyZWUuYWRkVHJlZUxpc3RlbmVyKG5ldyBUcmVlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gKEltYWdlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFRVhQQU5ERUQpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCQl0cmVlRXhwYW5kSXRlbShpdGVtKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUNPTExBUFNFRCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJfQotCQl9KTsKLQkJY3JlYXRlVHJlZURyYWdTb3VyY2UodHJlZSk7Ci0JCWNyZWF0ZVRyZWVEcm9wVGFyZ2V0KHRyZWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyYWdTb3VyY2UgZm9yIGl0ZW1zIGJlaW5nIGRyYWdnZWQgZnJvbSB0aGUgdHJlZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcmFnU291cmNlIGZvciB0aGUgdHJlZQotCSAqLwotCXByaXZhdGUgRHJhZ1NvdXJjZSBjcmVhdGVUcmVlRHJhZ1NvdXJjZShmaW5hbCBUcmVlIHRyZWUpewotCQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSh0cmVlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCVRyZWVJdGVtW10gZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRuZFNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc291cmNlTmFtZXMgPSBudWxsOwotCQkJCWV2ZW50LmRvaXQgPSBkbmRTZWxlY3Rpb24ubGVuZ3RoID4gMDsKLQkJCQlpc0RyYWdnaW5nID0gdHJ1ZTsKLQkJCQlwcm9jZXNzZWREcm9wRmlsZXMgPSBudWxsOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZHJhZ1NvdXJjZUhhbmRsZURyYWdGaW5pc2hlZChldmVudCwgc291cmNlTmFtZXMpOwotCQkJCWRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJc291cmNlTmFtZXMgPSBudWxsOwotCQkJCWlzRHJhZ2dpbmcgPSBmYWxzZTsKLQkJCQlwcm9jZXNzZWREcm9wRmlsZXMgPSBudWxsOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlpZiAoZG5kU2VsZWN0aW9uID09IG51bGwgfHwgZG5kU2VsZWN0aW9uLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQkJaWYgKCEgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgcmV0dXJuOwotCQkJCQotCQkJCXNvdXJjZU5hbWVzICA9IG5ldyBTdHJpbmdbZG5kU2VsZWN0aW9uLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkbmRTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGRuZFNlbGVjdGlvbltpXS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQkJc291cmNlTmFtZXNbaV0gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCQlldmVudC5kYXRhID0gc291cmNlTmFtZXM7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJhZ1NvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcm9wVGFyZ2V0IGZvciBpdGVtcyBiZWluZyBkcm9wcGVkIG9udG8gdGhlIHRyZWUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJvcFRhcmdldCBmb3IgdGhlIHRyZWUKLQkgKi8KLQlwcml2YXRlIERyb3BUYXJnZXQgY3JlYXRlVHJlZURyb3BUYXJnZXQoZmluYWwgVHJlZSB0cmVlKSB7Ci0JCURyb3BUYXJnZXQgZHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRyZWUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaXNEcm9wcGluZyA9IGZhbHNlOwotCQkJCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCBnZXRUYXJnZXRGaWxlKGV2ZW50KSk7Ci0JCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IGdldFRhcmdldEZpbGUoZXZlbnQpOwotCQkJCWlmIChkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIHRhcmdldEZpbGUpKQotCQkJCQlkcm9wVGFyZ2V0SGFuZGxlRHJvcChldmVudCwgdGFyZ2V0RmlsZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIEZpbGUgZ2V0VGFyZ2V0RmlsZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCBGaWxlIGZvciB0aGUgZHJvcCAKLQkJCQlUcmVlSXRlbSBpdGVtID0gdHJlZS5nZXRJdGVtKHRyZWUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSkpOwotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQkvLyBXZSBhcmUgb3ZlciBhIHBhcnRpY3VsYXIgaXRlbSBpbiB0aGUgdHJlZSwgdXNlIHRoZSBpdGVtJ3MgZmlsZQotCQkJCQl0YXJnZXRGaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJfQotCQkJCXJldHVybiB0YXJnZXRGaWxlOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyb3BUYXJnZXQ7CQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgZXhwYW5kIGV2ZW50cyBvbiBhIHRyZWUgaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSB0aGUgVHJlZUl0ZW0gdG8gZmlsbCBpbgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlRXhwYW5kSXRlbShUcmVlSXRlbSBpdGVtKSB7Ci0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JXYWl0XSk7Ci0JCWZpbmFsIE9iamVjdCBzdHViID0gaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCKTsKLQkJaWYgKHN0dWIgPT0gbnVsbCkgdHJlZVJlZnJlc2hJdGVtKGl0ZW0sIHRydWUpOwotCQlzaGVsbC5zZXRDdXJzb3IoaWNvbkNhY2hlLnN0b2NrQ3Vyc29yc1tpY29uQ2FjaGUuY3Vyc29yRGVmYXVsdF0pOwotCX0KLQkKLQkvKioKLQkgKiBUcmF2ZXJzZSB0aGUgZW50aXJlIHRyZWUgYW5kIHVwZGF0ZSBvbmx5IHdoYXQgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIHJvb3RzIHRoZSByb290IGRpcmVjdG9yeSBsaXN0aW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVSZWZyZXNoKEZpbGVbXSBtYXN0ZXJGaWxlcykgewotCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlpbnQgbWFzdGVySW5kZXggPSAwOwotCQlpbnQgaXRlbUluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJZmluYWwgRmlsZSBpdGVtRmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJaWYgKChpdGVtRmlsZSA9PSBudWxsKSB8fCAobWFzdGVySW5kZXggPT0gbWFzdGVyRmlsZXMubGVuZ3RoKSkgewotCQkJCS8vIHJlbW92ZSBiYWQgaXRlbSBvciBwbGFjZWhvbGRlcgotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZmluYWwgRmlsZSBtYXN0ZXJGaWxlID0gbWFzdGVyRmlsZXNbbWFzdGVySW5kZXhdOwotCQkJaW50IGNvbXBhcmUgPSBjb21wYXJlRmlsZXMobWFzdGVyRmlsZSwgaXRlbUZpbGUpOwotCQkJaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCS8vIHNhbWUgZmlsZSwgdXBkYXRlIGl0Ci0JCQkJdHJlZVJlZnJlc2hJdGVtKGl0ZW0sIGZhbHNlKTsKLQkJCQkrK2l0ZW1JbmRleDsKLQkJCQkrK21hc3RlckluZGV4OwotCQkJfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYmVmb3JlIGZpbGUsIGluc2VydCBpdAotCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGl0ZW1JbmRleCk7Ci0JCQkJdHJlZUluaXRWb2x1bWUobmV3SXRlbSwgbWFzdGVyRmlsZSk7Ci0JCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSB0byBnZXQgImV4cGFuZCIgYnV0dG9uCi0JCQkJKytpdGVtSW5kZXg7Ci0JCQkJKyttYXN0ZXJJbmRleDsKLQkJCQktLWk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYWZ0ZXIgZmlsZSwgZGVsZXRlIHN0YWxlIGl0ZW0KLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlmb3IgKDttYXN0ZXJJbmRleCA8IG1hc3RlckZpbGVzLmxlbmd0aDsgKyttYXN0ZXJJbmRleCkgewotCQkJZmluYWwgRmlsZSBtYXN0ZXJGaWxlID0gbWFzdGVyRmlsZXNbbWFzdGVySW5kZXhdOwotCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQl0cmVlSW5pdFZvbHVtZShuZXdJdGVtLCBtYXN0ZXJGaWxlKTsKLQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gdG8gZ2V0ICJleHBhbmQiIGJ1dHRvbgotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogVHJhdmVyc2UgYW4gaXRlbSBpbiB0aGUgdHJlZSBhbmQgdXBkYXRlIG9ubHkgd2hhdCBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlySXRlbSB0aGUgdHJlZSBpdGVtIG9mIHRoZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZm9yY2VQb3B1bGF0ZSB0cnVlIGlmZiB3ZSBzaG91bGQgcG9wdWxhdGUgbm9uLWV4cGFuZGVkIGl0ZW1zIGFzIHdlbGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZVJlZnJlc2hJdGVtKFRyZWVJdGVtIGRpckl0ZW0sIGJvb2xlYW4gZm9yY2VQb3B1bGF0ZSkgewotCQlmaW5hbCBGaWxlIGRpciA9IChGaWxlKSBkaXJJdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkKLQkJaWYgKCEgZm9yY2VQb3B1bGF0ZSAmJiAhIGRpckl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJLy8gUmVmcmVzaCBub24tZXhwYW5kZWQgaXRlbQotCQkJaWYgKGRpckl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfU1RVQikgIT0gbnVsbCkgewotCQkJCXRyZWVJdGVtUmVtb3ZlQWxsKGRpckl0ZW0pOwotCQkJCW5ldyBUcmVlSXRlbShkaXJJdGVtLCBTV1QuTk9ORSk7IC8vIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gdG8gZ2V0ICJleHBhbmQiIGJ1dHRvbgotCQkJCWRpckl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfU1RVQiwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gUmVmcmVzaCBleHBhbmRlZCBpdGVtCi0JCWRpckl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfU1RVQiwgdGhpcyk7IC8vIGNsZWFyIHN0dWIgZmxhZwotCi0JCS8qIEdldCBkaXJlY3RvcnkgbGlzdGluZyAqLwotCQlGaWxlW10gc3ViRmlsZXMgPSAoZGlyICE9IG51bGwpID8gRmlsZVZpZXdlci5nZXREaXJlY3RvcnlMaXN0KGRpcikgOiBudWxsOwotCQlpZiAoc3ViRmlsZXMgPT0gbnVsbCB8fCBzdWJGaWxlcy5sZW5ndGggPT0gMCkgewotCQkJLyogRXJyb3Igb3Igbm8gY29udGVudHMgKi8KLQkJCXRyZWVJdGVtUmVtb3ZlQWxsKGRpckl0ZW0pOwotCQkJZGlySXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBSZWZyZXNoIHN1Yi1pdGVtcyAqLwotCQlUcmVlSXRlbVtdIGl0ZW1zID0gZGlySXRlbS5nZXRJdGVtcygpOwotCQlmaW5hbCBGaWxlW10gbWFzdGVyRmlsZXMgPSBzdWJGaWxlczsKLQkJaW50IG1hc3RlckluZGV4ID0gMDsKLQkJaW50IGl0ZW1JbmRleCA9IDA7Ci0JCUZpbGUgbWFzdGVyRmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCXdoaWxlICgobWFzdGVyRmlsZSA9PSBudWxsKSAmJiAobWFzdGVySW5kZXggPCBtYXN0ZXJGaWxlcy5sZW5ndGgpKSB7Ci0JCQkJbWFzdGVyRmlsZSA9IG1hc3RlckZpbGVzW21hc3RlckluZGV4KytdOwotCQkJCWlmICghIG1hc3RlckZpbGUuaXNEaXJlY3RvcnkoKSkgbWFzdGVyRmlsZSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWZpbmFsIEZpbGUgaXRlbUZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCWlmICgoaXRlbUZpbGUgPT0gbnVsbCkgfHwgKG1hc3RlckZpbGUgPT0gbnVsbCkpIHsKLQkJCQkvLyByZW1vdmUgYmFkIGl0ZW0gb3IgcGxhY2Vob2xkZXIKLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWludCBjb21wYXJlID0gY29tcGFyZUZpbGVzKG1hc3RlckZpbGUsIGl0ZW1GaWxlKTsKLQkJCWlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBzYW1lIGZpbGUsIHVwZGF0ZSBpdAotCQkJCXRyZWVSZWZyZXNoSXRlbShpdGVtLCBmYWxzZSk7Ci0JCQkJbWFzdGVyRmlsZSA9IG51bGw7Ci0JCQkJKytpdGVtSW5kZXg7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBiZWZvcmUgZmlsZSwgaW5zZXJ0IGl0Ci0JCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShkaXJJdGVtLCBTV1QuTk9ORSwgaXRlbUluZGV4KTsKLQkJCQl0cmVlSW5pdEZvbGRlcihuZXdJdGVtLCBtYXN0ZXJGaWxlKTsKLQkJCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBhZGQgYSBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHNvIHdlIGdldCB0aGUgImV4cGFuZCIgYnV0dG9uCi0JCQkJbWFzdGVyRmlsZSA9IG51bGw7Ci0JCQkJKytpdGVtSW5kZXg7Ci0JCQkJLS1pOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyIGZpbGUsIGRlbGV0ZSBzdGFsZSBpdGVtCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKChtYXN0ZXJGaWxlICE9IG51bGwpIHx8IChtYXN0ZXJJbmRleCA8IG1hc3RlckZpbGVzLmxlbmd0aCkpIHsKLQkJCWlmIChtYXN0ZXJGaWxlICE9IG51bGwpIHsKLQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGRpckl0ZW0sIFNXVC5OT05FKTsKLQkJCQl0cmVlSW5pdEZvbGRlcihuZXdJdGVtLCBtYXN0ZXJGaWxlKTsKLQkJCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBhZGQgYSBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHNvIHdlIGdldCB0aGUgImV4cGFuZCIgYnV0dG9uCi0JCQkJaWYgKG1hc3RlckluZGV4ID09IG1hc3RlckZpbGVzLmxlbmd0aCkgYnJlYWs7Ci0JCQl9Ci0JCQltYXN0ZXJGaWxlID0gbWFzdGVyRmlsZXNbbWFzdGVySW5kZXgrK107Ci0JCQlpZiAoISBtYXN0ZXJGaWxlLmlzRGlyZWN0b3J5KCkpIG1hc3RlckZpbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yZWlnbiBtZXRob2Q6IHJlbW92ZXMgYWxsIGNoaWxkcmVuIG9mIGEgVHJlZUl0ZW0uCi0JICogQHBhcmFtIHRyZWVJdGVtIHRoZSBUcmVlSXRlbQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdHJlZUl0ZW1SZW1vdmVBbGwoVHJlZUl0ZW0gdHJlZUl0ZW0pIHsKLQkJZmluYWwgVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IHRyZWVJdGVtLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgZm9sZGVyIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW0gdGhlIFRyZWVJdGVtIHRvIGluaXRpYWxpemUKLQkgKiBAcGFyYW0gZm9sZGVyIHRoZSBGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRyZWVJdGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVJbml0Rm9sZGVyKFRyZWVJdGVtIGl0ZW0sIEZpbGUgZm9sZGVyKSB7Ci0JCWl0ZW0uc2V0VGV4dChmb2xkZXIuZ2V0TmFtZSgpKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFLCBmb2xkZXIpOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFRVhQQU5ERUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbk9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUNPTExBUFNFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRm9sZGVyXSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSB2b2x1bWUgaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSB0aGUgVHJlZUl0ZW0gdG8gaW5pdGlhbGl6ZQotCSAqIEBwYXJhbSB2b2x1bWUgdGhlIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVHJlZUl0ZW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZUluaXRWb2x1bWUoVHJlZUl0ZW0gaXRlbSwgRmlsZSB2b2x1bWUpIHsKLQkJaXRlbS5zZXRUZXh0KHZvbHVtZS5nZXRQYXRoKCkpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZERyaXZlXSk7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSwgdm9sdW1lKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUVYUEFOREVELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25PcGVuRHJpdmVdKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9JTUFHRUNPTExBUFNFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRHJpdmVdKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWxlIGRldGFpbHMgdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXRhYmxlQ29udGVudHNPZkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRhYmxlQ29udGVudHNPZkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZVRpdGxlcy5sZW5ndGg7ICsraSkgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQljb2x1bW4uc2V0VGV4dCh0YWJsZVRpdGxlc1tpXSk7Ci0JCQljb2x1bW4uc2V0V2lkdGgodGFibGVXaWR0aHNbaV0pOwotCQl9Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlub3RpZnlTZWxlY3RlZEZpbGVzKGdldFNlbGVjdGVkRmlsZXMoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlkb0RlZmF1bHRGaWxlQWN0aW9uKGdldFNlbGVjdGVkRmlsZXMoKSk7Ci0JCQl9Ci0JCQlwcml2YXRlIEZpbGVbXSBnZXRTZWxlY3RlZEZpbGVzKCkgewotCQkJCWZpbmFsIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZmluYWwgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbaXRlbXMubGVuZ3RoXTsKLQkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWZpbGVzW2ldID0gKEZpbGUpIGl0ZW1zW2ldLmdldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZpbGVzOwotCQkJfQotCQl9KTsKLQotCQljcmVhdGVUYWJsZURyYWdTb3VyY2UodGFibGUpOwotCQljcmVhdGVUYWJsZURyb3BUYXJnZXQodGFibGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyYWdTb3VyY2UgZm9yIGl0ZW1zIGJlaW5nIGRyYWdnZWQgZnJvbSB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJhZ1NvdXJjZSBmb3IgdGhlIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBEcmFnU291cmNlIGNyZWF0ZVRhYmxlRHJhZ1NvdXJjZShmaW5hbCBUYWJsZSB0YWJsZSkgewotCQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSh0YWJsZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQlUYWJsZUl0ZW1bXSBkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBudWxsOwotCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZG5kU2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc291cmNlTmFtZXMgPSBudWxsOwotCQkJCWV2ZW50LmRvaXQgPSBkbmRTZWxlY3Rpb24ubGVuZ3RoID4gMDsKLQkJCQlpc0RyYWdnaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWRyYWdTb3VyY2VIYW5kbGVEcmFnRmluaXNoZWQoZXZlbnQsIHNvdXJjZU5hbWVzKTsKLQkJCQlkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJCXNvdXJjZU5hbWVzID0gbnVsbDsKLQkJCQlpc0RyYWdnaW5nID0gZmFsc2U7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWlmIChkbmRTZWxlY3Rpb24gPT0gbnVsbCB8fCBkbmRTZWxlY3Rpb24ubGVuZ3RoID09IDApIHJldHVybjsKLQkJCQlpZiAoISBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSByZXR1cm47Ci0JCQkJCi0JCQkJc291cmNlTmFtZXMgID0gbmV3IFN0cmluZ1tkbmRTZWxlY3Rpb24ubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRuZFNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgZG5kU2VsZWN0aW9uW2ldLmdldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFKTsKLQkJCQkJc291cmNlTmFtZXNbaV0gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCQlldmVudC5kYXRhID0gc291cmNlTmFtZXM7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJhZ1NvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEcmFnICYgRHJvcCBEcm9wVGFyZ2V0IGZvciBpdGVtcyBiZWluZyBkcm9wcGVkIG9udG8gdGhlIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyb3BUYXJnZXQgZm9yIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgRHJvcFRhcmdldCBjcmVhdGVUYWJsZURyb3BUYXJnZXQoZmluYWwgVGFibGUgdGFibGUpewotCQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0YWJsZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gZmFsc2U7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIGdldFRhcmdldEZpbGUoZXZlbnQpKTsKLQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZShldmVudCk7Ci0JCQkJaWYgKGRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgdGFyZ2V0RmlsZSkpCi0JCQkJCWRyb3BUYXJnZXRIYW5kbGVEcm9wKGV2ZW50LCB0YXJnZXRGaWxlKTsKLQkJCX0KLQkJCXByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCS8vIERldGVybWluZSB0aGUgdGFyZ2V0IEZpbGUgZm9yIHRoZSBkcm9wIAotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSh0YWJsZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKSk7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJCS8vIFdlIGFyZSBvdmVyIGFuIHVub2NjdXBpZWQgYXJlYSBvZiB0aGUgdGFibGUuCi0JCQkJCS8vIElmIGl0IGlzIGEgQ09QWSwgd2UgY2FuIHVzZSB0aGUgdGFibGUncyByb290IGZpbGUuCi0JCQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfQ09QWSkgewotCQkJCQkJdGFyZ2V0RmlsZSA9IChGaWxlKSB0YWJsZS5nZXREYXRhKFRBQkxFREFUQV9ESVIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gV2UgYXJlIG92ZXIgYSBwYXJ0aWN1bGFyIGl0ZW0gaW4gdGhlIHRhYmxlLCB1c2UgdGhlIGl0ZW0ncyBmaWxlCi0JCQkJCXRhcmdldEZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRBQkxFSVRFTURBVEFfRklMRSk7Ci0JCQkJfQotCQkJCXJldHVybiB0YXJnZXRGaWxlOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGRyb3BUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMgdGhhdCBhIG5ldyBjdXJyZW50IGRpcmVjdG9yeSBoYXMgYmVlbiBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0aGF0IHdhcyBzZWxlY3RlZCwgbnVsbCBpcyBpZ25vcmVkCi0JICovCi0Jdm9pZCBub3RpZnlTZWxlY3RlZERpcmVjdG9yeShGaWxlIGRpcikgewotCQlpZiAoZGlyID09IG51bGwpIHJldHVybjsKLQkJaWYgKGN1cnJlbnREaXJlY3RvcnkgIT0gbnVsbCAmJiBkaXIuZXF1YWxzKGN1cnJlbnREaXJlY3RvcnkpKSByZXR1cm47Ci0JCWN1cnJlbnREaXJlY3RvcnkgPSBkaXI7Ci0JCW5vdGlmeVNlbGVjdGVkRmlsZXMobnVsbCk7Ci0JCQotCQkvKiBTaGVsbDoKLQkJICogU2V0cyB0aGUgdGl0bGUgdG8gaW5kaWNhdGUgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeQotCQkgKi8KLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiLCBuZXcgT2JqZWN0W10geyBjdXJyZW50RGlyZWN0b3J5LmdldFBhdGgoKSB9KSk7Ci0KLQkJLyogVGFibGUgdmlldzoKLQkJICogRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkuCi0JCSAqLwotCQl3b3JrZXJVcGRhdGUoZGlyLCBmYWxzZSk7Ci0KLQkJLyogQ29tYm8gdmlldzoKLQkJICogU2V0cyB0aGUgY29tYm8gYm94IHRvIHBvaW50IHRvIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkuCi0JCSAqLwotCQlmaW5hbCBGaWxlW10gY29tYm9Sb290cyA9IChGaWxlW10pIGNvbWJvLmdldERhdGEoQ09NQk9EQVRBX1JPT1RTKTsKLQkJaW50IGNvbWJvRW50cnkgPSAtMTsKLQkJaWYgKGNvbWJvUm9vdHMgIT0gbnVsbCkgewkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbWJvUm9vdHMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoZGlyLmVxdWFscyhjb21ib1Jvb3RzW2ldKSkgewotCQkJCQljb21ib0VudHJ5ID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjb21ib0VudHJ5ID09IC0xKSBjb21iby5zZXRUZXh0KGRpci5nZXRQYXRoKCkpOwotCQllbHNlIGNvbWJvLnNlbGVjdChjb21ib0VudHJ5KTsKLQotCQkvKiBUcmVlIHZpZXc6Ci0JCSAqIElmIG5vdCBhbHJlYWR5IGV4cGFuZGVkLCByZWN1cnNpdmVseSBleHBhbmRzIHRoZSBwYXJlbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkJICogZGlyZWN0b3J5IHVudGlsIGl0IGlzIHZpc2libGUuCi0JCSAqLwotCQlWZWN0b3IgLyogb2YgRmlsZSAqLyBwYXRoID0gbmV3IFZlY3RvcigpOwotCQkvLyBCdWlsZCBhIHN0YWNrIG9mIHBhdGhzIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHRyZWUKLQkJd2hpbGUgKGRpciAhPSBudWxsKSB7Ci0JCQlwYXRoLmFkZChkaXIpOwotCQkJZGlyID0gZGlyLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQkvLyBSZWN1cnNpdmVseSBleHBhbmQgdGhlIHRyZWUgdG8gZ2V0IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCVRyZWVJdGVtIGxhc3RJdGVtID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IHBhdGguc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLQkJCWZpbmFsIEZpbGUgcGF0aEVsZW1lbnQgPSAoRmlsZSkgcGF0aC5lbGVtZW50QXQoaSk7Ci0KLQkJCS8vIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIEZpbGUgaW4gdGhlIGFycmF5IG9mIHRyZWUgaXRlbXMKLQkJCS8vIE5vIGd1YXJhbnRlZSB0aGF0IHRoZSBpdGVtcyBhcmUgc29ydGVkIGluIGFueSByZWNvZ25pemFibGUgZmFzaGlvbiwgc28gd2UnbGwKLQkJCS8vIGp1c3Qgc2VxdWVudGlhbCBzY2FuLiAgVGhlcmUgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiBhIGZldyB0aG91c2FuZCBlbnRyaWVzLgotCQkJVHJlZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IGl0ZW1zLmxlbmd0aDsgKytrKSB7Ci0JCQkJaXRlbSA9IGl0ZW1zW2tdOwotCQkJCWlmIChpdGVtLmlzRGlzcG9zZWQoKSkgY29udGludWU7Ci0JCQkJZmluYWwgRmlsZSBpdGVtRmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCWlmIChpdGVtRmlsZSAhPSBudWxsICYmIGl0ZW1GaWxlLmVxdWFscyhwYXRoRWxlbWVudCkpIGJyZWFrOwotCQkJfQotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgYnJlYWs7Ci0JCQlsYXN0SXRlbSA9IGl0ZW07Ci0JCQlpZiAoaSAhPSAwICYmICFpdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJCQl0cmVlRXhwYW5kSXRlbShpdGVtKTsKLQkJCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQkJfQotCQkJaXRlbXMgPSBpdGVtLmdldEl0ZW1zKCk7Ci0JCX0KLQkJdHJlZS5zZXRTZWxlY3Rpb24oKGxhc3RJdGVtICE9IG51bGwpID8gbmV3IFRyZWVJdGVtW10geyBsYXN0SXRlbSB9IDogbmV3IFRyZWVJdGVtWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMgdGhhdCBmaWxlcyBoYXZlIGJlZW4gc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRoYXQgd2VyZSBzZWxlY3RlZCwgbnVsbCBvciBlbXB0eSBhcnJheSBpbmRpY2F0ZXMgbm8gYWN0aXZlIHNlbGVjdGlvbgotCSAqLwotCXZvaWQgbm90aWZ5U2VsZWN0ZWRGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJLyogRGV0YWlsczoKLQkJICogVXBkYXRlIHRoZSBkZXRhaWxzIHRoYXQgYXJlIHZpc2libGUgb24gc2NyZWVuLgotCQkgKi8KLQkJaWYgKChmaWxlcyAhPSBudWxsKSAmJiAoZmlsZXMubGVuZ3RoICE9IDApKSB7Ci0JCQludW1PYmplY3RzTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5OdW1iZXJPZlNlbGVjdGVkRmlsZXMudGV4dCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoZmlsZXMubGVuZ3RoKSB9KSk7Ci0JCQlsb25nIGZpbGVTaXplID0gMEw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmlsZVNpemUgKz0gZmlsZXNbaV0ubGVuZ3RoKCk7Ci0JCQl9Ci0JCQlkaXNrU3BhY2VMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkZpbGVTaXplLnRleHQiLAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBMb25nKGZpbGVTaXplKSB9KSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBObyBmaWxlcyBzZWxlY3RlZAotCQkJZGlza1NwYWNlTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQlpZiAoY3VycmVudERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJaW50IG51bU9iamVjdHMgPSBnZXREaXJlY3RvcnlMaXN0KGN1cnJlbnREaXJlY3RvcnkpLmxlbmd0aDsKLQkJCQludW1PYmplY3RzTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5EaXJOdW1iZXJPZk9iamVjdHMudGV4dCIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKG51bU9iamVjdHMpIH0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbnVtT2JqZWN0c0xhYmVsLnNldFRleHQoIiIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMgdGhhdCBmaWxlcyBtdXN0IGJlIHJlZnJlc2hlZAotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgZmlsZXMgdGhhdCBuZWVkIHJlZnJlc2hpbmcsIGVtcHR5IGFycmF5IGlzIGEgbm8tb3AsIG51bGwgcmVmcmVzaGVzIGFsbAotCSAqLwotCXZvaWQgbm90aWZ5UmVmcmVzaEZpbGVzKEZpbGVbXSBmaWxlcykgewotCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCi0JCWlmICgoZGVmZXJyZWRSZWZyZXNoUmVxdWVzdGVkKSAmJiAoZGVmZXJyZWRSZWZyZXNoRmlsZXMgIT0gbnVsbCkgJiYgKGZpbGVzICE9IG51bGwpKSB7Ci0JCQkvLyBtZXJnZSByZXF1ZXN0cwotCQkJRmlsZVtdIG5ld1JlcXVlc3QgPSBuZXcgRmlsZVtkZWZlcnJlZFJlZnJlc2hGaWxlcy5sZW5ndGggKyBmaWxlcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShkZWZlcnJlZFJlZnJlc2hGaWxlcywgMCwgbmV3UmVxdWVzdCwgMCwgZGVmZXJyZWRSZWZyZXNoRmlsZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZmlsZXMsIDAsIG5ld1JlcXVlc3QsIGRlZmVycmVkUmVmcmVzaEZpbGVzLmxlbmd0aCwgZmlsZXMubGVuZ3RoKTsKLQkJCWRlZmVycmVkUmVmcmVzaEZpbGVzID0gbmV3UmVxdWVzdDsKLQkJfSBlbHNlIHsKLQkJCWRlZmVycmVkUmVmcmVzaEZpbGVzID0gZmlsZXM7Ci0JCQlkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQgPSB0cnVlOwotCQl9Ci0JCWhhbmRsZURlZmVycmVkUmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgZGVmZXJyZWQgUmVmcmVzaCBub3RpZmljYXRpb25zIChkdWUgdG8gRHJhZyAmIERyb3ApCi0JICovCi0Jdm9pZCBoYW5kbGVEZWZlcnJlZFJlZnJlc2goKSB7Ci0JCWlmIChpc0RyYWdnaW5nIHx8IGlzRHJvcHBpbmcgfHwgISBkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQpIHJldHVybjsKLQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCXByb2dyZXNzRGlhbG9nLmNsb3NlKCk7Ci0JCQlwcm9ncmVzc0RpYWxvZyA9IG51bGw7Ci0JCX0KLQotCQlkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQgPSBmYWxzZTsKLQkJRmlsZVtdIGZpbGVzID0gZGVmZXJyZWRSZWZyZXNoRmlsZXM7Ci0JCWRlZmVycmVkUmVmcmVzaEZpbGVzID0gbnVsbDsKLQotCQlzaGVsbC5zZXRDdXJzb3IoaWNvbkNhY2hlLnN0b2NrQ3Vyc29yc1tpY29uQ2FjaGUuY3Vyc29yV2FpdF0pOwotCi0JCS8qIFRhYmxlIHZpZXc6Ci0JCSAqIFJlZnJlc2hlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZmlsZXMgaW4gdGhlIGxpc3QgYW5kIHRoZWlyIGNoaWxkcmVuLgotCQkgKi8KLQkJYm9vbGVhbiByZWZyZXNoVGFibGUgPSBmYWxzZTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCQlpZiAoZmlsZS5lcXVhbHMoY3VycmVudERpcmVjdG9yeSkpIHsKLQkJCQkJcmVmcmVzaFRhYmxlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUZpbGUgcGFyZW50RmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmICgocGFyZW50RmlsZSAhPSBudWxsKSAmJiAocGFyZW50RmlsZS5lcXVhbHMoY3VycmVudERpcmVjdG9yeSkpKSB7Ci0JCQkJCXJlZnJlc2hUYWJsZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHJlZnJlc2hUYWJsZSA9IHRydWU7Ci0JCWlmIChyZWZyZXNoVGFibGUpIHdvcmtlclVwZGF0ZShjdXJyZW50RGlyZWN0b3J5LCB0cnVlKTsKLQotCQkvKiBDb21ibyB2aWV3OgotCQkgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm9vdHMKLQkJICovCi0JCWZpbmFsIEZpbGVbXSByb290cyA9IGdldFJvb3RzKCk7Ci0KLQkJaWYgKGZpbGVzID09IG51bGwpIHsKLQkJCWJvb2xlYW4gcmVmcmVzaENvbWJvID0gZmFsc2U7Ci0JCQlmaW5hbCBGaWxlW10gY29tYm9Sb290cyA9IChGaWxlW10pIGNvbWJvLmdldERhdGEoQ09NQk9EQVRBX1JPT1RTKTsKLQkJCi0JCQlpZiAoKGNvbWJvUm9vdHMgIT0gbnVsbCkgJiYgKGNvbWJvUm9vdHMubGVuZ3RoID09IHJvb3RzLmxlbmd0aCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICghIHJvb3RzW2ldLmVxdWFscyhjb21ib1Jvb3RzW2ldKSkgewotCQkJCQkJcmVmcmVzaENvbWJvID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHJlZnJlc2hDb21ibyA9IHRydWU7Ci0KLQkJCWlmIChyZWZyZXNoQ29tYm8pIHsKLQkJCQljb21iby5yZW1vdmVBbGwoKTsKLQkJCQljb21iby5zZXREYXRhKENPTUJPREFUQV9ST09UUywgcm9vdHMpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJZmluYWwgRmlsZSBmaWxlID0gcm9vdHNbaV07Ci0JCQkJCWNvbWJvLmFkZChmaWxlLmdldFBhdGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogVHJlZSB2aWV3OgotCQkgKiBSZWZyZXNoZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGZpbGVzIGluIHRoZSBsaXN0IGFuZCB0aGVpciBjaGlsZHJlbi4KLQkJICovCi0JCXRyZWVSZWZyZXNoKHJvb3RzKTsKLQkJCi0JCS8vIFJlbWluZCBldmVyeW9uZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGVzeXN0ZW0KLQkJZmluYWwgRmlsZSBkaXIgPSBjdXJyZW50RGlyZWN0b3J5OwotCQljdXJyZW50RGlyZWN0b3J5ID0gbnVsbDsKLQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoZGlyKTsKLQotCQlzaGVsbC5zZXRDdXJzb3IoaWNvbkNhY2hlLnN0b2NrQ3Vyc29yc1tpY29uQ2FjaGUuY3Vyc29yRGVmYXVsdF0pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiBvbiBhIHNldCBvZiBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGFycmF5IG9mIGZpbGVzIHRvIHByb2Nlc3MKLQkgKi8KLQl2b2lkIGRvRGVmYXVsdEZpbGVBY3Rpb24oRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIG9ubHkgdXNlcyB0aGUgMXN0IGZpbGUgKGZvciBub3cpCi0JCWlmIChmaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlmaW5hbCBGaWxlIGZpbGUgPSBmaWxlc1swXTsKLQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShmaWxlKTsKLQkJfSBlbHNlIHsKLQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlpZiAoISBQcm9ncmFtLmxhdW5jaChmaWxlTmFtZSkpIHsJCi0JCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuT0spOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5GYWlsZWRMYXVuY2gubWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7IGZpbGVOYW1lIH0pKTsKLQkJCQlkaWFsb2cuc2V0VGV4dChzaGVsbC5nZXRUZXh0ICgpKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0JICovCi0Jdm9pZCBkb1BhcmVudCgpIHsKLQkJaWYgKGN1cnJlbnREaXJlY3RvcnkgPT0gbnVsbCkgcmV0dXJuOwotCQlGaWxlIHBhcmVudERpcmVjdG9yeSA9IGN1cnJlbnREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpOwotCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShwYXJlbnREaXJlY3RvcnkpOwotCX0KLQkgCi0JLyoqCi0JICogUGVyZm9ybXMgYSByZWZyZXNoCi0JICovCi0Jdm9pZCBkb1JlZnJlc2goKSB7Ci0JCW5vdGlmeVJlZnJlc2hGaWxlcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBkcm9wIHRhcmdldCBhcyBhIGNhbmRpZGF0ZSBmb3IgYSBkcm9wIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBVc2VkIGluIGRyYWdPdmVyKCkgYW5kIGRyb3BBY2NlcHQoKS48YnI+Ci0JICogTm90ZSBldmVudC5kZXRhaWwgaXMgc2V0IHRvIERORC5EUk9QX05PTkUgYnkgdGhpcyBtZXRob2QgaWYgdGhlIHRhcmdldCBpcyBub3QgdmFsaWQuCi0JICogPC9wPgotCSAqIEBwYXJhbSBldmVudCB0aGUgRHJvcFRhcmdldEV2ZW50IHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIHRhcmdldEZpbGUgdGhlIEZpbGUgcmVwcmVzZW50aW5nIHRoZSBkcm9wIHRhcmdldCBsb2NhdGlvbgotCSAqICAgICAgICB1bmRlciBpbnNwZWN0aW9uLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZHJvcFRhcmdldFZhbGlkYXRlKERyb3BUYXJnZXRFdmVudCBldmVudCwgRmlsZSB0YXJnZXRGaWxlKSB7Ci0JCWlmICh0YXJnZXRGaWxlICE9IG51bGwgJiYgdGFyZ2V0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX0NPUFkgJiYgZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX01PVkUpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJfQotCQlyZXR1cm4gZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX05PTkU7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGRyb3Agb24gYSBkcm9wVGFyZ2V0LgotCSAqIDxwPgotCSAqIFVzZWQgaW4gZHJvcCgpLjxicj4KLQkgKiBOb3RlIGV2ZW50LmRldGFpbCBpcyBtb2RpZmllZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGV2ZW50IHRoZSBEcm9wVGFyZ2V0RXZlbnQgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUgZHJvcCgpIG1ldGhvZAotCSAqIEBwYXJhbSB0YXJnZXRGaWxlIHRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgZHJvcCB0YXJnZXQgbG9jYXRpb24KLQkgKiAgICAgICAgdW5kZXIgaW5zcGVjdGlvbiwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYXJnZXRIYW5kbGVEcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCwgRmlsZSB0YXJnZXRGaWxlKSB7Ci0JCS8vIEdldCBkcm9wcGVkIGRhdGEgKGFuIGFycmF5IG9mIGZpbGVuYW1lcykKLQkJaWYgKCEgZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCB0YXJnZXRGaWxlKSkgcmV0dXJuOwotCQlmaW5hbCBTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IChTdHJpbmdbXSkgZXZlbnQuZGF0YTsKLQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgcmV0dXJuOwotCi0JCS8vIE9wZW4gcHJvZ3Jlc3MgZGlhbG9nCi0JCXByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKHNoZWxsLAotCQkJKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSA/IFByb2dyZXNzRGlhbG9nLk1PVkUgOiBQcm9ncmVzc0RpYWxvZy5DT1BZKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuc2V0VG90YWxXb3JrVW5pdHMoc291cmNlTmFtZXMubGVuZ3RoKTsKLQkJcHJvZ3Jlc3NEaWFsb2cub3BlbigpOwotCi0JCS8vIENvcHkgZWFjaCBmaWxlCi0JCVZlY3RvciAvKiBvZiBGaWxlICovIHByb2Nlc3NlZEZpbGVzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCBzb3VyY2VOYW1lcy5sZW5ndGgpICYmICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpOyBpKyspewotCQkJZmluYWwgRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShzb3VyY2VOYW1lc1tpXSk7Ci0JCQlmaW5hbCBGaWxlIGRlc3QgPSBuZXcgRmlsZSh0YXJnZXRGaWxlLCBzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWlmIChzb3VyY2UuZXF1YWxzKGRlc3QpKSBjb250aW51ZTsgLy8gaWdub3JlIGlmIGluIHNhbWUgbG9jYXRpb24KLQotCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShzb3VyY2UsIFByb2dyZXNzRGlhbG9nLkNPUFkpOwotCQkJd2hpbGUgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgewotCQkJCWlmIChjb3B5RmlsZVN0cnVjdHVyZShzb3VyY2UsIGRlc3QpKSB7Ci0JCQkJCXByb2Nlc3NlZEZpbGVzLmFkZChzb3VyY2UpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUgJiYgKCFpc0RyYWdnaW5nKSkgewotCQkJCQkJLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIG5vdGlmeSBhbiBleHRlcm5hbCBkcmFnIHNvdXJjZSB0aGF0IGEgZHJvcAotCQkJCQkJLy8gb3BlcmF0aW9uIHdhcyBvbmx5IHBhcnRpYWxseSBzdWNjZXNzZnVsLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3IgRFJPUF9NT1ZFIG9wZXJhdGlvbnMgc2luY2UgdW5sZXNzIHRoZSBzb3VyY2UgZ2V0cwotCQkJCQkJLy8gRFJPUF9OT05FLCBpdCB3aWxsIGRlbGV0ZSB0aGUgb3JpZ2luYWwgZGF0YSBpbmNsdWRpbmcgYml0cyB0aGF0Ci0JCQkJCQkvLyBtYXkgbm90IGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBzdWNjZXNzZnVsbHkuCi0JCQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5SRVRSWSB8IFNXVC5DQU5DRUwpOwotCQkJCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWRDb3B5LnRpdGxlIikpOwotCQkJCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWRDb3B5LmRlc2NyaXB0aW9uIiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBzb3VyY2UsIGRlc3QgfSkpOwotCQkJCQkJaW50IGJ1dHRvbiA9IGJveC5vcGVuKCk7Ci0JCQkJCQlpZiAoYnV0dG9uID09IFNXVC5DQU5DRUwpIHsKLQkJCQkJCQlpID0gc291cmNlTmFtZXMubGVuZ3RoOwotCQkJCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSBjYW4gcmVjb3ZlciBncmFjZWZ1bGx5IGZyb20gZXJyb3JzIGlmIHRoZSBkcmFnIHNvdXJjZSBiZWxvbmdzCi0JCQkJCQkvLyB0byB0aGlzIGFwcGxpY2F0aW9uIHNpbmNlIGl0IHdpbGwgbG9vayBhdCBwcm9jZXNzZWREcm9wRmlsZXMuCi0JCQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5BQk9SVCB8IFNXVC5SRVRSWSB8IFNXVC5JR05PUkUpOwotCQkJCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWRDb3B5LnRpdGxlIikpOwotCQkJCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWRDb3B5LmRlc2NyaXB0aW9uIiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBzb3VyY2UsIGRlc3QgfSkpOwotCQkJCQkJaW50IGJ1dHRvbiA9IGJveC5vcGVuKCk7Ci0JCQkJCQlpZiAoYnV0dG9uID09IFNXVC5BQk9SVCkgaSA9IHNvdXJjZU5hbWVzLmxlbmd0aDsKLQkJCQkJCWlmIChidXR0b24gIT0gU1dULlJFVFJZKSBicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNEcmFnZ2luZykgewotCQkJLy8gUmVtZW1iZXIgZXhhY3RseSB3aGljaCBmaWxlcyB3ZSBwcm9jZXNzZWQKLQkJCXByb2Nlc3NlZERyb3BGaWxlcyA9ICgoRmlsZVtdKSBwcm9jZXNzZWRGaWxlcy50b0FycmF5KG5ldyBGaWxlW3Byb2Nlc3NlZEZpbGVzLnNpemUoKV0pKTsKLQkJfSBlbHNlIHsKLQkJCXByb2dyZXNzRGlhbG9nLmNsb3NlKCk7Ci0JCQlwcm9ncmVzc0RpYWxvZyA9IG51bGw7Ci0JCX0KLQkJbm90aWZ5UmVmcmVzaEZpbGVzKG5ldyBGaWxlW10geyB0YXJnZXRGaWxlIH0pOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGNvbXBsZXRpb24gb2YgYSBkcmFnIG9uIGEgZHJhZ1NvdXJjZS4KLQkgKiA8cD4KLQkgKiBVc2VkIGluIGRyYWdGaW5pc2hlZCgpLjxicj4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGV2ZW50IHRoZSBEcmFnU291cmNlRXZlbnQgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUgZHJhZ0ZpbmlzaGVkKCkgbWV0aG9kCi0JICogQHBhcmFtIHNvdXJjZU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCB3ZXJlIGRyYWdnZWQgKGV2ZW50LmRhdGEgaXMgaW52YWxpZCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJhZ1NvdXJjZUhhbmRsZURyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQsIFN0cmluZ1tdIHNvdXJjZU5hbWVzKSB7Ci0JCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTU9WRSkgcmV0dXJuOwotCi0JCS8vIEdldCBhcnJheSBvZiBmaWxlcyB0aGF0IHdlcmUgYWN0dWFsbHkgdHJhbnNmZXJyZWQKLQkJZmluYWwgRmlsZVtdIHNvdXJjZUZpbGVzOwotCQlpZiAocHJvY2Vzc2VkRHJvcEZpbGVzICE9IG51bGwpIHsKLQkJCXNvdXJjZUZpbGVzID0gcHJvY2Vzc2VkRHJvcEZpbGVzOwotCQl9IGVsc2UgewotCQkJc291cmNlRmlsZXMgPSBuZXcgRmlsZVtzb3VyY2VOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGg7ICsraSkKLQkJCQlzb3VyY2VGaWxlc1tpXSA9IG5ldyBGaWxlKHNvdXJjZU5hbWVzW2ldKTsKLQkJfQkKLQkJaWYgKHByb2dyZXNzRGlhbG9nID09IG51bGwpCi0JCQlwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhzaGVsbCwgUHJvZ3Jlc3NEaWFsb2cuTU9WRSk7Ci0JCXByb2dyZXNzRGlhbG9nLnNldFRvdGFsV29ya1VuaXRzKHNvdXJjZUZpbGVzLmxlbmd0aCk7Ci0JCXByb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzKDApOwotCQlwcm9ncmVzc0RpYWxvZy5vcGVuKCk7Ci0KLQkJLy8gRGVsZXRlIGVhY2ggZmlsZQotCQlmb3IgKGludCBpID0gMDsgKGkgPCBzb3VyY2VGaWxlcy5sZW5ndGgpICYmICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpOyBpKyspewotCQkJZmluYWwgRmlsZSBzb3VyY2UgPSBzb3VyY2VGaWxlc1tpXTsKLQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUoc291cmNlLCBQcm9ncmVzc0RpYWxvZy5ERUxFVEUpOwotCQkJd2hpbGUgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgewotCQkJCWlmIChkZWxldGVGaWxlU3RydWN0dXJlKHNvdXJjZSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmICghIHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IgfCBTV1QuQUJPUlQgfCBTV1QuUkVUUlkgfCBTV1QuSUdOT1JFKTsKLQkJCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWREZWxldGUudGl0bGUiKSk7Ci0JCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuRmFpbGVkRGVsZXRlLmRlc2NyaXB0aW9uIiwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IHNvdXJjZSB9KSk7Ci0JCQkJCWludCBidXR0b24gPSBib3gub3BlbigpOwotCQkJCQlpZiAoYnV0dG9uID09IFNXVC5BQk9SVCkgaSA9IHNvdXJjZU5hbWVzLmxlbmd0aDsKLQkJCQkJaWYgKGJ1dHRvbiA9PSBTV1QuUkVUUlkpIGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQl9Ci0JCW5vdGlmeVJlZnJlc2hGaWxlcyhzb3VyY2VGaWxlcyk7Ci0JCXByb2dyZXNzRGlhbG9nLmNsb3NlKCk7Ci0JCXByb2dyZXNzRGlhbG9nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGZpbGVzeXN0ZW0gcm9vdCBlbnRyaWVzCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBGaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByb290IGRpcmVjdG9yaWVzIG9uIHRoZSBwbGF0Zm9ybSwKLQkgKiAgICAgICAgIG1heSBiZSBlbXB0eSBidXQgbm90IG51bGwKLQkgKi8KLQlGaWxlW10gZ2V0Um9vdHMoKSB7Ci0JCS8qCi0JCSAqIE9uIEpESyAxLjIyIG9ubHkuLi4KLQkJICovCi0JCS8vIHJldHVybiBGaWxlLmxpc3RSb290cygpOwotCi0JCS8qCi0JCSAqIE9uIEpESyAxLjEuNyBhbmQgYmV5b25kLi4uCi0JCSAqIC0tIFBPUlRBQklMSVRZIElTU1VFUyBIRVJFIC0tCi0JCSAqLwotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5ICgib3MubmFtZSIpLmluZGV4T2YgKCJXaW5kb3dzIikgIT0gLTEpIHsKLQkJCVZlY3RvciAvKiBvZiBGaWxlICovIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChuZXcgRmlsZShEUklWRV9BKSk7Ci0JCQlsaXN0LmFkZChuZXcgRmlsZShEUklWRV9CKSk7Ci0JCQlmb3IgKGNoYXIgaSA9ICdjJzsgaSA8PSAneic7ICsraSkgewotCQkJCUZpbGUgZHJpdmUgPSBuZXcgRmlsZShpICsgIjoiICsgRmlsZS5zZXBhcmF0b3IpOwotCQkJCWlmIChkcml2ZS5pc0RpcmVjdG9yeSgpICYmIGRyaXZlLmV4aXN0cygpKSB7Ci0JCQkJCWxpc3QuYWRkKGRyaXZlKTsKLQkJCQkJaWYgKGluaXRpYWwgJiYgaSA9PSAnYycpIHsKLQkJCQkJCWN1cnJlbnREaXJlY3RvcnkgPSBkcml2ZTsKLQkJCQkJCWluaXRpYWwgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUZpbGVbXSByb290cyA9IChGaWxlW10pIGxpc3QudG9BcnJheShuZXcgRmlsZVtsaXN0LnNpemUoKV0pOwotCQkJc29ydEZpbGVzKHJvb3RzKTsKLQkJCXJldHVybiByb290czsKLQkJfQotCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShGaWxlLnNlcGFyYXRvcik7Ci0JCWlmIChpbml0aWFsKSB7Ci0JCQljdXJyZW50RGlyZWN0b3J5ID0gcm9vdDsKLQkJCWluaXRpYWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbmV3IEZpbGVbXSB7IHJvb3QgfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgZGlyZWN0b3J5IGxpc3RpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZGlyZWN0b3J5IHRvIGJlIGxpc3RlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgdGhpcyBkaXJlY3RvcnkgY29udGFpbnMsIG1heSBiZSBlbXB0eSBidXQgbm90IG51bGwKLQkgKi8KLQlzdGF0aWMgRmlsZVtdIGdldERpcmVjdG9yeUxpc3QoRmlsZSBmaWxlKSB7Ci0JCUZpbGVbXSBsaXN0ID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG5ldyBGaWxlWzBdOwotCQlzb3J0RmlsZXMobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgYSBmaWxlIG9yIGVudGlyZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRGaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgb2xkIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG5ld0ZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMKLQkgKi8KLQlib29sZWFuIGNvcHlGaWxlU3RydWN0dXJlKEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCWlmIChvbGRGaWxlID09IG51bGwgfHwgbmV3RmlsZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCBuZXdGaWxlIGlzIG5vdCBhIGNoaWxkIG9mIG9sZEZpbGUgb3IgYSBkdXBlCi0JCUZpbGUgc2VhcmNoRmlsZSA9IG5ld0ZpbGU7Ci0JCWRvIHsKLQkJCWlmIChvbGRGaWxlLmVxdWFscyhzZWFyY2hGaWxlKSkgcmV0dXJuIGZhbHNlOwotCQkJc2VhcmNoRmlsZSA9IHNlYXJjaEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQl9IHdoaWxlIChzZWFyY2hGaWxlICE9IG51bGwpOwotCQkKLQkJaWYgKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJLyoKLQkJCSAqIENvcHkgYSBkaXJlY3RvcnkKLQkJCSAqLwotCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKG9sZEZpbGUsIFByb2dyZXNzRGlhbG9nLkNPUFkpOwotCQkJfQotCQkJaWYgKHNpbXVsYXRlT25seSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJzaW11bGF0ZS5EaXJlY3Rvcmllc0NyZWF0ZWQudGV4dCIsCi0JCQkJLy8JbmV3IE9iamVjdFtdIHsgbmV3RmlsZS5nZXRQYXRoKCkgfSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoISBuZXdGaWxlLm1rZGlycygpKSByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlGaWxlW10gc3ViRmlsZXMgPSBvbGRGaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKHN1YkZpbGVzICE9IG51bGwpIHsKLQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRXb3JrVW5pdHMoc3ViRmlsZXMubGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIG9sZFN1YkZpbGUgPSBzdWJGaWxlc1tpXTsKLQkJCQkJRmlsZSBuZXdTdWJGaWxlID0gbmV3IEZpbGUobmV3RmlsZSwgb2xkU3ViRmlsZS5nZXROYW1lKCkpOwotCQkJCQlpZiAoISBjb3B5RmlsZVN0cnVjdHVyZShvbGRTdWJGaWxlLCBuZXdTdWJGaWxlKSkgcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCQkJCQlpZiAocHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIENvcHkgYSBmaWxlCi0JCQkgKi8KLQkJCWlmIChzaW11bGF0ZU9ubHkpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygic2ltdWxhdGUuQ29weUZyb21Uby50ZXh0IiwKLQkJCQkvLwluZXcgT2JqZWN0W10geyBvbGRGaWxlLmdldFBhdGgoKSwgbmV3RmlsZS5nZXRQYXRoKCkgfSkpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlUmVhZGVyIGluID0gbnVsbDsKLQkJCQlGaWxlV3JpdGVyIG91dCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4gPSBuZXcgRmlsZVJlYWRlcihvbGRGaWxlKTsKLQkJCQkJb3V0ID0gbmV3IEZpbGVXcml0ZXIobmV3RmlsZSk7Ci0JCQkKLQkJCQkJaW50IGNvdW50OwotCQkJCQl3aGlsZSAoKGNvdW50ID0gaW4ucmVhZCgpKSAhPSAtMSkgb3V0LndyaXRlKGNvdW50KTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChpbiAhPSBudWxsKSBpbi5jbG9zZSgpOwotCQkJCQkJaWYgKG91dCAhPSBudWxsKSBvdXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYSBmaWxlIG9yIGVudGlyZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRGaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgb2xkIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIHdpdGhvdXQgZXJyb3JzCi0JICovCi0JYm9vbGVhbiBkZWxldGVGaWxlU3RydWN0dXJlKEZpbGUgb2xkRmlsZSkgewotCQlpZiAob2xkRmlsZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CQkKLQkJaWYgKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJLyoKLQkJCSAqIERlbGV0ZSBhIGRpcmVjdG9yeQotCQkJICovCi0JCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUob2xkRmlsZSwgUHJvZ3Jlc3NEaWFsb2cuREVMRVRFKTsKLQkJCX0KLQkJCUZpbGVbXSBzdWJGaWxlcyA9IG9sZEZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoc3ViRmlsZXMgIT0gbnVsbCkgewotCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCXByb2dyZXNzRGlhbG9nLmFkZFdvcmtVbml0cyhzdWJGaWxlcy5sZW5ndGgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YkZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgb2xkU3ViRmlsZSA9IHN1YkZpbGVzW2ldOwotCQkJCQlpZiAoISBkZWxldGVGaWxlU3RydWN0dXJlKG9sZFN1YkZpbGUpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJCQkJCWlmIChwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNpbXVsYXRlT25seSkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoInNpbXVsYXRlLkRlbGV0ZS50ZXh0IiwKLQkJCS8vCW5ldyBPYmplY3RbXSB7IG9sZEZpbGUuZ2V0UGF0aCgpLCBvbGRGaWxlLmdldFBhdGgoKSB9KSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gb2xkRmlsZS5kZWxldGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogU29ydHMgZmlsZXMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMgdGhlIGFycmF5IG9mIEZpbGVzIHRvIGJlIHNvcnRlZAotCSAqLwotCXN0YXRpYyB2b2lkIHNvcnRGaWxlcyhGaWxlW10gZmlsZXMpIHsKLQkJLyogVmVyeSBsYXp5IG1lcmdlIHNvcnQgYWxnb3JpdGhtICovCi0JCXNvcnRCbG9jayhmaWxlcywgMCwgZmlsZXMubGVuZ3RoIC0gMSwgbmV3IEZpbGVbZmlsZXMubGVuZ3RoXSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgc29ydEJsb2NrKEZpbGVbXSBmaWxlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBGaWxlW10gbWVyZ2VUZW1wKSB7Ci0JCWZpbmFsIGludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7Ci0JCWlmIChsZW5ndGggPCA4KSB7Ci0JCQlmb3IgKGludCBpID0gZW5kOyBpID4gc3RhcnQ7IC0taSkgewotCQkJCWZvciAoaW50IGogPSBlbmQ7IGogPiBzdGFydDsgLS1qKSAgewotCQkJCQlpZiAoY29tcGFyZUZpbGVzKGZpbGVzW2ogLSAxXSwgZmlsZXNbal0pID4gMCkgewotCQkJCQkgICAgZmluYWwgRmlsZSB0ZW1wID0gZmlsZXNbal07IAotCQkJCQkgICAgZmlsZXNbal0gPSBmaWxlc1tqLTFdOyAKLQkJCQkJICAgIGZpbGVzW2otMV0gPSB0ZW1wOwotCQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIGludCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKLQkJc29ydEJsb2NrKGZpbGVzLCBzdGFydCwgbWlkLCBtZXJnZVRlbXApOwotCQlzb3J0QmxvY2soZmlsZXMsIG1pZCArIDEsIGVuZCwgbWVyZ2VUZW1wKTsKLQkJaW50IHggPSBzdGFydDsKLQkJaW50IHkgPSBtaWQgKyAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0JCQlpZiAoKHggPiBtaWQpIHx8ICgoeSA8PSBlbmQpICYmIGNvbXBhcmVGaWxlcyhmaWxlc1t4XSwgZmlsZXNbeV0pID4gMCkpIHsKLQkJCQltZXJnZVRlbXBbaV0gPSBmaWxlc1t5KytdOwotCQkJfSBlbHNlIHsKLQkJCQltZXJnZVRlbXBbaV0gPSBmaWxlc1t4KytdOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGZpbGVzW2kgKyBzdGFydF0gPSBtZXJnZVRlbXBbaV07Ci0JfQotCXByaXZhdGUgc3RhdGljIGludCBjb21wYXJlRmlsZXMoRmlsZSBhLCBGaWxlIGIpIHsKLS8vCQlib29sZWFuIGFJc0RpciA9IGEuaXNEaXJlY3RvcnkoKTsKLS8vCQlib29sZWFuIGJJc0RpciA9IGIuaXNEaXJlY3RvcnkoKTsKLS8vCQlpZiAoYUlzRGlyICYmICEgYklzRGlyKSByZXR1cm4gLTE7Ci0vLwkJaWYgKGJJc0RpciAmJiAhIGFJc0RpcikgcmV0dXJuIDE7Ci0KLQkJLy8gc29ydCBjYXNlLXNlbnNpdGl2ZSBmaWxlcyBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgbWFubmVyCi0JCWludCBjb21wYXJlID0gYS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShiLmdldE5hbWUoKSk7Ci0JCWlmIChjb21wYXJlID09IDApIGNvbXBhcmUgPSBhLmdldE5hbWUoKS5jb21wYXJlVG8oYi5nZXROYW1lKCkpOwotCQlyZXR1cm4gY29tcGFyZTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGlzIHdvcmtlciB1cGRhdGVzIHRoZSB0YWJsZSB3aXRoIGZpbGUgaW5mb3JtYXRpb24gaW4gdGhlIGJhY2tncm91bmQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0JICogPHVsPgotCSAqIDxsaT4gSXQgaXMgZGVzaWduZWQgc3VjaCB0aGF0IGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCBjbGVhbmx5LgotCSAqIDxsaT4gSXQgdXNlcyBhc3luY0V4ZWMoKSBpbiBzb21lIHBsYWNlcyB0byBlbnN1cmUgdGhhdCBTV1QgV2lkZ2V0cyBhcmUgbWFuaXB1bGF0ZWQgaW4gdGhlCi0JICogICAgICByaWdodCB0aHJlYWQuICBFeGNsdXNpdmUgdXNlIG9mIHN5bmNFeGVjKCkgd291bGQgYmUgaW5hcHByb3ByaWF0ZSBhcyBpdCB3b3VsZCByZXF1aXJlIGEgcGFpcgotCSAqICAgICAgb2YgY29udGV4dCBzd2l0Y2hlcyBiZXR3ZWVuIGVhY2ggdGFibGUgdXBkYXRlIG9wZXJhdGlvbi4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQotCS8qKgotCSAqIFN0b3BzIHRoZSB3b3JrZXIgYW5kIHdhaXRzIGZvciBpdCB0byB0ZXJtaW5hdGUuCi0JICovCi0Jdm9pZCB3b3JrZXJTdG9wKCkgewotCQlpZiAod29ya2VyVGhyZWFkID09IG51bGwpIHJldHVybjsKLQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCXdvcmtlckNhbmNlbGxlZCA9IHRydWU7Ci0JCQl3b3JrZXJTdG9wcGVkID0gdHJ1ZTsKLQkJCXdvcmtlckxvY2subm90aWZ5QWxsKCk7Ci0JCX0KLQkJd2hpbGUgKHdvcmtlclRocmVhZCAhPSBudWxsKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgd29ya2VyIHRoYXQgaXQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgd2l0aCBuZXcgZGF0YS4KLQkgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBvcGVyYXRpb24gYW5kIGJlZ2lucyBhIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIGRpciB0aGUgbmV3IGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgdGFibGUsIG51bGwgaXMgaWdub3JlZAotCSAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlIGNhdXNlcyBhIHJlZnJlc2ggZXZlbiBpZiB0aGUgZGF0YSBpcyB0aGUgc2FtZQotCSAqLwotCXZvaWQgd29ya2VyVXBkYXRlKEZpbGUgZGlyLCBib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoKCFmb3JjZSkgJiYgKHdvcmtlck5leHREaXIgIT0gbnVsbCkgJiYgKHdvcmtlck5leHREaXIuZXF1YWxzKGRpcikpKSByZXR1cm47Ci0KLQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCXdvcmtlck5leHREaXIgPSBkaXI7Ci0JCQl3b3JrZXJTdG9wcGVkID0gZmFsc2U7Ci0JCQl3b3JrZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJd29ya2VyTG9jay5ub3RpZnlBbGwoKTsKLQkJfQotCQlpZiAod29ya2VyVGhyZWFkID09IG51bGwpIHsKLQkJCXdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQod29ya2VyUnVubmFibGUpOwotCQkJd29ya2VyVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYW5hZ2VzIHRoZSB3b3JrZXIncyB0aHJlYWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHdvcmtlclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl3aGlsZSAoISB3b3JrZXJTdG9wcGVkKSB7Ci0JCQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCQkJd29ya2VyQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCQkJCXdvcmtlclN0YXRlRGlyID0gd29ya2VyTmV4dERpcjsKLQkJCQl9Ci0JCQkJd29ya2VyRXhlY3V0ZSgpOwotCQkJCXN5bmNocm9uaXplZCh3b3JrZXJMb2NrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoKCF3b3JrZXJDYW5jZWxsZWQpICYmICh3b3JrZXJTdGF0ZURpciA9PSB3b3JrZXJOZXh0RGlyKSkgd29ya2VyTG9jay53YWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXdvcmtlclRocmVhZCA9IG51bGw7Ci0JCQkvLyB3YWtlIHVwIFVJIHRocmVhZCBpbiBjYXNlIGl0IGlzIGluIGEgbW9kYWwgbG9vcCBhd2FpdGluZyB0aHJlYWQgdGVybWluYXRpb24KLQkJCS8vIChzZWUgd29ya2VyU3RvcCgpKQotCQkJZGlzcGxheS53YWtlKCk7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRhYmxlJ3MgY29udGVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgd29ya2VyRXhlY3V0ZSgpIHsKLQkJRmlsZVtdIGRpckxpc3Q7Ci0JCS8vIENsZWFyIGV4aXN0aW5nIGluZm9ybWF0aW9uCi0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRhYmxlQ29udGVudHNPZkxhYmVsLnNldFRleHQoRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5Db250ZW50c09mLnRleHQiLAotCQkJCQluZXcgT2JqZWN0W10geyB3b3JrZXJTdGF0ZURpci5nZXRQYXRoKCkgfSkpOwotCQkJCXRhYmxlLnJlbW92ZUFsbCgpOwotCQkJCXRhYmxlLnNldERhdGEoVEFCTEVEQVRBX0RJUiwgd29ya2VyU3RhdGVEaXIpOwotCQkJfQotCQl9KTsKLQkJZGlyTGlzdCA9IGdldERpcmVjdG9yeUxpc3Qod29ya2VyU3RhdGVEaXIpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7ICghIHdvcmtlckNhbmNlbGxlZCkgJiYgKGkgPCBkaXJMaXN0Lmxlbmd0aCk7IGkrKykgewotCQkJd29ya2VyQWRkRmlsZURldGFpbHMoZGlyTGlzdFtpXSk7Ci0JCX0KLQotCX0KLQkJCi0JLyoqCi0JICogQWRkcyBhIGZpbGUncyBkZXRhaWwgaW5mb3JtYXRpb24gdG8gdGhlIGRpcmVjdG9yeSBsaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHdvcmtlckFkZEZpbGVEZXRhaWxzKGZpbmFsIEZpbGUgZmlsZSkgewotCQlmaW5hbCBTdHJpbmcgbmFtZVN0cmluZyA9IGZpbGUuZ2V0TmFtZSgpOwotCQlmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKGZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLQkJZmluYWwgU3RyaW5nIHNpemVTdHJpbmc7Ci0JCWZpbmFsIFN0cmluZyB0eXBlU3RyaW5nOwotCQlmaW5hbCBJbWFnZSBpY29uSW1hZ2U7Ci0JCQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLkZvbGRlciIpOwotCQkJc2l6ZVN0cmluZyA9ICIiOwotCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRm9sZGVyXTsKLQkJfSBlbHNlIHsKLQkJCXNpemVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXNpemUuS0IiLAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBMb25nKChmaWxlLmxlbmd0aCgpICsgNTEyKSAvIDEwMjQpIH0pOwotCQkJCi0JCQlpbnQgZG90ID0gbmFtZVN0cmluZy5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGRvdCAhPSAtMSkgewotCQkJCVN0cmluZyBleHRlbnNpb24gPSBuYW1lU3RyaW5nLnN1YnN0cmluZyhkb3QpOwotCQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uKTsKLQkJCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXR5cGVTdHJpbmcgPSBwcm9ncmFtLmdldE5hbWUoKTsKLQkJCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLmdldEljb25Gcm9tUHJvZ3JhbShwcm9ncmFtKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLlVua25vd24iLCBuZXcgT2JqZWN0W10geyBleHRlbnNpb24udG9VcHBlckNhc2UoKSB9KTsKLQkJCQkJaWNvbkltYWdlID0gaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uRmlsZV07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0eXBlU3RyaW5nID0gZ2V0UmVzb3VyY2VTdHJpbmcoImZpbGV0eXBlLk5vbmUiKTsKLQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25GaWxlXTsKLQkJCX0KLQkJfQotCQlmaW5hbCBTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgbmFtZVN0cmluZywgc2l6ZVN0cmluZywgdHlwZVN0cmluZywgZGF0ZVN0cmluZyB9OwotCi0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCQkvLyBndWFyZCBhZ2FpbnN0IHRoZSBzaGVsbCBiZWluZyBjbG9zZWQgYmVmb3JlIHRoaXMgcnVucwotCQkJCWlmIChzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCQkJdGFibGVJdGVtLnNldFRleHQoc3RyaW5ncyk7Ci0JCQkJdGFibGVJdGVtLnNldEltYWdlKGljb25JbWFnZSk7Ci0JCQkJdGFibGVJdGVtLnNldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFLCBmaWxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG1hbmFnZSBhIHByb2dyZXNzIGRpYWxvZyBmb3IgZmlsZSBvcGVyYXRpb25zLgotCSAqLwotCWNsYXNzIFByb2dyZXNzRGlhbG9nIHsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09QWSA9IDA7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFTEVURSA9IDE7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1PVkUgPSAyOwotCi0JCVNoZWxsIHNoZWxsOwotCQlMYWJlbCBtZXNzYWdlTGFiZWwsIGRldGFpbExhYmVsOwotCQlQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLQkJQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQkJYm9vbGVhbiBpc0NhbmNlbGxlZCA9IGZhbHNlOwotCi0JCWZpbmFsIFN0cmluZyBvcGVyYXRpb25LZXlOYW1lW10gPSB7Ci0JCQkiQ29weSIsCi0JCQkiRGVsZXRlIiwKLQkJCSJNb3ZlIgotCQl9OwotCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIHByb2dyZXNzIGRpYWxvZyBidXQgZG9lcyBub3Qgb3BlbiBpdCBpbW1lZGlhdGVseS4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBTaGVsbAotCQkgKiBAcGFyYW0gc3R5bGUgb25lIG9mIENPUFksIE1PVkUKLQkJICovCi0JCXB1YmxpYyBQcm9ncmVzc0RpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc2hlbGwgPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlRJVExFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy4iICsgb3BlcmF0aW9uS2V5TmFtZVtzdHlsZV0gKyAiLnRpdGxlIikpOwotCQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCQlpc0NhbmNlbGxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJwcm9ncmVzc0RpYWxvZy4iICsgb3BlcmF0aW9uS2V5TmFtZVtzdHlsZV0gKyAiLmRlc2NyaXB0aW9uIikpOwotCQkJCi0JCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULkhPUklaT05UQUwgfCBTV1QuV1JBUCk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDApOwotCQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bSgwKTsKLQkJCQotCQkJZGV0YWlsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlkZXRhaWxMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQkJY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJY2FuY2VsQnV0dG9uLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLmNhbmNlbEJ1dHRvbi50ZXh0IikpOwotCQkJY2FuY2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaXNDYW5jZWxsZWQgPSB0cnVlOwotCQkJCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGRldGFpbCB0ZXh0IHRvIHNob3cgdGhlIGZpbGVuYW1lIGFsb25nIHdpdGggYSBzdHJpbmcKLQkJICogcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoYXQgZmlsZS4KLQkJICogCi0JCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIGJlIGRldGFpbGVkCi0JCSAqIEBwYXJhbSBvcGVyYXRpb24gb25lIG9mIENPUFksIERFTEVURQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RGV0YWlsRmlsZShGaWxlIGZpbGUsIGludCBvcGVyYXRpb24pIHsKLQkJCWRldGFpbExhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW29wZXJhdGlvbl0gKyAiLm9wZXJhdGlvbiIsCi0JCQkJbmV3IE9iamVjdFtdIHsgZmlsZSB9KSk7Ci0JCX0KLQkJLyoqCi0JCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ2FuY2VsIGJ1dHRvbiB3YXMgYmVlbiBjbGlja2VkLgotCQkgKiAKLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSBDYW5jZWwgYnV0dG9uIHdhcyBjbGlja2VkLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCQlyZXR1cm4gaXNDYW5jZWxsZWQ7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGJlIHBlcmZvcm1lZC4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cwotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VG90YWxXb3JrVW5pdHMoaW50IHdvcmspIHsKLQkJCXByb2dyZXNzQmFyLnNldE1heGltdW0od29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIEFkZHMgdG8gdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGJlIHBlcmZvcm1lZC4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSBudW1iZXIgb2Ygd29yayB1bml0cyB0byBhZGQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZFdvcmtVbml0cyhpbnQgd29yaykgewotCQkJc2V0VG90YWxXb3JrVW5pdHMocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpICsgd29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHByb2dyZXNzIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRvdGFsIHdvcmsgdW5pdHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgY29tcGxldGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhpbnQgd29yaykgewotCQkJcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKHdvcmspOwotCQkJd2hpbGUgKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9IC8vIGVuYWJsZSBldmVudCBwcm9jZXNzaW5nCi0JCX0KLQkJLyoqCi0JCSAqIEFkZHMgdG8gdGhlIHByb2dyZXNzIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRvdGFsIHdvcmsgdW5pdHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gd29yayB0aGUgbnVtYmVyIG9mIHdvcmsgdW5pdHMgY29tcGxldGVkIHRvIGFkZAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkUHJvZ3Jlc3MoaW50IHdvcmspIHsKLQkJCXNldFByb2dyZXNzKHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpICsgd29yayk7Ci0JCX0KLQkJLyoqCi0JCSAqIE9wZW5zIHRoZSBkaWFsb2cuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQkJc2hlbGwucGFjaygpOwotCQkJZmluYWwgU2hlbGwgcGFyZW50U2hlbGwgPSAoU2hlbGwpIHNoZWxsLmdldFBhcmVudCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBwYXJlbnRTaGVsbC5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCWJvdW5kcy54ID0gcmVjdC54ICsgKHJlY3Qud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCWJvdW5kcy55ID0gcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC0gYm91bmRzLmhlaWdodCkgLyAyOwotCQkJc2hlbGwuc2V0Qm91bmRzKGJvdW5kcyk7Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQkJLyoqCi0JCSAqIENsb3NlcyB0aGUgZGlhbG9nIGFuZCBkaXNwb3NlcyBpdHMgcmVzb3VyY2VzLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJc2hlbGwgPSBudWxsOwotCQkJbWVzc2FnZUxhYmVsID0gbnVsbDsKLQkJCWRldGFpbExhYmVsID0gbnVsbDsKLQkJCXByb2dyZXNzQmFyID0gbnVsbDsKLQkJCWNhbmNlbEJ1dHRvbiA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9JY29uQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNlN2IxMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIGljb25zIGZvciB0aGUgYXBwbGljYXRpb24uCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB3ZSBjb3VsZCBlYXNpbHkgZW5kIHVwIGNyZWF0aW5nIHRob3VzYW5kcyBvZiBpY29ucwotICogYmVhcmluZyB0aGUgc2FtZSBpbWFnZS4KLSAqLwotY2xhc3MgSWNvbkNhY2hlIHsKLQkvLyBTdG9jayBpbWFnZXMKLQlwdWJsaWMgZmluYWwgaW50Ci0JCXNoZWxsSWNvbiA9IDAsCi0JCWljb25DbG9zZWREcml2ZSA9IDEsCi0JCWljb25DbG9zZWRGb2xkZXIgPSAyLAotCQlpY29uRmlsZSA9IDMsCi0JCWljb25PcGVuRHJpdmUgPSA0LAotCQlpY29uT3BlbkZvbGRlciA9IDUsCi0JCWNtZENvcHkgPSA2LAotCQljbWRDdXQgPSA3LAotCQljbWREZWxldGUgPSA4LAotCQljbWRQYXJlbnQgPSA5LAotCQljbWRQYXN0ZSA9IDEwLAotCQljbWRQcmludCA9IDExLAotCQljbWRSZWZyZXNoID0gMTIsCi0JCWNtZFJlbmFtZSA9IDEzLAotCQljbWRTZWFyY2ggPSAxNDsKLQlwdWJsaWMgZmluYWwgU3RyaW5nW10gc3RvY2tJbWFnZUxvY2F0aW9ucyA9IHsKLQkJImdlbmVyaWNfZXhhbXBsZS5naWYiLAotCQkiaWNvbl9DbG9zZWREcml2ZS5naWYiLAotCQkiaWNvbl9DbG9zZWRGb2xkZXIuZ2lmIiwKLQkJImljb25fRmlsZS5naWYiLAotCQkiaWNvbl9PcGVuRHJpdmUuZ2lmIiwKLQkJImljb25fT3BlbkZvbGRlci5naWYiLAotCQkiY21kX0NvcHkuZ2lmIiwKLQkJImNtZF9DdXQuZ2lmIiwKLQkJImNtZF9EZWxldGUuZ2lmIiwKLQkJImNtZF9QYXJlbnQuZ2lmIiwKLQkJImNtZF9QYXN0ZS5naWYiLAotCQkiY21kX1ByaW50LmdpZiIsCi0JCSJjbWRfUmVmcmVzaC5naWYiLAotCQkiY21kX1JlbmFtZS5naWYiLAotCQkiY21kX1NlYXJjaC5naWYiCi0JfTsKLQlwdWJsaWMgSW1hZ2Ugc3RvY2tJbWFnZXNbXTsKLQkKLQkvLyBTdG9jayBjdXJzb3JzCi0JcHVibGljIGZpbmFsIGludAotCQljdXJzb3JEZWZhdWx0ID0gMCwKLQkJY3Vyc29yV2FpdCA9IDE7Ci0JcHVibGljIEN1cnNvciBzdG9ja0N1cnNvcnNbXTsKLQkvLyBDYWNoZWQgaWNvbnMKLQlwcml2YXRlIEhhc2h0YWJsZSBpY29uQ2FjaGU7IC8qIG1hcCBQcm9ncmFtIHRvIEltYWdlICovCi0JCi0JcHVibGljIEljb25DYWNoZSgpIHsKLQl9Ci0JLyoqCi0JICogTG9hZHMgdGhlIHJlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdFJlc291cmNlcyhEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaWYgKHN0b2NrSW1hZ2VzID09IG51bGwpIHsKLQkJCXN0b2NrSW1hZ2VzID0gbmV3IEltYWdlW3N0b2NrSW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvY2tJbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCUltYWdlIGltYWdlID0gY3JlYXRlU3RvY2tJbWFnZShkaXNwbGF5LCBzdG9ja0ltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSk7Ci0JCQkJfQotCQkJCXN0b2NrSW1hZ2VzW2ldID0gaW1hZ2U7Ci0JCQl9Ci0JCX0JCi0JCWlmIChzdG9ja0N1cnNvcnMgPT0gbnVsbCkgewotCQkJc3RvY2tDdXJzb3JzID0gbmV3IEN1cnNvcltdIHsKLQkJCQludWxsLAotCQkJCW5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKQotCQkJfTsKLQkJfQotCQlpY29uQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCS8qKgotCSAqIEZyZWVzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBmcmVlUmVzb3VyY2VzKCkgewotCQlpZiAoc3RvY2tJbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0ltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gc3RvY2tJbWFnZXNbaV07Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN0b2NrSW1hZ2VzID0gbnVsbDsKLQkJfQotCQlpZiAoaWNvbkNhY2hlICE9IG51bGwpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gaXQgPSBpY29uQ2FjaGUuZWxlbWVudHMoKTsgaXQuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdC5uZXh0RWxlbWVudCgpOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZiAoc3RvY2tDdXJzb3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvY2tDdXJzb3JzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgQ3Vyc29yIGN1cnNvciA9IHN0b2NrQ3Vyc29yc1tpXTsKLQkJCQlpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzdG9ja0N1cnNvcnMgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdG9jayBpbWFnZQotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICogQHBhcmFtIHBhdGggdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGljb24KLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZVN0b2NrSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgcGF0aCkgewotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBJY29uQ2FjaGUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSAocGF0aCk7Ci0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhIChzdHJlYW0pOwotCQlJbWFnZURhdGEgbWFzayA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrICgpOwotCQlJbWFnZSByZXN1bHQgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlRGF0YSwgbWFzayk7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlICgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEdldHMgYW4gaW1hZ2UgZm9yIGEgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9ncmFtCi0JICoKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgUHJvZ3JhbQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uRnJvbVByb2dyYW0oUHJvZ3JhbSBwcm9ncmFtKSB7Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBpY29uQ2FjaGUuZ2V0KHByb2dyYW0pOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IHByb2dyYW0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlpZiAoaW1hZ2VEYXRhICE9IG51bGwpIHsKLQkJCQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBpbWFnZURhdGEsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCkpOwotCQkJCWljb25DYWNoZS5wdXQocHJvZ3JhbSwgaW1hZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlpbWFnZSA9IHN0b2NrSW1hZ2VzW2ljb25GaWxlXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ29weS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDI3NGIwNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjk0OGI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfRGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY2NDc2Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1BhcmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliMjc4ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzVlMGFiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXN0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkZmE4Y2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVmcmVzaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTA2M2MyMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZW5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNWIxMzI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfU2VhcmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRjM2ViZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWZiNmIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvZ2VuZXJpY19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRHJpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGU1MzBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fQ2xvc2VkRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Yjg2ZDA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRHJpdmUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiMmI2MzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5Yzc3NzM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmMGY3OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BZHZhbmNlZEdyYXBoaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotLyogCi0gKiBEcmF3aW5nIHdpdGggdHJhbnNmb3JtYXRpb25zLCBwYXRocyBhbmQgYWxwaGEgYmxlbmRpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkR3JhcGhpY3MgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfZ3JhcGhpY3MiKTsKLQkKLQlzdGF0aWMgSW1hZ2UgbG9hZEltYWdlIChEZXZpY2UgZGV2aWNlLCBDbGFzcyBjbGF6eiwgU3RyaW5nIHN0cmluZykgewotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtIChzdHJpbmcpOwotCQlpZiAoc3RyZWFtID09IG51bGwpIHJldHVybiBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGV2aWNlLCBzdHJlYW0pOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlICgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHt9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuKGZpbmFsIERpc3BsYXkgZGlzcGxheSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJBZHZhbmNlZEdyYXBoaWNzIikpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCXBhdGguZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCQlkaWFsb2cuc2V0VGV4dChSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cuc2V0TWVzc2FnZShSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJMaWJOb3RGb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUZvbnREYXRhIGZkID0gc2hlbGwuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCWZpbmFsIEZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgOTYsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JCWZpbmFsIEltYWdlIGltYWdlID0gbG9hZEltYWdlKGRpc3BsYXksIEFkdmFuY2VkR3JhcGhpY3MuY2xhc3MsICJpcm1hb3MuanBnIik7Ci0JCWZpbmFsIFJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwkJCQkKLQkJCQlUcmFuc2Zvcm0gdHIgPSBuZXcgVHJhbnNmb3JtKGRpc3BsYXkpOwotCQkJCXRyLnRyYW5zbGF0ZShyZWN0LndpZHRoIC8gNCwgcmVjdC5oZWlnaHQgLyAyKTsKLQkJCQl0ci5yb3RhdGUoLTMwKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJfQotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTsKLQkJc2hlbGwub3BlbigpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsJCi0JCXJldHVybiBzaGVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBBZHZhbmNlZEdyYXBoaWNzKCkub3BlbihkaXNwbGF5KTsKLQkJd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbHBoYVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWxwaGFUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MDhhZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbHBoYVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyBhbHBoYSBibGVuZGluZy4gSXQgZHJhd3MgdmFyaW91cyBzaGFwZXMgYW5kIGltYWdlcyBhcwotICogYWxwaGEgdmFsdWVzIGNoYW5nZS4KLSAqLwotcHVibGljIGNsYXNzIEFscGhhVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JLyoqCi0JICogVmFsdWUgdXNlZCBpbiBzZXRBbHBoYSBBUEkgY2FsbC4gR29lcyBmcm9tIDAgdG8gMjU1IGFuZCB0aGVuIHN0YXJ0cyBvdmVyLgotCSAqLwotCWludCBhbHBoYVZhbHVlOwotCQotCS8qKgotCSAqIFZhbHVlIHVzZWQgaW4gc2V0QWxwaGEgQVBJIGNhbGwuIEdvZXMgZnJvbSAwIHRvIDI1NSwgdGhlbiBmcm9tIDI1NSB0byAwCi0JICogYW5kIHRoZW4gc3RhcnRzIG92ZXIuCi0JICovCi0JaW50IGFscGhhVmFsdWUyOwotCi0JYm9vbGVhbiByZWFjaGVkTWF4ID0gZmFsc2U7Ci0JaW50IGRpYW1ldGVyOwotCQotCS8qKiByYW5kb20gbnVtYmVycyB1c2VkIGZvciBwb3NpdGlvbmluZyAiU1dUIiAqLwotCWludCByYW5kWCwgcmFuZFk7Ci0JSW1hZ2UgYWxwaGFJbWcxLCBhbHBoYUltZzI7Ci0KLQlwdWJsaWMgQWxwaGFUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQkJc3VwZXIoZXhhbXBsZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGFEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSB7Ci0JCXJldHVybiAyMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFscGhhSW1nMSAhPSBudWxsKSB7Ci0JCQlhbHBoYUltZzEuZGlzcG9zZSgpOwotCQkJYWxwaGFJbWcxID0gbnVsbDsKLQkJfQotCQlpZiAoYWxwaGFJbWcyICE9IG51bGwpIHsKLQkJCWFscGhhSW1nMi5kaXNwb3NlKCk7Ci0JCQlhbHBoYUltZzIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJYWxwaGFWYWx1ZSA9IChhbHBoYVZhbHVlKzUpJTI1NTsKLQkJCi0JCWFscGhhVmFsdWUyID0gcmVhY2hlZE1heCA/IGFscGhhVmFsdWUyIC0gNSA6IGFscGhhVmFsdWUyICsgNTsKLQkJCQotCQlpZiAoYWxwaGFWYWx1ZTIgPT0gMjU1KSB7Ci0JCQlyZWFjaGVkTWF4ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhbHBoYVZhbHVlMiA9PSAwKSB7Ci0JCQlyZWFjaGVkTWF4ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWRpYW1ldGVyID0gKGRpYW1ldGVyICsgMTApJSh3aWR0aCA+IGhlaWdodCA/IHdpZHRoIDogaGVpZ2h0KTsKLQl9Ci0KLQkvKiogCi0JICogUGFpbnQgdGhlIHJlY2VpdmVyIGludG8gdGhlIHNwZWNpZmllZCBHQy4gCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JCWlmIChhbHBoYUltZzEgPT0gbnVsbCkgewotCQkJYWxwaGFJbWcxID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFscGhhX2ltZzEucG5nIik7Ci0JCQlhbHBoYUltZzIgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWxwaGFfaW1nMi5wbmciKTsJCi0JCX0KLQotCQlSZWN0YW5nbGUgcmVjdCA9IGFscGhhSW1nMS5nZXRCb3VuZHMoKTsKLQkJCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUpOwotCQlnYy5kcmF3SW1hZ2UoYWxwaGFJbWcxLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIAotCQkJCXdpZHRoLzIsIGhlaWdodC8yLCB3aWR0aC80LCBoZWlnaHQvNCk7Ci0JCQotCQlnYy5kcmF3SW1hZ2UoYWxwaGFJbWcxLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIAotCQkJCTAsIDAsIHdpZHRoLzQsIGhlaWdodC80KTsKLQotCQlnYy5zZXRBbHBoYSgyNTUtYWxwaGFWYWx1ZSk7Ci0JCWdjLmRyYXdJbWFnZShhbHBoYUltZzIsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQkJd2lkdGgvMiwgMCwgd2lkdGgvNCwgaGVpZ2h0LzQpOwotCQkKLQkJZ2MuZHJhd0ltYWdlKGFscGhhSW1nMiwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCQkwLCAzKmhlaWdodC80LCB3aWR0aC80LCBoZWlnaHQvNCk7Ci0JCQotCQkvLyBwZW50YWdvbgotCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19NQUdFTlRBKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10ge3dpZHRoLzEwLCBoZWlnaHQvMiwgMyp3aWR0aC8xMCwgaGVpZ2h0LzItd2lkdGgvNiwgNSp3aWR0aC8xMCwgaGVpZ2h0LzIsIAotCQkJCTQqd2lkdGgvMTAsIGhlaWdodC8yK3dpZHRoLzYsIDIqd2lkdGgvMTAsIGhlaWdodC8yK3dpZHRoLzZ9KTsKLQotCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0KLQkJLy8gc3F1YXJlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKHdpZHRoLzIsIGhlaWdodC03NSwgNzUsIDc1KTsKLQkJCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyAxNSk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC8yKzc1LCBoZWlnaHQtKDIqNzUpLCB3aWR0aC8yKzc1LCBoZWlnaHQtNzUsIHdpZHRoLzIrKDIqNzUpLCBoZWlnaHQtNzV9KTsKLQkJCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyAzMCk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC8yKzgwLCBoZWlnaHQtKDIqNzUpLCB3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LSgyKjc1KSwgd2lkdGgvMisoMio3NSksIGhlaWdodC04MH0pOwotCQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDQ1KTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLzIrKDIqNzUpLCBoZWlnaHQtKDIqNzUpLCB3aWR0aC8yKygzKjc1KSwgaGVpZ2h0LSgyKjc1KSwgd2lkdGgvMisoMyo3NSksIGhlaWdodC0oMyo3NSl9KTsKLQkJCi0JCS8vIHRyaWFuZ2xlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyA2MCk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LSgoMio3NSkrNSksIHdpZHRoLzIrKDIqNzUpLCBoZWlnaHQtKDMqNzUpLCB3aWR0aC8yKygoMyo3NSktNSksIGhlaWdodC0oMyo3NSl9KTsKLQkJCi0JCS8vIHNxdWFyZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgNzUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKHdpZHRoLzIrKDMqNzUpLCBoZWlnaHQtKDQqNzUpLCA3NSwgNzUpOwotCQkKLQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCQotCQkvLyBjaXJjbGUgaW4gdG9wIHJpZ2h0IGNvcm5lcgotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlMik7Ci0JCWdjLmZpbGxPdmFsKHdpZHRoLTEwMCwgMCwgMTAwLCAxMDApOwotCQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDkwKTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLTMwMCwgMTAsIHdpZHRoLTEwMCwgMTAsIHdpZHRoLTI3NSwgNTB9KTsKLQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDEwNSk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC0xMCwgMTAwLCB3aWR0aC0xMCwgMzAwLCB3aWR0aC01MCwgMjc1fSk7Ci0JCQotCQkvLyBxdWFkcmlsYXRlcmFsIHNoYXBlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyAxMjApOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgtMTAwLCAxMDAsIHdpZHRoLTIwMCwgMTUwLCB3aWR0aC0yMDAsIDIwMCwgd2lkdGgtMTUwLCAyMDB9KTsKLQkJCi0JCS8vIGJsdWUgY2lyY2xlcwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQlpbnQgc2l6ZSA9IDUwOwotCQlpbnQgYWxwaGEgPSAyMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgYWxwaGEpOwotCQkJaWYgKGkgJSAyID4gMCkgewotCQkJCWdjLmZpbGxPdmFsKHdpZHRoLSgoaSsxKSpzaXplKSwgaGVpZ2h0LXNpemUsIHNpemUsIHNpemUpOwotCQkJfSBlbHNlIHsKLQkJCQlnYy5maWxsT3ZhbCh3aWR0aC0oKGkrMSkqc2l6ZSksIGhlaWdodC0oMypzaXplLzIpLCBzaXplLCBzaXplKTsKLQkJCX0KLQkJCWFscGhhID0gYWxwaGEgKyAyMDsKLQkJfQotCQkKLQkJLy8gU1dUIHN0cmluZyBhcHBlYXJpbmcgcmFuZG9tbHkKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZTIpOwotCQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7Ci0JCUZvbnQgZm9udCA9IGNyZWF0ZUZvbnQoZGV2aWNlLCAxMDAsIFNXVC5OT05FKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJCi0JCVBvaW50IHRleHRTaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCQlpbnQgdGV4dFdpZHRoID0gdGV4dFNpemUueDsKLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0U2l6ZS55OwotCQkKLQkJaWYgKGFscGhhVmFsdWUyID09IDApewotCQkJcmFuZFggPSAoaW50KSh3aWR0aCpNYXRoLnJhbmRvbSgpKTsKLQkJCXJhbmRZID0gKGludCkoaGVpZ2h0Kk1hdGgucmFuZG9tKCkpOwotCQkJcmFuZFggPSAocmFuZFggPiB0ZXh0V2lkdGgpID8gcmFuZFggLSB0ZXh0V2lkdGggOiByYW5kWDsKLQkJCXJhbmRZID0gKHJhbmRZID4gdGV4dEhlaWdodCkgPyByYW5kWSAtIHRleHRIZWlnaHQgOiByYW5kWTsKLQkJfQotCQkKLQkJZ2MuZHJhd1N0cmluZyh0ZXh0LCByYW5kWCwgcmFuZFksIHRydWUpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJCi0JCS8vIGdyYXkgZG9udXQKLQkJZ2Muc2V0QWxwaGEoMTAwKTsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5hZGRBcmMoKHdpZHRoLWRpYW1ldGVyKS8yLCAoaGVpZ2h0LWRpYW1ldGVyKS8yLCBkaWFtZXRlciwgZGlhbWV0ZXIsIDAsIDM2MCk7Ci0JCXBhdGguY2xvc2UoKTsKLQkJcGF0aC5hZGRBcmMoKHdpZHRoLWRpYW1ldGVyKzI1KS8yLCAoaGVpZ2h0LWRpYW1ldGVyKzI1KS8yLCBkaWFtZXRlci0yNSwgZGlhbWV0ZXItMjUsIDAsIDM2MCk7Ci0JCXBhdGguY2xvc2UoKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCWdjLmRyYXdQYXRoKHBhdGgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGZvbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHJldHVybnMgaXQuCi0JICogVGhpcyBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gZmFjZQotCSAqIAkJCVRoZSBuYW1lIG9mIHRoZSBmb250Ci0JICogQHBhcmFtIHBvaW50cwotCSAqIAkJCVRoZSBzaXplIG9mIHRoZSBmb250IGluIHBvaW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICogCQkJVGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGZvbnQKLQkgKi8KLQlzdGF0aWMgRm9udCBjcmVhdGVGb250KERldmljZSBkZXZpY2UsIGludCBwb2ludHMsIGludCBzdHlsZSkgewkJCi0JCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJCXJldHVybiBuZXcgRm9udChkZXZpY2UsICJWZXJkYW5hIiwgcG9pbnRzLCBzdHlsZSk7CQotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJCXJldHVybiBuZXcgRm9udChkZXZpY2UsICJUaW1lcyIsIHBvaW50cywgc3R5bGUpOwkJCi0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJCXJldHVybiBuZXcgRm9udChkZXZpY2UsICJCYWVrbXVrIEJhdGFuZyIsIHBvaW50cywgc3R5bGUpOwkJCi0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJCXJldHVybiBuZXcgRm9udChkZXZpY2UsICJWZXJkYW5hIiwgcG9pbnRzLCBzdHlsZSk7Ci0JCX0gZWxzZSB7IC8vIHBob3RvbgotCQkJcmV0dXJuIG5ldyBGb250KGRldmljZSwgIlZlcmRhbmEiLCBwb2ludHMsIHN0eWxlKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQW5pbWF0ZWRHcmFwaGljc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQW5pbWF0ZWRHcmFwaGljc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ0MmYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FuaW1hdGVkR3JhcGhpY3NUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIEdyYXBoaWNzVGFiIGNsYXNzIHRvIGNyZWF0ZSBhbmltYXRlZCBncmFwaGljcy4KLSAqICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWF0ZWRHcmFwaGljc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCVRvb2xCYXIgdG9vbEJhcjsKLQlUb29sSXRlbSBwbGF5SXRlbSwgcGF1c2VJdGVtOwotCVNwaW5uZXIgdGltZXJTcGlubmVyOwkJLy8gdG8gaW5wdXQgdGhlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gCi0JcHJpdmF0ZSBib29sZWFuIGFuaW1hdGU7CS8vIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gYW5pbWF0ZSB0aGUgZ3JhcGhpYwotCi0JcHVibGljIEFuaW1hdGVkR3JhcGhpY3NUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQkJc3VwZXIoZXhhbXBsZSk7Ci0JCWFuaW1hdGUgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBvZiB0aGUgY29tcG9zaXRlIHRvIFJvd0xheW91dCBhbmQgY3JlYXRlcyB0aGUgdG9vbGJhci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNjcmVhdGVDb250cm9sUGFuZWwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQkvLyBzZXR1cCBsYXlvdXQKLQkJUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJbGF5b3V0LndyYXAgPSB0cnVlOwotCQlsYXlvdXQuc3BhY2luZyA9IDg7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWNyZWF0ZVRvb2xCYXIocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhciBjb250cm9sczogcGxheSwgcGF1c2UgYW5kIGFuaW1hdGlvbiB0aW1lci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IEEgY29tcG9zaXRlCi0JICovCi0Jdm9pZCBjcmVhdGVUb29sQmFyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCQkKLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQpOwotCQlMaXN0ZW5lciB0b29sQmFyTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCQljYXNlIFNXVC5TZWxlY3Rpb246IHsKLQkJCQkJCWlmIChldmVudC53aWRnZXQgPT0gcGxheUl0ZW0pIHsKLQkJCQkJCQlhbmltYXRlID0gdHJ1ZTsKLQkJCQkJCQlwbGF5SXRlbS5zZXRFbmFibGVkKCFhbmltYXRlKTsKLQkJCQkJCQlwYXVzZUl0ZW0uc2V0RW5hYmxlZChhbmltYXRlKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHBhdXNlSXRlbSkgewotCQkJCQkJCWFuaW1hdGUgPSBmYWxzZTsKLQkJCQkJCQlwbGF5SXRlbS5zZXRFbmFibGVkKCFhbmltYXRlKTsKLQkJCQkJCQlwYXVzZUl0ZW0uc2V0RW5hYmxlZChhbmltYXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBwbGF5IHRvb2wgaXRlbQotCQlwbGF5SXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXBsYXlJdGVtLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQbGF5IikpOyAvLyROT04tTkxTLTEkCi0JCXBsYXlJdGVtLnNldEltYWdlKGV4YW1wbGUubG9hZEltYWdlKGRpc3BsYXksICJwbGF5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlwbGF5SXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0b29sQmFyTGlzdGVuZXIpOwotCQkKLQkJLy8gcGF1c2UgdG9vbCBpdGVtCi0JCXBhdXNlSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXBhdXNlSXRlbS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF1c2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGF1c2VJdGVtLnNldEltYWdlKGV4YW1wbGUubG9hZEltYWdlKGRpc3BsYXksICJwYXVzZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGF1c2VJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRvb2xCYXJMaXN0ZW5lcik7Ci0JCQotCQkvLyB0aW1lciBzcGlubmVyCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKTsKLQkJbGFiZWwuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFuaW1hdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aW1lclNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCQl0aW1lclNwaW5uZXIuc2V0TWF4aW11bSgxMDAwKTsKLQkJCi0JCXBsYXlJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhbmltYXRlID0gdHJ1ZTsKLQotCQl0aW1lclNwaW5uZXIuc2V0U2VsZWN0aW9uKGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiAgQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgZHJhd2luZyBzaG91bGQgYmUgZG91YmxlIGJ1ZmZlcmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERvdWJsZUJ1ZmZlcmVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgaW5pdGlhbCBhbmltYXRpb24gdGltZSB0byBiZSB1c2VkIGJ5IHRoZSB0YWIuIEFuaW1hdGlvbiB0aW1lOgotCSAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY3VycmVudCBkcmF3aW5nIGFuZCB0aGUgbmV4dCAodGhlIHRpbWUKLQkgKiBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHRvIHRoZSBuZXh0IG1ldGhvZCkuIFNob3VsZCBiZSBvdmVycmlkZGVuIHRvCi0JICogcmV0dXJuIGEgdmFsdWUgdGhhdCBpcyBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgdGFiLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSB7Ci0JCXJldHVybiAzMDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgYW5pbWF0aW9uIHRpbWUgdGhhdCBpcyBzZWxlY3RlZCBpbiB0aGUgc3Bpbm5lci4gQW5pbWF0aW9uIHRpbWU6Ci0JICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGRyYXdpbmcgYW5kIHRoZSBuZXh0ICh0aGUgdGltZQotCSAqIGludGVydmFsIGJldHdlZW4gY2FsbHMgdG8gdGhlIG5leHQgbWV0aG9kKS4gU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8KLQkgKiByZXR1cm4gYSB2YWx1ZSB0aGF0IGlzIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSB0YWIuCi0JICovCi0JcHVibGljIGludCBnZXRBbmltYXRpb25UaW1lKCkgewotCQlyZXR1cm4gdGltZXJTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cnVlIGlmIHRoZSB0YWIgaXMgY3VycmVudGx5IGFuaW1hdGVkOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QW5pbWF0aW9uKCkgewotCQlyZXR1cm4gYW5pbWF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2F1c2VzIHRoZSBhbmltYXRpb24gdG8gc3RvcCBvciBzdGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgdHJ1ZSBzdGFydHMgdGhlIGFuaW1hdGlvbjsgZmFsc2Ugc3RvcHMgdGhlIGFuaW1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbmltYXRpb24oYm9vbGVhbiBmbGFnKSB7Ci0JCWFuaW1hdGUgPSBmbGFnOwotCQlwbGF5SXRlbS5zZXRFbmFibGVkKCFmbGFnKTsKLQkJcGF1c2VJdGVtLnNldEVuYWJsZWQoZmxhZyk7Ci0JfQotCi0JLyoqCi0JICogQWR2YW5jZSB0aGUgYW5pbWF0aW9uLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JhbGxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JhbGxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0YmU3MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CYWxsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuVHJhbnNmb3JtOwotCi0vKioKLSAqIFRoaXMgdGFiIHVzZXMgYWxwaGEgYmxlbmRpbmcgdG8gc2ltdWxhdGUgImdob3N0aW5nIiBvZiBhIGJhbGwgaW4gbW92ZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWxsVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0KLQlCYWxsQ29sbGVjdGlvbltdIGJjOwotCi0JLyoqCi0JICogVGhpcyBpbm5lciBjbGFzcyBzZXJ2ZXMgYXMgYSBjb250YWluZXIgZm9yIHRoZSBkYXRhIG5lZWRlZCB0byBkaXNwbGF5IGEKLQkgKiBjb2xsZWN0aW9uIG9mIGJhbGxzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBCYWxsQ29sbGVjdGlvbiB7Ci0JCWZsb2F0IHgsIHk7IC8vIHBvc2l0aW9uIG9mIGJhbGwKLQkJZmxvYXQgaW5jWCwgaW5jWTsgLy8gdmFsdWVzIGJ5IHdoaWNoIHRvIG1vdmUgdGhlIGJhbGwKLQkJaW50IGJhbGxfc2l6ZTsgLy8gc2l6ZSAoZGlhbWV0ZXIpIG9mIHRoZSBiYWxsCi0JCWludCBjYXBhY2l0eTsgLy8gbnVtYmVyIG9mIGJhbGxzIGluIHRoZSBjb2xsZWN0aW9uCi0JCUxpbmtlZExpc3QgcHJldngsIHByZXZ5OyAvLyBjb2xsZWN0aW9uIG9mIHByZXZpb3VzIHggYW5kIHkgcG9zaXRpb25zCi0JCQkJCQkJCSAvLyBvZiBiYWxsCi0JCUNvbG9yW10gY29sb3JzOyAvLyBjb2xvcnMgdXNlZCBmb3IgdGhpcyBiYWxsIGNvbGxlY3Rpb24KLQotCQlwdWJsaWMgQmFsbENvbGxlY3Rpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgaW5jWCwgZmxvYXQgaW5jWSwKLQkJCQlpbnQgYmFsbF9zaXplLCBpbnQgY2FwYWNpdHksIENvbG9yW10gY29sb3JzKSB7Ci0JCQl0aGlzLnggPSB4OwotCQkJdGhpcy55ID0geTsKLQkJCXRoaXMuaW5jWCA9IGluY1g7Ci0JCQl0aGlzLmluY1kgPSBpbmNZOwotCQkJdGhpcy5iYWxsX3NpemUgPSBiYWxsX3NpemU7Ci0JCQl0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7Ci0JCQlwcmV2eCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQlwcmV2eSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl0aGlzLmNvbG9ycyA9IGNvbG9yczsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJjWzBdID0gYmNbMV0gPSBiY1syXSA9IGJjWzNdID0gYmNbNF0gPSBudWxsOwotCX0KLQotCXB1YmxpYyBCYWxsVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCQliYyA9IG5ldyBCYWxsQ29sbGVjdGlvbls1XTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWxsRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCQlyZXR1cm4gMTA7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJjW2ldID09IG51bGwpIHJldHVybjsKLQkJCWlmIChiY1tpXS5wcmV2eC5zaXplKCkgPT0gMCkgewotCQkJCWJjW2ldLnByZXZ4LmFkZExhc3QobmV3IEZsb2F0KGJjW2ldLngpKTsKLQkJCQliY1tpXS5wcmV2eS5hZGRMYXN0KG5ldyBGbG9hdChiY1tpXS55KSk7Ci0JCQl9IGVsc2UgaWYgKGJjW2ldLnByZXZ4LnNpemUoKSA9PSBiY1tpXS5jYXBhY2l0eSkgewotCQkJCWJjW2ldLnByZXZ4LnJlbW92ZUZpcnN0KCk7Ci0JCQkJYmNbaV0ucHJldnkucmVtb3ZlRmlyc3QoKTsKLQkJCX0KLQotCQkJYmNbaV0ueCArPSBiY1tpXS5pbmNYOwotCQkJYmNbaV0ueSArPSBiY1tpXS5pbmNZOwotCi0JCQlmbG9hdCByYW5kb20gPSAoZmxvYXQpIE1hdGgucmFuZG9tKCk7Ci0KLQkJCS8vIHJpZ2h0Ci0JCQlpZiAoYmNbaV0ueCArIGJjW2ldLmJhbGxfc2l6ZSA+IHdpZHRoKSB7Ci0JCQkJYmNbaV0ueCA9IHdpZHRoIC0gYmNbaV0uYmFsbF9zaXplOwotCQkJCWJjW2ldLmluY1ggPSByYW5kb20gKiAtd2lkdGggLyAxNiAtIDE7Ci0JCQl9Ci0JCQkvLyBsZWZ0Ci0JCQlpZiAoYmNbaV0ueCA8IDApIHsKLQkJCQliY1tpXS54ID0gMDsKLQkJCQliY1tpXS5pbmNYID0gcmFuZG9tICogd2lkdGggLyAxNiArIDE7Ci0JCQl9Ci0JCQkvLyBib3R0b20KLQkJCWlmIChiY1tpXS55ICsgYmNbaV0uYmFsbF9zaXplID4gaGVpZ2h0KSB7Ci0JCQkJYmNbaV0ueSA9IChoZWlnaHQgLSBiY1tpXS5iYWxsX3NpemUpIC0gMjsKLQkJCQliY1tpXS5pbmNZID0gcmFuZG9tICogLWhlaWdodCAvIDE2IC0gMTsKLQkJCX0KLQkJCS8vIHRvcAotCQkJaWYgKGJjW2ldLnkgPCAwKSB7Ci0JCQkJYmNbaV0ueSA9IDA7Ci0JCQkJYmNbaV0uaW5jWSA9IHJhbmRvbSAqIGhlaWdodCAvIDE2ICsgMTsKLQkJCX0KLQkJCWJjW2ldLnByZXZ4LmFkZExhc3QobmV3IEZsb2F0KGJjW2ldLngpKTsKLQkJCWJjW2ldLnByZXZ5LmFkZExhc3QobmV3IEZsb2F0KGJjW2ldLnkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCQlpZiAoYmNbMF0gPT0gbnVsbCkgewotCQkJYmNbMF0gPSBuZXcgQmFsbENvbGxlY3Rpb24oMCwgMCwgNSwgNSwgMjAsIDIwLCBuZXcgQ29sb3JbXSB7IGRldmljZQotCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSB9KTsKLQkJCWJjWzFdID0gbmV3IEJhbGxDb2xsZWN0aW9uKDUwLCAzMDAsIDEwLCAtNSwgNTAsIDEwLAotCQkJCQluZXcgQ29sb3JbXSB7IGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkgfSk7Ci0JCQliY1syXSA9IG5ldyBCYWxsQ29sbGVjdGlvbigyNTAsIDEwMCwgLTUsIDgsIDI1LCAxMiwKLQkJCQkJbmV3IENvbG9yW10geyBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkgfSk7Ci0JCQliY1szXSA9IG5ldyBCYWxsQ29sbGVjdGlvbigxNTAsIDQwMCwgNSwgOCwgMzUsIDE0LAotCQkJCQluZXcgQ29sb3JbXSB7IGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spIH0pOwotCQkJYmNbNF0gPSBuZXcgQmFsbENvbGxlY3Rpb24oMTAwLCAyNTAsIC01LCAtMTgsIDEwMCwgNSwKLQkJCQkJbmV3IENvbG9yW10geyBkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpIH0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBiYy5sZW5ndGg7IGorKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiY1tqXS5wcmV2eC5zaXplKCk7IGkrKykgewotCQkJCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCQkJdHJhbnNmb3JtLnRyYW5zbGF0ZSgoKEZsb2F0KSBiY1tqXS5wcmV2eC5nZXQoYmNbal0ucHJldnguc2l6ZSgpCi0JCQkJCQktIChpICsgMSkpKS5mbG9hdFZhbHVlKCksICgoRmxvYXQpIGJjW2pdLnByZXZ5Ci0JCQkJCQkuZ2V0KGJjW2pdLnByZXZ5LnNpemUoKSAtIChpICsgMSkpKS5mbG9hdFZhbHVlKCkpOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0KLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQkJCXBhdGguYWRkQXJjKDAsIDAsIGJjW2pdLmJhbGxfc2l6ZSwgYmNbal0uYmFsbF9zaXplLCAwLCAzNjApOwotCQkJCWdjLnNldEFscGhhKDI1NSAtIGkgKiAoMjU1IC8gYmNbal0uY2FwYWNpdHkpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJjW2pdLmNvbG9yc1swXSk7Ci0JCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQkJcGF0aC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9CbGFja0hvbGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JsYWNrSG9sZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmMyOWQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JsYWNrSG9sZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgQmxhY2tIb2xlVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHNpemUgPSAxOwotCQotcHVibGljIEJsYWNrSG9sZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmxhY2tIb2xlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCbGFja0hvbGVEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKHNpemUgPiB3aWR0aCAqIDMgLyAyKSBzaXplID0gMDsKLQllbHNlIHNpemUgKz0gMTA7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JZ2MuZmlsbE92YWwoKHdpZHRoIC0gc2l6ZSkgLyAyLCAoaGVpZ2h0IC0gc2l6ZSkgLyAyLCBzaXplLCBzaXplKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NhcmRzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DYXJkc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y1NDdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NhcmRzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQKLSAqIHRyYW5zbGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ2FyZHNUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlmbG9hdCBtb3ZDbHViWCwgbW92Q2x1YlksIG1vdkRpYW1vbmRYLCBtb3ZEaWFtb25kWSwgbW92SGVhcnQsIG1vdlNwYWRlOwotCWZsb2F0IGluY19jbHViID0gNS4wZjsKLQlmbG9hdCBpbmNfZGlhbW9uZCA9IDUuMGY7Ci0JZmxvYXQgaW5jX2hlYXJ0cyA9IDUuMGY7Ci0JZmxvYXQgaW5jX3NwYWRlID0gNS4wZjsKLQlmbG9hdCBzY2FsZSwgc2NhbGVXaWR0aDsKLQlpbnQgcm90YXRpb25BbmdsZSA9IDA7Ci0JZmxvYXQgc2NhbGVBcmcgPSAwOwotCWZsb2F0IGhlYXJ0U2NhbGUgPSAwLjVmOwotCWZsb2F0IHNwYWRlU2NhbGUgPSAwLjMzM2Y7Ci0JaW50IGNsdWJXaWR0aCwgZGlhbW9uZFdpZHRoLCBoZWFydFdpZHRoLCBzcGFkZUhlaWdodDsgCi0JCi0JSW1hZ2UgYWNlX2NsdWIsIGFjZV9zcGFkZSwgYWNlX2RpYW1vbmQsIGFjZV9oZWFydHM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqIEBwYXJhbSBleGFtcGxlIEEgR3JhcGhpY3NFeGFtcGxlCi0gKi8KLXB1YmxpYyBDYXJkc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyYW5zZm9ybSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYXJkcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2FyZHNEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKGFjZV9jbHViICE9IG51bGwpIHsKLQkJYWNlX2NsdWIuZGlzcG9zZSgpOwotCQlhY2VfY2x1YiA9IG51bGw7Ci0JCWFjZV9zcGFkZS5kaXNwb3NlKCk7Ci0JCWFjZV9zcGFkZSA9IG51bGw7Ci0JCWFjZV9kaWFtb25kLmRpc3Bvc2UoKTsKLQkJYWNlX2RpYW1vbmQgPSBudWxsOwotCQlhY2VfaGVhcnRzLmRpc3Bvc2UoKTsKLQkJYWNlX2hlYXJ0cyA9IG51bGw7Ci0JfQotfQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlyb3RhdGlvbkFuZ2xlID0gKHJvdGF0aW9uQW5nbGUrMTApJTM2MDsKLQotCS8vIHNjYWxlVmFsIGdvZXMgZnJvbSAwIHRvIDEsIHRoZW4gMSB0byAwLCB0aGVuIHN0YXJ0cyBvdmVyCi0Jc2NhbGVBcmcgPSAoZmxvYXQpKChzY2FsZUFyZyA9PSAxKSA/IHNjYWxlQXJnIC0gMC4xIDogc2NhbGVBcmcgKyAwLjEpOwotCXNjYWxlID0gKGZsb2F0KU1hdGguY29zKHNjYWxlQXJnKTsKLQkKLQltb3ZDbHViWCArPSBpbmNfY2x1YjsKLQltb3ZEaWFtb25kWCArPSBpbmNfZGlhbW9uZDsKLQltb3ZIZWFydCArPSBpbmNfaGVhcnRzOwotCW1vdlNwYWRlICs9IGluY19zcGFkZTsKLQkKLQlzY2FsZVdpZHRoID0gKGZsb2F0KSAoKG1vdkNsdWJZL2hlaWdodCkqMC4zNSArIDAuMTUpOwotCW1vdkNsdWJZID0gMipoZWlnaHQvNSAqIChmbG9hdClNYXRoLnNpbigwLjAxKm1vdkNsdWJYIC0gOTApICsgMipoZWlnaHQvNTsKLSAgICBtb3ZEaWFtb25kWSA9IDIqaGVpZ2h0LzUgKiAoZmxvYXQpTWF0aC5jb3MoMC4wMSptb3ZEaWFtb25kWCkgKyAyKmhlaWdodC81OwotICAgIAotICAgIGlmIChtb3ZDbHViWCArIGNsdWJXaWR0aCpzY2FsZVdpZHRoID4gd2lkdGgpIHsKLSAgICAJbW92Q2x1YlggPSB3aWR0aCAtIGNsdWJXaWR0aCpzY2FsZVdpZHRoOwotICAgICAgICBpbmNfY2x1YiA9IC1pbmNfY2x1YjsKLSAgICB9Ci0gICAgaWYgKG1vdkNsdWJYIDwgMCkgewotICAgICAgICBtb3ZDbHViWCA9IDA7Ci0gICAgICAgIGluY19jbHViID0gLWluY19jbHViOwotICAgIH0KLSAgICBpZiAobW92RGlhbW9uZFggKyBkaWFtb25kV2lkdGgqc2NhbGVXaWR0aCA+IHdpZHRoKSB7Ci0JICAgIG1vdkRpYW1vbmRYID0gd2lkdGggLSBkaWFtb25kV2lkdGgqc2NhbGVXaWR0aDsKLSAgICAgICAgaW5jX2RpYW1vbmQgPSAtaW5jX2RpYW1vbmQ7Ci0gICAgfQotICAgIGlmIChtb3ZEaWFtb25kWCA8IDApIHsKLQkgICAgbW92RGlhbW9uZFggPSAwOwotICAgICAgICBpbmNfZGlhbW9uZCA9IC1pbmNfZGlhbW9uZDsKLSAgICB9Ci0gICAgaWYgKG1vdkhlYXJ0ICsgaGVhcnRXaWR0aCpoZWFydFNjYWxlID4gd2lkdGgpIHsKLSAgICAJbW92SGVhcnQgPSB3aWR0aCAtIGhlYXJ0V2lkdGgqaGVhcnRTY2FsZTsKLSAgICAJaW5jX2hlYXJ0cyA9IC1pbmNfaGVhcnRzOwotICAgIH0KLSAgICBpZiAobW92SGVhcnQgPCAwKSB7Ci0gICAgCW1vdkhlYXJ0ID0gMDsKLSAgICAJaW5jX2hlYXJ0cyA9IC1pbmNfaGVhcnRzOwotICAgIH0KLSAgICBpZiAobW92U3BhZGUgKyBzcGFkZUhlaWdodCpzcGFkZVNjYWxlID4gaGVpZ2h0KSB7Ci0gICAgCW1vdlNwYWRlID0gaGVpZ2h0IC0gc3BhZGVIZWlnaHQqc3BhZGVTY2FsZTsKLSAgICAJaW5jX3NwYWRlID0gLWluY19zcGFkZTsKLSAgICB9Ci0gICAgaWYgKG1vdlNwYWRlIDwgMCkgewotICAgIAltb3ZTcGFkZSA9IDA7Ci0gICAgCWluY19zcGFkZSA9IC1pbmNfc3BhZGU7Ci0gICAgfQotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCWlmIChhY2VfY2x1YiA9PSBudWxsKSB7Ci0JCWFjZV9jbHViID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9jbHViLmpwZyIpOwotCQlhY2Vfc3BhZGUgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWNlX3NwYWRlLmpwZyIpOwotCQlhY2VfZGlhbW9uZCA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhY2VfZGlhbW9uZC5qcGciKTsKLQkJYWNlX2hlYXJ0cyA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhY2VfaGVhcnRzLmpwZyIpOwotCX0KLQkKLQljbHViV2lkdGggPSBhY2VfY2x1Yi5nZXRCb3VuZHMoKS53aWR0aDsKLQlkaWFtb25kV2lkdGggPSBhY2VfZGlhbW9uZC5nZXRCb3VuZHMoKS53aWR0aDsKLQloZWFydFdpZHRoID0gYWNlX2hlYXJ0cy5nZXRCb3VuZHMoKS53aWR0aDsKLQlzcGFkZUhlaWdodCA9IGFjZV9zcGFkZS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0KLQlUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCQotCS8vIGFjZSBvZiBjbHVicwkJCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKGludCltb3ZDbHViWCwgKGludCltb3ZDbHViWSk7CQotCXRyYW5zZm9ybS5zY2FsZShzY2FsZVdpZHRoLCBzY2FsZVdpZHRoKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyIG9mIGltYWdlCi0JUmVjdGFuZ2xlIHJlY3QgPSBhY2VfY2x1Yi5nZXRCb3VuZHMoKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHJlY3Qud2lkdGgvMiwgcmVjdC5oZWlnaHQvMik7Ci0JdHJhbnNmb3JtLnJvdGF0ZShyb3RhdGlvbkFuZ2xlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKC1yZWN0LndpZHRoLzIsIC1yZWN0LmhlaWdodC8yKTsKLQotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JZ2MuZHJhd0ltYWdlKGFjZV9jbHViLCAwLCAwKTsKLQkKLQkvLyBhY2Ugb2YgZGlhbW9uZHMKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgoaW50KW1vdkRpYW1vbmRYLCAoaW50KW1vdkRpYW1vbmRZKTsKLQl0cmFuc2Zvcm0uc2NhbGUoc2NhbGVXaWR0aCwgc2NhbGVXaWR0aCk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlnYy5kcmF3SW1hZ2UoYWNlX2RpYW1vbmQsIDAsIDApOwotCi0JLy8gYWNlIG9mIGhlYXJ0cwotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKG1vdkhlYXJ0LCBoZWlnaHQvMik7Ci0JdHJhbnNmb3JtLnNjYWxlKGhlYXJ0U2NhbGUsIDAuNWYqc2NhbGUpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JZ2MuZHJhd0ltYWdlKGFjZV9oZWFydHMsIDAsIDApOwotCQotCS8vIGFjZSBvZiBzcGFkZXMKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShtb3ZTcGFkZSwgbW92U3BhZGUpOwotCXRyYW5zZm9ybS5zY2FsZSgwLjVmKnNjYWxlLCBzcGFkZVNjYWxlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCWdjLmRyYXdJbWFnZShhY2Vfc3BhZGUsIDAsIDApOwotfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvckxpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmQ4MDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi0vKioKLSAqIFVzZWQgdG8gcGVyZm9ybSBhbiBhY3Rpb24gYWZ0ZXIgYW4gaXRlbSBpbiBhIE1lbnUgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkNvbG9yTWVudS5qYXZhCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc0JhY2tncm91bmQuamF2YQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbG9yTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKTsKLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ29sb3JNZW51LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvck1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZDA3Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvck1lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB1dGlsaXplcyB0aGUgZmFjdG9yeSBkZXNpZ24gcGF0dGVybiB0byBjcmVhdGUgbWVudXMgdGhhdCBtYXkKLSAqIGNvbnRhaW4gY29sb3IgaXRlbXMsIHBhdHRlcm4gaXRlbXMgYW5kIGdyYWRpZW50IGl0ZW1zLiBUbyBjcmVhdGUgYSBtZW51OgotICogZmlyc3Qgc2V0IHRoZSBtZW51IGl0ZW1zIHRoYXQgeW91IHdpc2ggdG8gaGF2ZSBhcHBlYXIgaW4gdGhlIG1lbnUgYnkgY2FsbGluZwotICogdGhlIHNldHRlcnMgKHNldENvbG9ySXRlbXMoKSwgc2V0UGF0dGVybkl0ZW1zKCksIHNldEdyYWRpZW50SXRlbXMoKSksIGFuZAotICogdGhlbiBjYWxsIGNyZWF0ZU1lbnUoKSB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgYSBtZW51LiBCeSBkZWZhdWx0LCB0aGUgbWVudQotICogd2lsbCBjb250YWluIGNvbG9yIGl0ZW1zLgotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JNZW51IHsKLQotCWJvb2xlYW4gZW5hYmxlQ29sb3JJdGVtcywgZW5hYmxlUGF0dGVybkl0ZW1zLCBlbmFibGVHcmFkaWVudEl0ZW1zOwotCQotCXB1YmxpYyBDb2xvck1lbnUoKSB7Ci0JCWVuYWJsZUNvbG9ySXRlbXMgPSB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRoZSBjb2xvciBtZW51IGl0ZW1zIHdpbGwgYXBwZWFyIGluCi0JICogdGhlIG1lbnUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgQSBib29sZWFuIGZsYWcgLSB0cnVlIHRvIG1ha2UgdGhlIGNvbG9yIG1lbnUgaXRlbXMgdmlzaWJsZSBpbgotCSAqICAgICAgICAgICAgdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xvckl0ZW1zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWVuYWJsZUNvbG9ySXRlbXMgPSBlbmFibGU7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb2xvciBtZW51IGl0ZW1zIGFyZSBjb250YWluZWQgaW4gdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKiAqLwotCXB1YmxpYyBib29sZWFuIGdldENvbG9ySXRlbXMoKSB7Ci0JCXJldHVybiBlbmFibGVDb2xvckl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRoZSBwYXR0ZXJuIG1lbnUgaXRlbXMgd2lsbCBhcHBlYXIKLQkgKiBpbiB0aGUgbWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBBIGJvb2xlYW4gZmxhZyAtIHRydWUgdG8gbWFrZSB0aGUgcGF0dGVybiBtZW51IGl0ZW1zIHZpc2libGUKLQkgKiAgICAgICAgICAgIGluIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0dGVybkl0ZW1zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWVuYWJsZVBhdHRlcm5JdGVtcyA9IGVuYWJsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHBhdHRlcm4gbWVudSBpdGVtcyBhcmUgY29udGFpbmVkIGluIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICogKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQYXR0ZXJuSXRlbXMoKSB7Ci0JCXJldHVybiBlbmFibGVQYXR0ZXJuSXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdGhlIGdyYWRpZW50IG1lbnUgaXRlbXMgd2lsbCBhcHBlYXIKLQkgKiBpbiB0aGUgbWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBBIGJvb2xlYW4gZmxhZyAtIHRydWUgdG8gbWFrZSB0aGUgZ3JhZGllbnQgbWVudSBpdGVtcyB2aXNpYmxlCi0JICogICAgICAgICAgICBpbiB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYWRpZW50SXRlbXMoYm9vbGVhbiBlbmFibGUpIHsKLQkJZW5hYmxlR3JhZGllbnRJdGVtcyA9IGVuYWJsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIGdyYWRpZW50IG1lbnUgaXRlbXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEdyYWRpZW50SXRlbXMoKSB7Ci0JCXJldHVybiBlbmFibGVHcmFkaWVudEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBtZW51IGJhc2VkIG9uIHRoZSBzZXR0aW5ncyBwcm92aWRlZCB2aWEKLQkgKiBzZXRDb2xvckl0ZW1zKCksIHNldFBhdHRlcm5JdGVtcygpIGFuZCBzZXRHcmFkaWVudEl0ZW1zKCkKLQkgKiAKLQkgKiBAcmV0dXJuIEEgbWVudSBiYXNlZCBvbiB0aGUgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgTWVudSBjcmVhdGVNZW51KENvbnRyb2wgcGFyZW50LCBDb2xvckxpc3RlbmVyIGNsKSB7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCi0JCU1lbnVJdGVtTGlzdGVuZXIgbWVudUl0ZW1MaXN0ZW5lciA9IGNyZWF0ZU1lbnVJdGVtTGlzdGVuZXIocGFyZW50KTsKLQkJbWVudS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51SXRlbUxpc3RlbmVyKTsKLQkJbWVudS5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbWVudUl0ZW1MaXN0ZW5lcik7Ci0JCW1lbnVJdGVtTGlzdGVuZXIuc2V0Q29sb3JMaXN0ZW5lcihjbCk7Ci0KLQkJaWYgKGVuYWJsZUNvbG9ySXRlbXMpIHsKLQkJCWFkZENvbG9ySXRlbXMobWVudSwgbWVudUl0ZW1MaXN0ZW5lciwgbWVudUl0ZW1MaXN0ZW5lci5nZXRNZW51UmVzb3VyY2VzKCkpOwotCQl9Ci0JCWlmIChlbmFibGVQYXR0ZXJuSXRlbXMpIHsKLQkJCWFkZFBhdHRlcm5JdGVtcyhtZW51LCBtZW51SXRlbUxpc3RlbmVyLCBtZW51SXRlbUxpc3RlbmVyLmdldE1lbnVSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJaWYgKGVuYWJsZUdyYWRpZW50SXRlbXMpIHsKLQkJCWFkZEdyYWRpZW50SXRlbXMobWVudSwgbWVudUl0ZW1MaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIG1lbnU7Ci0JfQotCQotCS8qKiBBZGRzIHRoZSBjb2xvcnMgaXRlbXMgdG8gdGhlIG1lbnUuICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbG9ySXRlbXMoTWVudSBtZW51LCBNZW51SXRlbUxpc3RlbmVyIG1lbnVMaXN0ZW5lciwKLQkJCUFycmF5TGlzdCBtZW51UmVzb3VyY2VzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG1lbnUuZ2V0RGlzcGxheSgpOwotCQkKLQkJaWYgKG1lbnUuZ2V0SXRlbUNvdW50KCkgIT0gMCkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCQotCQkvLyBjb2xvciBuYW1lcwotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbXXsKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiV2hpdGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCbGFjayIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZCIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyZWVuIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmx1ZSIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlllbGxvdyIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN5YW4iKSwgLy8kTk9OLU5MUy0xJAotCQl9OwotCQkKLQkJLy8gY29sb3JzIG5lZWRlZCBmb3IgdGhlIGJhY2tncm91bmQgbWVudQotCQlDb2xvcltdIGNvbG9ycyA9IG5ldyBDb2xvcltdewotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pLAotCQl9OwotCQotCQkvLyBhZGQgc3RhbmRhcmQgY29sb3IgaXRlbXMgdG8gbWVudQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuYW1lc1tpXSk7Ci0JCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVMaXN0ZW5lcik7Ci0JCQlDb2xvciBjb2xvciA9IGNvbG9yc1tpXTsKLQkJCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yKTsKLQkJCWdiLnNldEJnQ29sb3IxKGNvbG9yKTsKLQkJCWdiLnNldEJnSW1hZ2UoaW1hZ2UpOwotCQkJZ2Iuc2V0VGh1bWJOYWlsKGltYWdlKTsKLQkJCW1lbnVSZXNvdXJjZXMuYWRkKGltYWdlKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJaXRlbS5zZXREYXRhKGdiKTsKLQkJfQotCQkKLQkJLy8gYWRkIGN1c3RvbSBjb2xvciBpdGVtIHRvIG1lbnUKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUNvbG9yTUkgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tQ29sb3JNSS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUNvbG9yTUkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUxpc3RlbmVyKTsKLQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tQ29sb3JNSS5zZXREYXRhKGdiKTsJCQotCX0KLQkKLQkvKiogQWRkcyB0aGUgcGF0dGVybiBpdGVtcyB0byB0aGUgbWVudS4gKi8KLQlwcml2YXRlIHZvaWQgYWRkUGF0dGVybkl0ZW1zKE1lbnUgbWVudSwgTWVudUl0ZW1MaXN0ZW5lciBtZW51TGlzdGVuZXIsCi0JCQlBcnJheUxpc3QgbWVudVJlc291cmNlcykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBtZW51LmdldERpc3BsYXkoKTsKLQkJCi0JCWlmIChtZW51LmdldEl0ZW1Db3VudCgpICE9IDApIHsKLQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJfQotCQkKLQkJLy8gcGF0dGVybiBuYW1lcwotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbXXsKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0dGVybjEiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXR0ZXJuMiIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdHRlcm4zIiksIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQkJCi0JCS8vIHBhdHRlcm4gaW1hZ2VzCi0JCUltYWdlW10gaW1hZ2VzID0gbmV3IEltYWdlW117Ci0JCQlsb2FkSW1hZ2UoZGlzcGxheSwgInBhdHRlcm4xLmpwZyIsIG1lbnVSZXNvdXJjZXMpLAkKLQkJCWxvYWRJbWFnZShkaXNwbGF5LCAicGF0dGVybjIuanBnIiwgbWVudVJlc291cmNlcyksCi0JCQlsb2FkSW1hZ2UoZGlzcGxheSwgInBhdHRlcm4zLmpwZyIsIG1lbnVSZXNvdXJjZXMpLAotCQl9OwotCQkKLQkJLy8gYWRkIHRoZSBwcmUtZGVmaW5lZCBwYXR0ZXJucyB0byB0aGUgbWVudQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuYW1lc1tpXSk7Ci0JCQlpdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVMaXN0ZW5lcik7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsJCQkKLQkJCWdiLnNldEJnSW1hZ2UoaW1hZ2UpOwotCQkJZ2Iuc2V0VGh1bWJOYWlsKGltYWdlKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJaXRlbS5zZXREYXRhKGdiKTsKLQkJfQotCQkKLQkJLy8gYWRkIHRoZSBjdXN0b20gcGF0dGVybiBpdGVtCQotCQltZW51TGlzdGVuZXIuY3VzdG9tUGF0dGVybk1JID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbVBhdHRlcm5NSS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tUGF0dGVybiIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TGlzdGVuZXIuY3VzdG9tUGF0dGVybk1JLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVMaXN0ZW5lcik7Ci0JCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbVBhdHRlcm5NSS5zZXREYXRhKGdiKTsJCQkKLQl9Ci0JCi0JLyoqIEFkZHMgdGhlIGdyYWRpZW50IG1lbnUgaXRlbS4gKi8KLQlwcml2YXRlIHZvaWQgYWRkR3JhZGllbnRJdGVtcyhNZW51IG1lbnUsIE1lbnVJdGVtTGlzdGVuZXIgbWVudUxpc3RlbmVyKSB7Ci0JCWlmIChtZW51LmdldEl0ZW1Db3VudCgpICE9IDApIHsKLQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJfQotCQltZW51TGlzdGVuZXIuY3VzdG9tR3JhZGllbnRNSSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21HcmFkaWVudE1JLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TGlzdGVuZXIuY3VzdG9tR3JhZGllbnRNSS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51TGlzdGVuZXIpOwotCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21HcmFkaWVudE1JLnNldERhdGEoZ2IpOwotCX0KLQkKLQkvKiogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgbGlzdGVuZXIgZm9yIG1lbnUgaXRlbXMuICovCi0JcHJpdmF0ZSBNZW51SXRlbUxpc3RlbmVyIGNyZWF0ZU1lbnVJdGVtTGlzdGVuZXIoZmluYWwgQ29udHJvbCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBNZW51SXRlbUxpc3RlbmVyKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgSW1hZ2UgdXNpbmcgb24gdGhlIHBhdGggb2YgYW4gaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIEEgRGlzcGxheQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgcGF0aCBvZiB0aGUgaW1hZ2UgZmlsZQotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIFRoZSBsaXN0IG9mIHJlc291cmNlcyBvZiB0aGUgbWVudQotCSAqLwotCXByaXZhdGUgSW1hZ2UgbG9hZEltYWdlKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIG5hbWUsIEFycmF5TGlzdCByZXNvdXJjZXMpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRpc3BsYXksIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgbmFtZSk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSByZXNvdXJjZXMuYWRkKGltYWdlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEFuIGlubmVyIGNsYXNzIHVzZWQgYXMgYSBsaXN0ZW5lciBmb3IgTWVudUl0ZW1zIGFkZGVkIHRvIHRoZSBtZW51LgotCSAqLwotCXN0YXRpYyBjbGFzcyBNZW51SXRlbUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlNZW51SXRlbSBjdXN0b21Db2xvck1JLCBjdXN0b21QYXR0ZXJuTUksIGN1c3RvbUdyYWRpZW50TUk7CS8vIGN1c3RvbSBtZW51IGl0ZW1zCi0JCUNvbnRyb2wgcGFyZW50OwotCQlJbWFnZSBjdXN0b21JbWFnZSwgY3VzdG9tSW1hZ2VUaHVtYjsKLQkJQ29sb3IgY3VzdG9tQ29sb3I7Ci0JCUdyYXBoaWNzQmFja2dyb3VuZCBiYWNrZ3JvdW5kOwkvLyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWNrZ3JvdW5kCi0JCUNvbG9yTGlzdGVuZXIgY29sb3JMaXN0ZW5lcjsKLQkJQXJyYXlMaXN0IHJlc291cmNlczsKLQkJCi0JCXB1YmxpYyBNZW51SXRlbUxpc3RlbmVyKENvbnRyb2wgcGFyZW50KXsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OyAKLQkJCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkvKioKLQkJICogTWV0aG9kIHVzZWQgdG8gc2V0IHRoZSBDb2xvckxpc3RlbmVyCi0JCSAqIAotCQkgKiBAcGFyYW0gY2wKLQkJICogICAgICAgICAgICBBIENvbG9yTGlzdGVuZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQ29sb3JMaXN0ZW5lci5qYXZhCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDb2xvckxpc3RlbmVyKENvbG9yTGlzdGVuZXIgY2wpIHsKLQkJCXRoaXMuY29sb3JMaXN0ZW5lciA9IGNsOwotCQl9Ci0JCQotCQlwdWJsaWMgQXJyYXlMaXN0IGdldE1lbnVSZXNvdXJjZXMoKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCi0JCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCSgoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgotCQkJCURpc3BsYXkgZGlzcGxheSA9IGV2ZW50LmRpc3BsYXk7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCWlmIChjdXN0b21Db2xvck1JID09IGl0ZW0pIHsKLQkJCQkJQ29sb3JEaWFsb2cgZGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yICE9IG51bGwgJiYgIWN1c3RvbUNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJZGlhbG9nLnNldFJHQihjdXN0b21Db2xvci5nZXRSR0IoKSk7Ci0JCQkJCX0KLQkJCQkJUkdCIHJnYiA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpZiAoY3VzdG9tQ29sb3IgIT0gbnVsbCkgY3VzdG9tQ29sb3IuZGlzcG9zZSgpOwotCQkJCQljdXN0b21Db2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJCQlpZiAoY3VzdG9tUGF0dGVybk1JICE9IG51bGwpIGN1c3RvbVBhdHRlcm5NSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUdyYWRpZW50TUkgIT0gbnVsbCkgY3VzdG9tR3JhZGllbnRNSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUltYWdlICE9IG51bGwpIGN1c3RvbUltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJY3VzdG9tSW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY3VzdG9tQ29sb3IpOwotCQkJCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdiLnNldEJnSW1hZ2UoY3VzdG9tSW1hZ2UpOwotCQkJCQlnYi5zZXRUaHVtYk5haWwoY3VzdG9tSW1hZ2UpOwotCQkJCQlnYi5zZXRCZ0NvbG9yMShjdXN0b21Db2xvcik7Ci0JCQkJCWl0ZW0uc2V0RGF0YShnYik7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoY3VzdG9tSW1hZ2UpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGN1c3RvbUNvbG9yKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjdXN0b21JbWFnZSk7Ci0JCQkJfSBlbHNlIGlmIChjdXN0b21QYXR0ZXJuTUkgPT0gaXRlbSkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIiouanBnIiwgIiouZ2lmIiwJIiouKiIgfSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpZiAoY3VzdG9tQ29sb3JNSSAhPSBudWxsKSBjdXN0b21Db2xvck1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tR3JhZGllbnRNSSAhPSBudWxsKSBjdXN0b21HcmFkaWVudE1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tQ29sb3IgIT0gbnVsbCkgY3VzdG9tQ29sb3IuZGlzcG9zZSgpOwotCQkJCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkgY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlpZiAoY3VzdG9tSW1hZ2VUaHVtYiAhPSBudWxsKSBjdXN0b21JbWFnZVRodW1iLmRpc3Bvc2UoKTsKLQkJCQkJY3VzdG9tSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgbmFtZSk7Ci0JCQkJCWN1c3RvbUltYWdlVGh1bWIgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlVGh1bWJuYWlsKGRpc3BsYXksIG5hbWUpOwotCQkJCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdiLnNldEJnSW1hZ2UoY3VzdG9tSW1hZ2UpOwotCQkJCQlnYi5zZXRUaHVtYk5haWwoY3VzdG9tSW1hZ2VUaHVtYik7Ci0JCQkJCWl0ZW0uc2V0RGF0YShnYik7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoY3VzdG9tSW1hZ2VUaHVtYik7Ci0JCQkJCXJlc291cmNlcy5hZGQoY3VzdG9tSW1hZ2VUaHVtYik7Ci0JCQkJfSBlbHNlIGlmIChjdXN0b21HcmFkaWVudE1JID09IGl0ZW0pIHsKLQkJCQkJR3JhZGllbnREaWFsb2cgZGlhbG9nID0gbmV3IEdyYWRpZW50RGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQkJaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKQotCQkJCQkJCWRpYWxvZy5zZXRGaXJzdFJHQihiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkuZ2V0UkdCKCkpOwotCQkJCQkJaWYgKGJhY2tncm91bmQuZ2V0QmdDb2xvcjIoKSAhPSBudWxsKQotCQkJCQkJCWRpYWxvZy5zZXRTZWNvbmRSR0IoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMigpLmdldFJHQigpKTsJCQkJCQkKLQkJCQkJfQkJCQkJCi0JCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFNXVC5PSykgcmV0dXJuOwotCQkJCQlDb2xvciBjb2xvckEgPSBuZXcgQ29sb3IoZGlzcGxheSwgZGlhbG9nLmdldEZpcnN0UkdCKCkpOwotCQkJCQlDb2xvciBjb2xvckIgPSBuZXcgQ29sb3IoZGlzcGxheSwgZGlhbG9nLmdldFNlY29uZFJHQigpKTsKLQkJCQkJaWYgKGNvbG9yQSA9PSBudWxsIHx8IGNvbG9yQiA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWlmIChjdXN0b21Db2xvck1JICE9IG51bGwpIGN1c3RvbUNvbG9yTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21QYXR0ZXJuTUkgIT0gbnVsbCkgY3VzdG9tUGF0dGVybk1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tQ29sb3IgIT0gbnVsbCkgY3VzdG9tQ29sb3IuZGlzcG9zZSgpOwotCQkJCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkgY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQljdXN0b21JbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjb2xvckEsIAotCQkJCQkJCWNvbG9yQiwgMTYsIDE2KTsKLQkJCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQkJCQlnYi5zZXRCZ0ltYWdlKGN1c3RvbUltYWdlKTsKLQkJCQkJZ2Iuc2V0VGh1bWJOYWlsKGN1c3RvbUltYWdlKTsKLQkJCQkJZ2Iuc2V0QmdDb2xvcjEoY29sb3JBKTsKLQkJCQkJZ2Iuc2V0QmdDb2xvcjIoY29sb3JCKTsKLQkJCQkJaXRlbS5zZXREYXRhKGdiKTsKLQkJCQkJaXRlbS5zZXRJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQkJCXJlc291cmNlcy5hZGQoY29sb3JBKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjb2xvckIpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGN1c3RvbUltYWdlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY3VzdG9tQ29sb3JNSSAhPSBudWxsKSBjdXN0b21Db2xvck1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tUGF0dGVybk1JICE9IG51bGwpIGN1c3RvbVBhdHRlcm5NSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbUdyYWRpZW50TUkgIT0gbnVsbCkgY3VzdG9tR3JhZGllbnRNSS5zZXRJbWFnZShudWxsKTsKLQkJCQl9Ci0JCQkJYmFja2dyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJCWNvbG9yTGlzdGVuZXIuc2V0Q29sb3IoYmFja2dyb3VuZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db3VudERvd25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvdW50RG93blRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDgzNTM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvdW50RG93blRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHByZXNlbnRzIGEgY291bnQgZG93biBmcm9tIDUgdG8gMSwgdGhlbiBkaXNwbGF5cyBTV1QuCi0gKiAqLwotcHVibGljIGNsYXNzIENvdW50RG93blRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JZmluYWwgaW50IHN0YXJ0TnVtYmVyID0gNTsJCQkvLyBudW1iZXIgYXQgd2hpY2ggdG8gc3RhcnQgdGhlIGNvdW50ZG93bgotCWludCBuZXh0TnVtYmVyID0gc3RhcnROdW1iZXI7CQkvLyBuZXh0IG51bWJlciB0byBiZSBkaXNwbGF5ZWQKLQlpbnQgYW5nbGUgPSAtOTA7CQkJCQkvLyBhbmdsZSB1c2VkIHRvIHJvdGF0ZSB0aGUgYmFyCi0KLQlTcGlubmVyIGxpbmVXaWR0aFNwaW5uZXI7CQkJLy8gc3Bpbm5lciBmb3IgbGluZSB3aWR0aAotCUNvbWJvIGFsaWFzQ29tYm8sIGxpbmVDYXBDb21ibzsJCS8vIGNvbWJvIGZvciBhbGlhcyB0eXBlIGFuZCBsaW5lIGNhcAotCWludCBhbnRpYWxpYXMsIGxpbmVDYXA7CQkJCS8vIGFudGlhbGlhcyBhbmQgbGluZWNhcCB2YWx1ZXMKLQlpbnRbXSBjYXBWYWx1ZXMgPSB7IFNXVC5DQVBfRkxBVCwgU1dULkNBUF9TUVVBUkUsIFNXVC5DQVBfUk9VTkQgfTsKLQlpbnRbXSBhbGlhc1ZhbHVlcyA9IHsgU1dULkRFRkFVTFQsIFNXVC5PRkYsIFNXVC5PTiB9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZXhhbXBsZQotCSAqICAgICAgICAgICAgQSBHcmFwaGljc0V4YW1wbGUKLQkgKi8KLQlwdWJsaWMgQ291bnREb3duVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSB0YWIuIFRoZSBjYWxsIHRvIHRoZQotCSAqIGNyZWF0ZUNvbnRyb2xQYW5lbCBtZXRob2QgaW4gdGhlIHN1cGVyIGNsYXNzIGNyZWF0ZSB0aGUgY29udHJvbHMgdGhhdCBhcmUKLQkgKiBkZWZpbmVkIGluIHRoZSBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCi0JCWlmIChuZXh0TnVtYmVyIDwgMSkKLQkJCW5leHROdW1iZXIgPSBzdGFydE51bWJlcjsKLQotCQkvLyBhZGQgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHJlc2V0IG5leHROdW1iZXIgYWZ0ZXIKLQkJLy8gdGhlIHNlcXVlbmNlIGhhcyBjb21wbGV0ZWQKLQkJcGxheUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAobmV4dE51bWJlciA8IDEpCi0JCQkJCW5leHROdW1iZXIgPSBzdGFydE51bWJlcjsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXA7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQotCQkvLyBjcmVhdGUgc3Bpbm5lciBmb3IgbGluZSB3aWR0aAotCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiTGluZVdpZHRoIikpOyAvLyROT04tTkxTLTEkCi0JCWxpbmVXaWR0aFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCQlsaW5lV2lkdGhTcGlubmVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCWxpbmVXaWR0aFNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkJbGluZVdpZHRoU3Bpbm5lci5zZXRNYXhpbXVtKDEwMCk7Ci0JCWxpbmVXaWR0aFNwaW5uZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIXBhdXNlSXRlbS5pc0VuYWJsZWQoKSkgewotCQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgYW50aWFsaWFzaW5nCi0JCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWxpYXNDb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQkJYWxpYXNDb21iby5hZGQoIkRFRkFVTFQiKTsKLQkJYWxpYXNDb21iby5hZGQoIk9GRiIpOwotCQlhbGlhc0NvbWJvLmFkZCgiT04iKTsKLQkJYWxpYXNDb21iby5zZWxlY3QoMCk7Ci0JCWFudGlhbGlhcyA9IGFsaWFzVmFsdWVzWzBdOwotCQlhbGlhc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJYW50aWFsaWFzID0gYWxpYXNWYWx1ZXNbYWxpYXNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCQlpZiAoIXBhdXNlSXRlbS5pc0VuYWJsZWQoKSkgewotCQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgbGluZSBjYXAKLQkJY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVDYXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGluZUNhcENvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCQlsaW5lQ2FwQ29tYm8uYWRkKCJGTEFUIik7Ci0JCWxpbmVDYXBDb21iby5hZGQoIlNRVUFSRSIpOwotCQlsaW5lQ2FwQ29tYm8uYWRkKCJST1VORCIpOwotCQlsaW5lQ2FwQ29tYm8uc2VsZWN0KDApOwotCQlsaW5lQ2FwID0gY2FwVmFsdWVzWzBdOwotCQlsaW5lQ2FwQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlsaW5lQ2FwID0gY2FwVmFsdWVzW2xpbmVDYXBDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCQlpZiAoIXBhdXNlSXRlbS5pc0VuYWJsZWQoKSkgewotCQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb3VudGRvd24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb3VudGRvd25EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQW5pbWF0ZWRHcmFwaGljc1RhYiNnZXRBbmltYXRpb25UaW1lKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCQlyZXR1cm4gMjg7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQW5pbWF0ZWRHcmFwaGljc1RhYiNuZXh0KGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0KLQkJaWYgKGFuZ2xlID09IDI3MCkgewotCQkJbmV4dE51bWJlci0tOwotCQkJaWYgKG5leHROdW1iZXIgPCAxKSB7Ci0JCQkJLy8gc3RvcCBhbmltYXRpb24KLQkJCQlzZXRBbmltYXRpb24oZmFsc2UpOwotCQkJfQotCQkJYW5nbGUgPSAtOTA7Ci0JCX0KLQkJYW5nbGUgKz0gMTA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCSAqICAgICAgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JCS8vIGRpYW1ldGVyIG9mIHRoZSBjaXJjbGUgaW4gcGl4ZWxzCi0JCWludCBkaWFtZXRlciA9ICgod2lkdGggPCBoZWlnaHQpID8gd2lkdGggLSAyNSA6IGhlaWdodCAtIDI1KTsKLQotCQlpZiAoIWdldEFuaW1hdGlvbigpICYmIG5leHROdW1iZXIgPT0gMCkgewotCQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDEpLCBkaWFtZXRlci8yLAotCQkJCQlTV1QuTk9ORSk7Ci0JCQlnYy5zZXRGb250KGZvbnQpOwotCi0JCQkvLyBkaXNwbGF5ICJTV1QiCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19CTFVFKSk7Ci0JCQlnYy5zZXRUZXh0QW50aWFsaWFzKFNXVC5PTik7Ci0KLQkJCS8vIGRldGVybWluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgd29yZAotCQkJU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCQkJUG9pbnQgcG9pbnQgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JCQlpbnQgdGV4dFdpZHRoID0gcG9pbnQueDsKLQkJCWludCB0ZXh0SGVpZ2h0ID0gcG9pbnQueTsKLQkJCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXRleHRXaWR0aCkvMiwKLQkJCQkJKGhlaWdodC10ZXh0SGVpZ2h0KS8yLCB0cnVlKTsKLQkJCWZvbnQuZGlzcG9zZSgpOwotCi0JCX0gZWxzZSB7Ci0KLQkJCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSgwKSwKLQkJCQkJNipkaWFtZXRlci8xMCwgU1dULk5PTkUpOwotCQkJZ2Muc2V0Rm9udChmb250KTsKLQotCQkJLy8gc2V0IGF0dHJpYnV0ZXMgZnJvbSBjb250cm9scwotCQkJZ2Muc2V0TGluZVdpZHRoKGxpbmVXaWR0aFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJZ2Muc2V0TGluZUNhcChsaW5lQ2FwKTsgLy8gcm91bmQgbGluZSBlbmRzCi0JCQlnYy5zZXRBbnRpYWxpYXMoYW50aWFsaWFzKTsgLy8gc21vb3RoIGphZ2dlZCBlZGdlcwotCQkJZ2Muc2V0VGV4dEFudGlhbGlhcyhhbnRpYWxpYXMpOyAvLyBzbW9vdGggamFnZ2VkIGVkZ2VzCi0KLQkJCS8vIGRyYXcgdGhlIGNpcmNsZXMKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCQlwYXRoLmFkZEFyYygod2lkdGgtZGlhbWV0ZXIpLzIsIChoZWlnaHQtZGlhbWV0ZXIpLzIsCi0JCQkJCWRpYW1ldGVyLCBkaWFtZXRlciwgMCwgMzYwKTsKLQkJCXBhdGguYWRkQXJjKCh3aWR0aC1kaWFtZXRlcis1MCkvMiwKLQkJCQkJKGhlaWdodC1kaWFtZXRlcis1MCkvMiwgZGlhbWV0ZXItNTAsIGRpYW1ldGVyLTUwLAotCQkJCQkwLCAzNjApOwotCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCXBhdGguZGlzcG9zZSgpOwotCi0JCQlQb2ludCBwb2ludCA9IGdjLnN0cmluZ0V4dGVudChuZXcgSW50ZWdlcihuZXh0TnVtYmVyKS50b1N0cmluZygpKTsKLQkJCWludCB0ZXh0V2lkdGggPSBwb2ludC54OwotCQkJaW50IHRleHRIZWlnaHQgPSBwb2ludC55OwotCi0JCQkvLyBkcmF3IHRoZSBudW1iZXIKLQkJCWdjLmRyYXdTdHJpbmcobmV3IEludGVnZXIobmV4dE51bWJlcikudG9TdHJpbmcoKSwKLQkJCQkJKHdpZHRoLXRleHRXaWR0aCkvMiwgKGhlaWdodC10ZXh0SGVpZ2h0KS8yLCB0cnVlKTsKLQotCQkJLy8gZHJhdyB0aGUgcm90YXRpbmcgYXJtCi0JCQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCQkJdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC8yLCBoZWlnaHQvMik7Ci0JCQl0cmFuc2Zvcm0ucm90YXRlKGFuZ2xlKTsKLQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJZ2MuZHJhd0xpbmUoMCwgMCwgZGlhbWV0ZXIvMiwgMCk7Ci0JCQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCi0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbmRleCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZm9udCBmYWNlCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnRGYWNlKGludCBpbmRleCkgewotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJDb3VyaWVyIiwgIkltcGFjdCIgfVtpbmRleF07Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJDb3VyaWVyIiwgIlVSVyBHb3RoaWMgTCIgfVtpbmRleF07Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10geyAiQ291cmllciIsICJCYWVrbXVrIEhlYWRsaW5lIiB9W2luZGV4XTsKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJDb3VyaWVyIiwgIkltcGFjdCIgfVtpbmRleF07Ci0JCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJDb3VyaWVyIiwgIlZlcmRhbmEiIH1baW5kZXhdOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzU1dUVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNTV1RUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZTdhYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNTV1RUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBwcmVzZW50cyBjdWJpYyBhbmQgcXVhZHJhdGljIGN1cnZlcyB0aGF0IGNhbiBiZSBkcmF3bi4gQXMgYQotICogZGVtb25zdHJhdGlvbiwgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgYXJlIHVzZWQgdG8gc3BlbGwgb3V0ICJTV1QiLgotICogVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXJ2ZXNTV1RUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JLyoqIFRoZXNlIHJlY3RhbmdsZXMgcmVwcmVzZW50IHRoZSBoYW5kbGVzIG9uIHRoZSBjdXJ2ZXMuICovCi0JcHJpdmF0ZSBSZWN0YW5nbGUgc1JlY3QxLCBzUmVjdDIsIHdSZWN0MSwgd1JlY3QyLCB0VG9wUmVjdDEsIHRUb3BSZWN0MiwgCi0JCQl0Qm90dG9tUmVjdDEsIHRCb3R0b21SZWN0MjsKLQkKLQkvKiogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9zaXRpb25zIG9mIHRoZSBjdXJ2ZXMuICovCi0JcHJpdmF0ZSBmbG9hdCBzWFBvcywgc1lQb3MsIHdYUG9zLCB3WVBvcywgdG9wVFhQb3MsIHRvcFRZUG9zLCAKLQkJCWJvdFRYUG9zLCBib3RUWVBvczsKLQkKLQkvKiogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgeCBhbmQgeSBkaXNwbGFjZW1lbnQgb2YgZWFjaCBoYW5kbGUuICovCi0JcHJpdmF0ZSBmbG9hdCBzRGlmZlgxLCBzRGlmZlkxLCBzRGlmZlgyLCBzRGlmZlkyOwotCXByaXZhdGUgZmxvYXQgd0RpZmZYMSwgd0RpZmZZMSwgd0RpZmZYMiwgd0RpZmZZMjsKLQlwcml2YXRlIGZsb2F0IHRUb3BEaWZmWDEsIHRUb3BEaWZmWTEsIHRUb3BEaWZmWDIsIHRUb3BEaWZmWTI7Ci0JcHJpdmF0ZSBmbG9hdCB0Qm90RGlmZlgxLCB0Qm90RGlmZlkxLCB0Qm90RGlmZlgyLCB0Qm90RGlmZlkyOwotCQotCS8qKiBUaGVzZSBhcmUgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBhIGhhbmRsZSBoYXMgYmVlbiBtb3ZlZC4gKi8KLQlwcml2YXRlIGJvb2xlYW4gc0xlZnRQdE1vdmVkLCBzUmlnaHRQdE1vdmVkLCB3UHQxTW92ZWQsIHdQdDJNb3ZlZCwKLQkJCXRUb3BQdDFNb3ZlZCwgdFRvcFB0Mk1vdmVkLCB0Qm90UHQxTW92ZWQsIHRCb3RQdDJNb3ZlZDsKLQkKLQlwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIG1vdXNlTW92ZUxpc3RlbmVyOwotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyOwotCXByaXZhdGUgQ3Vyc29yIGN1cnNvcjsKLQkKLQkvKiogdHJ1ZSBpZiBob3ZlcmluZyBvdmVyIGEgaGFuZGxlLCBmYWxzZSBvdGhlcndpc2UgKi8KLQlwcml2YXRlIGJvb2xlYW4gaG92ZXJpbmcgPSBmYWxzZTsKLQkKLQkvKiogdHJ1ZSBpZiBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBoZWxkIGRvd24sIGZhbHNlIG90aGVyd2lzZSAqLwotCXByaXZhdGUgYm9vbGVhbiBtb3VzZURvd24gPSBmYWxzZTsKLQotCQotcHVibGljIEN1cnZlc1NXVFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXNSZWN0MSA9IG5ldyBSZWN0YW5nbGUoLTc1LCA1MCwgNSwgNSk7Ci0Jc1JlY3QyID0gbmV3IFJlY3RhbmdsZSg3NSwgMTAwLCA1LCA1KTsKLQlzRGlmZlgxID0gc0RpZmZZMSA9IDA7Ci0Jc0RpZmZYMiA9IHNEaWZmWTIgPSAwOwotCXdSZWN0MSA9IG5ldyBSZWN0YW5nbGUoODAsIDMwMCwgNSwgNSk7Ci0Jd1JlY3QyID0gbmV3IFJlY3RhbmdsZSgxMjAsIDMwMCwgNSwgNSk7Ci0Jd0RpZmZYMSA9IHdEaWZmWTEgPSB3RGlmZlgyID0gd0RpZmZZMiA9IDA7Ci0JdFRvcFJlY3QxID0gbmV3IFJlY3RhbmdsZSgzMywgLTIwLCA1LCA1KTsKLQl0VG9wUmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDY2LCAyMCwgNSwgNSk7Ci0JdFRvcERpZmZYMSA9IHRUb3BEaWZmWTEgPSB0VG9wRGlmZlgyID0gdFRvcERpZmZZMiA9IDA7Ci0JdEJvdHRvbVJlY3QxID0gbmV3IFJlY3RhbmdsZSgtMzMsIDUwLCA1LCA1KTsKLQl0Qm90dG9tUmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMzLCAxMDAsIDUsIDUpOwotCXRCb3REaWZmWDEgPSB0Qm90RGlmZlkxID0gdEJvdERpZmZYMiA9IHRCb3REaWZmWTIgPSAwOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1cnZlcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1cnZlc1NXVERlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGJvb2xlYW4gZ2V0RG91YmxlQnVmZmVyZWQoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1vdXNlTGlzdGVuZXIgIT0gbnVsbCkKLQkJZXhhbXBsZS5jYW52YXMucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLQkKLQlpZiAobW91c2VNb3ZlTGlzdGVuZXIgIT0gbnVsbCkKLQkJZXhhbXBsZS5jYW52YXMucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIobW91c2VNb3ZlTGlzdGVuZXIpOwotCQotCWlmIChjdXJzb3IgIT0gbnVsbCkgewotCQljdXJzb3IuZGlzcG9zZSgpOwotCQljdXJzb3IgPSBudWxsOwotCX0KLX0KLQotCS8qKgotCSAqIFRoaXMgaGVscGVyIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZAotCSAqIG92ZXIgYSBoYW5kbGUuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIEEgTW91c2VFdmVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJzb3IgaXMgcG9zaXRpb25lZCBvdmVyIGEgaGFuZGxlOyBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLXByaXZhdGUgYm9vbGVhbiBpc0hvdmVyaW5nKE1vdXNlRXZlbnQgZSkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoc1JlY3QxLnggKyAoaW50KXNYUG9zIC0gMSwgc1JlY3QxLnkgKyAoaW50KXNZUG9zIC0gMSwgc1JlY3QxLndpZHRoKzIsIHNSZWN0MS5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZShzUmVjdDIueCArIChpbnQpc1hQb3MgLSAxLCBzUmVjdDIueSArIChpbnQpc1lQb3MgLSAxLCBzUmVjdDIud2lkdGgrMiwgc1JlY3QyLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdzEgPSBuZXcgUmVjdGFuZ2xlKHdSZWN0MS54ICsgKGludCl3WFBvcyAtIDEsIHdSZWN0MS55ICsgKGludCl3WVBvcyAtIDEsIHdSZWN0MS53aWR0aCsyLCB3UmVjdDEuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB3MiA9IG5ldyBSZWN0YW5nbGUod1JlY3QyLnggKyAoaW50KXdYUG9zIC0gMSwgd1JlY3QyLnkgKyAoaW50KXdZUG9zIC0gMSwgd1JlY3QyLndpZHRoKzIsIHdSZWN0Mi5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHRUb3AxID0gbmV3IFJlY3RhbmdsZSh0VG9wUmVjdDEueCArIChpbnQpdG9wVFhQb3MgLSAxLCB0VG9wUmVjdDEueSArIChpbnQpdG9wVFlQb3MgLSAxLCB0VG9wUmVjdDEud2lkdGgrMiwgdFRvcFJlY3QxLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdFRvcDIgPSBuZXcgUmVjdGFuZ2xlKHRUb3BSZWN0Mi54ICsgKGludCl0b3BUWFBvcyAtIDEsIHRUb3BSZWN0Mi55ICsgKGludCl0b3BUWVBvcyAtIDEsIHRUb3BSZWN0Mi53aWR0aCsyLCB0VG9wUmVjdDIuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB0Qm90MSA9IG5ldyBSZWN0YW5nbGUodEJvdHRvbVJlY3QxLnggKyAoaW50KWJvdFRYUG9zIC0gMSwgdEJvdHRvbVJlY3QxLnkgKyAoaW50KWJvdFRZUG9zIC0gMSwgdEJvdHRvbVJlY3QxLndpZHRoKzIsIHRCb3R0b21SZWN0MS5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHRCb3QyID0gbmV3IFJlY3RhbmdsZSh0Qm90dG9tUmVjdDIueCArIChpbnQpYm90VFhQb3MgLSAxLCB0Qm90dG9tUmVjdDIueSArIChpbnQpYm90VFlQb3MgLSAxLCB0Qm90dG9tUmVjdDIud2lkdGgrMiwgdEJvdHRvbVJlY3QyLmhlaWdodCsyKTsKLQkKLQlyZXR1cm4gKCByMS5jb250YWlucyhlLngsIGUueSkgfHwgcjIuY29udGFpbnMoZS54LCBlLnkpIAotCQkgfHwgdzEuY29udGFpbnMoZS54LCBlLnkpIHx8IHcyLmNvbnRhaW5zKGUueCwgZS55KSAKLQkJIHx8IHRUb3AxLmNvbnRhaW5zKGUueCwgZS55KSB8fCB0VG9wMi5jb250YWlucyhlLngsIGUueSkgCi0JCSB8fCB0Qm90MS5jb250YWlucyhlLngsIGUueSkgfHwgdEJvdDIuY29udGFpbnMoZS54LCBlLnkpICk7Ci19Ci0vKiogCi0gKiBDcmVhdGVzIHRoZSB3aWRnZXRzIHVzZWQgdG8gY29udHJvbCB0aGUgZHJhd2luZy4KLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlpZiAoY3Vyc29yID09IG51bGwpIHsgCi0JCWN1cnNvciA9IG5ldyBDdXJzb3IocGFyZW50LmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9IQU5EKTsKLQl9Ci0KLQltb3VzZU1vdmVMaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCi0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWlmIChob3ZlcmluZyAmJiBtb3VzZURvd24pIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCX0gZWxzZSBpZiAoaXNIb3ZlcmluZyhlKSkgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJCWhvdmVyaW5nID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKG51bGwpOwotCQkJCWhvdmVyaW5nID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChzTGVmdFB0TW92ZWQpIHsKLQkJCQlzRGlmZlgxID0gc0RpZmZYMSArIGUueCAtIChpbnQpc1hQb3MgLSBzUmVjdDEueDsKLQkJCQlzRGlmZlkxID0gc0RpZmZZMSArIGUueSAtIChpbnQpc1lQb3MgLSBzUmVjdDEueTsKLQkJCQlzUmVjdDEueCA9IGUueCAtIChpbnQpc1hQb3M7Ci0JCQkJc1JlY3QxLnkgPSBlLnkgLSAoaW50KXNZUG9zOwotCQkJfSBlbHNlIGlmIChzUmlnaHRQdE1vdmVkKSB7Ci0JCQkJc0RpZmZYMiA9IHNEaWZmWDIgKyBlLnggLSAoaW50KXNYUG9zIC0gc1JlY3QyLng7Ci0JCQkJc0RpZmZZMiA9IHNEaWZmWTIgKyBlLnkgLSAoaW50KXNZUG9zIC0gc1JlY3QyLnk7Ci0JCQkJc1JlY3QyLnggPSBlLnggLSAoaW50KXNYUG9zOwotCQkJCXNSZWN0Mi55ID0gZS55IC0gKGludClzWVBvczsKLQkJCX0gZWxzZSBpZiAod1B0MU1vdmVkKSB7Ci0JCQkJd0RpZmZYMSA9IHdEaWZmWDEgKyBlLnggLSAoaW50KXdYUG9zIC0gd1JlY3QxLng7Ci0JCQkJd0RpZmZZMSA9IHdEaWZmWTEgKyBlLnkgLSAoaW50KXdZUG9zIC0gd1JlY3QxLnk7Ci0JCQkJd1JlY3QxLnggPSBlLnggLSAoaW50KXdYUG9zOwotCQkJCXdSZWN0MS55ID0gZS55IC0gKGludCl3WVBvczsJCQkJCi0JCQl9IGVsc2UgaWYgKHdQdDJNb3ZlZCkgewotCQkJCXdEaWZmWDIgPSB3RGlmZlgyICsgZS54IC0gKGludCl3WFBvcyAtIHdSZWN0Mi54OwotCQkJCXdEaWZmWTIgPSB3RGlmZlkyICsgZS55IC0gKGludCl3WVBvcyAtIHdSZWN0Mi55OwotCQkJCXdSZWN0Mi54ID0gZS54IC0gKGludCl3WFBvczsKLQkJCQl3UmVjdDIueSA9IGUueSAtIChpbnQpd1lQb3M7CQotCQkJfSBlbHNlIGlmICh0VG9wUHQxTW92ZWQpIHsKLQkJCQl0VG9wRGlmZlgxID0gdFRvcERpZmZYMSArIGUueCAtIChpbnQpdG9wVFhQb3MgLSB0VG9wUmVjdDEueDsKLQkJCQl0VG9wRGlmZlkxID0gdFRvcERpZmZZMSArIGUueSAtIChpbnQpdG9wVFlQb3MgLSB0VG9wUmVjdDEueTsKLQkJCQl0VG9wUmVjdDEueCA9IGUueCAtIChpbnQpdG9wVFhQb3M7Ci0JCQkJdFRvcFJlY3QxLnkgPSBlLnkgLSAoaW50KXRvcFRZUG9zOwkKLQkJCX0gZWxzZSBpZiAodFRvcFB0Mk1vdmVkKSB7Ci0JCQkJdFRvcERpZmZYMiA9IHRUb3BEaWZmWDIgKyBlLnggLSAoaW50KXRvcFRYUG9zIC0gdFRvcFJlY3QyLng7Ci0JCQkJdFRvcERpZmZZMiA9IHRUb3BEaWZmWTIgKyBlLnkgLSAoaW50KXRvcFRZUG9zIC0gdFRvcFJlY3QyLnk7Ci0JCQkJdFRvcFJlY3QyLnggPSBlLnggLSAoaW50KXRvcFRYUG9zOwotCQkJCXRUb3BSZWN0Mi55ID0gZS55IC0gKGludCl0b3BUWVBvczsKLQkJCX0gZWxzZSBpZiAodEJvdFB0MU1vdmVkKSB7Ci0JCQkJdEJvdERpZmZYMSA9IHRCb3REaWZmWDEgKyBlLnggLSAoaW50KWJvdFRYUG9zIC0gdEJvdHRvbVJlY3QxLng7Ci0JCQkJdEJvdERpZmZZMSA9IHRCb3REaWZmWTEgKyBlLnkgLSAoaW50KWJvdFRZUG9zIC0gdEJvdHRvbVJlY3QxLnk7Ci0JCQkJdEJvdHRvbVJlY3QxLnggPSBlLnggLSAoaW50KWJvdFRYUG9zOwotCQkJCXRCb3R0b21SZWN0MS55ID0gZS55IC0gKGludClib3RUWVBvczsJCi0JCQl9IGVsc2UgaWYgKHRCb3RQdDJNb3ZlZCkgewotCQkJCXRCb3REaWZmWDIgPSB0Qm90RGlmZlgyICsgZS54IC0gKGludClib3RUWFBvcyAtIHRCb3R0b21SZWN0Mi54OwotCQkJCXRCb3REaWZmWTIgPSB0Qm90RGlmZlkyICsgZS55IC0gKGludClib3RUWVBvcyAtIHRCb3R0b21SZWN0Mi55OwotCQkJCXRCb3R0b21SZWN0Mi54ID0gZS54IC0gKGludClib3RUWFBvczsKLQkJCQl0Qm90dG9tUmVjdDIueSA9IGUueSAtIChpbnQpYm90VFlQb3M7Ci0JCQl9Ci0JCQlleGFtcGxlLnJlZHJhdygpOwkJCQotCQl9Ci0JfTsKLQkKLQltb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHt9Ci0KLQkJLyoqCi0JCSAqIFNlbnQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkLgotCQkgKgotCQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VzZSBidXR0b24gcHJlc3MKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsgIAotCQkJUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZShzUmVjdDEueCArIChpbnQpc1hQb3MgLSAxLCBzUmVjdDEueSArIChpbnQpc1lQb3MgLSAxLCBzUmVjdDEud2lkdGgrMiwgc1JlY3QxLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoc1JlY3QyLnggKyAoaW50KXNYUG9zIC0gMSwgc1JlY3QyLnkgKyAoaW50KXNZUG9zIC0gMSwgc1JlY3QyLndpZHRoKzIsIHNSZWN0Mi5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdzEgPSBuZXcgUmVjdGFuZ2xlKHdSZWN0MS54ICsgKGludCl3WFBvcyAtIDEsIHdSZWN0MS55ICsgKGludCl3WVBvcyAtIDEsIHdSZWN0MS53aWR0aCsyLCB3UmVjdDEuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHcyID0gbmV3IFJlY3RhbmdsZSh3UmVjdDIueCArIChpbnQpd1hQb3MgLSAxLCB3UmVjdDIueSArIChpbnQpd1lQb3MgLSAxLCB3UmVjdDIud2lkdGgrMiwgd1JlY3QyLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB0VG9wMSA9IG5ldyBSZWN0YW5nbGUodFRvcFJlY3QxLnggKyAoaW50KXRvcFRYUG9zIC0gMSwgdFRvcFJlY3QxLnkgKyAoaW50KXRvcFRZUG9zIC0gMSwgdFRvcFJlY3QxLndpZHRoKzIsIHRUb3BSZWN0MS5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdFRvcDIgPSBuZXcgUmVjdGFuZ2xlKHRUb3BSZWN0Mi54ICsgKGludCl0b3BUWFBvcyAtIDEsIHRUb3BSZWN0Mi55ICsgKGludCl0b3BUWVBvcyAtIDEsIHRUb3BSZWN0Mi53aWR0aCsyLCB0VG9wUmVjdDIuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHRCb3QxID0gbmV3IFJlY3RhbmdsZSh0Qm90dG9tUmVjdDEueCArIChpbnQpYm90VFhQb3MgLSAxLCB0Qm90dG9tUmVjdDEueSArIChpbnQpYm90VFlQb3MgLSAxLCB0Qm90dG9tUmVjdDEud2lkdGgrMiwgdEJvdHRvbVJlY3QxLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB0Qm90MiA9IG5ldyBSZWN0YW5nbGUodEJvdHRvbVJlY3QyLnggKyAoaW50KWJvdFRYUG9zIC0gMSwgdEJvdHRvbVJlY3QyLnkgKyAoaW50KWJvdFRZUG9zIC0gMSwgdEJvdHRvbVJlY3QyLndpZHRoKzIsIHRCb3R0b21SZWN0Mi5oZWlnaHQrMik7Ci0KLQkJCWlmIChyMS5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQlzTGVmdFB0TW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHIyLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXNSaWdodFB0TW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHcxLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXdQdDFNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodzIuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJd1B0Mk1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh0VG9wMS5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl0VG9wUHQxTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHRUb3AyLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXRUb3BQdDJNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodEJvdDEuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJdEJvdFB0MU1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh0Qm90Mi5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl0Qm90UHQyTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2VudCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLgotCQkgKgotCQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VzZSBidXR0b24gcmVsZWFzZQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCW1vdXNlRG93biA9IGZhbHNlOwotCQkJaWYgKGlzSG92ZXJpbmcoZSkpIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKG51bGwpOwotCQkJfQotCQkJaWYgKHNMZWZ0UHRNb3ZlZCkKLQkJCQlzTGVmdFB0TW92ZWQgPSBmYWxzZTsKLQkJCWlmIChzUmlnaHRQdE1vdmVkKQotCQkJCXNSaWdodFB0TW92ZWQgPSBmYWxzZTsKLQkJCWlmICh3UHQxTW92ZWQpCi0JCQkJd1B0MU1vdmVkID0gZmFsc2U7Ci0JCQlpZiAod1B0Mk1vdmVkKQotCQkJCXdQdDJNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKHRUb3BQdDFNb3ZlZCkKLQkJCQl0VG9wUHQxTW92ZWQgPSBmYWxzZTsJCi0JCQlpZiAodFRvcFB0Mk1vdmVkKQotCQkJCXRUb3BQdDJNb3ZlZCA9IGZhbHNlOwkKLQkJCWlmICh0Qm90UHQxTW92ZWQpCi0JCQkJdEJvdFB0MU1vdmVkID0gZmFsc2U7CQotCQkJaWYgKHRCb3RQdDJNb3ZlZCkKLQkJCQl0Qm90UHQyTW92ZWQgPSBmYWxzZTsKLQkJCQotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX07Ci0JZXhhbXBsZS5jYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobW91c2VNb3ZlTGlzdGVuZXIpOwotCWV4YW1wbGUuY2FudmFzLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnQoKSwgMTYsIFNXVC5JVEFMSUMpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JZ2Muc2V0TGluZVdpZHRoKDIpOwotCQotCVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0JCi0JLy8gLS0tLS0gbGV0dGVyIHMgLS0tLS0JCi0Jc1hQb3MgPSA0KndpZHRoLzE2OwotCXNZUG9zID0gKGhlaWdodC0xNTApLzI7Ci0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoc1hQb3MsIHNZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfQkxVRSkpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJpYyIpLCAwLCAxNzUsIHRydWUpOwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5jdWJpY1RvKC0yMDAgKyBzRGlmZlgxLCA1MCArIHNEaWZmWTEsIDIwMCArIHNEaWZmWDIsIDEwMCArIHNEaWZmWTIsIDAsIDE1MCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JLy8gZHJhdyB0aGUgc3BsaW5lIHBvaW50cwotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHNSZWN0MS54ICsgKGludClzWFBvcywgc1JlY3QxLnkgKyAoaW50KXNZUG9zLCBzUmVjdDEud2lkdGgsIHNSZWN0MS5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUoc1JlY3QyLnggKyAoaW50KXNYUG9zLCBzUmVjdDIueSArIChpbnQpc1lQb3MsIHNSZWN0Mi53aWR0aCwgc1JlY3QyLmhlaWdodCk7Ci0JCi0JLy8gLS0tLS0gbGV0dGVyIHcgLS0tLS0KLQl3WFBvcyA9IDYqd2lkdGgvMTY7Ci0Jd1lQb3MgPSAoaGVpZ2h0LTE1MCkvMjsKLQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3WFBvcywgd1lQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUXVhZHJhdGljIiksIDAsIC01MCwgdHJ1ZSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlF1YWRyYXRpYyIpLCAxMTAsIC01MCwgdHJ1ZSk7Ci0JCi0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5xdWFkVG8oMTAwICsgd0RpZmZYMSwgMzAwICsgd0RpZmZZMSwgMTAwLCAwKTsKLQlwYXRoLnF1YWRUbygxMDArd0RpZmZYMiwgMzAwK3dEaWZmWTIsIDIwMCwgMCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwkKLQlnYy5kcmF3UmVjdGFuZ2xlKHdSZWN0MS54ICsgKGludCl3WFBvcywgd1JlY3QxLnkgKyAoaW50KXdZUG9zLCB3UmVjdDEud2lkdGgsIHdSZWN0MS5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUod1JlY3QyLnggKyAoaW50KXdYUG9zLCB3UmVjdDIueSArIChpbnQpd1lQb3MsIHdSZWN0Mi53aWR0aCwgd1JlY3QyLmhlaWdodCk7Ci0JCi0JCi0JLy8gLS0tLS0gdG9wIG9mIGxldHRlciB0IC0tLS0tCi0JdG9wVFhQb3MgPSAxMSp3aWR0aC8xNjsKLQl0b3BUWVBvcyA9IChoZWlnaHQtMTUwKS8yOwotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHRvcFRYUG9zLCB0b3BUWVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1YmljIiksIDI1LCAtNTAsIHRydWUpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygzMyArIHRUb3BEaWZmWDEsIC0yMCArIHRUb3BEaWZmWTEsIDY2ICsgdFRvcERpZmZYMiwgMjAgKyB0VG9wRGlmZlkyLCAxMDAsIDApOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLmRyYXdSZWN0YW5nbGUodFRvcFJlY3QxLnggKyAoaW50KXRvcFRYUG9zLCB0VG9wUmVjdDEueSArIChpbnQpdG9wVFlQb3MsIHRUb3BSZWN0MS53aWR0aCwgdFRvcFJlY3QxLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSh0VG9wUmVjdDIueCArIChpbnQpdG9wVFhQb3MsIHRUb3BSZWN0Mi55ICsgKGludCl0b3BUWVBvcywgdFRvcFJlY3QyLndpZHRoLCB0VG9wUmVjdDIuaGVpZ2h0KTsKLQkKLQotCS8vIC0tLS0tIHZlcnRpY2FsIGJhciBvZiBsZXR0ZXIgdCAtLS0tLQotCWJvdFRYUG9zID0gMTIqd2lkdGgvMTY7Ci0JYm90VFlQb3MgPSAoaGVpZ2h0LTE1MCkvMjsKLQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKGJvdFRYUG9zLCBib3RUWVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1YmljIiksIDAsIDE3NSwgdHJ1ZSk7Ci0JCi0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5jdWJpY1RvKC0zMyArIHRCb3REaWZmWDEsIDUwICsgdEJvdERpZmZZMSwgMzMgKyB0Qm90RGlmZlgyLCAxMDAgKyB0Qm90RGlmZlkyLCAwLCAxNTApOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHRCb3R0b21SZWN0MS54ICsgKGludClib3RUWFBvcywgdEJvdHRvbVJlY3QxLnkgKyAoaW50KWJvdFRZUG9zLCB0Qm90dG9tUmVjdDEud2lkdGgsIHRCb3R0b21SZWN0MS5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUodEJvdHRvbVJlY3QyLnggKyAoaW50KWJvdFRYUG9zLCB0Qm90dG9tUmVjdDIueSArIChpbnQpYm90VFlQb3MsIHRCb3R0b21SZWN0Mi53aWR0aCwgdEJvdHRvbVJlY3QyLmhlaWdodCk7Ci0KLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udCgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCXJldHVybiAiQXJpYWwiOwkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJcmV0dXJuICJIZWx2ZXRpY2EiOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gIkJhZWttdWsgQmF0YW5nIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiAiVmVyZGFuYSI7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VydmVzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NDE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBwcmVzZW50cyBjdWJpYyBhbmQgcXVhZHJhdGljIGN1cnZlcyB0aGF0IGNhbiBiZSBkcmF3bi4KLSAqIFRoZSB1c2VyIG1heSByZXBvc2l0aW9uIHRoZSBjdWJpYyBhbmQgcXVhZHJhdGljIGhhbmRsZXMuIAotICovCi1wdWJsaWMgY2xhc3MgQ3VydmVzVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCS8qKiBUaGVzZSByZWN0YW5nbGVzIHJlcHJlc2VudCB0aGUgaGFuZGxlcyBvbiB0aGUgY3VydmVzLiAqLwotCXByaXZhdGUgUmVjdGFuZ2xlIHF1YWRIbmRsLCBxdWFkRW5kSG5kbCwgY3ViSG5kbDEsIGN1YkhuZGwyLCBjdWJFbmRIbmRsOwotCQotCS8qKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb3NpdGlvbnMgb2YgdGhlIGN1cnZlcy4gKi8KLQlwcml2YXRlIGZsb2F0IHF1YWRYUG9zLCBxdWFkWVBvcywgY3ViWFBvcywgY3ViWVBvczsKLQkKLQkvKiogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgeCBhbmQgeSBkaXNwbGFjZW1lbnQgb2YgZWFjaCBoYW5kbGUuICovCi0JcHJpdmF0ZSBmbG9hdCBxdWFkRGlmZlgsIHF1YWREaWZmWSwgcXVhZEVuZERpZmZYLCBxdWFkRW5kRGlmZlk7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJEaWZmWDEsIGN1YkRpZmZZMSwgY3ViRGlmZlgyLCBjdWJEaWZmWTIsIGN1YkVuZERpZmZYLCBjdWJFbmREaWZmWTsKLQkKLQkvKiogVGhlc2UgYXJlIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgYSBoYW5kbGUgaGFzIGJlZW4gbW92ZWQuICovCi0JcHJpdmF0ZSBib29sZWFuIHF1YWRQdE1vdmVkLCBxdWFkRW5kUHRNb3ZlZCwgY3ViUHQxTW92ZWQsIGN1YlB0Mk1vdmVkLCBjdWJFbmRQdE1vdmVkOwotCi0JcHJpdmF0ZSBNb3VzZU1vdmVMaXN0ZW5lciBtb3VzZU1vdmVMaXN0ZW5lcjsKLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLQlwcml2YXRlIEN1cnNvciBjdXJzb3I7Ci0KLQkvKiogdHJ1ZSBpZiBob3ZlcmluZyBvdmVyIGEgaGFuZGxlLCBmYWxzZSBvdGhlcndpc2UgKi8KLQlwcml2YXRlIGJvb2xlYW4gaG92ZXJpbmcgPSBmYWxzZTsKLQkKLQkvKiogdHJ1ZSBpZiBsZWZ0IG1vdXNlIGJ1dHRvbiBpcyBoZWxkIGRvd24sIGZhbHNlIG90aGVyd2lzZSAqLwotCXByaXZhdGUgYm9vbGVhbiBtb3VzZURvd24gPSBmYWxzZTsKLQotCQotcHVibGljIEN1cnZlc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXF1YWRIbmRsID0gbmV3IFJlY3RhbmdsZSgyMDAsIDE1MCwgNSwgNSk7Ci0JcXVhZEVuZEhuZGwgPSBuZXcgUmVjdGFuZ2xlKDQwMCwgMCwgNSwgNSk7Ci0JcXVhZERpZmZYID0gcXVhZERpZmZZID0gcXVhZEVuZERpZmZYID0gcXVhZEVuZERpZmZZID0gMDsKLQljdWJIbmRsMSA9IG5ldyBSZWN0YW5nbGUoMTMzLCAtNjAsIDUsIDUpOwotCWN1YkhuZGwyID0gbmV3IFJlY3RhbmdsZSgyNjYsIDYwLCA1LCA1KTsKLQljdWJEaWZmWDEgPSBjdWJEaWZmWTEgPSBjdWJEaWZmWDIgPSBjdWJEaWZmWTIgPSAwOwotCWN1YkVuZEhuZGwgPSBuZXcgUmVjdGFuZ2xlKDQwMCwgMCwgNSwgNSk7Ci0JY3ViRW5kRGlmZlggPSBjdWJFbmREaWZmWSA9IDA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VydmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1cnZlcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VydmVzRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXREb3VibGVCdWZmZXJlZCgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobW91c2VMaXN0ZW5lciAhPSBudWxsKQotCQlleGFtcGxlLmNhbnZhcy5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCQotCWlmIChtb3VzZU1vdmVMaXN0ZW5lciAhPSBudWxsKQotCQlleGFtcGxlLmNhbnZhcy5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcihtb3VzZU1vdmVMaXN0ZW5lcik7Ci0JCi0JaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCWN1cnNvciA9IG51bGw7Ci0JfQotfQotCi0vKioKLSAqIFRoaXMgaGVscGVyIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZAotICogb3ZlciBhIGhhbmRsZS4KLSAqIAotICogQHBhcmFtIGUKLSAqICAgICAgICAgICAgQSBNb3VzZUV2ZW50Ci0gKiBAcmV0dXJuIHRydWUgaWYgY3Vyc29yIGlzIHBvc2l0aW9uZWQgb3ZlciBhIGhhbmRsZTsgZmFsc2Ugb3RoZXJ3aXNlCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBpc0hvdmVyaW5nKE1vdXNlRXZlbnQgZSkgewotCVJlY3RhbmdsZSBxdWFkID0gbmV3IFJlY3RhbmdsZShxdWFkSG5kbC54ICsgKGludClxdWFkWFBvcyAtIDEsIHF1YWRIbmRsLnkgKyAoaW50KXF1YWRZUG9zIC0gMSwgcXVhZEhuZGwud2lkdGgrMiwgcXVhZEhuZGwuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSBxdWFkRW5kID0gbmV3IFJlY3RhbmdsZShxdWFkRW5kSG5kbC54ICsgKGludClxdWFkWFBvcyAtIDEsIHF1YWRFbmRIbmRsLnkgKyAoaW50KXF1YWRZUG9zIC0gMSwgcXVhZEVuZEhuZGwud2lkdGgrMiwgcXVhZEVuZEhuZGwuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSBjdWIxID0gbmV3IFJlY3RhbmdsZShjdWJIbmRsMS54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViSG5kbDEueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkhuZGwxLndpZHRoKzIsIGN1YkhuZGwxLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgY3ViMiA9IG5ldyBSZWN0YW5nbGUoY3ViSG5kbDIueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkhuZGwyLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJIbmRsMi53aWR0aCsyLCBjdWJIbmRsMi5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIGN1YkVuZCA9IG5ldyBSZWN0YW5nbGUoY3ViRW5kSG5kbC54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViRW5kSG5kbC55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViRW5kSG5kbC53aWR0aCsyLCBjdWJFbmRIbmRsLmhlaWdodCsyKTsKLQotCXJldHVybiAoIHF1YWQuY29udGFpbnMoZS54LCBlLnkpIHx8IHF1YWRFbmQuY29udGFpbnMoZS54LCBlLnkpIAotCQkgfHwgY3ViMS5jb250YWlucyhlLngsIGUueSkgfHwgY3ViMi5jb250YWlucyhlLngsIGUueSkgCi0JCSB8fCBjdWJFbmQuY29udGFpbnMoZS54LCBlLnkpKTsKLX0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCWlmIChjdXJzb3IgPT0gbnVsbCkgeyAKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotCX0KLQotCW1vdXNlTW92ZUxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGhvdmVyaW5nICYmIG1vdXNlRG93bikgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJfSBlbHNlIGlmIChpc0hvdmVyaW5nKGUpKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQkJaG92ZXJpbmcgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJaG92ZXJpbmcgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKHF1YWRQdE1vdmVkKSB7Ci0JCQkJcXVhZERpZmZYID0gcXVhZERpZmZYICsgZS54IC0gKGludClxdWFkWFBvcyAtIHF1YWRIbmRsLng7Ci0JCQkJcXVhZERpZmZZID0gcXVhZERpZmZZICsgZS55IC0gKGludClxdWFkWVBvcyAtIHF1YWRIbmRsLnk7Ci0JCQkJcXVhZEhuZGwueCA9IGUueCAtIChpbnQpcXVhZFhQb3M7Ci0JCQkJcXVhZEhuZGwueSA9IGUueSAtIChpbnQpcXVhZFlQb3M7CQkJCQotCQkJfSBlbHNlIGlmIChxdWFkRW5kUHRNb3ZlZCkgewotCQkJCXF1YWRFbmREaWZmWCA9IHF1YWRFbmREaWZmWCArIGUueCAtIChpbnQpcXVhZFhQb3MgLSBxdWFkRW5kSG5kbC54OwotCQkJCXF1YWRFbmREaWZmWSA9IHF1YWRFbmREaWZmWSArIGUueSAtIChpbnQpcXVhZFlQb3MgLSBxdWFkRW5kSG5kbC55OwotCQkJCXF1YWRFbmRIbmRsLnggPSBlLnggLSAoaW50KXF1YWRYUG9zOwotCQkJCXF1YWRFbmRIbmRsLnkgPSBlLnkgLSAoaW50KXF1YWRZUG9zOwkKLQkJCX0gZWxzZSBpZiAoY3ViUHQxTW92ZWQpIHsKLQkJCQljdWJEaWZmWDEgPSBjdWJEaWZmWDEgKyBlLnggLSAoaW50KWN1YlhQb3MgLSBjdWJIbmRsMS54OwotCQkJCWN1YkRpZmZZMSA9IGN1YkRpZmZZMSArIGUueSAtIChpbnQpY3ViWVBvcyAtIGN1YkhuZGwxLnk7Ci0JCQkJY3ViSG5kbDEueCA9IGUueCAtIChpbnQpY3ViWFBvczsKLQkJCQljdWJIbmRsMS55ID0gZS55IC0gKGludCljdWJZUG9zOwkKLQkJCX0gZWxzZSBpZiAoY3ViUHQyTW92ZWQpIHsKLQkJCQljdWJEaWZmWDIgPSBjdWJEaWZmWDIgKyBlLnggLSAoaW50KWN1YlhQb3MgLSBjdWJIbmRsMi54OwotCQkJCWN1YkRpZmZZMiA9IGN1YkRpZmZZMiArIGUueSAtIChpbnQpY3ViWVBvcyAtIGN1YkhuZGwyLnk7Ci0JCQkJY3ViSG5kbDIueCA9IGUueCAtIChpbnQpY3ViWFBvczsKLQkJCQljdWJIbmRsMi55ID0gZS55IC0gKGludCljdWJZUG9zOwotCQkJfSBlbHNlIGlmIChjdWJFbmRQdE1vdmVkKSB7Ci0JCQkJY3ViRW5kRGlmZlggPSBjdWJFbmREaWZmWCArIGUueCAtIChpbnQpY3ViWFBvcyAtIGN1YkVuZEhuZGwueDsKLQkJCQljdWJFbmREaWZmWSA9IGN1YkVuZERpZmZZICsgZS55IC0gKGludCljdWJZUG9zIC0gY3ViRW5kSG5kbC55OwotCQkJCWN1YkVuZEhuZGwueCA9IGUueCAtIChpbnQpY3ViWFBvczsKLQkJCQljdWJFbmRIbmRsLnkgPSBlLnkgLSAoaW50KWN1YllQb3M7Ci0JCQl9Ci0JCQlleGFtcGxlLnJlZHJhdygpOwkJCQotCQl9Ci0JfTsKLQkKLQltb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHt9Ci0KLQkJLyoqCi0JCSAqIFNlbnQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkLgotCQkgKgotCQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VzZSBidXR0b24gcHJlc3MKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsgIAotCQkJUmVjdGFuZ2xlIHF1YWQgPSBuZXcgUmVjdGFuZ2xlKHF1YWRIbmRsLnggKyAoaW50KXF1YWRYUG9zIC0gMSwgcXVhZEhuZGwueSArIChpbnQpcXVhZFlQb3MgLSAxLCBxdWFkSG5kbC53aWR0aCsyLCBxdWFkSG5kbC5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgcXVhZEVuZCA9IG5ldyBSZWN0YW5nbGUocXVhZEVuZEhuZGwueCArIChpbnQpcXVhZFhQb3MgLSAxLCBxdWFkRW5kSG5kbC55ICsgKGludClxdWFkWVBvcyAtIDEsIHF1YWRFbmRIbmRsLndpZHRoKzIsIHF1YWRFbmRIbmRsLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSBjdWIxID0gbmV3IFJlY3RhbmdsZShjdWJIbmRsMS54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViSG5kbDEueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkhuZGwxLndpZHRoKzIsIGN1YkhuZGwxLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSBjdWIyID0gbmV3IFJlY3RhbmdsZShjdWJIbmRsMi54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViSG5kbDIueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkhuZGwyLndpZHRoKzIsIGN1YkhuZGwyLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSBjdWJFbmQgPSBuZXcgUmVjdGFuZ2xlKGN1YkVuZEhuZGwueCArIChpbnQpY3ViWFBvcyAtIDEsIGN1YkVuZEhuZGwueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkVuZEhuZGwud2lkdGgrMiwgY3ViRW5kSG5kbC5oZWlnaHQrMik7Ci0JCQkKLQkJCWlmIChxdWFkLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXF1YWRQdE1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmIChxdWFkRW5kLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXF1YWRFbmRQdE1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjdWIxLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCWN1YlB0MU1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjdWIyLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCWN1YlB0Mk1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjdWJFbmQuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJY3ViRW5kUHRNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBTZW50IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdXNlIGJ1dHRvbiByZWxlYXNlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJbW91c2VEb3duID0gZmFsc2U7Ci0JCQlpZiAoaXNIb3ZlcmluZyhlKSkgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJfSBlbHNlIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IobnVsbCk7Ci0JCQl9Ci0KLQkJCWlmIChxdWFkUHRNb3ZlZCkKLQkJCQlxdWFkUHRNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKHF1YWRFbmRQdE1vdmVkKQotCQkJCXF1YWRFbmRQdE1vdmVkID0gZmFsc2U7Ci0JCQlpZiAoY3ViUHQxTW92ZWQpCi0JCQkJY3ViUHQxTW92ZWQgPSBmYWxzZTsJCi0JCQlpZiAoY3ViUHQyTW92ZWQpCi0JCQkJY3ViUHQyTW92ZWQgPSBmYWxzZTsKLQkJCWlmIChjdWJFbmRQdE1vdmVkKQotCQkJCWN1YkVuZFB0TW92ZWQgPSBmYWxzZTsKLQkJCQotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX07Ci0JZXhhbXBsZS5jYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobW91c2VNb3ZlTGlzdGVuZXIpOwotCWV4YW1wbGUuY2FudmFzLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnQoKSwgMTYsIFNXVC5JVEFMSUMpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JZ2Muc2V0TGluZVdpZHRoKDUpOwotCQotCVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0KLQkvLyAtLS0tLSBjdWJpYyBjdXJ2ZSAtLS0tLQotCWN1YlhQb3MgPSB3aWR0aC81OwotCWN1YllQb3MgPSBoZWlnaHQvMzsKLQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShjdWJYUG9zLCBjdWJZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3ViaWMiKSwgMjUsIC03MCwgdHJ1ZSk7Ci0JCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmN1YmljVG8oMTMzICsgY3ViRGlmZlgxLCAtNjAgKyBjdWJEaWZmWTEsIDI2NiArIGN1YkRpZmZYMiwgNjAgKyBjdWJEaWZmWTIsIDQwMCArIGN1YkVuZERpZmZYLCAwICsgY3ViRW5kRGlmZlkpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0JMVUUpKTsKLQlnYy5kcmF3UmVjdGFuZ2xlKGN1YkhuZGwxLnggKyAoaW50KWN1YlhQb3MsIGN1YkhuZGwxLnkgKyAoaW50KWN1YllQb3MsIGN1YkhuZGwxLndpZHRoLCBjdWJIbmRsMS5oZWlnaHQpOwotCWdjLmRyYXdSZWN0YW5nbGUoY3ViSG5kbDIueCArIChpbnQpY3ViWFBvcywgY3ViSG5kbDIueSArIChpbnQpY3ViWVBvcywgY3ViSG5kbDIud2lkdGgsIGN1YkhuZGwyLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShjdWJFbmRIbmRsLnggKyAoaW50KWN1YlhQb3MsIGN1YkVuZEhuZGwueSArIChpbnQpY3ViWVBvcywgY3ViRW5kSG5kbC53aWR0aCwgY3ViRW5kSG5kbC5oZWlnaHQpOwotCQotCS8vIC0tLS0tIHF1YWRyYXRpYyBjdXJ2ZSAtLS0tLQotCXF1YWRYUG9zID0gd2lkdGgvNTsKLQlxdWFkWVBvcyA9IDIqaGVpZ2h0LzM7Ci0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUocXVhZFhQb3MsIHF1YWRZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJRdWFkcmF0aWMiKSwgMCwgLTUwLCB0cnVlKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLnF1YWRUbygyMDAgKyBxdWFkRGlmZlgsIDE1MCArIHF1YWREaWZmWSwgNDAwICsgcXVhZEVuZERpZmZYLCAwICsgcXVhZEVuZERpZmZZKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHF1YWRIbmRsLnggKyAoaW50KXF1YWRYUG9zLCBxdWFkSG5kbC55ICsgKGludClxdWFkWVBvcywgcXVhZEhuZGwud2lkdGgsIHF1YWRIbmRsLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShxdWFkRW5kSG5kbC54ICsgKGludClxdWFkWFBvcywgcXVhZEVuZEhuZGwueSArIChpbnQpcXVhZFlQb3MsIHF1YWRFbmRIbmRsLndpZHRoLCBxdWFkRW5kSG5kbC5oZWlnaHQpOwotCi0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21BbHBoYVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tQWxwaGFUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2ZmM1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21BbHBoYVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGFscGhhIGJsZW5kaW5nLiBJdCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkKLSAqIGEgY3VzdG9tIGFscGhhIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQWxwaGFUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlwcml2YXRlIFNwaW5uZXIgYWxwaGFTcGlubmVyOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIGJhY2tncm91bmQ7Ci0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0JcHJpdmF0ZSBpbnQgYW5nbGU7Ci0KLXB1YmxpYyBDdXN0b21BbHBoYVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbUFscGhhIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21BbHBoYURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXA7Ci0JCi0JLy8gY3JlYXRlIHNwaW5uZXIgZm9yIGxpbmUgd2lkdGgKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGEiKSk7IC8vJE5PTi1OTFMtMSQKLQlhbHBoYVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWFscGhhU3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCWFscGhhU3Bpbm5lci5zZXRNYXhpbXVtKDI1NSk7Ci0JYWxwaGFTcGlubmVyLnNldFNlbGVjdGlvbigxMjcpOwotCWFscGhhU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJYmFja2dyb3VuZCA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQliYWNrZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCi0JYW5nbGUgPSAoYW5nbGUrMSklMzYwOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLQkKLQlnYy5zZXRBbnRpYWxpYXMoU1dULk9OKTsKLQlnYy5zZXRBbHBoYShhbHBoYVNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiwgaGVpZ2h0LzIpOwotCXRyYW5zZm9ybS5yb3RhdGUoLWFuZ2xlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKC13aWR0aC8yLCAtaGVpZ2h0LzIpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gY2hvb3NlIHRoZSBzbWFsbGVzdCBiZXR3ZWVuIGhlaWdodCBhbmQgd2lkdGgKLQlpbnQgZGlhbWV0ZXIgPSAoaGVpZ2h0IDwgd2lkdGgpID8gaGVpZ2h0IDogd2lkdGg7Ci0JCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZEFyYygod2lkdGgtZGlhbWV0ZXIvNSkvMiwgKGhlaWdodC1kaWFtZXRlci81KS8yLCBkaWFtZXRlci81LCBkaWFtZXRlci81LCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDUqKHdpZHRoLWRpYW1ldGVyLzgpLzEyLCA0KihoZWlnaHQtZGlhbWV0ZXIvOCkvMTIsIGRpYW1ldGVyLzgsIGRpYW1ldGVyLzgsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoNyood2lkdGgtZGlhbWV0ZXIvOCkvMTIsIDgqKGhlaWdodC1kaWFtZXRlci84KS8xMiwgZGlhbWV0ZXIvOCwgZGlhbWV0ZXIvOCwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYyg2Kih3aWR0aC1kaWFtZXRlci8xMikvMTIsIDMqKGhlaWdodC1kaWFtZXRlci8xMikvMTIsIGRpYW1ldGVyLzEyLCBkaWFtZXRlci8xMiwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYyg2Kih3aWR0aC1kaWFtZXRlci8xMikvMTIsIDkqKGhlaWdodC1kaWFtZXRlci8xMikvMTIsIGRpYW1ldGVyLzEyLCBkaWFtZXRlci8xMiwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYygxMS41Ziood2lkdGgtZGlhbWV0ZXIvMTgpLzIwLCA1KihoZWlnaHQtZGlhbWV0ZXIvMTgpLzE4LCBkaWFtZXRlci8xOCwgZGlhbWV0ZXIvMTgsIDAsIDM2MCk7CQotCXBhdGguYWRkQXJjKDguNWYqKHdpZHRoLWRpYW1ldGVyLzE4KS8yMCwgMTMqKGhlaWdodC1kaWFtZXRlci8xOCkvMTgsIGRpYW1ldGVyLzE4LCBkaWFtZXRlci8xOCwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYyg2MmYqKHdpZHRoLWRpYW1ldGVyLzI1KS8xMDAsIDMyKihoZWlnaHQtZGlhbWV0ZXIvMjUpLzEwMCwgZGlhbWV0ZXIvMjUsIGRpYW1ldGVyLzI1LCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDM5Ziood2lkdGgtZGlhbWV0ZXIvMjUpLzEwMCwgNjcqKGhlaWdodC1kaWFtZXRlci8yNSkvMTAwLCBkaWFtZXRlci8yNSwgZGlhbWV0ZXIvMjUsIDAsIDM2MCk7Ci0JCQotCWdjLmZpbGxQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQkJCi0gICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21Gb250VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21Gb250VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGQyODMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ3VzdG9tRm9udFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgdGV4dCBmb250cy4gSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgZm9udAotICogcGFyYW1ldGVycyBzdWNoIGFzIGZhY2UsIHN0eWxlIGFuZCBzaXplLgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tRm9udFRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQlHcmFwaGljc0JhY2tncm91bmQgZm9udEZvcmVncm91bmQ7Ci0JQ29tYm8gZm9udEZhY2VDYiwgZm9udFN0eWxlQ2I7Ci0JU3Bpbm5lciBmb250UG9pbnRTcGlubmVyOwotCUJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlBcnJheUxpc3QgZm9udE5hbWVzOwotCWludCBbXSBzdHlsZVZhbHVlczsKLQlTdHJpbmcgW10gZm9udFN0eWxlczsKLQlNZW51IG1lbnU7Ci0JCi1wdWJsaWMgQ3VzdG9tRm9udFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCQotCS8vIGNyZWF0ZSBsaXN0IG9mIGZvbnRzIGZvciB0aGlzIHBsYXRmb3JtCi0JRm9udERhdGEgW10gZm9udERhdGEgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQlmb250TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JZm9yIChpbnQgaT0wOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHsKLQkJLy8gcmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHNvcnQKLQkJU3RyaW5nIG5leHROYW1lID0gZm9udERhdGFbaV0uZ2V0TmFtZSgpOwotCQlpZiAoIWZvbnROYW1lcy5jb250YWlucyhuZXh0TmFtZSkpIHsKLQkJCWludCBqID0gMDsKLQkJCXdoaWxlKGogPCBmb250TmFtZXMuc2l6ZSgpICYmIG5leHROYW1lLmNvbXBhcmVUbygoU3RyaW5nKWZvbnROYW1lcy5nZXQoaikpID4gMCkgewotCQkJCWorKzsKLQkJCX0KLQkJCWZvbnROYW1lcy5hZGQoaiwgbmV4dE5hbWUpOwotCQl9Ci0JfQotCWZvbnRTdHlsZXMgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVndWxhciIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkl0YWxpYyIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJvbGQiKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCb2xkSXRhbGljIikgLy8kTk9OLU5MUy0xJAotCX07Ci0Jc3R5bGVWYWx1ZXMgPSBuZXcgaW50IFtdIHtTV1QuTk9STUFMLCBTV1QuSVRBTElDLCBTV1QuQk9MRCwgU1dULkJPTEQgfCBTV1QuSVRBTElDfTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250Iik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbUZvbnQiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbUZvbnREZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JQ29tcG9zaXRlIG1haW5Db21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQltYWluQ29tcC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkKLQkvLyBjcmVhdGUgY29tYm8gZm9yIGZvbnQgZmFjZQotCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5MRUZUKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udEZhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlmb250RmFjZUNiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWZvciAoaW50IGk9MDsgaSA8IGZvbnROYW1lcy5zaXplKCk7IGkrKykgewotCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZm9udE5hbWVzLmdldChpKTsKLQkJZm9udEZhY2VDYi5hZGQobmFtZSk7Ci0JfQotCWZvbnRGYWNlQ2Iuc2VsZWN0KDApOwotCWZvbnRGYWNlQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29tYm8gZm9yIGZvbnQgc3R5bGUKLQljb21wID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5MRUZUKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udFN0eWxlIikpOyAvLyROT04tTkxTLTEkCi0JZm9udFN0eWxlQ2IgPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JZm9yIChpbnQgaT0wOyBpIDwgZm9udFN0eWxlcy5sZW5ndGg7IGkrKykgewotCQlmb250U3R5bGVDYi5hZGQoZm9udFN0eWxlc1tpXSk7Ci0JfQotCWZvbnRTdHlsZUNiLnNlbGVjdCgwKTsKLQlmb250U3R5bGVDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBzcGlubmVyIGZvciBmb250IHNpemUgKHBvaW50cykKLQljb21wID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5MRUZUKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udFNpemUiKSk7IC8vJE5PTi1OTFMtMSQKLQlmb250UG9pbnRTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlmb250UG9pbnRTcGlubmVyLnNldE1pbmltdW0oMSk7Ci0JZm9udFBvaW50U3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCWZvbnRQb2ludFNwaW5uZXIuc2V0U2VsZWN0aW9uKDIwMCk7Ci0JZm9udFBvaW50U3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJZm9udEZvcmVncm91bmQgPSBnYjsKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSAybmQgaXRlbSBpbiB0aGUgbWVudSAoYmxhY2spCi0JZm9udEZvcmVncm91bmQgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgxKS5nZXREYXRhKCk7Ci0JCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGZvbnRGb3JlZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCVN0cmluZyBmb250RmFjZSA9IChTdHJpbmcpZm9udE5hbWVzLmdldChmb250RmFjZUNiLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWludCBwb2ludHMgPSBmb250UG9pbnRTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCWludCBzdHlsZSA9IHN0eWxlVmFsdWVzW2ZvbnRTdHlsZUNiLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZm9udEZhY2UsIHBvaW50cywgc3R5bGUpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JZ2Muc2V0VGV4dEFudGlhbGlhcyhTV1QuT04pOwotCi0JUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlpbnQgdGV4dFdpZHRoID0gc2l6ZS54OwotCWludCB0ZXh0SGVpZ2h0ID0gc2l6ZS55OwotCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoZm9udEZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoZm9udEZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChmb250Rm9yZWdyb3VuZC5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBmb250Rm9yZWdyb3VuZC5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRGb3JlZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0JCi0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtdGV4dFdpZHRoKS8yLCAoaGVpZ2h0LXRleHRIZWlnaHQpLzIsIHRydWUpOwotCi0JZm9udC5kaXNwb3NlKCk7Ci0JaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7CQotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ZvbnRCb3VuY2VUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ZvbnRCb3VuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0MThjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Gb250Qm91bmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgaXMgYW4gYW5pbWF0ZWQgZ3JhcGhpYy4gSXQgcHJlc2VudHMgdGhlIHdvcmQgU1dUIGluIGRpZmZlcmVudCBmb250cwotICogYXMgaXQgYm91bmNlcyBhcm91bmQgdGhlIHNjcmVlbi4KLSAqLwotcHVibGljIGNsYXNzIEZvbnRCb3VuY2VUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlmbG9hdCB4LCB5OwotCWZsb2F0IGluY1ggPSAxMC4wZjsJCQkJLy8gdW5pdHMgYnkgd2hpY2ggdG8gbW92ZSB0aGUgd29yZCBhbG9uZyBYIGF4aXMKLQlmbG9hdCBpbmNZID0gNS4wZjsJCQkJLy8gdW5pdHMgYnkgd2hpY2ggdG8gbW92ZSB0aGUgd29yZCBhbG9uZyBZIGF4aXMgCi0JaW50IHRleHRXaWR0aCwgdGV4dEhlaWdodDsJCS8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHdvcmQgU1dUCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCWludCBmb250U2l6ZSA9IDEwMDsKLQlpbnQgZm9udEZhY2UgPSAwOyAKLQlpbnQgZm9yZUdyZENvbG9yLCBmaWxsQ29sb3I7CS8vIGZvbnQgY29sb3JzCi0JaW50IGZvbnRTdHlsZTsJCQkJLy8gcmVwcmVzZW50cyB2YXJpb3VzIHN0eWxlIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSB0byBhIEZvbnQKLQkKLXB1YmxpYyBGb250Qm91bmNlVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCb3VuY2UiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnRCb3VuY2VEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkFuaW1hdGVkR3JhcGhpY3NUYWIjbmV4dChpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQl4ICs9IGluY1g7Ci0gICAgeSArPSBpbmNZOwotCWZsb2F0IHJhbmRvbSA9IChmbG9hdClNYXRoLnJhbmRvbSgpOwotCQotCS8vIGNvbGxpc2lvbiB3aXRoIHJpZ2h0IHNpZGUgb2Ygc2NyZWVuIAotICAgIGlmICh4ICsgdGV4dFdpZHRoID4gd2lkdGgpIHsKLSAgICAgICAgeCA9IHdpZHRoIC0gdGV4dFdpZHRoOwotICAgICAgICBpbmNYID0gcmFuZG9tICogLXdpZHRoIC8gMTYgLSAxOwotICAgICAgICBmb250RmFjZSA9IDA7Ci0gICAgICAgIGZvbnRTaXplID0gMTI1OwotICAgICAgICBmaWxsQ29sb3IgPSBTV1QuQ09MT1JfREFSS19CTFVFOyAgCi0gICAgICAgIGZvcmVHcmRDb2xvciA9IFNXVC5DT0xPUl9ZRUxMT1c7Ci0gICAgICAgIGZvbnRTdHlsZSA9IFNXVC5JVEFMSUM7Ci0gICAgfQotCS8vIGNvbGxpc2lvbiB3aXRoIGxlZnQgc2lkZSBvZiBzY3JlZW4KLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiB3aWR0aCAvIDE2ICsgMTsKLSAgICAgICAgZm9udEZhY2UgPSAxOwotICAgICAgICBmb250U2l6ZSA9IDgwOwotICAgICAgICBmaWxsQ29sb3IgPSBTV1QuQ09MT1JfREFSS19NQUdFTlRBOwotICAgICAgICBmb3JlR3JkQ29sb3IgPSBTV1QuQ09MT1JfQ1lBTjsKLSAgICAgICAgZm9udFN0eWxlID0gU1dULk5PTkU7Ci0gICAgfQotCS8vIGNvbGxpc2lvbiB3aXRoIGJvdHRvbSBzaWRlIG9mIHNjcmVlbgotICAgIGlmICh5ICsgdGV4dEhlaWdodCA+IGhlaWdodCkgewotICAgICAgICB5ID0gKGhlaWdodCAtIHRleHRIZWlnaHQpLSAyOwotICAgICAgICBpbmNZID0gcmFuZG9tICogLWhlaWdodCAvIDE2IC0gMTsKLSAgICAgICAgZm9udEZhY2UgPSAyOwotICAgICAgICBmb250U2l6ZSA9IDEwMDsKLSAgICAgICAgZmlsbENvbG9yID0gU1dULkNPTE9SX1lFTExPVzsKLSAgICAgICAgZm9yZUdyZENvbG9yID0gU1dULkNPTE9SX0JMQUNLOwotICAgICAgICBmb250U3R5bGUgPSBTV1QuQk9MRDsKLSAgICB9Ci0JLy8gY29sbGlzaW9uIHdpdGggdG9wIHNpZGUgb2Ygc2NyZWVuCi0gICAgaWYgKHkgPCAwKSB7Ci0gICAgICAgIHkgPSAwOwotICAgICAgICBpbmNZID0gcmFuZG9tICogaGVpZ2h0IC8gMTYgKyAxOwotICAgICAgICBmb250RmFjZSA9IDM7Ci0gICAgICAgIGZvbnRTaXplID0gMTIwOwotICAgICAgICBmaWxsQ29sb3IgPSBTV1QuQ09MT1JfR1JFRU47Ci0gICAgICAgIGZvcmVHcmRDb2xvciA9IFNXVC5DT0xPUl9HUkFZOwotICAgICAgICBmb250U3R5bGUgPSBTV1QuTk9ORTsKLSAgICB9Ci19Ci0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoZm9udEZhY2UpLCBmb250U2l6ZSwgZm9udFN0eWxlKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCQotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JdGV4dFdpZHRoID0gc2l6ZS54OwotCXRleHRIZWlnaHQgPSBzaXplLnk7Ci0JCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFN0cmluZyh0ZXh0LCB4LCB5LCBmb250KTsKLQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKGZvcmVHcmRDb2xvcikpOwotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKGZpbGxDb2xvcikpOwotCi0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZm9udCB1c2luZyB0aGUgc3BlY2lmaWVkIGluZGV4LgotICogVGhpcyBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqIAotICogQHBhcmFtIGluZGV4Ci0gKiAJCQlUaGUgaW5kZXggb2YgdGhlIGZvbnQgdG8gYmUgdXNlZAotICovCi1zdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udEZhY2UoaW50IGluZGV4KSB7CQotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJBcmlhbCIsICJJbXBhY3QiLCAiVGltZXMiLCAiVmVyZGFuYSJ9IFtpbmRleF07CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IlVSVyBDaGFuY2VyeSBMIiwgIlVSVyBHb3RoaWMgTCIsICJUaW1lcyIsICJxdWIifSBbaW5kZXhdOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IlVSVyBDaGFuY2VyeSBMIiwgIkJhZWttdWsgQmF0YW5nIiwgIkJhZWttdWsgSGVhZGxpbmUiLCAiS2Fjc1RpdGxlTCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFyaWFsIiwgIkltcGFjdCIsICJUaW1lcyIsICJWZXJkYW5hIn0gW2luZGV4XTsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJBcmlhbCIsICJJbXBhY3QiLCAiVGltZXMiLCAiVmVyZGFuYSJ9IFtpbmRleF07Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnREaWFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOGE2ODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgZm9yIHByb21wdGluZyB0aGUgdXNlciB0byBzZWxlY3QgdHdvIGNvbG9ycyBmb3IgdGhlCi0gKiBjcmVhdGlvbiBvZiBhIGdyYWRpZW50LgotICovCi1wdWJsaWMgY2xhc3MgR3JhZGllbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JQ2FudmFzIGNhbnZhczsKLQotCUJ1dHRvbiBjb2xvckJ1dHRvbjEsIGNvbG9yQnV0dG9uMjsJCS8vIGNvbG9yIGJ1dHRvbnMKLQotCUJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JTWVudSBtZW51MSwgbWVudTI7Ci0JCi0JUkdCIHJnYjEsIHJnYjI7CQkJLy8gZmlyc3QgYW5kIHNlY29uZCBjb2xvciB1c2VkIGluIGdyYWRpZW50Ci0JaW50IHJldHVyblZhbDsgCQkJLy8gdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgb3BlbigpLCBzZXQgdG8gU1dULk9LIAotCQkJCQkJCS8vIGlmIHRoZSBvayBidXR0b24gaGFzIGJlZW4gcHJlc3NlZAkJCi0JQXJyYXlMaXN0IHJlc291cmNlczsKLQkJCQotCXB1YmxpYyBHcmFkaWVudERpYWxvZyhTaGVsbCBwYXJlbnQpIHsJCQotCQl0aGlzIChwYXJlbnQsIFNXVC5QUklNQVJZX01PREFMKTsKLQl9Ci0JCi0JcHVibGljIEdyYWRpZW50RGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlyZ2IxID0gcmdiMiA9IG51bGw7Ci0JCXJldHVyblZhbCA9IFNXVC5DQU5DRUw7Ci0JCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZGlhbG9nIGFuZCBvcGVucyBpdC4KLQkgKiAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKGdldFBhcmVudCgpLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgZ2V0U3R5bGUoKSk7Ci0JCWRpYWxvZy5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCSAgICBkaWFsb2cuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCSAgICAKLQkgICAgLy8gY3JlYXRlIHRoZSBjb250cm9scyBpbiB0aGUgZGlhbG9nCi0JICAgIGNyZWF0ZURpYWxvZ0NvbnRyb2xzKGRpYWxvZyk7Ci0JCQotCQlkaWFsb2cuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJCSgoUmVzb3VyY2UpIG9iaikuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwkKLQotCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbiAob2tCdXR0b24pOwotCQlkaWFsb2cucGFjayAoKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRQYXJlbnQoKS5nZXRNb25pdG9yKCkuZ2V0Qm91bmRzKCk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaWFsb2cuZ2V0Qm91bmRzKCk7Ci0JCWRpYWxvZy5zZXRMb2NhdGlvbihyZWN0LnggKyAocmVjdC53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyLCByZWN0LnkgKyAocmVjdC5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDIpOwotCQlkaWFsb2cuc2V0TWluaW11bVNpemUoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCi0JCWRpYWxvZy5vcGVuICgpOwotCQkKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpOwotCQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCQotCQlpZiAobWVudTEgIT0gbnVsbCkgewotCQkJbWVudTEuZGlzcG9zZSgpOwotCQkJbWVudTEgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAobWVudTIgIT0gbnVsbCkgewotCQkJbWVudTIuZGlzcG9zZSgpOwotCQkJbWVudTIgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHJldHVyblZhbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgb2YgdGhlIGRpYWxvZy4KLQkgKiAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZURpYWxvZ0NvbnRyb2xzKGZpbmFsIFNoZWxsIHBhcmVudCkgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkKLQkJLy8gbWVzc2FnZQotCQlMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAKLQkJbWVzc2FnZS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnREbGdNc2ciKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbWVzc2FnZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIGRlZmF1bHQgY29sb3JzIGFyZSB3aGl0ZSBhbmQgYmxhY2sKLQkJaWYgKHJnYjEgPT0gbnVsbCB8fCByZ2IyID09IG51bGwpIHsKLQkJCXJnYjEgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkuZ2V0UkdCKCk7Ci0JCQlyZ2IyID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spLmdldFJHQigpOwotCQl9CQkJCi0KLQkJLy8gY2FudmFzCi0JCWNhbnZhcyA9IG5ldyBDYW52YXMocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJY2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJSW1hZ2UgcHJldmlldyA9IG51bGw7Ci0JCQkJUG9pbnQgc2l6ZSA9IGNhbnZhcy5nZXRTaXplKCk7Ci0JCQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYjEpOwotCQkJCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IyKTsKLQkJCQlwcmV2aWV3ID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yMSwgY29sb3IyLCBzaXplLngsIHNpemUueSk7Ci0JCQkJaWYgKHByZXZpZXcgIT0gbnVsbCkgewotCQkJCQllLmdjLmRyYXdJbWFnZSAocHJldmlldywgMCwgMCk7Ci0JCQkJfQotCQkJCXByZXZpZXcuZGlzcG9zZSgpOwotCQkJCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBjb21wb3NpdGUgdXNlZCBmb3IgYm90aCBjb2xvciBidXR0b25zCi0JCUNvbXBvc2l0ZSBjb2xvckJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJLy8gbGF5b3V0IGJ1dHRvbnMKLQkJUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoKTs7Ci0JCWxheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOwotCQlsYXlvdXQucGFjayA9IGZhbHNlOwotCQljb2xvckJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gcG9zaXRpb24gY29tcG9zaXRlCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JICAgIGNvbG9yQnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkgICAgCi0JCUNvbG9yTWVudSBjb2xvck1lbnUgPSBuZXcgQ29sb3JNZW51KCk7Ci0JCQotCQkvLyBjb2xvciBjb250cm9sczogZmlyc3QgY29sb3IKLQkJY29sb3JCdXR0b24xID0gbmV3IEJ1dHRvbihjb2xvckJ1dHRvbkNvbXAsIFNXVC5QVVNIKTsKLQkJY29sb3JCdXR0b24xLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudERsZ0J1dHRvbjEiKSk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IxKTsKLQkJSW1hZ2UgaW1nMSA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjb2xvcjEpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvckJ1dHRvbjEuc2V0SW1hZ2UoaW1nMSk7Ci0JCXJlc291cmNlcy5hZGQoaW1nMSk7Ci0JCW1lbnUxID0gY29sb3JNZW51LmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJCXJnYjEgPSBnYi5nZXRCZ0NvbG9yMSgpLmdldFJHQigpOwotCQkJCWNvbG9yQnV0dG9uMS5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQkJaWYgKGNhbnZhcyAhPSBudWxsKSBjYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCQljb2xvckJ1dHRvbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQkJbWVudTEuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCW1lbnUxLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gY29sb3IgY29udHJvbHM6IHNlY29uZCBjb2xvciAKLQkJY29sb3JCdXR0b24yID0gbmV3IEJ1dHRvbihjb2xvckJ1dHRvbkNvbXAsIFNXVC5QVVNIKTsKLQkJY29sb3JCdXR0b24yLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudERsZ0J1dHRvbjIiKSk7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IyKTsKLQkJSW1hZ2UgaW1nMiA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjb2xvcjIpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoaW1nMik7Ci0JCXJlc291cmNlcy5hZGQoaW1nMik7Ci0JCW1lbnUyID0gY29sb3JNZW51LmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJCXJnYjIgPSBnYi5nZXRCZ0NvbG9yMSgpLmdldFJHQigpOwotCQkJCWNvbG9yQnV0dG9uMi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQkJaWYgKGNhbnZhcyAhPSBudWxsKSBjYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCQljb2xvckJ1dHRvbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQkJbWVudTIuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCW1lbnUyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gY29tcG9zaXRlIHVzZWQgZm9yIG9rIGFuZCBjYW5jZWwgYnV0dG9ucwotCQlDb21wb3NpdGUgb2tDYW5jZWxDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvLyBsYXlvdXQgYnV0dG9ucwotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQucGFjayA9IGZhbHNlOwotCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gNTsKLQkJb2tDYW5jZWxDb21wLnNldExheW91dChyb3dMYXlvdXQpOwotCi0JCS8vIHBvc2l0aW9uIGNvbXBvc2l0ZQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkgICAgb2tDYW5jZWxDb21wLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkgICAgLy8gT0sgYnV0dG9uCi0JCW9rQnV0dG9uID0gbmV3IEJ1dHRvbiAob2tDYW5jZWxDb21wLCBTV1QuUFVTSCk7Ci0JCW9rQnV0dG9uLnNldFRleHQoIiZPSyIpOwotCQlva0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXJldHVyblZhbCA9IFNXVC5PSzsKLQkJCQlwYXJlbnQuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBjYW5jZWwgYnV0dG9uCi0JCWNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG9rQ2FuY2VsQ29tcCwgU1dULlBVU0gpOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dCgiJkNhbmNlbCIpOwotCQljYW5jZWxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlwYXJlbnQuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IFJHQiBzZWxlY3RlZCBieSB0aGUgdXNlci4KLQkgKiAqLwotCXB1YmxpYyBSR0IgZ2V0Rmlyc3RSR0IoKSB7Ci0JCXJldHVybiByZ2IxOwkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZpcnN0IFJHQi4KLQkgKiBAcGFyYW0gcmdiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RSR0IoUkdCIHJnYikgewotCQl0aGlzLnJnYjEgPSByZ2I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY29uZCBSR0Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICogKi8KLQlwdWJsaWMgUkdCIGdldFNlY29uZFJHQigpIHsKLQkJcmV0dXJuIHJnYjI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2Vjb25kIFJHQi4KLQkgKiBAcGFyYW0gcmdiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kUkdCKFJHQiByZ2IpIHsKLQkJdGhpcy5yZ2IyID0gcmdiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAzNGJiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRyYXdzIGFuIGltYWdlIGNvbnNpc3Rpbmcgb2YgZ3JhZGllbnRzIG9mIHR3byBjb2xvcnMuCi0gKiAqLwotcHVibGljIGNsYXNzIEdyYWRpZW50VGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCVRvb2xCYXIgdG9vbEJhcjsKLQlUb29sSXRlbSBjb2xvckl0ZW0xLCBjb2xvckl0ZW0yOwotCU1lbnUgbWVudTEsIG1lbnUyOwotCUdyYXBoaWNzQmFja2dyb3VuZCBjb2xvckdCMSwgY29sb3JHQjI7Ci0JQXJyYXlMaXN0IHJlc291cmNlczsJCS8vIHJlc291cmNlcyB0byBiZSBkaXNwb3NlZCB3aGVuIHRoZSBkaXBvc2UoKSBtZXRob2QgaXMgaW52b2tlZAotCQotCi1wdWJsaWMgR3JhZGllbnRUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci19Ci0KLS8qKgotICogRGlzcG9zZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIHRhYi4KLSAqICovCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCU9iamVjdCBvYmogPSByZXNvdXJjZXMuZ2V0KGkpOwotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIAotCQkJKChSZXNvdXJjZSkgb2JqKS5kaXNwb3NlKCk7Ci0JfQotCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlpZiAobWVudTEgIT0gbnVsbCkgewotCQltZW51MS5kaXNwb3NlKCk7Ci0JCW1lbnUxID0gbnVsbDsKLQl9Ci0JaWYgKG1lbnUyICE9IG51bGwpIHsKLQkJbWVudTIuZGlzcG9zZSgpOwotCQltZW51MiA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50Iik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRJbWFnZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnRJbWFnZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjY3JlYXRlQ29udHJvbFBhbmVsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAqLwotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkKLQlDb2xvck1lbnUgY29sb3JNZW51ID0gbmV3IENvbG9yTWVudSgpOwotCi0JLy8gbWVudSBmb3IgY29sb3JJdGVtMQotCW1lbnUxID0gY29sb3JNZW51LmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQljb2xvckdCMSA9IGdiOwotCQkJY29sb3JJdGVtMS5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0JY29sb3JHQjEgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUxLmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCQotCS8vIHRvb2xiYXIgaXRlbSBmb3IgY29sb3IxCi0JY29sb3JJdGVtMSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JY29sb3JJdGVtMS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnRUYWJJdGVtMSIpKTsKLQljb2xvckl0ZW0xLnNldEltYWdlKGNvbG9yR0IxLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckl0ZW0xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJbWVudTEuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQltZW51MS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gbWVudSBmb3IgY29sb3JJdGVtMgotCW1lbnUyID0gY29sb3JNZW51LmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQljb2xvckdCMiA9IGdiOwotCQkJY29sb3JJdGVtMi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgM3JkIGl0ZW0gaW4gdGhlIG1lbnUgKHJlZCkKLQljb2xvckdCMiA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudTIuZ2V0SXRlbSgyKS5nZXREYXRhKCk7Ci0JCi0JLy8gdG9vbGJhciBpdGVtIGZvciBjb2xvcjIKLQljb2xvckl0ZW0yID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQljb2xvckl0ZW0yLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudFRhYkl0ZW0yIikpOwotCWNvbG9ySXRlbTIuc2V0SW1hZ2UoY29sb3JHQjIuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9ySXRlbTIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCl7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQltZW51Mi5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUyLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLQkKLQkvLyB0b29sYmFyIGl0ZW0gZm9yIHN3YXBwaW5nIGNvbG9ycwotCVRvb2xJdGVtIHN3YXBJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQlzd2FwSXRlbS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3dhcENvbG9ycyIpKTsgLy8kTk9OLU5MUy0xJAotCXN3YXBJdGVtLnNldEltYWdlKGV4YW1wbGUubG9hZEltYWdlKGRpc3BsYXksICJzd2FwLmdpZiIpKTsKLQlzd2FwSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdyYXBoaWNzQmFja2dyb3VuZCB0bXAgPSBjb2xvckdCMTsKLQkJCWNvbG9yR0IxID0gY29sb3JHQjI7Ci0JCQljb2xvckdCMiA9IHRtcDsKLQkJCWNvbG9ySXRlbTEuc2V0SW1hZ2UoY29sb3JHQjEuZ2V0VGh1bWJOYWlsKCkpOwotCQkJY29sb3JJdGVtMi5zZXRJbWFnZShjb2xvckdCMi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKgotICogVGhpcyBtZXRob2QgZHJhd3MgdGhlIGdyYWRpZW50IHBhdHRlcm5zIHRoYXQgbWFrZSB1cCB0aGUgaW1hZ2UuIFRoZSBpbWFnZQotICogY29uc2lzdHMgb2YgNCByb3dzLCBlYWNoIGNvbnNpc3Rpbmcgb2YgNCBncmFkaWVudCBwYXR0ZXJucyAodG90YWwgb2YgMTYpLgotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCUltYWdlIGltYWdlID0gY3JlYXRlSW1hZ2UoZGV2aWNlLCBjb2xvckdCMS5nZXRCZ0NvbG9yMSgpLCBjb2xvckdCMi5nZXRCZ0NvbG9yMSgpLCB3aWR0aCwgaGVpZ2h0KTsKLQlQYXR0ZXJuIHAgPSBuZXcgUGF0dGVybihkZXZpY2UsIGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCi0JcC5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi0KLS8qKgotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBpbWFnZSBtYWRlIHVwIG9mIGdyYWRpZW50IHBhdHRlcm5zLiBUaGUgaW1hZ2UgdGFrZXMgdXAKLSAqIGEgcXVhcnRlciBvZiB0aGUgYXJlYSBvZiB0aGUgdG90YWwgZHJhd2luZyBzdXJmYWNlLgotICogCi0gKiBAcGFyYW0gZGV2aWNlCi0gKiAgICAgICAgICAgIEEgRGV2aWNlCi0gKiBAcGFyYW0gY29sb3IxCi0gKiAgICAgICAgICAgIEEgQ29sb3IKLSAqIEBwYXJhbSBjb2xvcjIKLSAqICAgICAgICAgICAgQSBDb2xvcgotICogQHBhcmFtIHdpZHRoCi0gKiAgICAgICAgICAgIFdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UKLSAqIEBwYXJhbSBoZWlnaHQKLSAqICAgICAgICAgICAgSGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UKLSAqLwotSW1hZ2UgY3JlYXRlSW1hZ2UoRGV2aWNlIGRldmljZSwgQ29sb3IgY29sb3IxLCBDb2xvciBjb2xvcjIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRldmljZSwgd2lkdGgvMiwgaGVpZ2h0LzIpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQotCVBhdHRlcm4gcGF0dGVybjEgPSBuZXcgUGF0dGVybihkZXZpY2UsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLzJmLCByZWN0LmhlaWdodC8yZiwgY29sb3IxLCBjb2xvcjIpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4xKTsJCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSgwLCAwLCB3aWR0aC80ZiwgaGVpZ2h0LzRmKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSh3aWR0aC80ZiwgaGVpZ2h0LzRmLCB3aWR0aC80ZiwgaGVpZ2h0LzRmKTsKLQlnYy5maWxsUGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkKLQlQYXR0ZXJuIHBhdHRlcm4yID0gbmV3IFBhdHRlcm4oZGV2aWNlLCByZWN0LndpZHRoLCAwLCByZWN0LndpZHRoLzJmLCByZWN0LmhlaWdodC8yZiwgY29sb3IxLCBjb2xvcjIpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4yKTsKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSh3aWR0aC80ZiwgMCwgd2lkdGgvNGYsIGhlaWdodC80Zik7Ci0JcGF0aC5hZGRSZWN0YW5nbGUoMCwgaGVpZ2h0LzRmLCB3aWR0aC80ZiwgaGVpZ2h0LzRmKTsKLQlnYy5maWxsUGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsJCi0KLQlnYy5kaXNwb3NlKCk7Ci0JcGF0dGVybjEuZGlzcG9zZSgpOwotCXBhdHRlcm4yLmRpc3Bvc2UoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNBbnRpYWxpYXNUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNBbnRpYWxpYXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyZjcwMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljQW50aWFsaWFzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGFudGlhbGlhc2luZyBmb3IgZ3JhcGhpY3MuIEFudGlhbGlhc2luZyBpcyB1c2VkIGZvcgotICogc21vb3RoaW5nIGphZ2dlZCBlZGdlcyBpbiBncmFwaGljcy4gVGhpcyB0YWIgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUKLSAqIGVmZmVjdHMgb2YgZGlmZmVyZW50IGFudGlhbGlhc2luZyB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljQW50aWFsaWFzVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JQ29tYm8gYWxpYXNDb21ibzsKLQlpbnRbXSBhbGlhc1ZhbHVlcyA9IHsgU1dULk9GRiwgU1dULkRFRkFVTFQsIFNXVC5PTiB9OwotCQotCUJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlNZW51IG1lbnU7Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIG92YWxDb2xvckdCOwotCi0JCi1wdWJsaWMgR3JhcGhpY0FudGlhbGlhc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFwaGljcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQW50aWFsaWFzaW5nR3JhcGhpY3NEZXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlDb21wb3NpdGUgY29tcDsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBhbnRpYWxpYXNpbmcKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQlhbGlhc0NvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWFsaWFzQ29tYm8uYWRkKCJPRkYiKTsKLQlhbGlhc0NvbWJvLmFkZCgiREVGQVVMVCIpOwotCWFsaWFzQ29tYm8uYWRkKCJPTiIpOwotCWFsaWFzQ29tYm8uc2VsZWN0KDApOwotCWFsaWFzQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRDb2xvckl0ZW1zKHRydWUpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJb3ZhbENvbG9yR0IgPSBnYjsKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0Jb3ZhbENvbG9yR0IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShvdmFsQ29sb3JHQi5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlpZiAob3ZhbENvbG9yR0IgIT0gbnVsbCAmJiBvdmFsQ29sb3JHQi5nZXRCZ0NvbG9yMSgpICE9IG51bGwpCi0JCWdjLnNldEJhY2tncm91bmQob3ZhbENvbG9yR0IuZ2V0QmdDb2xvcjEoKSk7Ci0JCi0JZ2Muc2V0QW50aWFsaWFzKGFsaWFzVmFsdWVzW2FsaWFzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlmbG9hdCBvZmZzZXRYID0gMip3aWR0aC8zZiwgb2Zmc2V0WSA9IGhlaWdodC8zZjsKLQlmb3IoaW50IGk9MDsgaSA8IDI1OyBpKyspIHsKLQkJcGF0aC5hZGRBcmMob2Zmc2V0WC0oNTAqaSksIG9mZnNldFktKDI1KmkpLCA1MCsoMTAwKmkpLCAyNSsoNTAqaSksIDAsIDM2MCk7Ci0JfQotCWdjLmZpbGxQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0JhY2tncm91bmQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzQmFja2dyb3VuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk5ZmVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzQmFja2dyb3VuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHN0b3JpbmcgZGF0YSByZWxldmFudCB0byBhIGJhY2tncm91bmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljc0JhY2tncm91bmQgewotCQotCXByaXZhdGUgSW1hZ2UgYmdJbWFnZTsKLQlwcml2YXRlIEltYWdlIHRodW1iTmFpbDsKLQlwcml2YXRlIENvbG9yIGJnQ29sb3IxOwotCXByaXZhdGUgQ29sb3IgYmdDb2xvcjI7Ci0JCi0JcHVibGljIEdyYXBoaWNzQmFja2dyb3VuZCgpIHsKLQkJYmdJbWFnZSA9IG51bGw7Ci0JCXRodW1iTmFpbCA9IG51bGw7Ci0JCWJnQ29sb3IxID0gbnVsbDsKLQkJYmdDb2xvcjIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRCZ0ltYWdlKCkgewotCQlyZXR1cm4gYmdJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZ0ltYWdlKEltYWdlIGJnSW1hZ2UpIHsKLQkJdGhpcy5iZ0ltYWdlID0gYmdJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0QmdDb2xvcjEoKSB7Ci0JCXJldHVybiBiZ0NvbG9yMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZ0NvbG9yMShDb2xvciBiZ0NvbG9yMSkgewotCQl0aGlzLmJnQ29sb3IxID0gYmdDb2xvcjE7Ci0JfQotCi0JcHVibGljIENvbG9yIGdldEJnQ29sb3IyKCkgewotCQlyZXR1cm4gYmdDb2xvcjI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmdDb2xvcjIoQ29sb3IgYmdDb2xvcjIpIHsKLQkJdGhpcy5iZ0NvbG9yMiA9IGJnQ29sb3IyOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRUaHVtYk5haWwoKSB7Ci0JCXJldHVybiB0aHVtYk5haWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGh1bWJOYWlsKEltYWdlIHRodW1iTmFpbCkgewotCQl0aGlzLnRodW1iTmFpbCA9IHRodW1iTmFpbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc0V4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1NTMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBtYWluIGNsYXNzIG9mIHRoZSBncmFwaGljcyBhcHBsaWNhdGlvbi4gVmFyaW91cyAidGFicyIgYXJlCi0gKiBjcmVhdGVkIGFuZCBtYWRlIHZpc2libGUgYnkgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNzRXhhbXBsZSB7Ci0JCQotCUNvbXBvc2l0ZSBwYXJlbnQ7Ci0JR3JhcGhpY3NUYWJbXSB0YWJzOwkJCQkvLyB0YWJzIHRvIGJlIGZvdW5kIGluIHRoZSBhcHBsaWNhdGlvbgotCUdyYXBoaWNzVGFiIHRhYjsJCQkJLy8gdGhlIGN1cnJlbnQgdGFiCi0JR3JhcGhpY3NCYWNrZ3JvdW5kIGJhY2tncm91bmQ7CS8vIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhY2tncm91bmQKLQkKLQlUb29sQmFyIHRvb2xCYXI7CQkJCS8vIHRvb2xiYXIgdGhhdCBjb250YWlucyBiYWNrSXRlbSBhbmQgZGJJdGVtCi0JVHJlZSB0YWJMaXN0OwkJCQkJLy8gdHJlZSBzdHJ1Y3R1cmUgb2YgdGFicwotCVRleHQgdGFiRGVzYzsJCQkJCS8vIG11bHRpLWxpbmUgdGV4dCB3aWRnZXQgdGhhdCBkaXNwbGF5cyBhIHRhYiBkZXNjcmlwdGlvbgotCVNhc2ggaFNhc2gsIHZTYXNoOwotCUNhbnZhcyBjYW52YXM7Ci0JQ29tcG9zaXRlIHRhYkNvbnRyb2xQYW5lbDsKLQlUb29sSXRlbSBiYWNrSXRlbSwgZGJJdGVtOwkJLy8gYmFja2dyb3VuZCwgZG91YmxlIGJ1ZmZlciBpdGVtcwotCU1lbnUgYmFja01lbnU7CQkJCQkvLyBiYWNrZ3JvdW5kIG1lbnUgaXRlbQotCQotCUFycmF5TGlzdCByZXNvdXJjZXM7CQkJLy8gc3RvcmVzIHJlc291cmNlcyB0aGF0IHdpbGwgYmUgZGlzcG9zZWQKLQlBcnJheUxpc3QgdGFic19pbl9vcmRlcjsJCS8vIHN0b3JlcyBHcmFwaGljc1RhYnMgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIHRyZWUKLQlib29sZWFuIGFuaW1hdGUgPSB0cnVlOwkJCS8vIHdoZXRoZXIgYW5pbWF0aW9uIHNob3VsZCBoYXBwZW4KLQotCXN0YXRpYyBib29sZWFuIGFkdmFuY2VHcmFwaGljcywgYWR2YW5jZUdyYXBoaWNzSW5pdDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IE1BUkdJTiA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBTQVNIX1NQQUNJTkcgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgVElNRVIgPSAzMDsKLQlzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19ncmFwaGljcyIpOyAvLyROT04tTkxTLTEkCi0KLS8qCi0gKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5lZWRlZCBzbyB0aGF0IGV4YW1wbGUgbGF1bmNoZXIgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZS4gCi0gKi8KLXB1YmxpYyBHcmFwaGljc0V4YW1wbGUoKSB7Ci0Jc3VwZXIoKTsKLX0KLQotcHVibGljIEdyYXBoaWNzRXhhbXBsZShmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCWNyZWF0ZUNvbnRyb2xzKHBhcmVudCk7Ci0Jc2V0VGFiKHRhYik7Ci0Jc3RhcnRBbmltYXRpb25UaW1lcigpOwotfQotCi1ib29sZWFuIGNoZWNrQWR2YW5jZWRHcmFwaGljcygpIHsKLQlpZiAoYWR2YW5jZUdyYXBoaWNzSW5pdCkgcmV0dXJuIGFkdmFuY2VHcmFwaGljczsKLQlhZHZhbmNlR3JhcGhpY3NJbml0ID0gdHJ1ZTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCXRyeSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlTaGVsbCBzaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSwgbmV3U2hlbGwgPSBudWxsOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgc2hlbGwgPSBuZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5PSyk7Ci0JCWRpYWxvZy5zZXRUZXh0KFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIldhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldE1lc3NhZ2UoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiTGliTm90Rm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKG5ld1NoZWxsICE9IG51bGwpIG5ld1NoZWxsLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gYWR2YW5jZUdyYXBoaWNzID0gdHJ1ZTsKLX0KLQotdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JdGFicyA9IGNyZWF0ZVRhYnMoKTsKLQljcmVhdGVUb29sQmFyKHBhcmVudCk7Ci0JY3JlYXRlVGFiTGlzdChwYXJlbnQpOwotCWhTYXNoID0gbmV3IFNhc2gocGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0JY3JlYXRlVGFiRGVzYyhwYXJlbnQpOwkKLQl2U2FzaCA9IG5ldyBTYXNoKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQljcmVhdGVDYW52YXMocGFyZW50KTsKLQljcmVhdGVDb250cm9sUGFuZWwocGFyZW50KTsKLQkKLQlGb3JtRGF0YSBkYXRhOwotCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBNQVJHSU4pOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIE1BUkdJTik7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sQmFyLCBNQVJHSU4pOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodlNhc2gsIC1TQVNIX1NQQUNJTkcpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGhTYXNoLCAtU0FTSF9TUEFDSU5HKTsKLQl0YWJMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIE1BUkdJTik7Ci0JaW50IG9mZnNldCA9IHBhcmVudC5nZXRCb3VuZHMoKS5oZWlnaHQgLSB0YWJEZXNjLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCB0YWJEZXNjLmdldExpbmVIZWlnaHQoKSAqIDEwKS55OwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG51bGwsIG9mZnNldCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh2U2FzaCwgLVNBU0hfU1BBQ0lORyk7Ci0JaFNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChoU2FzaCwgU0FTSF9TUEFDSU5HKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZTYXNoLCAtU0FTSF9TUEFDSU5HKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCXRhYkRlc2Muc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG51bGwsIHRhYkxpc3QuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54ICsgNTApOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xCYXIsIE1BUkdJTik7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQl2U2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh2U2FzaCwgU0FTSF9TUEFDSU5HKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0b29sQmFyLCBNQVJHSU4pOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCh0YWJDb250cm9sUGFuZWwpOwotCWNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh2U2FzaCwgU0FTSF9TUEFDSU5HKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQl0YWJDb250cm9sUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQl2U2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGhTYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCWV2ZW50LnggPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LngsIDYwKSwgcmVjdC53aWR0aCAtIDYwKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihldmVudC54KTsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKXZTYXNoLmdldExheW91dERhdGEoKTsKLQkJCQlkYXRhLmxlZnQub2Zmc2V0ID0gZXZlbnQueDsKLQkJCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJCWFuaW1hdGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlhbmltYXRlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQloU2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHZTYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCWV2ZW50LnkgPSBNYXRoLm1pbiAoTWF0aC5tYXggKGV2ZW50LnksIHRhYkxpc3QuZ2V0TG9jYXRpb24oKS55ICsgNjApLCByZWN0LmhlaWdodCAtIDYwKTsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpIHsKLQkJCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKWhTYXNoLmdldExheW91dERhdGEoKTsKLQkJCQlkYXRhLnRvcC5vZmZzZXQgPSBldmVudC55OwotCQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCBjcmVhdGVDYW52YXMoQ29tcG9zaXRlIHBhcmVudCkgewotCWludCBzdHlsZSA9IFNXVC5OT19CQUNLR1JPVU5EOwotCWlmIChkYkl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5ET1VCTEVfQlVGRkVSRUQ7Ci0JY2FudmFzID0gbmV3IENhbnZhcyhwYXJlbnQsIHN0eWxlKTsKLQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwkJCQotCQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQkJUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQkJCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQkJCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IyKCkgIT0gbnVsbCkgeyAvLyBncmFkaWVudAotCQkJCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCAwLCAwLCByZWN0LndpZHRoLCAKLQkJCQkJCQlyZWN0LmhlaWdodCwKLQkJCQkJCQliYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCksCi0JCQkJCQkJYmFja2dyb3VuZC5nZXRCZ0NvbG9yMigpKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJfSBlbHNlIHsJLy8gc29saWQgY29sb3IKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewkJLy8gaW1hZ2UKLQkJCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JCQl9Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCQkJR3JhcGhpY3NUYWIgdGFiID0gZ2V0VGFiKCk7Ci0JCQlpZiAodGFiICE9IG51bGwpIHRhYi5wYWludChnYywgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLQotdm9pZCByZWNyZWF0ZUNhbnZhcygpIHsKLQlpZiAoZGJJdGVtLmdldFNlbGVjdGlvbigpID09ICgoY2FudmFzLmdldFN0eWxlKCkgJiBTV1QuRE9VQkxFX0JVRkZFUkVEKSAhPSAwKSkgcmV0dXJuOwotCU9iamVjdCBkYXRhID0gY2FudmFzLmdldExheW91dERhdGEoKTsKLQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5kaXNwb3NlKCk7Ci0JY3JlYXRlQ2FudmFzKHBhcmVudCk7Ci0JY2FudmFzLnNldExheW91dERhdGEoZGF0YSk7Ci0JcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBjb250cm9sIHBhbmVsIAotICogQHBhcmFtIHBhcmVudAotICovCi12b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JR3JvdXAgZ3JvdXA7Ci0JdGFiQ29udHJvbFBhbmVsID0gZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiU2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl0YWJDb250cm9sUGFuZWwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci19Ci0KLXZvaWQgY3JlYXRlVG9vbEJhcihmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0JCi0JVG9vbEl0ZW0gIGJhY2sgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWJhY2suc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiQmFjayIpKTsgLy8kTk9OLU5MUy0xJAotCWJhY2suc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJiYWNrLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQotCWJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGluZGV4ID0gdGFic19pbl9vcmRlci5pbmRleE9mKHRhYikgLSAxOwotCQkJaWYgKGluZGV4IDwgMCkKLQkJCQlpbmRleCA9IHRhYnNfaW5fb3JkZXIuc2l6ZSgpIC0gMTsKLQkJCXNldFRhYigoR3JhcGhpY3NUYWIpdGFic19pbl9vcmRlci5nZXQoaW5kZXgpKTsKLQkJfQotCX0pOwotCQotCVRvb2xJdGVtICBuZXh0ID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQluZXh0LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIk5leHQiKSk7IC8vJE5PTi1OTFMtMSQKLQluZXh0LnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAibmV4dC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQluZXh0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9ICh0YWJzX2luX29yZGVyLmluZGV4T2YodGFiKSArIDEpJXRhYnNfaW5fb3JkZXIuc2l6ZSgpOwotCQkJc2V0VGFiKChHcmFwaGljc1RhYil0YWJzX2luX29yZGVyLmdldChpbmRleCkpOwotCQl9Ci0JfSk7Ci0JCi0JQ29sb3JNZW51IGNvbG9yTWVudSA9IG5ldyBDb2xvck1lbnUoKTsKLQkKLQkvLyBzZXR1cCBpdGVtcyB0byBiZSBjb250YWluZWQgaW4gdGhlIGJhY2tncm91bmQgbWVudQotCWNvbG9yTWVudS5zZXRDb2xvckl0ZW1zKHRydWUpOwotCWNvbG9yTWVudS5zZXRQYXR0ZXJuSXRlbXMoY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCWNvbG9yTWVudS5zZXRHcmFkaWVudEl0ZW1zKGNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQkKLQkvLyBjcmVhdGUgdGhlIGJhY2tncm91bmQgbWVudQotCWJhY2tNZW51ID0gY29sb3JNZW51LmNyZWF0ZU1lbnUocGFyZW50LCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQliYWNrZ3JvdW5kID0gZ2I7Ci0JCQliYWNrSXRlbS5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG1lbnUKLQliYWNrZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCliYWNrTWVudS5nZXRJdGVtKDApLmdldERhdGEoKTsKLQkKLQkvLyBiYWNrZ3JvdW5kIHRvb2wgaXRlbQotCWJhY2tJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQliYWNrSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCYWNrZ3JvdW5kIikpOyAvLyROT04tTkxTLTEkCi0JYmFja0l0ZW0uc2V0SW1hZ2UoYmFja2dyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JYmFja0l0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LndpZGdldCA9PSBiYWNrSXRlbSkgewotCQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xJdGVtQm91bmRzLngsIHRvb2xJdGVtQm91bmRzLnkpKTsKLQkJCQliYWNrTWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCQliYWNrTWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gZG91YmxlIGJ1ZmZlciB0b29sIGl0ZW0KLQlkYkl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlkYkl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRG91YmxlQnVmZmVyIikpOyAvLyROT04tTkxTLTEkCi0JZGJJdGVtLnNldEltYWdlKGxvYWRJbWFnZShkaXNwbGF5LCAiZGIuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JZGJJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXNldERvdWJsZUJ1ZmZlcmVkKGRiSXRlbS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9KTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdGh1bWJuYWlsIGltYWdlLgotICogCi0gKiBAcGFyYW0gZGV2aWNlCi0gKiAJCQlhIGRldmljZQotICogQHBhcmFtIG5hbWUKLSAqIAkJCWZpbGVuYW1lIG9mIHRoZSBpbWFnZQotICovCi1zdGF0aWMgSW1hZ2UgY3JlYXRlVGh1bWJuYWlsKERldmljZSBkZXZpY2UsIFN0cmluZyBuYW1lKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGV2aWNlLCBuYW1lKTsKLQlSZWN0YW5nbGUgc3JjID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQlpZiAoc3JjLndpZHRoICE9IDE2IHx8IHNyYy5oZWlnaHQgIT0gMTYpIHsKLQkJcmVzdWx0ID0gbmV3IEltYWdlKGRldmljZSwgMTYsIDE2KTsKLQkJR0MgZ2MgPSBuZXcgR0MocmVzdWx0KTsKLQkJUmVjdGFuZ2xlIGRlc3QgPSByZXN1bHQuZ2V0Qm91bmRzKCk7Ci0JCWdjLmRyYXdJbWFnZShpbWFnZSwgc3JjLngsIHNyYy55LCBzcmMud2lkdGgsIHNyYy5oZWlnaHQsIGRlc3QueCwgZGVzdC55LCBkZXN0LndpZHRoLCBkZXN0LmhlaWdodCk7Ci0JCWdjLmRpc3Bvc2UoKTsJCQkJCi0JfQotCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFuIGltYWdlIGJhc2VkIG9uIGEgZ3JhZGllbnQgcGF0dGVybiBtYWRlIHVwIG9mIHR3byBjb2xvcnMuCi0gKiAKLSAqIEBwYXJhbSBkZXZpY2UgLSBUaGUgRGV2aWNlCi0gKiBAcGFyYW0gY29sb3IxIC0gVGhlIGZpcnN0IGNvbG9yIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICogQHBhcmFtIGNvbG9yMiAtIFRoZSBzZWNvbmQgY29sb3IgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gKiAKLSAqICovCi1zdGF0aWMgSW1hZ2UgY3JlYXRlSW1hZ2UoRGV2aWNlIGRldmljZSwgQ29sb3IgY29sb3IxLCBDb2xvciBjb2xvcjIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRldmljZSwgd2lkdGgsIGhlaWdodCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JUGF0dGVybiBwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCAtIDEsCi0JCQkJcmVjdC5oZWlnaHQgLSAxLCBjb2xvcjEsIGNvbG9yMik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoIC0gMSwgcmVjdC5oZWlnaHQgLSAxKTsKLQlnYy5kaXNwb3NlKCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYW4gaW1hZ2UgYmFzZWQgb24gdGhlIGNvbG9yIHByb3ZpZGVkIGFuZCByZXR1cm5zIGl0LgotICogCi0gKiBAcGFyYW0gZGV2aWNlIC0gVGhlIERldmljZQotICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotICogCi0gKiAqLwotc3RhdGljIEltYWdlIGNyZWF0ZUltYWdlKERldmljZSBkZXZpY2UsIENvbG9yIGNvbG9yKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGV2aWNlLCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JaWYgKGNvbG9yLmVxdWFscyhkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSkpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JfQotCWdjLmRyYXdSZWN0YW5nbGUocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotCWdjLmRpc3Bvc2UoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLXZvaWQgY3JlYXRlVGFiTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JdGFiTGlzdCA9IG5ldyBUcmVlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCUFycmF5cy5zb3J0KHRhYnMsIG5ldyBDb21wYXJhdG9yKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IHRhYjAsIE9iamVjdCB0YWIxKSB7Ci0JCQlyZXR1cm4gKChHcmFwaGljc1RhYil0YWIwKS5nZXRUZXh0KCkuY29tcGFyZVRvKCgoR3JhcGhpY3NUYWIpdGFiMSkuZ2V0VGV4dCgpKTsKLQkJfQotCX0pOwotCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tpXTsKLQkJc2V0LmFkZCh0YWIuZ2V0Q2F0ZWdvcnkoKSk7Ci0JfQotCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW3NldC5zaXplKCldOwotCXNldC50b0FycmF5KGNhdGVnb3JpZXMpOwotCUFycmF5cy5zb3J0KGNhdGVnb3JpZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgewotCQlTdHJpbmcgdGV4dCA9IGNhdGVnb3JpZXNbaV07Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odGFiTGlzdCwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JfQotCXRhYnNfaW5fb3JkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IHRhYkxpc3QuZ2V0SXRlbXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSB0YWJzW2pdOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh0YWIuZ2V0Q2F0ZWdvcnkoKSkpIHsKLQkJCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbTEuc2V0VGV4dCh0YWIuZ2V0VGV4dCgpKTsKLQkJCQlpdGVtMS5zZXREYXRhKHRhYik7Ci0JCQkJdGFic19pbl9vcmRlci5hZGQodGFiKTsKLQkJCX0KLQkJfQotCX0KLQl0YWJMaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlHcmFwaGljc1RhYiBndCA9IChHcmFwaGljc1RhYilpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoZ3QgPT0gdGFiKSByZXR1cm47Ci0JCQkJc2V0VGFiKChHcmFwaGljc1RhYilpdGVtLmdldERhdGEoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBtdWx0aS1saW5lIHRleHQgd2lkZ2V0IHRoYXQgd2lsbCBjb250YWluIHRoZSB0YWIgZGVzY3JpcHRpb24uIAotICogKi8KLXZvaWQgY3JlYXRlVGFiRGVzYyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JdGFiRGVzYyA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQl0YWJEZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQl0YWJEZXNjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgdGhlIEdyYXBoaWNzVGFiIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgY29udGFpbmVkIGluIEdyYXBoaWNzRXhhbXBsZS4KLSAqICovCi1HcmFwaGljc1RhYltdIGNyZWF0ZVRhYnMoKSB7Ci0JcmV0dXJuIG5ldyBHcmFwaGljc1RhYltdIHsKLQkJbmV3IExpbmVUYWIodGhpcyksCi0JCW5ldyBTdGFyUG9seVRhYih0aGlzKSwKLQkJdGFiID0gbmV3IEludHJvVGFiKHRoaXMpLAotCQluZXcgQmxhY2tIb2xlVGFiKHRoaXMpLAotCQluZXcgQWxwaGFUYWIodGhpcyksCi0JCW5ldyBCYWxsVGFiKHRoaXMpLAotCQluZXcgQ291bnREb3duVGFiKHRoaXMpLAotCQluZXcgQ3VydmVzU1dUVGFiKHRoaXMpLAotCQluZXcgQ3VydmVzVGFiKHRoaXMpLAotCQluZXcgQ3VzdG9tRm9udFRhYih0aGlzKSwKLQkJbmV3IEZvbnRCb3VuY2VUYWIodGhpcyksCi0JCW5ldyBHcmFkaWVudFRhYih0aGlzKSwKLQkJbmV3IEltYWdlVHJhbnNmb3JtVGFiKHRoaXMpLAotCQluZXcgU2hhcGVzVGFiKHRoaXMpLAotCQluZXcgTWF6ZVRhYih0aGlzKSwKLQkJbmV3IFJHQlRhYih0aGlzKSwKLQkJbmV3IFNwaXJhbFRhYih0aGlzKSwKLQkJbmV3IENhcmRzVGFiKHRoaXMpLAotCQluZXcgTGluZUNhcFRhYih0aGlzKSwKLQkJbmV3IEludGVycG9sYXRpb25UYWIodGhpcyksCi0JCW5ldyBQYXRoQ2xpcHBpbmdUYWIodGhpcyksCi0JCW5ldyBQYXRoQ2xpcHBpbmdBbmltVGFiKHRoaXMpLAotCQluZXcgTGluZVN0eWxlVGFiKHRoaXMpLAotCQluZXcgTGluZUpvaW5UYWIodGhpcyksCi0JCW5ldyBSZWdpb25DbGlwcGluZ1RhYih0aGlzKSwKLQkJbmV3IEN1c3RvbUFscGhhVGFiKHRoaXMpLAotCQluZXcgVGV4dEFudGlhbGlhc1RhYih0aGlzKSwKLQkJbmV3IEdyYXBoaWNBbnRpYWxpYXNUYWIodGhpcyksCi0JCW5ldyBJbWFnZUZsaXBUYWIodGhpcyksCi0JCW5ldyBQYXRoVGFiKHRoaXMpLAotCX07Ci19Ci0KLS8qKgotICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAodGFicyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tpXTsKLQkJCXRhYi5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JdGFicyA9IG51bGw7Ci0JaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzLmdldChpKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJKChSZXNvdXJjZSlyZXNvdXJjZXMuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmVzb3VyY2VzID0gbnVsbDsKLQkKLQlpZiAoYmFja01lbnUgIT0gbnVsbCkgewotCQliYWNrTWVudS5kaXNwb3NlKCk7Ci0JCWJhY2tNZW51ID0gbnVsbDsKLQl9Ci19Ci0KLVRyZWVJdGVtIGZpbmRJdGVtQnlEYXRhKFRyZWVJdGVtW10gaXRlbXMsIE9iamVjdCBkYXRhKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWlmIChpdGVtLmdldERhdGEoKSA9PSBkYXRhKSByZXR1cm4gaXRlbTsKLQkJaXRlbSA9IGZpbmRJdGVtQnlEYXRhKGl0ZW0uZ2V0SXRlbXMoKSwgZGF0YSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBpdGVtOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIEdyYXBoaWNzVGFiIGdldFRhYigpIHsKLQlyZXR1cm4gdGFiOwotfQotCi0vKioKLSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0gKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQl0cnkgewotCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBrZXk7Ci0JfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQkJCi19Ci0KLXN0YXRpYyBJbWFnZSBsb2FkSW1hZ2UgKERldmljZSBkZXZpY2UsIENsYXNzIGNsYXp6LCBTdHJpbmcgc3RyaW5nKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSAoc3RyaW5nKTsKLQlpZiAoc3RyZWFtID09IG51bGwpIHJldHVybiBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGV2aWNlLCBzdHJlYW0pOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCX0KLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLUltYWdlIGxvYWRJbWFnZShEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbmFtZSkgewotCUltYWdlIGltYWdlID0gbG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCBuYW1lKTsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgcmVzb3VyY2VzLmFkZChpbWFnZSk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbihmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJBZHZhbmNlZEdyYXBoaWNzIikpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUgPSBuZXcgR3JhcGhpY3NFeGFtcGxlKHNoZWxsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV4YW1wbGUuZGlzcG9zZSgpOwotCQl9Ci0JfSk7CQotCXNoZWxsLm9wZW4oKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLS8qKgotICogUmVkcmF3cyB0aGUgY3VycmVudCB0YWIuCi0gKi8KLXB1YmxpYyB2b2lkIHJlZHJhdygpIHsKLQljYW52YXMucmVkcmF3KCk7Ci19Ci0KLS8qKgotICogU2V0cyB3aGV0ZXIgdGhlIGNhbnZhcyBpcyBkb3VibGUgYnVmZmVyZWQgb3Igbm90LgotICovCi1wdWJsaWMgdm9pZCBzZXREb3VibGVCdWZmZXJlZChib29sZWFuIGRvdWJsZUJ1ZmZlcmVkKSB7Ci0JZGJJdGVtLnNldFNlbGVjdGlvbihkb3VibGVCdWZmZXJlZCk7Ci0JcmVjcmVhdGVDYW52YXMoKTsKLX0KLQotLyoqCi0gKiBHcmFicyBpbnB1dCBmb2N1cy4KLSAqLwotcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JdGFiTGlzdC5zZXRGb2N1cygpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGN1cnJlbnQgdGFiLgotICovCi1wdWJsaWMgdm9pZCBzZXRUYWIoR3JhcGhpY3NUYWIgdGFiKSB7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gdGFiQ29udHJvbFBhbmVsLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbltpXTsKLQkJY29udHJvbC5kaXNwb3NlKCk7Ci0JfQotCWlmICh0aGlzLnRhYiAhPSBudWxsKSB0aGlzLnRhYi5kaXNwb3NlKCk7Ci0JdGhpcy50YWIgPSB0YWI7Ci0JaWYgKHRhYiAhPSBudWxsKSB7Ci0JCXNldERvdWJsZUJ1ZmZlcmVkKHRhYi5nZXREb3VibGVCdWZmZXJlZCgpKTsKLQkJdGFiLmNyZWF0ZUNvbnRyb2xQYW5lbCh0YWJDb250cm9sUGFuZWwpOwotCQl0YWJEZXNjLnNldFRleHQodGFiLmdldERlc2NyaXB0aW9uKCkpOwotCX0gZWxzZSB7Ci0JCXRhYkRlc2Muc2V0VGV4dCgiIik7Ci0JfQotCUZvcm1EYXRhIGRhdGEgPSAoRm9ybURhdGEpdGFiQ29udHJvbFBhbmVsLmdldExheW91dERhdGEoKTsKLQljaGlsZHJlbiA9IHRhYkNvbnRyb2xQYW5lbC5nZXRDaGlsZHJlbigpOwotCWlmIChjaGlsZHJlbi5sZW5ndGggIT0gMCkgewotCQlkYXRhLnRvcCA9IG51bGw7Ci0JfSBlbHNlIHsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQl9Ci0JcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQlpZiAodGFiICE9IG51bGwpIHsKLQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJMaXN0LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwIHx8IHNlbGVjdGlvblswXS5nZXREYXRhKCkgIT0gdGFiKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gZmluZEl0ZW1CeURhdGEodGFiTGlzdC5nZXRJdGVtcygpLCB0YWIpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgdGFiTGlzdC5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbX0pOwotCQl9Ci0JfQotCWNhbnZhcy5yZWRyYXcoKTsKLX0KLQotLyoqCi0gKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBpZiB0aGUgYW5pbWF0ZSBmbGFnIGlzIHNldC4KLSAqLwotdm9pZCBzdGFydEFuaW1hdGlvblRpbWVyKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JZGlzcGxheS50aW1lckV4ZWMoVElNRVIsIG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCWludCB0aW1lb3V0ID0gVElNRVI7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSBnZXRUYWIoKTsKLQkJCWlmICh0YWIgaW5zdGFuY2VvZiBBbmltYXRlZEdyYXBoaWNzVGFiKSB7Ci0JCQkJQW5pbWF0ZWRHcmFwaGljc1RhYiBhbmltVGFiID0gKEFuaW1hdGVkR3JhcGhpY3NUYWIpIHRhYjsJCi0JCQkJaWYgKGFuaW1hdGUgJiYgYW5pbVRhYi5nZXRBbmltYXRpb24oKSkgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCWFuaW1UYWIubmV4dChyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJY2FudmFzLnVwZGF0ZSgpOwotCQkJCX0KLQkJCQl0aW1lb3V0ID0gIGFuaW1UYWIuZ2V0QW5pbWF0aW9uVGltZSgpOwotCQkJfQotCQkJZGlzcGxheS50aW1lckV4ZWModGltZW91dCwgdGhpcyk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgR3JhcGhpY3NFeGFtcGxlKCkub3BlbihkaXNwbGF5KTsKLQl3aGlsZSAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1OTBiNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgb25lIHVzZWQgZm9yIGNyZWF0aW5nIGEgZ3JhcGhpYy4gT3ZlcnJpZGUgdGhlIHBhaW50KCkKLSAqIG1ldGhvZCB0byBjcmVhdGUgdGhlIGRyYXdpbmcuIFRvIGNyZWF0ZSBhbiBhbmltYXRlZCBncmFwaGljLCB1c2UgdGhlCi0gKiBBbmltYXRlZEdyYXBoaWNzVGFiIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhpY3NUYWIgewotCQotR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGU7Ci0KLXB1YmxpYyBHcmFwaGljc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXRoaXMuZXhhbXBsZSA9IGV4YW1wbGU7Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotfQotCi0vKiogCi0gKiBEaXNwb3NlcyByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci19Ci0KLS8qKiAKLSAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBuYW1lLgotICovCi1wdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoKTsKLQotLyoqIAotICogQW5zd2VyIHRoZSByZWNlaXZlcidzIGNhdGVnb3J5LgotICovCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKioKLSAqICBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZGVzY3JpcHRpb24uCi0gKiAqLwotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlcidzIGRyYXdpbmcgc2hvdWxkIGJlIGRvdWJsZSBidWZmZXJlci4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0RG91YmxlQnVmZmVyZWQoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiogCi0gKiBQYWludCB0aGUgcmVjZWl2ZXIgaW50byB0aGUgc3BlY2lmaWVkIEdDLiAKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZUZsaXBUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlRmxpcFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk1NzliLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlRmxpcFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyBob3cgYW4gaW1hZ2UgY2FuIGJlIGZsaXBwZWQgaW4gdmFyaW91cyBmYXNoaW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUZsaXBUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLXB1YmxpYyBJbWFnZUZsaXBUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGbGlwIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGbGlwRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhvdXNlcy5wbmciKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCi0JLy8gdG9wCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKCh3aWR0aC1ib3VuZHMud2lkdGgpLzIsIChoZWlnaHQtYm91bmRzLmhlaWdodCkvMik7Ci0JdHJhbnNmb3JtLnNjYWxlKDEsIC0xKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCi0JLy8gZHJhdyB0aGUgb3JpZ2luYWwgaW1hZ2UKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gYm90dG9tCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgMipib3VuZHMuaGVpZ2h0ICsgKGhlaWdodC1ib3VuZHMuaGVpZ2h0KS8yKTsKLQl0cmFuc2Zvcm0uc2NhbGUoMSwgLTEpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQotCS8vIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIGxlZnQKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgod2lkdGgtYm91bmRzLndpZHRoKS8yLCAoaGVpZ2h0LWJvdW5kcy5oZWlnaHQpLzIpOwotCXRyYW5zZm9ybS5zY2FsZSgtMSwgMSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JLy8gZHJhdyB0aGUgb3JpZ2luYWwgaW1hZ2UKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gcmlnaHQKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgyKmJvdW5kcy53aWR0aCArICh3aWR0aC1ib3VuZHMud2lkdGgpLzIsIChoZWlnaHQtYm91bmRzLmhlaWdodCkvMik7Ci0JdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAod2lkdGgtYm91bmRzLndpZHRoKS8yLCAoaGVpZ2h0LWJvdW5kcy5oZWlnaHQpLzIpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlVHJhbnNmb3JtVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZVRyYW5zZm9ybVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk3NzRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlVHJhbnNmb3JtVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kCi0gKiBpbnZlcnQuICBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB2YWx1ZXMgZm9yIHNjYWxpbmcgYW5kIHJvdGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VUcmFuc2Zvcm1UYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlwcml2YXRlIFNwaW5uZXIgcm90YXRlU3Bpbm5lciwgc2NhbGVTcGlubmVyWCwgc2NhbGVTcGlubmVyWTsKLQlwcml2YXRlIEJ1dHRvbiBpbnZlcnRCdXR0b247Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqIEBwYXJhbSBleGFtcGxlIEEgR3JhcGhpY3NFeGFtcGxlCi0gKi8KLXB1YmxpYyBJbWFnZVRyYW5zZm9ybVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyYW5zZm9ybSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJhbnNmb3JtSW1nRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKioKLSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSB0YWIuIFRoZSBjYWxsIHRvIHRoZQotICogY3JlYXRlQ29udHJvbFBhbmVsIG1ldGhvZCBpbiB0aGUgc3VwZXIgY2xhc3MgY3JlYXRlIHRoZSBjb250cm9scyB0aGF0IGFyZQotICogZGVmaW5lZCBpbiB0aGUgc3VwZXIgY2xhc3MuCi0gKiAKLSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JQ29tcG9zaXRlIGNvbXA7Ci0JR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQotCS8vIGNyZWF0ZSBzcGlubmVyIGZvciB0aGUgcm90YXRpb24gYW5nbGUKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLSAKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJvdGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCXJvdGF0ZVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCXJvdGF0ZVNwaW5uZXIuc2V0U2VsZWN0aW9uKDApOwotCXJvdGF0ZVNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQlyb3RhdGVTcGlubmVyLnNldE1heGltdW0oMzYwKTsKLQlyb3RhdGVTcGlubmVyLnNldEluY3JlbWVudCgxMCk7Ci0Jcm90YXRlU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgYSBzbGlkZXIgZm9yIHNjYWxpbmcgYWxvbmcgdGhlIHggYXhpcwotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygieHNjYWxlIikpOyAvLyROT04tTkxTLTEkCi0Jc2NhbGVTcGlubmVyWCA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0Jc2NhbGVTcGlubmVyWC5zZXREaWdpdHMoMik7Ci0Jc2NhbGVTcGlubmVyWC5zZXRNaW5pbXVtKDEpOwotCXNjYWxlU3Bpbm5lclguc2V0TWF4aW11bSg1MDApOwotCXNjYWxlU3Bpbm5lclguc2V0U2VsZWN0aW9uKDc1KTsKLQlzY2FsZVNwaW5uZXJYLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCi0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBhIHNsaWRlciBmb3Igc2NhbGluZyBhbG9uZyB0aGUgeSBheGlzCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInlzY2FsZSIpKTsgLy8kTk9OLU5MUy0xJAotCXNjYWxlU3Bpbm5lclkgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCXNjYWxlU3Bpbm5lclkuc2V0RGlnaXRzKDIpOwotCXNjYWxlU3Bpbm5lclkuc2V0TWluaW11bSgxKTsKLQlzY2FsZVNwaW5uZXJZLnNldE1heGltdW0oNTAwKTsKLQlzY2FsZVNwaW5uZXJZLnNldFNlbGVjdGlvbig3NSk7Ci0Jc2NhbGVTcGlubmVyWS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgYSBidXR0b24gZm9yICJpbnZlcnQiCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JaW52ZXJ0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuVE9HR0xFKTsKLQlpbnZlcnRCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludmVydCIpKTsgLy8kTk9OLU5MUy0xJAotCWludmVydEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9jbHViLmpwZyIpOyAKLQotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCi0JLy8gc2NhbGUgaW1hZ2UKLQl0cmFuc2Zvcm0uc2NhbGUoc2NhbGVTcGlubmVyWC5nZXRTZWxlY3Rpb24oKS8xMDBmLCBzY2FsZVNwaW5uZXJZLmdldFNlbGVjdGlvbigpLzEwMGYpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIgb2YgaW1hZ2UKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKHJvdGF0ZVNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoLXJlY3Qud2lkdGgvMiwgLXJlY3QuaGVpZ2h0LzIpOwotCQotCWlmKGludmVydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JCXRyYW5zZm9ybS5pbnZlcnQoKTsKLQl9Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMCwgMCwgaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIAotCQkJCQkJCQlpbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQsIDIyLCAyMik7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludGVycG9sYXRpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludGVycG9sYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllZWY4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRlcnBvbGF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgc2hvd3MgdGhlIGVmZmVjdHMgb2YgYXBwbHlpbmcgdmFyaW91cyBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobXMgdG8KLSAqIGltYWdlcyB0aGF0IGhhdmUgYmVlbiBzdHJldGNoZWQgb3Igc2hydW5rLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJwb2xhdGlvblRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLQlDb21ibyBpbWFnZUNiOwkvLyBjb21ibyBmb3Igc2VsZWN0aW5nIGltYWdlcwotCi1wdWJsaWMgSW50ZXJwb2xhdGlvblRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludGVycG9sYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlSW50ZXJwb2xhdGlvbkRlc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCUNvbXBvc2l0ZSBjb21wOwotCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIAotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWltYWdlQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSG91c2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlF1ZXN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYXNrIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJlIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk92YWxzIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5zZWxlY3QoMCk7Ci0JaW1hZ2VDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JZmxvYXQgc2NhbGVYID0gMTBmOwotCWZsb2F0IHNjYWxlWSA9IDEwZjsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0Jc3dpdGNoIChpbWFnZUNiLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkKLQljYXNlIDA6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhvbWVfbmF2LmdpZiIpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhlbHAuZ2lmIik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAidGFzay5naWYiKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJmb250LmdpZiIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImN1YmUucG5nIik7Ci0JCXNjYWxlWCA9IDAuNzVmOwotCQlzY2FsZVkgPSAwLjVmOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgInN3dC5wbmciKTsKLQkJc2NhbGVYID0gMC40ZjsKLQkJc2NhbGVZID0gMC44ZjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQlpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJvdmFscy5wbmciKTsKLQkJc2NhbGVYID0gMS4xZjsKLQkJc2NhbGVZID0gMC41ZjsKLQkJYnJlYWs7Ci0JfQotCQotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgMjApOwkKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQkKLQkvLyB3cml0ZSBzb21lIHRleHQgYmVsb3cgdGhlIG9yaWdpbmFsIGltYWdlCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9yaWdpbmFsSW1nIik7IC8vJE5PTi1OTFMtMSQKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDI1ICsgYm91bmRzLmhlaWdodCwgdHJ1ZSk7Ci0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKCh3aWR0aCAtIChib3VuZHMud2lkdGggKiBzY2FsZVggKyAxMCkgKiA0KSAvIDIsIDI1ICsgYm91bmRzLmhlaWdodCArIHNpemUueSArCi0JCQkJKGhlaWdodCAtICgyNSArIGJvdW5kcy5oZWlnaHQgKyBzaXplLnkgKyBib3VuZHMuaGVpZ2h0KnNjYWxlWSkpIC8gMik7Ci0JdHJhbnNmb3JtLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKLQotCS8vIC0tLSBkcmF3IHN0cmluZ3MgLS0tCi0JZmxvYXRbXSBwb2ludCA9IG5ldyBmbG9hdFsyXTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb25lIik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKTsKLQlwb2ludFsxXSA9IGJvdW5kcy5oZWlnaHQ7Ci0JdHJhbnNmb3JtLnRyYW5zZm9ybShwb2ludCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAoaW50KXBvaW50WzBdLCAoaW50KXBvaW50WzFdLCB0cnVlKTsKLQkKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMb3ciKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JcG9pbnRbMF0gPSAoc2NhbGVYKmJvdW5kcy53aWR0aCArIDUgLSBzaXplLngpLygyKnNjYWxlWCkgKyBib3VuZHMud2lkdGg7Ci0JcG9pbnRbMV0gPSBib3VuZHMuaGVpZ2h0OwotCXRyYW5zZm9ybS50cmFuc2Zvcm0ocG9pbnQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKGludClwb2ludFswXSwgKGludClwb2ludFsxXSwgdHJ1ZSk7Ci0JCi0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKSArIDIqYm91bmRzLndpZHRoOwotCXBvaW50WzFdID0gYm91bmRzLmhlaWdodDsKLQl0cmFuc2Zvcm0udHJhbnNmb3JtKHBvaW50KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsIChpbnQpcG9pbnRbMF0sIChpbnQpcG9pbnRbMV0sIHRydWUpOwotCQotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhpZ2giKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JcG9pbnRbMF0gPSAoc2NhbGVYKmJvdW5kcy53aWR0aCArIDUgLSBzaXplLngpLygyKnNjYWxlWCkgKyAzKmJvdW5kcy53aWR0aDsKLQlwb2ludFsxXSA9IGJvdW5kcy5oZWlnaHQ7Ci0JdHJhbnNmb3JtLnRyYW5zZm9ybShwb2ludCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAoaW50KXBvaW50WzBdLCAoaW50KXBvaW50WzFdLCB0cnVlKTsKLQotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0KLQkvLyAtLS0gZHJhdyBpbWFnZXMgLS0tCi0JCi0JLy8gbm8gaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULk5PTkUpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JLy8gbG93IGludGVycG9sYXRpb24KLQlnYy5zZXRJbnRlcnBvbGF0aW9uKFNXVC5MT1cpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgYm91bmRzLndpZHRoLCAwKTsKLQotCS8vIGRlZmF1bHQgaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULkRFRkFVTFQpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMipib3VuZHMud2lkdGgsIDApOwotCQotCS8vIGhpZ2ggaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULkhJR0gpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMypib3VuZHMud2lkdGgsIDApOwotCi0JZm9udC5kaXNwb3NlKCk7Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50cm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ZWQwMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnRyb1RhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCUZvbnQgZm9udDsKLQlJbWFnZSBpbWFnZTsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZsb2F0IHgsIHk7Ci0gICAgZmxvYXQgaW5jWCA9IDEwLjBmOwotCWZsb2F0IGluY1kgPSA1LjBmOwotCWludCB0ZXh0V2lkdGgsIHRleHRIZWlnaHQ7Ci0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCQotcHVibGljIEludHJvVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZSA9IG51bGw7Ci0JaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG51bGw7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW50cm9kdWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW50cm9kdWN0aW9uRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIHggKz0gaW5jWDsKLSAgICB5ICs9IGluY1k7Ci0JZmxvYXQgcmFuZG9tID0gKGZsb2F0KU1hdGgucmFuZG9tKCk7IAotICAgIGlmICh4ICsgdGV4dFdpZHRoID4gd2lkdGgpIHsKLSAgICAgICAgeCA9IHdpZHRoIC0gdGV4dFdpZHRoOwotICAgICAgICBpbmNYID0gcmFuZG9tICogLXdpZHRoIC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiB3aWR0aCAvIDE2ICsgMTsKLSAgICB9Ci0gICAgaWYgKHkgKyB0ZXh0SGVpZ2h0ID4gaGVpZ2h0KSB7Ci0gICAgICAgIHkgPSAoaGVpZ2h0IC0gdGV4dEhlaWdodCktIDI7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiAtaGVpZ2h0IC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeSA8IDApIHsKLSAgICAgICAgeSA9IDA7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiBoZWlnaHQgLyAxNiArIDE7Ci0gICAgfQotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCWltYWdlID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaXJtYW9zLmpwZyIpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlGb250RGF0YSBmZCA9IGRldmljZS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZm9udCA9IG5ldyBGb250KGRldmljZSwgZmQuZ2V0TmFtZSgpLCByZWN0LmhlaWdodCAvIDQsIFNXVC5CT0xEKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJdGV4dFdpZHRoID0gc2l6ZS54OwotCQl0ZXh0SGVpZ2h0ID0gc2l6ZS55OwotCX0KLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkU3RyaW5nKHRleHQsIHgsIHksIGZvbnQpOwotCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JZ2Muc2V0Q2xpcHBpbmcoKFJlY3RhbmdsZSludWxsKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUNhcFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUNhcFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhmZmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVDYXBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyBsaW5lIGNhcHMgYXBwbGljYWJsZSB0byBhIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lQ2FwVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmb3JlZ3JvdW5kOwotCU1lbnUgbWVudTsKLQotcHVibGljIExpbmVDYXBUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lQ2FwIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lQ2FwRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQkJCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmb3JlZ3JvdW5kID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDNyZCBpdGVtIGluIHRoZSBtZW51IChyZWQpCi0JZm9yZWdyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDIpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBkcmF3IHNpZGUgbGluZXMKLQlnYy5zZXRMaW5lV2lkdGgoMSk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgaGVpZ2h0LzYsIDMqd2lkdGgvMTYsIDUqaGVpZ2h0LzYpOwotCWdjLmRyYXdMaW5lKDEzKndpZHRoLzE2LCBoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDUqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCi0JLy8gZHJhdyBsYWJlbHMKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGbGF0Iik7IC8vJE5PTi1OTFMtMSQKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgMypoZWlnaHQvMTIsIHRydWUpOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNxdWFyZSIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsJCi0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA1KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA3KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChmb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCQotCS8vIGRyYXcgbGluZXMgd2l0aCBjYXBzCi0JZ2Muc2V0TGluZVdpZHRoKDIwKTsKLQlnYy5zZXRMaW5lQ2FwKFNXVC5DQVBfRkxBVCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMipoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDIqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVDYXAoU1dULkNBUF9TUVVBUkUpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAzKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lQ2FwKFNXVC5DQVBfUk9VTkQpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDQqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCA0KmhlaWdodC82KTsKLQkKLQlpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsJCi19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVKb2luVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lSm9pblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmRjOGNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVKb2luVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgbGluZSBqb2lucy4gSXQgYWxsb3dzIGEgdXNlciB0byBjaG9vc2UgZnJvbQotICogYmV2ZWwsIG1pdGVyIGFuZCByb3VuZC4KLSAqLwotcHVibGljIGNsYXNzIExpbmVKb2luVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCXByaXZhdGUgQ29tYm8gam9pbkNiOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIHNoYXBlQ29sb3I7Ci0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0JcHJpdmF0ZSBpbnQgW10gam9pblZhbHVlcyA9IG5ldyBpbnQgW10ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCi1wdWJsaWMgTGluZUpvaW5UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lSm9pbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGluZUpvaW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lSm9pbiIpKTsgLy8kTk9OLU5MUy0xJAotCWpvaW5DYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQlqb2luQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJiZXZlbCIpKTsgLy8kTk9OLU5MUy0xJAotCWpvaW5DYi5hZGQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIm1pdGVyIikpOyAvLyROT04tTkxTLTEkCi0Jam9pbkNiLmFkZChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygicm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQlqb2luQ2Iuc2VsZWN0KDEpOwotCWpvaW5DYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJc2hhcGVDb2xvciA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQkvLyBpbml0aWFsaXplIHRoZSBzaGFwZSBjb2xvciB0byB0aGUgNHRoIGl0ZW0gaW4gdGhlIG1lbnUgKGdyZWVuKQotCXNoYXBlQ29sb3IgPShHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDMpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShzaGFwZUNvbG9yLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlnYy5zZXRMaW5lV2lkdGgoMjApOwotCWdjLnNldExpbmVKb2luKGpvaW5WYWx1ZXNbam9pbkNiLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQkKLQkvLyBzZXQgdGhlIGZvcmVncm91bmQgY29sb3Igb3IgcGF0dGVybgotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKHNoYXBlQ29sb3IuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoc2hhcGVDb2xvci5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKHNoYXBlQ29sb3IuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgc2hhcGVDb2xvci5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRGb3JlZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0JCi0JLy8gZHJhdyB0aGUgc2hhcGUKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGgubW92ZVRvKHdpZHRoLzIsIDI1KTsKLQlwYXRoLmxpbmVUbygyKndpZHRoLzMsIGhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbyh3aWR0aC0yNSwgaGVpZ2h0LzIpOwotCXBhdGgubGluZVRvKDIqd2lkdGgvMywgMipoZWlnaHQvMyk7Ci0JcGF0aC5saW5lVG8od2lkdGgvMiwgaGVpZ2h0LTI1KTsKLQlwYXRoLmxpbmVUbyh3aWR0aC8zLCAyKmhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbygyNSwgaGVpZ2h0LzIpOwotCXBhdGgubGluZVRvKHdpZHRoLzMsIGhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAyNSk7Ci0JcGF0aC5jbG9zZSgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVN0eWxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lU3R5bGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4YzdhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lU3R5bGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgbGluZSBzdHlsZXMgYXBwbGljYWJsZSB0byBhIGxpbmUuICBJdCBzaG93cyB0aGUgdXNlIG9mIHRoZQotICogPGNvZGU+R0Muc2V0TGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlHcmFwaGljc0JhY2tncm91bmQgbGluZUNvbG9yOwotCU1lbnUgbWVudTsKLQlTcGlubmVyIGxpbmVXaWR0aFNwaW5uZXI7Ci0KLXB1YmxpYyBMaW5lU3R5bGVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lU3R5bGVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lU3R5bGVzRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQkKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lV2lkdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQlsaW5lV2lkdGhTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsaW5lV2lkdGhTcGlubmVyLnNldFNlbGVjdGlvbigxMCk7Ci0JbGluZVdpZHRoU3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCWxpbmVXaWR0aFNwaW5uZXIuc2V0TWF4aW11bSgzMCk7Ci0JbGluZVdpZHRoU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQkKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJbGluZUNvbG9yID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBmb3JlZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQlsaW5lQ29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGxpbmVDb2xvci5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGxpbmVDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChsaW5lQ29sb3IuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChsaW5lQ29sb3IuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgbGluZUNvbG9yLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEZvcmVncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLQkKLQkvLyBzZXQgbGluZSB3aWR0aAotCWdjLnNldExpbmVXaWR0aChsaW5lV2lkdGhTcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyBkcmF3IGxpbmVzIHdpdGggY2FwcwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDEqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAxKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMipoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDIqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAzKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgNCpoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDQqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9URE9UKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCA1KmhlaWdodC82LCAxMyp3aWR0aC8xNiwgNSpoZWlnaHQvNik7Ci0JCi0JLy8gZHJhdyBsYWJlbHMKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTb2xpZCIpOyAvLyROT04tTkxTLTEkCi0JUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDEqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEYXNoIik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDMqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEb3QiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA1KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGFzaERvdCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDcqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEYXNoRG90RG90Iik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgOSpoZWlnaHQvMTIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1ODc1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi1wdWJsaWMgTGluZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmUiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlnYy5kcmF3TGluZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlnYy5kcmF3TGluZSh3aWR0aCwgMCwgMCwgaGVpZ2h0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL01hemVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL01hemVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0ZTE0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9NYXplVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHNob3dzIHRocmVlIGNpcmNsZXMsIGVhY2ggZm9sbG93aW5nIGEgZGlmZmVyZW50IHBhdGggaW4gYSBtYXplLgotICogT25seSBvbmUgb2YgdGhlIHRocmVlIGNpcmNsZXMgZm9sbG93cyB0aGUgY29ycmVjdCBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgTWF6ZVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JaW50IG5leHRJbmRleCwgbmV4dEluZGV4MiwgbmV4dEluZGV4MzsKLQlpbnQgeGNvb3JkLCB5Y29vcmQsIHhjb29yZDIsIHljb29yZDIsIHhjb29yZDMsIHljb29yZDM7Ci0JQXJyYXlMaXN0IG5leHRDb29yZCwgbmV4dENvb3JkMiwgbmV4dENvb3JkMzsKLQlib29sZWFuIGlzRG9uZSwgaXNEb25lMiwgaXNEb25lMzsKLQlJbWFnZSBpbWFnZTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICogQHBhcmFtIGV4YW1wbGUgQSBHcmFwaGljc0V4YW1wbGUKLSAqLwotcHVibGljIE1hemVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQotCS8vIGNvcnJlY3QgcGF0aAotCW5leHRDb29yZCA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDIwLCAtNTAsIDIwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMzAsIDExMCwgMTMwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlVXAoMTM1LCAxMDAsIDEzNSwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMTQwLCAxNSwgMjEwLCAxNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDIxMCwgMjUsIDIxMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMjIwLCA3NSwgMzIwLCA3NSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVVcCgzMjAsIDY1LCAzMjAsIDU1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZVJpZ2h0KDMzMCwgNTAsIDQ3NSwgNTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93big0NzUsIDYwLCA0NzUsIDIyNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVMZWZ0KDQ2NSwgMjI1LCAyMDAsIDIyNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVVcCgyMDAsIDIxNSwgMjAwLCAxODAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlTGVmdCgxOTAsIDE4MCwgMTIwLCAxODAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93bigxMjAsIDE5MCwgMTIwLCAzMjAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMTMwLCAzMjAsIDQ3NSwgMzIwLCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZURvd24oNDc1LCAzMzAsIDQ3NSwgNDM1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZUxlZnQoNDY1LCA0MzUsIDIwLCA0MzUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93bigyMCwgNDQ1LCAyMCwgNDk1LCAxMCkpOwotCQotCW5leHRJbmRleCA9IDA7Ci0JeGNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KSkuaW50VmFsdWUoKTsKLQl5Y29vcmQgPSAoKEludGVnZXIpbmV4dENvb3JkLmdldChuZXh0SW5kZXgrMSkpLmludFZhbHVlKCk7Ci0JCi0JLy8gd3JvbmcgcGF0aCAxCi0JbmV4dENvb3JkMiA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlRG93bigyMCwgLTI1LCAyMCwgMTEwLCAxMCkpOwotCW5leHRDb29yZDIuYWRkQWxsKG1vdmVSaWdodCgzMCwgMTEwLCAxMzAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlVXAoMTM1LCAxMDAsIDEzNSwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZVJpZ2h0KDE0MCwgMTUsIDUyMCwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZURvd24oNTI1LCAxNSwgNTI1LCA0ODAsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZUxlZnQoNTE1LCA0ODAsIDcwLCA0ODAsIDEwKSk7Ci0JCi0JbmV4dEluZGV4MiA9IDA7Ci0JeGNvb3JkMiA9ICgoSW50ZWdlciluZXh0Q29vcmQyLmdldChuZXh0SW5kZXgyKSkuaW50VmFsdWUoKTsKLQl5Y29vcmQyID0gKChJbnRlZ2VyKW5leHRDb29yZDIuZ2V0KG5leHRJbmRleDIrMSkpLmludFZhbHVlKCk7Ci0JCi0JLy8gd3JvbmcgcGF0aCAyCi0JbmV4dENvb3JkMyA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlRG93bigyMCwgMCwgMjAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlUmlnaHQoMzAsIDExMCwgMTMwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVVwKDEzNSwgMTAwLCAxMzUsIDE1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVSaWdodCgxNDAsIDE1LCAyMTAsIDE1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVEb3duKDIxMCwgMjUsIDIxMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVJpZ2h0KDIyMCwgNzUsIDMyMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVVwKDMyMCwgNjUsIDMyMCwgNTUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVJpZ2h0KDMzMCwgNTAsIDQ3NSwgNTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZURvd24oNDc1LCA2MCwgNDc1LCAyMjUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZUxlZnQoNDY1LCAyMjUsIDQyNSwgMjI1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVVcCg0MjAsIDIyNSwgNDIwLCAxNTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZUxlZnQoNDIwLCAxNDUsIDcwLCAxNDUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZURvd24oNzAsIDE1MCwgNzAsIDMyMCwgMTApKTsKLQkKLQluZXh0SW5kZXgzID0gMDsKLQl4Y29vcmQzID0gKChJbnRlZ2VyKW5leHRDb29yZDMuZ2V0KG5leHRJbmRleDMpKS5pbnRWYWx1ZSgpOwotCXljb29yZDMgPSAoKEludGVnZXIpbmV4dENvb3JkMy5nZXQobmV4dEluZGV4MysxKSkuaW50VmFsdWUoKTsKLQkKLQlpc0RvbmUgPSBpc0RvbmUyID0gaXNEb25lMyA9IGZhbHNlOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF6ZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF6ZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQlyZXR1cm4gNTA7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKGltYWdlICE9IG51bGwpIHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQotCS8vIGFkZCBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gcmVzZXQgbmV4dE51bWJlciBhZnRlciAKLQkvLyB0aGUgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZAotCXBsYXlJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc0RvbmUpewotCQkJCW5leHRJbmRleCA9IG5leHRJbmRleDIgPSBuZXh0SW5kZXgzID0gMDsKLQkJCQlpc0RvbmUgPSBpc0RvbmUyID0gaXNEb25lMyA9IGZhbHNlOyAKLQkJCX0KLQkJfQotCX0pOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0KLQlpZiAobmV4dEluZGV4KzIgPCBuZXh0Q29vcmQuc2l6ZSgpKSB7Ci0JCW5leHRJbmRleCA9IChuZXh0SW5kZXgrMiklbmV4dENvb3JkLnNpemUoKTsKLQkJeGNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KSkuaW50VmFsdWUoKTsKLQkJeWNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KzEpKS5pbnRWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCS8vIHN0b3AgYW5pbWF0aW9uCi0JCXNldEFuaW1hdGlvbihmYWxzZSk7Ci0JCWlzRG9uZSA9IHRydWU7Ci0JfQotCQotCWlmIChuZXh0SW5kZXgyKzIgPCBuZXh0Q29vcmQyLnNpemUoKSkgewotCQluZXh0SW5kZXgyID0gKG5leHRJbmRleDIrMiklbmV4dENvb3JkMi5zaXplKCk7Ci0JCXhjb29yZDIgPSAoKEludGVnZXIpbmV4dENvb3JkMi5nZXQobmV4dEluZGV4MikpLmludFZhbHVlKCk7Ci0JCXljb29yZDIgPSAoKEludGVnZXIpbmV4dENvb3JkMi5nZXQobmV4dEluZGV4MisxKSkuaW50VmFsdWUoKTsKLQl9IGVsc2UgewotCQlpc0RvbmUyID0gdHJ1ZTsKLQl9Ci0JCi0JaWYgKG5leHRJbmRleDMrMiA8IG5leHRDb29yZDMuc2l6ZSgpKSB7Ci0JCW5leHRJbmRleDMgPSAobmV4dEluZGV4MysyKSVuZXh0Q29vcmQzLnNpemUoKTsKLQkJeGNvb3JkMyA9ICgoSW50ZWdlciluZXh0Q29vcmQzLmdldChuZXh0SW5kZXgzKSkuaW50VmFsdWUoKTsKLQkJeWNvb3JkMyA9ICgoSW50ZWdlciluZXh0Q29vcmQzLmdldChuZXh0SW5kZXgzKzEpKS5pbnRWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCWlzRG9uZTMgPSB0cnVlOwotCX0KLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQlpbWFnZSA9IGV4YW1wbGUubG9hZEltYWdlKGRldmljZSwgIm1hemUuYm1wIik7Ci0JfQotCS8vIGRyYXcgbWF6ZQotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbnQgeCA9ICh3aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCWludCB5ID0gKGhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQotCS8vIGRyYXcgY29ycmVjdCBvdmFsCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmZpbGxPdmFsKHggKyB4Y29vcmQsIHkgKyB5Y29vcmQsIDE2LCAxNik7Ci0JZ2MuZHJhd092YWwoeCArIHhjb29yZCwgeSArIHljb29yZCwgMTUsIDE1KTsKLQkKLQkvLyBkcmF3IHdyb25nIG92YWwgMQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbE92YWwoeCArIHhjb29yZDIsIHkgKyB5Y29vcmQyLCAxNiwgMTYpOwotCWdjLmRyYXdPdmFsKHggKyB4Y29vcmQyLCB5ICsgeWNvb3JkMiwgMTUsIDE1KTsKLQkKLQkvLyBkcmF3IHdyb25nIG92YWwgMgotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmZpbGxPdmFsKHggKyB4Y29vcmQzLCB5ICsgeWNvb3JkMywgMTYsIDE2KTsKLQlnYy5kcmF3T3ZhbCh4ICsgeGNvb3JkMywgeSArIHljb29yZDMsIDE1LCAxNSk7Ci0KLQlpZiAoaXNEb25lMikgewotCQlJbWFnZSBoZWxwSW1nID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaGVscC5naWYiKTsKLQkJZ2MuZHJhd0ltYWdlKGhlbHBJbWcsIHggKyB4Y29vcmQyICsgMTYsIHkgKyB5Y29vcmQyIC0gMTYpOwotCQloZWxwSW1nLmRpc3Bvc2UoKTsKLQl9Ci0KLQlpZiAoaXNEb25lMykgewotCQlJbWFnZSBoZWxwSW1nID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaGVscC5naWYiKTsKLQkJZ2MuZHJhd0ltYWdlKGhlbHBJbWcsIHggKyB4Y29vcmQzICsgMTYsIHkgKyB5Y29vcmQzIC0gMTYpOwotCQloZWxwSW1nLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGEgImxlZnQtbW92aW5nIiBmYXNoaW9uIGZyb20gdGhlIHN0YXJ0Ci0gKiBwb2ludCB0byB0aGUgZW5kIHBvaW50IGluY2x1c2l2ZWx5LgotICogCi0gKiBAcGFyYW0geDEKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geTEKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geDIKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHkyCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSBzdGVwc2l6ZQotICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlIGVhY2ggY29vcmRpbmF0ZQotICovCi1wcml2YXRlIEFycmF5TGlzdCBtb3ZlTGVmdChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBzdGVwc2l6ZSkgewotCUFycmF5TGlzdCBjb29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl3aGlsZSh4MSAtIHN0ZXBzaXplID4geDIpIHsKLQkJeDEgPSB4MSAtIHN0ZXBzaXplOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl9Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MikpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTIpKTsKLQlyZXR1cm4gY29vcmRzOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBsaXN0IG9mIGNvb3JkaW5hdGVzIG1vdmluZyBpbiBhICJyaWdodC1tb3ZpbmciIGZhc2hpb24gZnJvbSB0aGUgc3RhcnQKLSAqIHBvaW50IHRvIHRoZSBlbmQgcG9pbnQgaW5jbHVzaXZlbHkuCi0gKiAKLSAqIEBwYXJhbSB4MQotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB5MQotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB4MgotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0geTIKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHN0ZXBzaXplCi0gKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgc2VwYXJhdGUgZWFjaCBjb29yZGluYXRlCi0gKi8KLXByaXZhdGUgQXJyYXlMaXN0IG1vdmVSaWdodChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBzdGVwc2l6ZSkgewotCUFycmF5TGlzdCBjb29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl3aGlsZSh4MSArIHN0ZXBzaXplIDwgeDIpIHsKLQkJeDEgPSB4MSArIHN0ZXBzaXplOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl9Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MikpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTIpKTsKLQlyZXR1cm4gY29vcmRzOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBsaXN0IG9mIGNvb3JkaW5hdGVzIG1vdmluZyBpbiBhbiB1cHdhcmQgZmFzaGlvbiBmcm9tIHRoZSBzdGFydAotICogcG9pbnQgdG8gdGhlIGVuZCBwb2ludCBpbmNsdXNpdmVseS4KLSAqIAotICogQHBhcmFtIHgxCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHkxCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHgyCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSB5MgotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0gc3RlcHNpemUKLSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSBlYWNoIGNvb3JkaW5hdGUKLSAqLwotcHJpdmF0ZSBBcnJheUxpc3QgbW92ZVVwKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IHN0ZXBzaXplKSB7Ci0JQXJyYXlMaXN0IGNvb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCXdoaWxlKHkxIC0gc3RlcHNpemUgPiB5MikgewotCQl5MSA9IHkxIC0gc3RlcHNpemU7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCX0KLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgyKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MikpOwotCXJldHVybiBjb29yZHM7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGEgZG93bndhcmQgZmFzaGlvbiBmcm9tIHRoZSBzdGFydAotICogcG9pbnQgdG8gdGhlIGVuZCBwb2ludCBpbmNsdXNpdmVseS4KLSAqIAotICogQHBhcmFtIHgxCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHkxCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHgyCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSB5MgotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0gc3RlcHNpemUKLSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSBlYWNoIGNvb3JkaW5hdGUKLSAqLwotcHJpdmF0ZSBBcnJheUxpc3QgbW92ZURvd24oaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgc3RlcHNpemUpIHsKLQlBcnJheUxpc3QgY29vcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0Jd2hpbGUoeTEgKyBzdGVwc2l6ZSA8IHkyKSB7Ci0JCXkxID0geTEgKyBzdGVwc2l6ZTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0JfQotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDIpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkyKSk7Ci0JcmV0dXJuIGNvb3JkczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nQW5pbVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nQW5pbVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNjNGVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhDbGlwcGluZ0FuaW1UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGFub3RoZXIgdGFiIHRoYXQgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBwYXRoIGNsaXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgUGF0aENsaXBwaW5nQW5pbVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JcHJpdmF0ZSBCdXR0b24gY29sb3JCdXR0b247Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsKLQlwcml2YXRlIE1lbnUgbWVudTsKLQlwcml2YXRlIGludCByZWN0V2lkdGggPSAzMDA7Ci0JcHJpdmF0ZSBpbnQgcmVjdEhlaWdodCA9IDMwMDsKLQlwcml2YXRlIGludCBpbmNXaWR0aCA9IDU7Ci0JcHJpdmF0ZSBpbnQgaW5jSGVpZ2h0ID0gNTsKLQlwcml2YXRlIGJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQlwcml2YXRlIGludCBhbmdsZTsKLQotCXB1YmxpYyBQYXRoQ2xpcHBpbmdBbmltVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFuaW1QYXRoQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbmltUGF0aENsaXBwaW5nRGVzYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQltZW51ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCi0JCS8vIGNvbG9yIG1lbnUKLQkJQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCQliYWNrZ3JvdW5kID0gZ2I7Ci0JCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCQliYWNrZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCkgbWVudS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQotCQkvLyBjb2xvciBidXR0b24KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xvckJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQkJY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJYW5nbGUgPSAoYW5nbGUgKyA1KSUzNjA7Ci0JCWlmICh2ZXJ0aWNhbCkgewotCQkJaWYgKHJlY3RIZWlnaHQgPD0gMCkgewotCQkJCWluY0hlaWdodCA9IC1pbmNIZWlnaHQ7Ci0JCQl9Ci0JCQlpZiAocmVjdEhlaWdodCA+PSBoZWlnaHQpIHsKLQkJCQlpbmNIZWlnaHQgPSAtaW5jSGVpZ2h0OwotCQkJCXZlcnRpY2FsID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZWN0SGVpZ2h0ID0gcmVjdEhlaWdodCArIGluY0hlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWN0V2lkdGggPD0gMCkgewotCQkJCWluY1dpZHRoID0gLWluY1dpZHRoOwotCQkJfQotCQkJaWYgKHJlY3RXaWR0aCA+PSB3aWR0aCkgewotCQkJCWluY1dpZHRoID0gLWluY1dpZHRoOwotCQkJCXZlcnRpY2FsID0gdHJ1ZTsKLQkJCX0KLQkJCXJlY3RXaWR0aCA9IHJlY3RXaWR0aCArIGluY1dpZHRoOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQkKLQkJLy8gdG9wIHRyaWFuZ2xlCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgubW92ZVRvKHdpZHRoLzIsIDApOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yKzEwMCwgMTczKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvMi0xMDAsIDE3Myk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzIsIDApOwotCQkKLQkJLy8gYm90dG9tIHRyaWFuZ2xlCi0JCVBhdGggcGF0aDIgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMi5tb3ZlVG8od2lkdGgvMiwgaGVpZ2h0KTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIrMTAwLCBoZWlnaHQtMTczKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzItMTAwLCBoZWlnaHQtMTczKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIsIGhlaWdodCk7Ci0JCQotCQkvLyBsZWZ0IHRyaWFuZ2xlCi0JCVBhdGggcGF0aDMgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMy5tb3ZlVG8oMCwgaGVpZ2h0LzIpOwotCQlwYXRoMy5saW5lVG8oMTczLCBoZWlnaHQvMi0xMDApOwotCQlwYXRoMy5saW5lVG8oMTczLCBoZWlnaHQvMisxMDApOwotCQlwYXRoMy5saW5lVG8oMCwgaGVpZ2h0LzIpOwotCQkKLQkJLy8gcmlnaHQgdHJpYW5nbGUKLQkJUGF0aCBwYXRoNCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg0Lm1vdmVUbyh3aWR0aCwgaGVpZ2h0LzIpOwotCQlwYXRoNC5saW5lVG8od2lkdGgtMTczLCBoZWlnaHQvMi0xMDApOwotCQlwYXRoNC5saW5lVG8od2lkdGgtMTczLCBoZWlnaHQvMisxMDApOwotCQlwYXRoNC5saW5lVG8od2lkdGgsIGhlaWdodC8yKTsKLQkJCi0JCS8vIGNpcmNsZQotCQlQYXRoIHBhdGg1ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDUubW92ZVRvKCh3aWR0aC0yMDApLzIsIChoZWlnaHQtMjAwKS8yKTsKLQkJcGF0aDUuYWRkQXJjKCh3aWR0aC0yMDApLzIsIChoZWlnaHQtMjAwKS8yLCAyMDAsIDIwMCwgMCwgMzYwKTsKLQkJCi0JCS8vIHRvcCByZWN0YW5nbGUKLQkJUGF0aCBwYXRoNiA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg2LmFkZFJlY3RhbmdsZSgod2lkdGgtNDApLzIsIDE3NSwgNDAsICgoaGVpZ2h0LTIwMCkvMiktMTc3KTsKLQkJCi0JCS8vIGJvdHRvbSByZWN0YW5nbGUKLQkJUGF0aCBwYXRoNyA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg3LmFkZFJlY3RhbmdsZSgod2lkdGgtNDApLzIsICgoaGVpZ2h0LTIwMCkvMikrMjAyLCA0MCwgKGhlaWdodC0xNzUpLSgoKGhlaWdodC0yMDApLzIpKzIwMikpOwotCQkKLQkJLy8gbGVmdCByZWN0YW5nbGUKLQkJUGF0aCBwYXRoOCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg4LmFkZFJlY3RhbmdsZSgxNzUsIChoZWlnaHQtNDApLzIsICgod2lkdGgtMjAwKS8yKS0xNzcsIDQwKTsKLQkJCi0JCS8vIHJpZ2h0IHJlY3RhbmdsZQotCQlQYXRoIHBhdGg5ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDkuYWRkUmVjdGFuZ2xlKCh3aWR0aC0yMDApLzIrMjAyLCAoaGVpZ2h0LTQwKS8yLCAod2lkdGgtMTc1KS0oKHdpZHRoLTIwMCkvMisyMDIpLCA0MCk7Ci0JCQotCQlwYXRoLmFkZFBhdGgocGF0aDIpOwotCQlwYXRoLmFkZFBhdGgocGF0aDMpOwotCQlwYXRoLmFkZFBhdGgocGF0aDQpOwotCQlwYXRoLmFkZFBhdGgocGF0aDUpOwotCQlwYXRoLmFkZFBhdGgocGF0aDYpOwotCQlwYXRoLmFkZFBhdGgocGF0aDcpOwotCQlwYXRoLmFkZFBhdGgocGF0aDgpOwotCQlwYXRoLmFkZFBhdGgocGF0aDkpOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQotCQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJfQotCi0JCWdjLnNldExpbmVXaWR0aCgyKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgod2lkdGgtcmVjdFdpZHRoKS8yLCAoaGVpZ2h0LXJlY3RIZWlnaHQpLzIsIHJlY3RXaWR0aCwgcmVjdEhlaWdodCk7Ci0JCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXBhdHRlcm4uZGlzcG9zZSgpOwotCQkKLQkJcGF0aDkuZGlzcG9zZSgpOwotCQlwYXRoOC5kaXNwb3NlKCk7Ci0JCXBhdGg3LmRpc3Bvc2UoKTsKLQkJcGF0aDYuZGlzcG9zZSgpOwotCQlwYXRoNS5kaXNwb3NlKCk7Ci0JCXBhdGg0LmRpc3Bvc2UoKTsKLQkJcGF0aDMuZGlzcG9zZSgpOwotCQlwYXRoMi5kaXNwb3NlKCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhDbGlwcGluZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODcwMjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHBhdGggY2xpcHBpbmcgYW5kIHRoZSBlZmZlY3RzIG9mCi0gKiBhcHBseWluZyBvbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoQ2xpcHBpbmdUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JcHJpdmF0ZSBDb21ibyBjbGlwcGluZ0NiOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIGJhY2tncm91bmQ7Ci0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0KLXB1YmxpYyBQYXRoQ2xpcHBpbmdUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXRoQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGhDbGlwcGluZ0Rlc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7CQotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJDbGlwcGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IgPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaXJjbGVzIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZWN0YW5nbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk92YWwiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIldvcmQiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXIiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyaWFuZ2xlcyIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2Iuc2VsZWN0KDApOwotCWNsaXBwaW5nQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjb2xvciBtZW51Ci0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWJhY2tncm91bmQgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0JYmFja2dyb3VuZCA9KEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JaW50IGNsaXBwaW5nID0gY2xpcHBpbmdDYi5nZXRTZWxlY3Rpb25JbmRleCgpOwotCXN3aXRjaCAoY2xpcHBpbmcpIHsKLQkKLQljYXNlIDA6CQkvLyBjaXJjbGVzCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkQXJjKCh3aWR0aC13aWR0aC81KS8yLCAoaGVpZ2h0LWhlaWdodC81KS8yLCB3aWR0aC81LCBoZWlnaHQvNSwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNSood2lkdGgtd2lkdGgvOCkvMTIsIDQqKGhlaWdodC1oZWlnaHQvOCkvMTIsIHdpZHRoLzgsIGhlaWdodC84LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg3Kih3aWR0aC13aWR0aC84KS8xMiwgOCooaGVpZ2h0LWhlaWdodC84KS8xMiwgd2lkdGgvOCwgaGVpZ2h0LzgsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgMyooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgOSooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDExLjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDUqKGhlaWdodC1oZWlnaHQvMTgpLzE4LCB3aWR0aC8xOCwgaGVpZ2h0LzE4LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg4LjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDEzKihoZWlnaHQtaGVpZ2h0LzE4KS8xOCwgd2lkdGgvMTgsIGhlaWdodC8xOCwgMCwgMzYwKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDE6CQkvLyByZWN0YW5nbGUKLQkJcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkUmVjdGFuZ2xlKDEwMCwgMTAwLCB3aWR0aC0yMDAsIGhlaWdodC0yMDApOwotCQlwYXRoLmFkZFJlY3RhbmdsZSgxMjAsIDEyMCwgd2lkdGgtMjQwLCBoZWlnaHQtMjQwKTsKLQkJcGF0aC5hZGRSZWN0YW5nbGUoMTQwLCAxNDAsIHdpZHRoLTI4MCwgaGVpZ2h0LTI4MCk7Ci0JCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgkJLy8gY2lyY2xlCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmFkZEFyYygxMDAsIDEwMCwgd2lkdGgtMjAwLCBoZWlnaHQtMjAwLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYygod2lkdGgtd2lkdGgvNSkvMiwgKGhlaWdodC1oZWlnaHQvNSkvMiwgd2lkdGgvNSwgaGVpZ2h0LzUsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDUqKHdpZHRoLXdpZHRoLzgpLzEyLCA0KihoZWlnaHQtaGVpZ2h0LzgpLzEyLCB3aWR0aC84LCBoZWlnaHQvOCwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNyood2lkdGgtd2lkdGgvOCkvMTIsIDgqKGhlaWdodC1oZWlnaHQvOCkvMTIsIHdpZHRoLzgsIGhlaWdodC84LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg2Kih3aWR0aC13aWR0aC8xMikvMTIsIDMqKGhlaWdodC1oZWlnaHQvMTIpLzEyLCB3aWR0aC8xMiwgaGVpZ2h0LzEyLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg2Kih3aWR0aC13aWR0aC8xMikvMTIsIDkqKGhlaWdodC1oZWlnaHQvMTIpLzEyLCB3aWR0aC8xMiwgaGVpZ2h0LzEyLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYygxMS41Ziood2lkdGgtd2lkdGgvMTgpLzIwLCA1KihoZWlnaHQtaGVpZ2h0LzE4KS8xOCwgd2lkdGgvMTgsIGhlaWdodC8xOCwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoOC41Ziood2lkdGgtd2lkdGgvMTgpLzIwLCAxMyooaGVpZ2h0LWhlaWdodC8xOCkvMTgsIHdpZHRoLzE4LCBoZWlnaHQvMTgsIDAsIDM2MCk7Ci0JCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJLy8gd29yZAotCQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOyAvLyROT04tTkxTLTEkCi0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgIlRpbWVzIiwgMjAwLCBTV1QuTk9STUFMKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJcGF0aC5hZGRTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgKGhlaWdodC1zaXplLnkpLzIsIGZvbnQpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDQ6CQkvLyBzdGFyCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAwKTsKLQkJcGF0aC5saW5lVG8oNSp3aWR0aC84LCBoZWlnaHQvMyk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLCBoZWlnaHQvMyk7Ci0JCXBhdGgubGluZVRvKDMqd2lkdGgvNCwgMTAqaGVpZ2h0LzE2KTsKLQkJcGF0aC5saW5lVG8oNyp3aWR0aC84LCBoZWlnaHQpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAzKmhlaWdodC80KTsKLQkJcGF0aC5saW5lVG8od2lkdGgvOCwgaGVpZ2h0KTsKLQkJcGF0aC5saW5lVG8od2lkdGgvNCwgMTAqaGVpZ2h0LzE2KTsKLQkJcGF0aC5saW5lVG8oMCwgaGVpZ2h0LzMpOwotCQlwYXRoLmxpbmVUbygzKndpZHRoLzgsIGhlaWdodC8zKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvMiwgMCk7Ci0JCQotCQlQYXRoIG92YWxQYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJb3ZhbFBhdGguYWRkQXJjKDkwLCA5MCwgd2lkdGgtMTgwLCBoZWlnaHQtMTgwLCAwLCAzNjApOwotCQkKLQkJcGF0aC5hZGRQYXRoKG92YWxQYXRoKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCW92YWxQYXRoLmRpc3Bvc2UoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCS8vIHRyaWFuZ2xlcwotCQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5hZGRSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzQsIDApOwotCQlwYXRoLmxpbmVUbyh3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgubGluZVRvKDAsIGhlaWdodC8yKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvNCwgMCk7Ci0JCQotCQlQYXRoIHBhdGgyID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIsIDApOwotCQlwYXRoMi5saW5lVG8od2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoMi5saW5lVG8oMyp3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgyLmxpbmVUbyh3aWR0aC8yLCAwKTsKLQkJCi0JCVBhdGggcGF0aDMgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMy5saW5lVG8oMyp3aWR0aC80LCAwKTsKLQkJcGF0aDMubGluZVRvKDMqd2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoMy5saW5lVG8od2lkdGgsIGhlaWdodC8yKTsKLQkJcGF0aDMubGluZVRvKDMqd2lkdGgvNCwgMCk7Ci0JCQotCQlQYXRoIHBhdGg0ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDQubGluZVRvKDAsIGhlaWdodCk7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQlwYXRoNC5saW5lVG8oMCwgaGVpZ2h0KTsKLQkJCi0JCVBhdGggcGF0aDUgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoNS5saW5lVG8od2lkdGgvMiwgaGVpZ2h0KTsKLQkJcGF0aDUubGluZVRvKDMqd2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoNS5saW5lVG8od2lkdGgsIGhlaWdodCk7Ci0JCXBhdGg1LmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQkKLQkJcGF0aC5hZGRQYXRoKHBhdGgyKTsKLQkJcGF0aC5hZGRQYXRoKHBhdGgzKTsKLQkJcGF0aC5hZGRQYXRoKHBhdGg0KTsKLQkJcGF0aC5hZGRQYXRoKHBhdGg1KTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCQotCQlwYXRoNS5kaXNwb3NlKCk7Ci0JCXBhdGg0LmRpc3Bvc2UoKTsKLQkJcGF0aDMuZGlzcG9zZSgpOwotCQlwYXRoMi5kaXNwb3NlKCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDY6CQkvLyBkZWZhdWx0Ci0JCWdjLnNldENsaXBwaW5nKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlicmVhazsKLQl9Ci0JCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLSAgICBnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFhYWVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBwYXRocy4gSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUKLSAqIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsbGluZywgZHJhd2luZyBhbmQgY2xvc2luZyBwYXRocy4KLSAqLwotcHVibGljIGNsYXNzIFBhdGhUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlCdXR0b24gY29sb3JCdXR0b24sIGZpbGxCdXR0b24sIGRyYXdCdXR0b24sIGNsb3NlQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmaWxsQ29sb3I7Ci0JTWVudSBtZW51OwotCi1wdWJsaWMgUGF0aFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGgiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0aE9wZXIiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGhPcGVyRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQotCS8vIGNyZWF0ZSBkcmF3IGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCWRyYXdCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCWRyYXdCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyYXdQYXRoIikpOyAvLyROT04tTkxTLTEkCi0JZHJhd0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCWRyYXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQotCS8vIGNyZWF0ZSBmaWxsIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCWZpbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCWZpbGxCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxQYXRoIikpOyAvLyROT04tTkxTLTEkCi0JZmlsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBjbG9zZSBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlRPR0dMRSk7Ci0JY2xvc2VCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlUGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsb3NlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJZmlsbENvbG9yID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChncmVlbikKLQlmaWxsQ29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgzKS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbENvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZmlsbENvbG9yLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoZmlsbENvbG9yLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvci5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGZpbGxDb2xvci5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBmaWxsQ29sb3IuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCi0JZ2Muc2V0TGluZVdpZHRoKDUpOwotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQotCS8vIGFyYwotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRBcmMoKHdpZHRoLTI1MCkvMiwgKGhlaWdodC00MDApLzIsIDUwMCwgNDAwLCA5MCwgMTgwKTsKLQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHBhdGguY2xvc2UoKTsKLQlpZiAoZmlsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZmlsbFBhdGgocGF0aCk7Ci0JaWYgKGRyYXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCS8vIHNoYXBlIG9uIGxlZnQKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoLTI1MCkvNCwgaGVpZ2h0LzItMTUwKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygtMTUwLCAxMDAsIDE1MCwgMjAwLCAwLCAzMDApOwotCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcGF0aC5jbG9zZSgpOwotCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBnYy5maWxsUGF0aChwYXRoKTsKLQlpZiAoZHJhd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCQotCS8vIHNoYXBlIG9uIHJpZ2h0Ci0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5tb3ZlVG8oMyood2lkdGgtMjUwKS80IC0gMjUgKyAyNTAsIGhlaWdodC8yKTsKLQlwYXRoLmxpbmVUbygzKih3aWR0aC0yNTApLzQgKyA1MCArIDI1MCwgaGVpZ2h0LzIgLSAyMDApOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCArIDUwICsgMjUwLCBoZWlnaHQvMiArIDUwKTsKLQlwYXRoLmxpbmVUbygzKih3aWR0aC0yNTApLzQgLSAyNSArIDI1MCwgaGVpZ2h0LzIgKyAxNTApOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCArIDI1ICsgMjUwLCBoZWlnaHQvMiArIDUwKTsKLQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHBhdGguY2xvc2UoKTsKLQlpZiAoZmlsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZmlsbFBhdGgocGF0aCk7Ci0JaWYgKGRyYXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUkdCVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SR0JUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYjNlMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SR0JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBNaXNjZWxsYW5lb3VzIHRhYiB0aGF0IGRlbW9uc3RyYXRlcyBlbWVyZ2luZyBjb2xvcnMgZnJvbSBsYXllcmluZyBvdGhlcgotICogY29sb3JzLgotICovCi1wdWJsaWMgY2xhc3MgUkdCVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVk7Ci0JZmxvYXQgZGlhZ1RyYW5zbGF0ZVgxLCBkaWFnVHJhbnNsYXRlWDIsIGRpYWdUcmFuc2xhdGVZMSwgZGlhZ1RyYW5zbGF0ZVkyOwotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKiBAcGFyYW0gZXhhbXBsZSBBIEdyYXBoaWNzRXhhbXBsZQotICovCi1wdWJsaWMgUkdCVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZVkgPSAwOwotCWRpYWdUcmFuc2xhdGVYMSA9IGRpYWdUcmFuc2xhdGVYMiA9IGRpYWdUcmFuc2xhdGVZMSA9IGRpYWdUcmFuc2xhdGVZMiA9IDA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJyZ2IiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInJnYkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQW5pbWF0ZWRHcmFwaGljc1RhYiNuZXh0KGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQotCWZsb2F0IGggPSBoZWlnaHQ7Ci0JZmxvYXQgdyA9IHdpZHRoOwotCQotCXRyYW5zbGF0ZVggPSAodHJhbnNsYXRlWCszKSV3aWR0aDsKLQl0cmFuc2xhdGVZID0gKHRyYW5zbGF0ZVkrNSklaGVpZ2h0OwotCi0JZGlhZ1RyYW5zbGF0ZVgxID0gKGRpYWdUcmFuc2xhdGVYMSs2KSV3aWR0aDsKLQlkaWFnVHJhbnNsYXRlWTEgPSBkaWFnVHJhbnNsYXRlWDEqKGgvdyk7Ci0JCi0JZGlhZ1RyYW5zbGF0ZVgyID0gKGRpYWdUcmFuc2xhdGVYMis4KSV3aWR0aDsKLQlkaWFnVHJhbnNsYXRlWTIgPSAtZGlhZ1RyYW5zbGF0ZVgyKihoL3cpICsgaDsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBob3Jpem9udGFsIHJlY3RhbmdsZQotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgwLCB0cmFuc2xhdGVZKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIDUwKTsKLQlQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIDAsIDAsIHdpZHRoLCA1MCwgCi0JCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgMHg3ZiwKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JLy8gdmVydGljYWwgcmVjdGFuZ2xlCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUodHJhbnNsYXRlWCwgMCk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSgwLCAwLCA1MCwgaGVpZ2h0KTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCAwLCAwLCA1MCwgaGVpZ2h0LCAKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfQ1lBTiksIDB4N2YsCi0JCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JLy8gZGlhZ29uYWwgcmVjdGFuZ2xlIGZyb20gYm90dG9tIHJpZ2h0IGNvcm5lcgotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCA1MCwgaGVpZ2h0KTsKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC1kaWFnVHJhbnNsYXRlWDEsIChoZWlnaHQvMiktZGlhZ1RyYW5zbGF0ZVkxKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyIG9mIHJlY3RhbmdsZQotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKDQ1KTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKC1yZWN0LndpZHRoLzIsIC1yZWN0LmhlaWdodC8yKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTiksIDB4N2YsCi0JCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfTUFHRU5UQSksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCS8vIGRpYWdvbmFsIHJlY3RhbmdsZSBmcm9tIHRvcCByaWdodCBjb3JuZXIKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC1kaWFnVHJhbnNsYXRlWDIsIChoZWlnaHQvMiktZGlhZ1RyYW5zbGF0ZVkyKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyIG9mIHJlY3RhbmdsZQotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKC00NSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgtcmVjdC53aWR0aC8yLCAtcmVjdC5oZWlnaHQvMik7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfUkVEKSwgMHg3ZiwKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSwgMHg3Zik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JlZ2lvbkNsaXBwaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SZWdpb25DbGlwcGluZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUzNmYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JlZ2lvbkNsaXBwaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHJlZ2lvbiBjbGlwcGluZyBhbmQgdGhlIGVmZmVjdHMgb2YKLSAqIGFwcGx5aW5nIG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkNsaXBwaW5nVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCXByaXZhdGUgQ29tYm8gY2xpcHBpbmdDYjsKLQlwcml2YXRlIEJ1dHRvbiBjb2xvckJ1dHRvbjEsIGNvbG9yQnV0dG9uMjsKLQlwcml2YXRlIE1lbnUgbWVudTEsIG1lbnUyOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIGNvbG9yR0IxLCBjb2xvckdCMjsKLQotcHVibGljIFJlZ2lvbkNsaXBwaW5nVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVnaW9uQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbkNsaXBwaW5nRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51MSAhPSBudWxsKSB7Ci0JCW1lbnUxLmRpc3Bvc2UoKTsKLQkJbWVudTEgPSBudWxsOwotCX0KLQlpZiAobWVudTIgIT0gbnVsbCkgewotCQltZW51Mi5kaXNwb3NlKCk7Ci0JCW1lbnUyID0gbnVsbDsKLQl9Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbjEiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbjIiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFkZCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbnRlciIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2Iuc2VsZWN0KDApOwotCWNsaXBwaW5nQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JbWVudTEgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJY29sb3JHQjEgPSBnYjsJCQotCQkJY29sb3JCdXR0b24xLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQltZW51MiA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQljb2xvckdCMiA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGNvbG9yIHRvIGJsdWUKLQljb2xvckdCMSA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudTEuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gcmVkCi0JY29sb3JHQjIgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUyLmdldEl0ZW0oMikuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbiAxCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQljb2xvckJ1dHRvbjEgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbjEuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IxIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24xLnNldEltYWdlKGNvbG9yR0IxLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudTEuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudTEuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCi0JLy8gY29sb3IgYnV0dG9uIDIKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uMiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uMi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvcjIiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoY29sb3JHQjIuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51Mi5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51Mi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JLy8gYXJyYXkgb2YgY29vcmRpbmF0ZSBwb2ludHMgb2YgcG9seWdvbiAxIChyZWdpb24gMSkKLQlpbnQgW10gcG9seWdvbjEgPSBuZXcgaW50IFtdIHsxMCwgaGVpZ2h0LzIsIDkqd2lkdGgvMTYsIDEwLCA5KndpZHRoLzE2LCBoZWlnaHQtMTB9OwotCVJlZ2lvbiByZWdpb24xID0gbmV3IFJlZ2lvbihkZXZpY2UpOwotCXJlZ2lvbjEuYWRkKHBvbHlnb24xKTsKLQotCS8vIGFycmF5IG9mIGNvb3JkaW5hdGUgcG9pbnRzIG9mIHBvbHlnb24gMiAocmVnaW9uIDIpCi0JaW50IFtdIHBvbHlnb24yID0gbmV3IGludCBbXSB7Ci0JCQk5KndpZHRoLzE2LCAxMCwKLQkJCTkqd2lkdGgvMTYsIGhlaWdodC84LAotCQkJNyp3aWR0aC8xNiwgMipoZWlnaHQvOCwKLQkJCTkqd2lkdGgvMTYsIDMqaGVpZ2h0LzgsCi0JCQk3KndpZHRoLzE2LCA0KmhlaWdodC84LAotCQkJOSp3aWR0aC8xNiwgNSpoZWlnaHQvOCwKLQkJCTcqd2lkdGgvMTYsIDYqaGVpZ2h0LzgsCi0JCQk5KndpZHRoLzE2LCA3KmhlaWdodC84LAotCQkJOSp3aWR0aC8xNiwgaGVpZ2h0LTEwLAotCQkJd2lkdGgtMTAsIGhlaWdodC8yCi0JfTsKLQlSZWdpb24gcmVnaW9uMiA9IG5ldyBSZWdpb24oZGV2aWNlKTsKLQlyZWdpb24yLmFkZChwb2x5Z29uMik7Ci0JCi0JZ2Muc2V0QWxwaGEoMTI3KTsKLQkKLQlpbnQgY2xpcHBpbmdJbmRleCA9IGNsaXBwaW5nQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkKLQlzd2l0Y2ggKGNsaXBwaW5nSW5kZXgpIHsKLQljYXNlIDA6Ci0JCS8vIHJlZ2lvbiAxCi0JCWdjLnNldENsaXBwaW5nKHJlZ2lvbjEpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yR0IxLmdldEJnQ29sb3IxKCkpOwotCQlnYy5maWxsUG9seWdvbihwb2x5Z29uMSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLy8gcmVnaW9uIDIKLQkJZ2Muc2V0Q2xpcHBpbmcocmVnaW9uMik7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjIuZ2V0QmdDb2xvcjEoKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKHBvbHlnb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvLyBhZGQJCQotCQlyZWdpb24xLmFkZChyZWdpb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQkvLyBzdWIKLQkJcmVnaW9uMS5zdWJ0cmFjdChyZWdpb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQkvLyBpbnRlcnNlY3QKLQkJcmVnaW9uMS5pbnRlcnNlY3QocmVnaW9uMik7Ci0JCWJyZWFrOwkJCi0JfQotCQotCWlmIChjbGlwcGluZ0luZGV4ID4gMSkgewotCQlnYy5zZXRDbGlwcGluZyhyZWdpb24xKTsKLQkJCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjEuZ2V0QmdDb2xvcjEoKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKHBvbHlnb24xKTsKLQkJCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjIuZ2V0QmdDb2xvcjEoKSk7Ci0JICAgIGdjLmZpbGxQb2x5Z29uKHBvbHlnb24yKTsKLQl9Ci0JCi0JcmVnaW9uMS5kaXNwb3NlKCk7Ci0JcmVnaW9uMi5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU2hhcGVzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TaGFwZXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlYmNkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TaGFwZXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkcmF3cyAzRCBzaGFwZXMgKGluIDJEKSB1c2luZyB2YXJpb3VzIGxpbmUgc3R5bGVzLgotICovCi1wdWJsaWMgY2xhc3MgU2hhcGVzVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHVwRG93blZhbHVlOwotCWludCBpbmMgPSAxOwotCQotcHVibGljIFNoYXBlc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXVwRG93blZhbHVlID0gMDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaGFwZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNoYXBlc0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQl1cERvd25WYWx1ZSArPSBpbmM7Ci0KLQlpZiAodXBEb3duVmFsdWUgPiA1KSBpbmMgPSAtMTsKLQlpZiAodXBEb3duVmFsdWUgPCAtNSkgaW5jID0gMTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCWludCBzaXplID0gMTAwOwotCQotCWdjLnNldExpbmVXaWR0aCgyKTsKLQkKLQkvLyAtLS0tLSBjdWJlIC0tLS0tCi0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzQgLSBzaXplLCBoZWlnaHQvNCArIC11cERvd25WYWx1ZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0KLQkvLyBmaWxsIGluIGxlZnQgZmFjZQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHswLCAwLCBzaXplLzMsIC1zaXplLzIsIHNpemUvMywgc2l6ZS8yLCAwLCBzaXplfSk7Ci0JCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyBzcXVhcmUKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIHNpemUsIHNpemUpOwotCQotCS8vIG5leHQgMyBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKDAsIDAsIHNpemUvMywgLXNpemUvMik7CQkJLy8gbGVmdAotCWdjLmRyYXdMaW5lKHNpemUsIDAsIDQqc2l6ZS8zLCAtc2l6ZS8yKTsJLy8gbWlkZGxlCi0JZ2MuZHJhd0xpbmUoc2l6ZSwgc2l6ZSwgNCpzaXplLzMsIHNpemUvMik7CS8vIHJpZ2h0Ci0JCi0JLy8gMiBmdXJ0aGVzdCBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNCpzaXplLzMsIC1zaXplLzIpOyAgCS8vIGhvcml6b250YWwKLQlnYy5kcmF3TGluZSg0KnNpemUvMywgc2l6ZS8yLCA0KnNpemUvMywgLXNpemUvMik7CS8vIHZlcnRpY2FsCi0JCi0JLy8gMyBkb3R0ZWQgbGluZXMKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQlnYy5kcmF3TGluZSgwLCBzaXplLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoNCpzaXplLzMsIHNpemUvMiwgc2l6ZS8zLCBzaXplLzIpOwotCQotCS8vIGZpbGwgcmlnaHQgc2lkZSBvZiBjdWJlCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHtzaXplLCAwLCA0KnNpemUvMywgLXNpemUvMiwgNCpzaXplLzMsIHNpemUvMiwgc2l6ZSwgc2l6ZX0pOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gLS0tLS0gcHlyYW1pZCAtLS0tLQotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIgKyBzaXplLzIsIGhlaWdodC80ICsgc2l6ZSArIHVwRG93blZhbHVlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBmaWxsIGJhY2sgb2YgcHlyYW1pZAotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10ge3NpemUvMywgLXNpemUvMiwgNipzaXplLzEwLCAtNSpzaXplLzQsIDQqc2l6ZS8zLCAtc2l6ZS8yfSk7Ci0JCi0JLy8gZmlsbCBsZWZ0IHNpZGUgb2YgcHlyYW1pZAotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10gezAsIDAsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80LCBzaXplLzMsIC1zaXplLzJ9KTsKLQkKLQkvLyBzZWxlY3Qgc29saWQgbGluZSBzdHlsZQotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCi0JLy8gMiBzb2xpZCBsaW5lcyBvZiBiYXNlCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZSwgMCk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgNCpzaXplLzMsIC1zaXplLzIpOwotCQotCS8vIDMgc29saWQgbGluZXMgb2YgcHlyYW1pZAotCWdjLmRyYXdMaW5lKDAsIDAsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80KTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCA2KnNpemUvMTAsIC01KnNpemUvNCk7Ci0JZ2MuZHJhd0xpbmUoNCpzaXplLzMsIC1zaXplLzIsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80KTsKLQkKLQkvLyBzZWxlY3QgZG90IGxpbmUgc3R5bGUKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQkKLQkvLyAzIGRvdHRlZCBsaW5lcwotCWdjLmRyYXdMaW5lKDAsIDAsIHNpemUvMywgLXNpemUvMik7CQkJCQkvLyBsZWZ0IAotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNipzaXplLzEwLCAtNSpzaXplLzQpOyAvLyB0byB0b3Agb2YgcHlyYW1pZAotCWdjLmRyYXdMaW5lKDQqc2l6ZS8zLCAtc2l6ZS8yLCBzaXplLzMsIC1zaXplLzIpOwkvLyByaWdodAotCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyAtLS0tLSByZWN0YW5ndWxhciBwcmlzbSAtLS0tLQotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIgKyB1cERvd25WYWx1ZSwgaGVpZ2h0LzIgKyBzaXplKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBmaWxsIGJvdHRvbQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgc2l6ZSwgc2l6ZS8zLCBzaXplLzIsIDcqc2l6ZS8zLCBzaXplLzIsIDIqc2l6ZSwgc2l6ZX0pOwotCQotCS8vIHNlbGVjdCBzb2xpZCBsaW5lIHN0eWxlCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIDIqc2l6ZSwgc2l6ZSk7Ci0JCi0JLy8gbmV4dCAzIHNvbGlkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8zLCAtc2l6ZS8yKTsJCQkvLyBsZWZ0Ci0JZ2MuZHJhd0xpbmUoMipzaXplLCAwLCA3KnNpemUvMywgLXNpemUvMik7CS8vIG1pZGRsZQotCWdjLmRyYXdMaW5lKDIqc2l6ZSwgc2l6ZSwgNypzaXplLzMsIHNpemUvMik7CS8vIHJpZ2h0Ci0JCi0JLy8gMiBmdXJ0aGVzdCBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNypzaXplLzMsIC1zaXplLzIpOyAgCS8vIGhvcml6b250YWwKLQlnYy5kcmF3TGluZSg3KnNpemUvMywgc2l6ZS8yLCA3KnNpemUvMywgLXNpemUvMik7CS8vIHZlcnRpY2FsCi0JCi0JLy8gMyBkb3R0ZWQgbGluZXMKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVERPVCk7Ci0JZ2MuZHJhd0xpbmUoMCwgc2l6ZSwgc2l6ZS8zLCBzaXplLzIpOwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgc2l6ZS8zLCBzaXplLzIpOwotCWdjLmRyYXdMaW5lKDcqc2l6ZS8zLCBzaXplLzIsIHNpemUvMywgc2l6ZS8yKTsKLQkKLQkvLyBmaWxsIHRvcAotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgMCwgc2l6ZS8zLCAtc2l6ZS8yLCA3KnNpemUvMywgLXNpemUvMiwgMipzaXplLCAwfSk7Ci0KLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIC0tLS0tIHRyaWFuZ3VsYXIgc2hhcGUgLS0tLS0KLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC80IC0gc2l6ZSAtIHVwRG93blZhbHVlLCBoZWlnaHQvMiArIHNpemUgKyB1cERvd25WYWx1ZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JLy8gZmlsbCBiYWNrIG9mIHNoYXBlICh0b3AgbGVmdCkKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgMCwgc2l6ZS8yLCAtc2l6ZSwgc2l6ZS8yLCAtc2l6ZS8zfSk7Ci0KLQkvLyBmaWxsIGJhY2sgb2Ygc2hhcGUgKGJvdHRvbSByaWdodCkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHtzaXplLCAwLCBzaXplLzIsIHNpemUsIHNpemUvMiwgLXNpemUvM30pOwotCQotCS8vIHNlbGVjdCBzb2xpZCBsaW5lIHN0eWxlCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyBzb2xpZCBsaW5lcyBvZiBib3R0b20gdHJpYW5nbGUKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLzIsIHNpemUpOwotCWdjLmRyYXdMaW5lKHNpemUsIDAsIHNpemUvMiwgc2l6ZSk7Ci0JCi0JLy8gc29saWQgbGluZXMgb2YgdG9wIHRyaWFuZ2xlCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8yLCAtc2l6ZSk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgc2l6ZS8yLCAtc2l6ZSk7Ci0JCi0JLy8gc29saWQgbGluZXMgb24gdG9wCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8yLCAtc2l6ZS8zKTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCBzaXplLzIsIC1zaXplLzMpOwotCWdjLmRyYXdMaW5lKHNpemUvMiwgLXNpemUvMywgc2l6ZS8yLCBzaXplKTsKLQlnYy5kcmF3TGluZShzaXplLzIsIC1zaXplLzMsIHNpemUvMiwgLXNpemUpOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3BpcmFsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TcGlyYWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxMjJlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TcGlyYWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBwcmVzZW50cyBhIHNwaXJhbCBjb25zaXN0aW5nIG9mIHRoZSBudW1iZXIgb2YgcGV0YWxzIHNwZWNpZmllZC4KLSAqICovCi1wdWJsaWMgY2xhc3MgU3BpcmFsVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IGFuZ2xlOwkJCQkJLy8gYW5nbGUgYnkgd2hpY2ggdG8gcm90YXRlIHRoZSBwZXRhbHMKLQlTcGlubmVyIHBldGFsU3Bpbm5lcjsJCS8vIHNwaW5uZXIgdG8gY29udHJvbCBudW1iZXIgb2YgcGV0YWxzCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmb3JlZ3JvdW5kOwotCU1lbnUgbWVudTsKLQkKLXB1YmxpYyBTcGlyYWxUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQlhbmdsZSA9IC05MDsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzcGlubmVyIGZvciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgcGV0YWxzLiBUaGUgY2FsbCB0byB0aGUKLSAqIGNyZWF0ZUNvbnRyb2xQYW5lbCBtZXRob2QgaW4gdGhlIHN1cGVyIGNsYXNzIGNyZWF0ZSB0aGUgY29udHJvbHMgdGhhdCBhcmUKLSAqIGRlZmluZWQgaW4gdGhlIHN1cGVyIGNsYXNzLgotICogCi0gKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIAotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQkKLQkvLyBjcmVhdGUgc3Bpbm5lciBudW1iZXIgb2YgcGV0YWxzCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlBldGFscyIpKTsgLy8kTk9OLU5MUy0xJAotCXBldGFsU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JcGV0YWxTcGlubmVyLnNldFNlbGVjdGlvbig4KTsKLQlwZXRhbFNwaW5uZXIuc2V0TWluaW11bSgzKTsKLQlwZXRhbFNwaW5uZXIuc2V0TWF4aW11bSgyMCk7Ci0JcGV0YWxTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmb3JlZ3JvdW5kID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDJuZCBpdGVtIGluIHRoZSBtZW51Ci0JZm9yZWdyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDEpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNwaXJhbCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3BpcmFsRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI2dldEFuaW1hdGlvblRpbWUoKQotICovCi1wdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCXJldHVybiAxNTA7CQotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKGFuZ2xlID09IDI3MCkgewotCQlhbmdsZSA9IC05MDsKLQl9Ci0JYW5nbGUgKz0gMTA7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JLy8gc2V0IGxpbmUgYXR0cmlidXRlcwotCWdjLnNldExpbmVXaWR0aCgyMCk7Ci0JZ2Muc2V0TGluZUNhcChTV1QuQ0FQX1JPVU5EKTsJLy8gcm91bmQgbGluZSBlbmRzCi0JZ2Muc2V0QW50aWFsaWFzKFNXVC5PTik7CS8vIHNtb290aCBqYWdnZWQgZWRnZXMKLQkKLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChmb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCi0JLy8gZHJhdyBwZXRhbHMgZm9yIHRoZSBzcGlyYWwKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWludCBuID0gcGV0YWxTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCWZvciAoaW50IGk9MDsgaSA8IG47IGkrKykgewotCQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiwgaGVpZ2h0LzIpOwotCQl0cmFuc2Zvcm0ucm90YXRlKC0oYW5nbGUgKyAzNjAvbiAqIGkpKTsKLQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCWdjLmRyYXdBcmMoMCwgMCwgd2lkdGgvMywgaGVpZ2h0LzYsIDAsIDE4MCk7Ci0JCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JfQotCQotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1N0YXJQb2x5VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2U0MjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU3RhclBvbHlUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JaW50W10gcmFkaWFsOwotCXN0YXRpYyBmaW5hbCBpbnQgUE9JTlRTICA9IDExOwotCQotCUNvbWJvIGZpbGxSdWxlQ2I7Ci0KLXB1YmxpYyBTdGFyUG9seVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXJhZGlhbCA9IG5ldyBpbnRbUE9JTlRTICogMl07Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsUnVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZpbGxSdWxlQ2IgPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOKTsKLQlmaWxsUnVsZUNiLmFkZCgiRklMTF9FVkVOX09ERCIpOwotCWZpbGxSdWxlQ2IuYWRkKCJGSUxMX1dJTkRJTkciKTsKLQlmaWxsUnVsZUNiLnNlbGVjdCgwKTsKLQlmaWxsUnVsZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUG9seWdvbnMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3RhclBvbHlnb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXJQb2x5Z29uRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgaW50IGNlbnRlclggPSB3aWR0aCAvIDI7Ci0gICAgaW50IGNlbnRlclkgPSBoZWlnaHQgLyAyOwotICAgIGludCBwb3MgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9JTlRTOyArK2kpIHsKLSAgICAgICAgZG91YmxlIHIgPSBNYXRoLlBJKjIgKiBwb3MvUE9JTlRTOwotICAgICAgICByYWRpYWxbaSoyXSA9IChpbnQpKCgxK01hdGguY29zKHIpKSpjZW50ZXJYKTsKLSAgICAgICAgcmFkaWFsW2kqMisxXSA9IChpbnQpKCgxK01hdGguc2luKHIpKSpjZW50ZXJZKTsKLSAgICAgICAgcG9zID0gKHBvcyArIFBPSU5UUy8yKSAlIFBPSU5UUzsKLSAgICB9Ci0JZ2Muc2V0RmlsbFJ1bGUoZmlsbFJ1bGVDYi5nZXRTZWxlY3Rpb25JbmRleCgpICE9IDAgPyBTV1QuRklMTF9XSU5ESU5HIDogU1dULkZJTExfRVZFTl9PREQpOwotCWdjLnNldEJhY2tncm91bmQoZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgZ2MuZmlsbFBvbHlnb24ocmFkaWFsKTsKLSAgICBnYy5kcmF3UG9seWdvbihyYWRpYWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQ5MGQzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1RleHRBbnRpYWxpYXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciB0ZXh0LiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3IKLSAqIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCi0gKiBlZmZlY3RzIG9mIGRpZmZlcmVudCBhbnRpYWxpYXNpbmcgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFudGlhbGlhc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUNvbWJvIGFsaWFzQ29tYm87Ci0Jc3RhdGljIGludFtdIGFsaWFzVmFsdWVzID0geyBTV1QuT0ZGLCBTV1QuREVGQVVMVCwgU1dULk9OIH07Ci0JCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCU1lbnUgbWVudTsKLQlHcmFwaGljc0JhY2tncm91bmQgdGV4dENvbG9yOwotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQotCQotcHVibGljIFRleHRBbnRpYWxpYXNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dCIpOyAvLyROT04tTkxTLTEkIAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZ1RleHREZXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlDb21wb3NpdGUgY29tcDsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBhbnRpYWxpYXNpbmcKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQlhbGlhc0NvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWFsaWFzQ29tYm8uYWRkKCJPRkYiKTsKLQlhbGlhc0NvbWJvLmFkZCgiREVGQVVMVCIpOwotCWFsaWFzQ29tYm8uYWRkKCJPTiIpOwotCWFsaWFzQ29tYm8uc2VsZWN0KDApOwotCWFsaWFzQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkJCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQl0ZXh0Q29sb3IgPSBnYjsKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gYmxhY2sKLQl0ZXh0Q29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgxKS5nZXREYXRhKCk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZSh0ZXh0Q29sb3IuZ2V0VGh1bWJOYWlsKCkpOwotCQotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JaWYgKHRleHRDb2xvciAhPSBudWxsICYmIHRleHRDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpCi0JCWdjLnNldEZvcmVncm91bmQodGV4dENvbG9yLmdldEJnQ29sb3IxKCkpOwotCi0JZ2Muc2V0VGV4dEFudGlhbGlhcyhhbGlhc1ZhbHVlc1thbGlhc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQotCS8vIGNvbHVtbiAxLCByb3cgMQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSgwKSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCB3aWR0aC80IC0gc2l6ZS54LzIsIGhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAxLCByb3cgMgotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMSksIDEwMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgd2lkdGgvNCAtIHNpemUueC8yLCAzKmhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAyLCByb3cgMQotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMiksIDUwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCAwLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDIKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDMpLCAxMDAsIFNXVC5JVEFMSUMpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIChoZWlnaHQtc2l6ZS55KS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDMKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDQpLCA1MCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgaGVpZ2h0LXNpemUueSwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAxCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg1KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgaGVpZ2h0LzQgLSBzaXplLnkvMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAyCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg2KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgMypoZWlnaHQvNCAtIHNpemUueS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKiAKLSAqIEBwYXJhbSBpbmRleAotICogICAgICAgICAgICBpbmRleCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZm9udCBmYWNlCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250RmFjZShpbnQgaW5kZXgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiIHx8IFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3cGYiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQm9va21hbiBPbGQgU3R5bGUiLCAiQ2VudHVyeSBHb3RoaWMiLCAiQ29taWMgU2FucyBNUyIsICJJbXBhY3QiLCAiR2FyYW1vbmQiLCAiTHVjaWRhIENvbnNvbGUiLCAiTW9ub3R5cGUgQ29yc2l2YSJ9IFtpbmRleF07CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7InVydyBwYWxsYWRpbyBsIiwgIkNvdXJpZXIiLCAicXViIiwgIlVSVyBHb3RoaWMgTCIsICJUaW1lcyIsICJMdWNpZGEiLCAiVVJXIENoYW5jZXJ5TCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ikx1eGkgTW9ubyIsICJLYWNzdFRpdGxlTCIsICJCYWVrbXVrIEJhdGFuZyIsICJCYWVrbXVrIEhlYWRsaW5lIiwgIkthY3N0RmFyc2kiLCAiQmFla211ayBHdWxpbSIsICJVUlcgQ2hhbmNlcnkgTCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFwcGxlIENoYW5jZXJ5IiwgIkJydXNoIFNjcmlwdCBNVCIsICJDb21pYyBTYW5zIE1TIiwgIkltcGFjdCIsICJIZXJjdWxhbnVtIiwgIkx1Y2lkYSBHcmFuZGUiLCAiUGFweXJ1cyJ9IFtpbmRleF07Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQ291cmllciIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSJ9IFtpbmRleF07Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVlYTMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9jbHViLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMTNmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfZGlhbW9uZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfaGVhcnRzLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzMWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9zcGFkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDkxMTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzEucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDEwZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hbHBoYV9pbWcyLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIwMjE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYmFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNDE1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2N1YmUucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmE0YTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTNkOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZGIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZm9udC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzODk0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hlbHAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzJlOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hvdXNlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTgxNGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9pcm1hb3MuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzUyY2RlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9tYXplLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg3ZTc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvbmV4dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmOGMzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmU1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9vdmFscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmE3ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg5ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMDZhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWUzZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF1c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGxheS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNGUyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3N3YXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3d0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OWI1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvdGFzay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkMTBmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM5OGRjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkCi0gKiB0byBvcGVuIGFuIFNXVCBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMSAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIwYzhjOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCAKLSAqIG9mIGNvZGUgcmVxdWlyZWQgdG8gb3BlbiBhbiBTV1QgU2hlbGwgd2l0aCBhIExhYmVsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQyICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0IChyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIikpOwotCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNjFhZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgCi0gKiBMYWJlbCB3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGlzdGVuZXIgbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDMgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMyAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlsYWJlbC5wYWNrKCk7Ci0Jc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwNGY0NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSAKLSAqIExhYmVsIHdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ0ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzYxMTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLSAqIG9uIGFuIFNXVCBDb250cm9sLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ1ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlmaW5hbCBDb2xvciByZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhGRiwgMCwgMCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCl7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCArIDEwLCByZWN0LnkgKyAxMCwgcmVjdC53aWR0aCAtIDIwLCByZWN0LmhlaWdodCAtIDIwKTsKLQkJCWdjLmRyYXdTdHJpbmcocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpLCByZWN0LnggKyAyMCwgcmVjdC55ICsgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyIChuZXcgRGlzcG9zZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQgKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQlyZWQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZjdiM2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0vKioKLSAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBob3ZlciBoZWxwIGZlZWRiYWNrCi0gKiB1c2luZyB0aGUgTW91c2VUcmFja0xpc3RlbmVyLgotICovCi1wdWJsaWMgY2xhc3MgSG92ZXJIZWxwIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaG92ZXJoZWxwIik7Ci0JCi0Jc3RhdGljIGZpbmFsIGludAotCQloaGlJbmZvcm1hdGlvbiA9IDAsCi0JCWhoaVdhcm5pbmcgPSAxOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImluZm9ybWF0aW9uLmdpZiIsCi0JCSJ3YXJuaW5nLmdpZiIKLQl9OwotCUltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogUnVucyBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IEhvdmVySGVscCgpLm9wZW4oZGlzcGxheSk7Ci0JCS8vIEV2ZW50IGxvb3AKLQkJd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQkvLyBDbGVhbnVwCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCi0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7CQkKLQkJLy8gTG9hZCB0aGUgaW1hZ2VzCi0JCUNsYXNzIGNsYXp6ID0gSG92ZXJIZWxwLmNsYXNzOwotCQl0cnkgewotCQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIsCi0JCQkJbmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJY3JlYXRlUGFydENvbnRyb2woc2hlbGwpOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJLyogRnJlZSByZXNvdXJjZXMgKi8KLQkJCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlpbWFnZXMgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJZmluYWwgVG9vbFRpcEhhbmRsZXIgdG9vbHRpcCA9IG5ldyBUb29sVGlwSGFuZGxlcihmcmFtZS5nZXRTaGVsbCgpKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlmcmFtZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NTsgaSsrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUb29sSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSEVMUFRFWFRIQU5ETEVSIiwgbmV3IFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KSB7Ci0JCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZygiVG9vbEl0ZW0uaGVscCIsIG5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKGJhcik7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKGZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSXRlbSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9JTUFHRSIsIGltYWdlc1toaGlJbmZvcm1hdGlvbl0pOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiVGFibGVJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUYWJsZUl0ZW0udG9vbHRpcCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0hFTFBURVhUSEFORExFUiIsIG5ldyBUb29sVGlwSGVscFRleHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKHRhYmxlKTsKLQkKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUgKGZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSXRlbSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9JTUFHRSIsIGltYWdlc1toaGlXYXJuaW5nXSk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS50ZXh0IiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiVHJlZUl0ZW0udG9vbHRpcCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0hFTFBURVhUSEFORExFUiIsIG5ldyBUb29sVGlwSGVscFRleHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVJdGVtLmhlbHAiLCBuZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscCh0cmVlKTsKLQkKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGZyYW1lLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSGVsbG8udGV4dCIpKTsKLQkJYnV0dG9uLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJIZWxsby50b29sdGlwIikpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKGJ1dHRvbik7Ci0JfQotCi0JLyoqCi0JICogRW11bGF0ZWQgdG9vbHRpcCBoYW5kbGVyCi0JICogTm90aWNlIHRoYXQgd2UgY291bGQgZGlzcGxheSBhbnl0aGluZyBpbiBhIHRvb2x0aXAgYmVzaWRlcyB0ZXh0IGFuZCBpbWFnZXMuCi0JICogRm9yIGluc3RhbmNlLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGVtYmVkIGxhcmdlIHRhYmxlcyBvZiBkYXRhIG9yIGJ1dHRvbnMgbGlua2luZwotCSAqIGRhdGEgdW5kZXIgaW5zcGVjdGlvbiB0byBtYXRlcmlhbCBlbHNld2hlcmUsIG9yIHBlcmZvcm0gZHluYW1pYyBsb29rdXAgZm9yIGNyZWF0aW5nCi0JICogdG9vbHRpcCB0ZXh0IG9uIHRoZSBmbHkuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUb29sVGlwSGFuZGxlciB7Ci0JCXByaXZhdGUgU2hlbGwgIHBhcmVudFNoZWxsOwotCQlwcml2YXRlIFNoZWxsICB0aXBTaGVsbDsKLQkJcHJpdmF0ZSBMYWJlbCAgdGlwTGFiZWxJbWFnZSwgdGlwTGFiZWxUZXh0OwotCQlwcml2YXRlIFdpZGdldCB0aXBXaWRnZXQ7IC8vIHdpZGdldCB0aGlzIHRvb2x0aXAgaXMgaG92ZXJpbmcgb3ZlcgotCQlwcml2YXRlIFBvaW50ICB0aXBQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIGJlaW5nIGhvdmVyZWQgb3ZlcgotCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyB0b29sdGlwIGhhbmRsZXIKLQkJICoKLQkJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IFNoZWxsCi0JCSAqLwkKLQkJcHVibGljIFRvb2xUaXBIYW5kbGVyKFNoZWxsIHBhcmVudCkgewotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCXRoaXMucGFyZW50U2hlbGwgPSBwYXJlbnQ7Ci0JCi0JCQl0aXBTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5PTl9UT1AgfCBTV1QuVE9PTCk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQkJdGlwU2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQotCQkJdGlwU2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQotCQkJdGlwTGFiZWxJbWFnZSA9IG5ldyBMYWJlbCh0aXBTaGVsbCwgU1dULk5PTkUpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQotCQkJdGlwTGFiZWxUZXh0ID0gbmV3IExhYmVsKHRpcFNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0aXBMYWJlbFRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCXRpcExhYmVsVGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJdGlwTGFiZWxUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8Ci0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEVuYWJsZXMgY3VzdG9taXplZCBob3ZlciBoZWxwIGZvciBhIHNwZWNpZmllZCBjb250cm9sCi0JCSAqIAotCQkgKiBAY29udHJvbCB0aGUgY29udHJvbCBvbiB3aGljaCB0byBlbmFibGUgaG92ZXJoZWxwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZUhvdmVySGVscChmaW5hbCBDb250cm9sIGNvbnRyb2wpIHsKLQkJCS8qCi0JCQkgKiBHZXQgb3V0IG9mIHRoZSB3YXkgaWYgd2UgYXR0ZW1wdCB0byBhY3RpdmF0ZSB0aGUgY29udHJvbCB1bmRlcm5lYXRoIHRoZSB0b29sdGlwCi0JCQkgKi8KLQkJCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24gKE1vdXNlRXZlbnQgZSkgewotCQkJCQlpZiAodGlwU2hlbGwuaXNWaXNpYmxlKCkpIHRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0JCi0JCQl9KTsKLQkKLQkJCS8qCi0JCQkgKiBUcmFwIGhvdmVyIGV2ZW50cyB0byBwb3AtdXAgdG9vbHRpcAotCQkJICovCi0JCQljb250cm9sLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJdGlwV2lkZ2V0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgbW91c2VIb3ZlciAoTW91c2VFdmVudCBldmVudCkgewotCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVdpZGdldCB3aWRnZXQgPSBldmVudC53aWRnZXQ7Ci0JCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUb29sQmFyKSB7Ci0JCQkJCQlUb29sQmFyIHcgPSAoVG9vbEJhcikgd2lkZ2V0OwotCQkJCQkJd2lkZ2V0ID0gdy5nZXRJdGVtIChwdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKSB7Ci0JCQkJCQlUYWJsZSB3ID0gKFRhYmxlKSB3aWRnZXQ7Ci0JCQkJCQl3aWRnZXQgPSB3LmdldEl0ZW0gKHB0KTsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkgewotCQkJCQkJVHJlZSB3ID0gKFRyZWUpIHdpZGdldDsKLQkJCQkJCXdpZGdldCA9IHcuZ2V0SXRlbSAocHQpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgPT0gbnVsbCkgewotCQkJCQkJdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQl0aXBXaWRnZXQgPSBudWxsOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgPT0gdGlwV2lkZ2V0KSByZXR1cm47Ci0JCQkJCXRpcFdpZGdldCA9IHdpZGdldDsKLQkJCQkJdGlwUG9zaXRpb24gPSBjb250cm9sLnRvRGlzcGxheShwdCk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgd2lkZ2V0LmdldERhdGEoIlRJUF9URVhUIik7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSB3aWRnZXQuZ2V0RGF0YSgiVElQX0lNQUdFIik7Ci0JCQkJCXRpcExhYmVsVGV4dC5zZXRUZXh0KHRleHQgIT0gbnVsbCA/IHRleHQgOiAiIik7Ci0JCQkJCXRpcExhYmVsSW1hZ2Uuc2V0SW1hZ2UoaW1hZ2UpOyAvLyBhY2NlcHRzIG51bGwKLQkJCQkJdGlwU2hlbGwucGFjaygpOwotCQkJCQlzZXRIb3ZlckxvY2F0aW9uKHRpcFNoZWxsLCB0aXBQb3NpdGlvbik7Ci0JCQkJCXRpcFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCi0JCQkvKgotCQkJICogVHJhcCBGMSBIZWxwIHRvIHBvcCB1cCBhIGN1c3RvbSBoZWxwIGJveAotCQkJICovCi0JCQljb250cm9sLmFkZEhlbHBMaXN0ZW5lcihuZXcgSGVscExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBldmVudCkgewotCQkJCQlpZiAodGlwV2lkZ2V0ID09IG51bGwpIHJldHVybjsKLQkJCQkJVG9vbFRpcEhlbHBUZXh0SGFuZGxlciBoYW5kbGVyID0gKFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIpCi0JCQkJCQl0aXBXaWRnZXQuZ2V0RGF0YSgiVElQX0hFTFBURVhUSEFORExFUiIpOwotCQkJCQlpZiAoaGFuZGxlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVN0cmluZyB0ZXh0ID0gaGFuZGxlci5nZXRIZWxwVGV4dCh0aXBXaWRnZXQpOwotCQkJCQlpZiAodGV4dCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCQotCQkJCQlpZiAodGlwU2hlbGwuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJU2hlbGwgaGVscFNoZWxsID0gbmV3IFNoZWxsKHBhcmVudFNoZWxsLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQkJCQloZWxwU2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaGVscFNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJCQkJaGVscFNoZWxsLnBhY2soKTsKLQkJCQkJCXNldEhvdmVyTG9jYXRpb24oaGVscFNoZWxsLCB0aXBQb3NpdGlvbik7Ci0JCQkJCQloZWxwU2hlbGwub3BlbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgYSBob3ZlcmluZyBzaGVsbAotCQkgKiBAcGFyYW0gc2hlbGwgdGhlIG9iamVjdCB0aGF0IGlzIHRvIGhvdmVyCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgYSB3aWRnZXQgdG8gaG92ZXIgb3ZlcgotCQkgKiBAcmV0dXJuIHRoZSB0b3AtbGVmdCBsb2NhdGlvbiBmb3IgYSBob3ZlcmluZyBib3gKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRIb3ZlckxvY2F0aW9uKFNoZWxsIHNoZWxsLCBQb2ludCBwb3NpdGlvbikgewotCQkJUmVjdGFuZ2xlIGRpc3BsYXlCb3VuZHMgPSBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgc2hlbGxCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCXNoZWxsQm91bmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvbi54LCBkaXNwbGF5Qm91bmRzLndpZHRoIC0gc2hlbGxCb3VuZHMud2lkdGgpLCAwKTsKLQkJCXNoZWxsQm91bmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvbi55ICsgMTYsIGRpc3BsYXlCb3VuZHMuaGVpZ2h0IC0gc2hlbGxCb3VuZHMuaGVpZ2h0KSwgMCk7Ci0JCQlzaGVsbC5zZXRCb3VuZHMoc2hlbGxCb3VuZHMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRvb2xUaXAgaGVscCBoYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIGludGVyZmFjZSBUb29sVGlwSGVscFRleHRIYW5kbGVyIHsKLQkJLyoqCi0JCSAqIEdldCBoZWxwIHRleHQKLQkJICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0IHRoYXQgaXMgdW5kZXIgaGVscAotCQkgKiBAcmV0dXJuIGEgaGVscCB0ZXh0IHN0cmluZwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL2luZm9ybWF0aW9uLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2Yzc0NzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL2luZm9ybWF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC93YXJuaW5nLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC93YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y0ZmRmOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjZiZmIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZUFuYWx5emVyIHsKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19pbWFnZXMiKTsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JQ2FudmFzIGltYWdlQ2FudmFzLCBwYWxldHRlQ2FudmFzOwotCUxhYmVsIHR5cGVMYWJlbCwgc2l6ZUxhYmVsLCBkZXB0aExhYmVsLCB0cmFuc3BhcmVudFBpeGVsTGFiZWwsCi0JCXRpbWVUb0xvYWRMYWJlbCwgc2NyZWVuU2l6ZUxhYmVsLCBiYWNrZ3JvdW5kUGl4ZWxMYWJlbCwKLQkJbG9jYXRpb25MYWJlbCwgZGlzcG9zYWxNZXRob2RMYWJlbCwgZGVsYXlUaW1lTGFiZWwsCi0JCXJlcGVhdENvdW50TGFiZWwsIHBhbGV0dGVMYWJlbCwgZGF0YUxhYmVsLCBzdGF0dXNMYWJlbDsKLQlDb21ibyBiYWNrZ3JvdW5kQ29tYm8sIHNjYWxlWENvbWJvLCBzY2FsZVlDb21ibywgYWxwaGFDb21ibzsKLQlCdXR0b24gaW5jcmVtZW50YWxDaGVjaywgdHJhbnNwYXJlbnRDaGVjaywgbWFza0NoZWNrLCBiYWNrZ3JvdW5kQ2hlY2s7Ci0JQnV0dG9uIHByZXZpb3VzQnV0dG9uLCBuZXh0QnV0dG9uLCBhbmltYXRlQnV0dG9uOwotCVN0eWxlZFRleHQgZGF0YVRleHQ7Ci0JU2FzaCBzYXNoOwotCUNvbG9yIHdoaXRlQ29sb3IsIGJsYWNrQ29sb3IsIHJlZENvbG9yLCBncmVlbkNvbG9yLCBibHVlQ29sb3IsIGNhbnZhc0JhY2tncm91bmQ7Ci0JRm9udCBmaXhlZFdpZHRoRm9udDsKLQlDdXJzb3IgY3Jvc3NDdXJzb3I7Ci0JR0MgaW1hZ2VDYW52YXNHQzsKLQkKLQlpbnQgcGFsZXR0ZVdpZHRoID0gMTQwOyAvLyByZWNhbGN1bGF0ZWQgYW5kIHVzZWQgYXMgYSB3aWR0aCBoaW50Ci0JaW50IGl4ID0gMCwgaXkgPSAwLCBweSA9IDA7IC8vIHVzZWQgdG8gc2Nyb2xsIHRoZSBpbWFnZSBhbmQgcGFsZXR0ZQotCWZsb2F0IHhzY2FsZSA9IDEsIHlzY2FsZSA9IDE7IC8vIHVzZWQgdG8gc2NhbGUgdGhlIGltYWdlCi0JaW50IGFscGhhID0gMjU1OyAvLyB1c2VkIHRvIG1vZGlmeSB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGltYWdlCi0JYm9vbGVhbiBpbmNyZW1lbnRhbCA9IGZhbHNlOyAvLyB1c2VkIHRvIGluY3JlbWVudGFsbHkgZGlzcGxheSBhbiBpbWFnZQotCWJvb2xlYW4gdHJhbnNwYXJlbnQgPSB0cnVlOyAvLyB1c2VkIHRvIGRpc3BsYXkgYW4gaW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kKLQlib29sZWFuIHNob3dNYXNrID0gZmFsc2U7IC8vIHVzZWQgdG8gZGlzcGxheSBhbiBpY29uIG1hc2sgb3IgdHJhbnNwYXJlbnQgaW1hZ2UgbWFzawotCWJvb2xlYW4gc2hvd0JhY2tncm91bmQgPSBmYWxzZTsgLy8gdXNlZCB0byBkaXNwbGF5IHRoZSBiYWNrZ3JvdW5kIG9mIGFuIGFuaW1hdGVkIGltYWdlCi0JYm9vbGVhbiBhbmltYXRlID0gZmFsc2U7IC8vIHVzZWQgdG8gYW5pbWF0ZSBhIG11bHRpLWltYWdlIGZpbGUKLQlUaHJlYWQgYW5pbWF0ZVRocmVhZDsgLy8gZHJhd3MgYW5pbWF0ZWQgaW1hZ2VzCi0JVGhyZWFkIGluY3JlbWVudGFsVGhyZWFkOyAvLyBkcmF3cyBpbmNyZW1lbnRhbCBpbWFnZXMKLQlTdHJpbmcgbGFzdFBhdGg7IC8vIHVzZWQgdG8gc2VlZCB0aGUgZmlsZSBkaWFsb2cKLQlTdHJpbmcgY3VycmVudE5hbWU7IC8vIHRoZSBjdXJyZW50IGltYWdlIGZpbGUgb3IgVVJMIG5hbWUKLQlTdHJpbmcgZmlsZU5hbWU7IC8vIHRoZSBjdXJyZW50IGltYWdlIGZpbGUKLQlJbWFnZUxvYWRlciBsb2FkZXI7IC8vIHRoZSBsb2FkZXIgZm9yIHRoZSBjdXJyZW50IGltYWdlIGZpbGUKLQlJbWFnZURhdGFbXSBpbWFnZURhdGFBcnJheTsgLy8gYWxsIGltYWdlIGRhdGEgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUKLQlpbnQgaW1hZ2VEYXRhSW5kZXg7IC8vIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBpbWFnZSBkYXRhCi0JSW1hZ2VEYXRhIGltYWdlRGF0YTsgLy8gdGhlIGN1cnJlbnRseS1kaXNwbGF5ZWQgaW1hZ2UgZGF0YQotCUltYWdlIGltYWdlOyAvLyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZQotCVZlY3RvciBpbmNyZW1lbnRhbEV2ZW50czsgLy8gaW5jcmVtZW50YWwgaW1hZ2UgZXZlbnRzCi0JbG9uZyBsb2FkVGltZSA9IDA7IC8vIHRoZSB0aW1lIGl0IHRvb2sgdG8gbG9hZCB0aGUgY3VycmVudCBpbWFnZQotCQotCXN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRElHSVRTID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX0NIQVJTID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX0NPTlNUQU5UID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX1ggPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfWSA9IDI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRU5fRklMVEVSX0VYVEVOU0lPTlMgPSBuZXcgU3RyaW5nW10gewotCQkJIiouYm1wOyAqLmdpZjsgKi5pY287ICouamZpZjsgKi5qcGVnOyAqLmpwZzsgKi5wbmc7ICoudGlmOyAqLnRpZmYiLAotCQkJIiouYm1wIiwgIiouZ2lmIiwgIiouaWNvIiwgIiouanBnOyAqLmpwZWc7ICouamZpZiIsICIqLnBuZyIsICIqLnRpZjsgKi50aWZmIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVOX0ZJTFRFUl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlidW5kbGUuZ2V0U3RyaW5nKCJBbGxfaW1hZ2VzIikgKyAiIChibXAsIGdpZiwgaWNvLCBqZmlmLCBqcGVnLCBqcGcsIHBuZywgdGlmLCB0aWZmKSIsCi0JCQkiQk1QICgqLmJtcCkiLCAiR0lGICgqLmdpZikiLCAiSUNPICgqLmljbykiLCAiSlBFRyAoKi5qcGcsICouanBlZywgKi5qZmlmKSIsCi0JCQkiUE5HICgqLnBuZykiLCAiVElGRiAoKi50aWYsICoudGlmZikiIH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNBVkVfRklMVEVSX0VYVEVOU0lPTlMgPSBuZXcgU3RyaW5nW10gewotCQkJIiouYm1wIiwgIiouZ2lmIiwgIiouaWNvIiwgIiouanBnIiwgIioucG5nIiwgIioudGlmIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTQVZFX0ZJTFRFUl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiQk1QICgqLmJtcCkiLCAiR0lGICgqLmdpZikiLCAiSUNPICgqLmljbykiLCAiSlBFRyAoKi5qcGcpIiwKLQkJCSJQTkcgKCoucG5nKSIsICJUSUZGICgqLnRpZikiIH07Ci0KLQljbGFzcyBUZXh0UHJvbXB0ZXIgZXh0ZW5kcyBEaWFsb2cgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU2hlbGwgZGlhbG9nOwotCQlUZXh0IHRleHQ7Ci0JCXB1YmxpYyBUZXh0UHJvbXB0ZXIgKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlciAocGFyZW50LCBzdHlsZSk7Ci0JCX0KLQkJcHVibGljIFRleHRQcm9tcHRlciAoU2hlbGwgcGFyZW50KSB7Ci0JCQl0aGlzIChwYXJlbnQsIFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICgpIHsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UgKFN0cmluZyBzdHJpbmcpIHsKLQkJCW1lc3NhZ2UgPSBzdHJpbmc7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBvcGVuICgpIHsKLQkJCWRpYWxvZyA9IG5ldyBTaGVsbChnZXRQYXJlbnQoKSwgZ2V0U3R5bGUoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChnZXRUZXh0KCkpOwotCQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJdGV4dCA9IG5ldyBUZXh0KGRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGdyaWQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JpZC5udW1Db2x1bW5zID0gMjsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0KGdyaWQpOwotCQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQlvay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9LIikpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJCW9rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlc3VsdCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCQlkaWFsb2cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJY2FuY2VsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQ2FuY2VsIikpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJCWNhbmNlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uKG9rKTsKLQkJCWRpYWxvZy5wYWNrKCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJSW1hZ2VBbmFseXplciBpbWFnZUFuYWx5emVyID0gbmV3IEltYWdlQW5hbHl6ZXIoKTsKLQkJU2hlbGwgc2hlbGwgPSBpbWFnZUFuYWx5emVyLm9wZW4oZGlzcGxheSk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRweSkgewotCQkvLyBDcmVhdGUgYSB3aW5kb3cgYW5kIHNldCBpdHMgdGl0bGUuCi0JCXRoaXMuZGlzcGxheSA9IGRweTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiSW1hZ2VfYW5hbHl6ZXIiKSk7Ci0JCQotCQkvLyBIb29rIHJlc2l6ZSBhbmQgZGlzcG9zZSBsaXN0ZW5lcnMuCi0JCXNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXNpemVTaGVsbChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQkJCWlmIChhbmltYXRlVGhyZWFkICE9IG51bGwpIHsKLQkJCQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBkaWUgYmVmb3JlIGRpc3Bvc2luZyB0aGUgc2hlbGwuCi0JCQkJCXdoaWxlIChhbmltYXRlVGhyZWFkLmlzQWxpdmUoKSkgewotCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkvLyBDbGVhbiB1cC4KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCXdoaXRlQ29sb3IuZGlzcG9zZSgpOwotCQkJCWJsYWNrQ29sb3IuZGlzcG9zZSgpOwotCQkJCXJlZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlncmVlbkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlibHVlQ29sb3IuZGlzcG9zZSgpOwotCQkJCWZpeGVkV2lkdGhGb250LmRpc3Bvc2UoKTsKLQkJCQljcm9zc0N1cnNvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSBjb2xvcnMgYW5kIGZvbnRzLgotCQl3aGl0ZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCQlibGFja0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCQlyZWRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQlncmVlbkNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDI1NSwgMCk7Ci0JCWJsdWVDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCQlmaXhlZFdpZHRoRm9udCA9IG5ldyBGb250KGRpc3BsYXksICJjb3VyaWVyIiwgMTAsIDApOwotCQljcm9zc0N1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9DUk9TUyk7Ci0JCQotCQkvLyBBZGQgYSBtZW51IGJhciBhbmQgd2lkZ2V0cy4KLQkJY3JlYXRlTWVudUJhcigpOwotCQljcmVhdGVXaWRnZXRzKCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJCi0JCS8vIENyZWF0ZSBhIEdDIGZvciBkcmF3aW5nLCBhbmQgaG9vayB0aGUgbGlzdGVuZXIgdG8gZGlzcG9zZSBpdC4KLQkJaW1hZ2VDYW52YXNHQyA9IG5ldyBHQyhpbWFnZUNhbnZhcyk7Ci0JCWltYWdlQ2FudmFzLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpbWFnZUNhbnZhc0dDLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBPcGVuIHRoZSB3aW5kb3cKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0Jdm9pZCBjcmVhdGVXaWRnZXRzKCkgewotCQkvLyBBZGQgdGhlIHdpZGdldHMgdG8gdGhlIHNoZWxsIGluIGEgZ3JpZCBsYXlvdXQuCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gU2VwYXJhdGUgdGhlIG1lbnUgYmFyIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHdpZGdldHMuCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gQWRkIGEgY29tcG9zaXRlIHRvIGNvbnRhaW4gc29tZSBjb250cm9sIHdpZGdldHMgYWNyb3NzIHRoZSB0b3AuCi0JCUNvbXBvc2l0ZSBjb250cm9scyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCXJvd0xheW91dC5tYXJnaW5Cb3R0b20gPSA1OwotCQlyb3dMYXlvdXQuc3BhY2luZyA9IDg7Ci0JCWNvbnRyb2xzLnNldExheW91dChyb3dMYXlvdXQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvbnRyb2xzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gQ29tYm8gdG8gY2hhbmdlIHRoZSBiYWNrZ3JvdW5kLgotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJCYWNrZ3JvdW5kIikpOwotCQliYWNrZ3JvdW5kQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJYmFja2dyb3VuZENvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCQlidW5kbGUuZ2V0U3RyaW5nKCJOb25lIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJXaGl0ZSIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiQmxhY2siKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIlJlZCIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiR3JlZW4iKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkJsdWUiKX0pOwotCQliYWNrZ3JvdW5kQ29tYm8uc2VsZWN0KGJhY2tncm91bmRDb21iby5pbmRleE9mKGJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIikpKTsKLQkJYmFja2dyb3VuZENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljaGFuZ2VCYWNrZ3JvdW5kKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ29tYm8gdG8gY2hhbmdlIHRoZSB4IHNjYWxlLgotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7Ci0JCQkiMC4xIiwgIjAuMiIsICIwLjMiLCAiMC40IiwgIjAuNSIsICIwLjYiLCAiMC43IiwgIjAuOCIsICIwLjkiLCAiMSIsCi0JCQkiMS4xIiwgIjEuMiIsICIxLjMiLCAiMS40IiwgIjEuNSIsICIxLjYiLCAiMS43IiwgIjEuOCIsICIxLjkiLCAiMiIsCi0JCQkiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsfTsKLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiWF9zY2FsZSIpKTsKLQkJc2NhbGVYQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJc2NhbGVYQ29tYm8uYWRkKHZhbHVlc1tpXSk7Ci0JCX0KLQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY2FsZVgoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDb21ibyB0byBjaGFuZ2UgdGhlIHkgc2NhbGUuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIllfc2NhbGUiKSk7Ci0JCXNjYWxlWUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNjYWxlWUNvbWJvLmFkZCh2YWx1ZXNbaV0pOwotCQl9Ci0JCXNjYWxlWUNvbWJvLnNlbGVjdChzY2FsZVlDb21iby5pbmRleE9mKCIxIikpOwotCQlzY2FsZVlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2NhbGVZKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ29tYm8gdG8gY2hhbmdlIHRoZSBhbHBoYSB2YWx1ZS4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQWxwaGFfSyIpKTsKLQkJYWxwaGFDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSAyNTU7IGkgKz0gNSkgewotCQkJYWxwaGFDb21iby5hZGQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCWFscGhhQ29tYm8uc2VsZWN0KGFscGhhQ29tYm8uaW5kZXhPZigiMjU1IikpOwotCQlhbHBoYUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlhbHBoYSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IGluY3JlbWVudGFsIGRpc3BsYXkuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3BsYXkiKSk7Ci0JCWluY3JlbWVudGFsQ2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmNyZW1lbnRhbENoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiSW5jcmVtZW50YWwiKSk7Ci0JCWluY3JlbWVudGFsQ2hlY2suc2V0U2VsZWN0aW9uKGluY3JlbWVudGFsKTsKLQkJaW5jcmVtZW50YWxDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaW5jcmVtZW50YWwgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCB0cmFuc3BhcmVudCBkaXNwbGF5LgotCQl0cmFuc3BhcmVudENoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJdHJhbnNwYXJlbnRDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlRyYW5zcGFyZW50IikpOwotCQl0cmFuc3BhcmVudENoZWNrLnNldFNlbGVjdGlvbih0cmFuc3BhcmVudCk7Ci0JCXRyYW5zcGFyZW50Q2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyYW5zcGFyZW50ID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IG1hc2sgZGlzcGxheS4KLQkJbWFza0NoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJbWFza0NoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiTWFzayIpKTsKLQkJbWFza0NoZWNrLnNldFNlbGVjdGlvbihzaG93TWFzayk7Ci0JCW1hc2tDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hvd01hc2sgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgYmFja2dyb3VuZCBkaXNwbGF5LgotCQliYWNrZ3JvdW5kQ2hlY2sgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWNrZ3JvdW5kQ2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJCYWNrZ3JvdW5kIikpOwotCQliYWNrZ3JvdW5kQ2hlY2suc2V0U2VsZWN0aW9uKHNob3dCYWNrZ3JvdW5kKTsKLQkJYmFja2dyb3VuZENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaG93QmFja2dyb3VuZCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEdyb3VwIHRoZSBhbmltYXRpb24gYnV0dG9ucy4KLQkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0aW9uIikpOwotCi0JCS8vIFB1c2ggYnV0dG9uIHRvIGRpc3BsYXkgdGhlIHByZXZpb3VzIGltYWdlIGluIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkJcHJldmlvdXNCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCXByZXZpb3VzQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUHJldmlvdXMiKSk7Ci0JCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwcmV2aW91c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJldmlvdXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gUHVzaCBidXR0b24gdG8gZGlzcGxheSB0aGUgbmV4dCBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JCW5leHRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCW5leHRCdXR0b24uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJOZXh0IikpOwotCQluZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQluZXh0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQluZXh0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFB1c2ggYnV0dG9uIHRvIHRvZ2dsZSBhbmltYXRpb24gb2YgYSBtdWx0aS1pbWFnZSBmaWxlLgotCQlhbmltYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlhbmltYXRlQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0ZSIpKTsKLQkJYW5pbWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYW5pbWF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYW5pbWF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBmaWxlIHR5cGUuCi0JCXR5cGVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQl0eXBlTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX2luaXRpYWwiKSk7Ci0JCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBDYW52YXMgdG8gc2hvdyB0aGUgaW1hZ2UuCi0JCWltYWdlQ2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk5PX1JFRFJBV19SRVNJWkUgfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQod2hpdGVDb2xvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE1OwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlpbWFnZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaW1hZ2VDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQkJCQlldmVudC5nYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFpbnRJbWFnZShldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJaW1hZ2VDYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlzaG93Q29sb3JBdChldmVudC54LCBldmVudC55KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFNldCB1cCB0aGUgaW1hZ2UgY2FudmFzIHNjcm9sbCBiYXJzLgotCQlTY3JvbGxCYXIgaG9yaXpvbnRhbCA9IGltYWdlQ2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaG9yaXpvbnRhbC5zZXRWaXNpYmxlKHRydWUpOwotCQlob3Jpem9udGFsLnNldE1pbmltdW0oMCk7Ci0JCWhvcml6b250YWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbEhvcml6b250YWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl2ZXJ0aWNhbC5zZXRNaW5pbXVtKDApOwotCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbFZlcnRpY2FsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBzaXplLgotCQlzaXplTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJc2l6ZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2l6ZV9pbml0aWFsIikpOwotCQlzaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZGVwdGguCi0JCWRlcHRoTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGVwdGhMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkRlcHRoX2luaXRpYWwiKSk7Ci0JCWRlcHRoTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgdHJhbnNwYXJlbnQgcGl4ZWwuCi0JCXRyYW5zcGFyZW50UGl4ZWxMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudF9waXhlbF9pbml0aWFsIikpOwotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgdGltZSB0byBsb2FkLgotCQl0aW1lVG9Mb2FkTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJdGltZVRvTG9hZExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVGltZV90b19sb2FkX2luaXRpYWwiKSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBTZXBhcmF0ZSB0aGUgYW5pbWF0aW9uIGZpZWxkcyBmcm9tIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMuCi0JCXNlcGFyYXRvciA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGxvZ2ljYWwgc2NyZWVuIHNpemUgZm9yIGFuaW1hdGlvbi4KLQkJc2NyZWVuU2l6ZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXNjcmVlblNpemVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbl9zaXplX2luaXRpYWwiKSk7Ci0JCXNjcmVlblNpemVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBiYWNrZ3JvdW5kIHBpeGVsLgotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQliYWNrZ3JvdW5kUGl4ZWxMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfcGl4ZWxfaW5pdGlhbCIpKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgbG9jYXRpb24gKHgsIHkpLgotCQlsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9sb2NhdGlvbl9pbml0aWFsIikpOwotCQlsb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGRpc3Bvc2FsIG1ldGhvZC4KLQkJZGlzcG9zYWxNZXRob2RMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRGlzcG9zYWxfaW5pdGlhbCIpKTsKLQkJZGlzcG9zYWxNZXRob2RMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBkZWxheSB0aW1lLgotCQlkZWxheVRpbWVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkZWxheVRpbWVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkRlbGF5X2luaXRpYWwiKSk7Ci0JCWRlbGF5VGltZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGJhY2tncm91bmQgcGl4ZWwuCi0JCXJlcGVhdENvdW50TGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJcmVwZWF0Q291bnRMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlJlcGVhdHNfaW5pdGlhbCIpKTsKLQkJcmVwZWF0Q291bnRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBTZXBhcmF0ZSB0aGUgYW5pbWF0aW9uIGZpZWxkcyBmcm9tIHRoZSBwYWxldHRlLgotCQlzZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IGlmIHRoZSBpbWFnZSBoYXMgYSBkaXJlY3Qgb3IgaW5kZXhlZCBwYWxldHRlLgotCQlwYWxldHRlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFsZXR0ZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUGFsZXR0ZV9pbml0aWFsIikpOwotCQlwYWxldHRlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gQ2FudmFzIHRvIHNob3cgdGhlIGltYWdlJ3MgcGFsZXR0ZS4KLQkJcGFsZXR0ZUNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTk9fUkVEUkFXX1JFU0laRSk7Ci0JCXBhbGV0dGVDYW52YXMuc2V0Rm9udChmaXhlZFdpZHRoRm9udCk7Ci0JCXBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKS5zZXRWaXNpYmxlKHRydWUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlHQyBnYyA9IG5ldyBHQyhwYWxldHRlTGFiZWwpOwotCQlwYWxldHRlV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQoYnVuZGxlLmdldFN0cmluZygiTWF4X2xlbmd0aF9zdHJpbmciKSkueDsKLQkJZ2MuZGlzcG9zZSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSBwYWxldHRlV2lkdGg7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxNiAqIDExOyAvLyBzaG93IGF0IGxlYXN0IDE2IGNvbG9ycwotCQlwYWxldHRlQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwYWxldHRlQ2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlwYWludFBhbGV0dGUoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBTZXQgdXAgdGhlIHBhbGV0dGUgY2FudmFzIHNjcm9sbCBiYXIuCi0JCXZlcnRpY2FsID0gcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl2ZXJ0aWNhbC5zZXRNaW5pbXVtKDApOwotCQl2ZXJ0aWNhbC5zZXRJbmNyZW1lbnQoMTApOwotCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbFBhbGV0dGUoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBTYXNoIHRvIHNlZSBtb3JlIG9mIGltYWdlIG9yIGltYWdlIGRhdGEuCi0JCXNhc2ggPSBuZXcgU2FzaChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzYXNoLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzYXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCSgoR3JpZERhdGEpcGFsZXR0ZUNhbnZhcy5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJCQkJUmVjdGFuZ2xlIHBhbGV0dGVDYW52YXNCb3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldEJvdW5kcygpOwotCQkJCQlpbnQgbWluWSA9IHBhbGV0dGVDYW52YXNCb3VuZHMueSArIDIwOwotCQkJCQlSZWN0YW5nbGUgZGF0YUxhYmVsQm91bmRzID0gZGF0YUxhYmVsLmdldEJvdW5kcygpOwotCQkJCQlpbnQgbWF4WSA9IHN0YXR1c0xhYmVsLmdldEJvdW5kcygpLnkgLSBkYXRhTGFiZWxCb3VuZHMuaGVpZ2h0IC0gMjA7Ci0JCQkJCWlmIChldmVudC55ID4gbWluWSAmJiBldmVudC55IDwgbWF4WSkgewotCQkJCQkJUmVjdGFuZ2xlIG9sZFNhc2ggPSBzYXNoLmdldEJvdW5kcygpOwotCQkJCQkJc2FzaC5zZXRCb3VuZHMoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJCQlpbnQgZGlmZiA9IGV2ZW50LnkgLSBvbGRTYXNoLnk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlpbWFnZUNhbnZhcy5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQgKyBkaWZmKTsKLQkJCQkJCWJvdW5kcyA9IHBhbGV0dGVDYW52YXNCb3VuZHM7Ci0JCQkJCQlwYWxldHRlQ2FudmFzLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCArIGRpZmYpOwotCQkJCQkJYm91bmRzID0gZGF0YUxhYmVsQm91bmRzOwotCQkJCQkJZGF0YUxhYmVsLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnkgKyBkaWZmLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCQkJYm91bmRzID0gZGF0YVRleHQuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlkYXRhVGV4dC5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55ICsgZGlmZiwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0IC0gZGlmZik7Ci0JCQkJCQkvL3NoZWxsLmxheW91dCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyBkYXRhLXNwZWNpZmljIGZpZWxkcy4KLQkJZGF0YUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGFMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlBpeGVsX2RhdGFfaW5pdGlhbCIpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gVGV4dCB0byBzaG93IGEgZHVtcCBvZiB0aGUgZGF0YS4KLQkJZGF0YVRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlkYXRhVGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0JCWRhdGFUZXh0LnNldEZvbnQoZml4ZWRXaWR0aEZvbnQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMjg7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWRhdGFUZXh0LmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwgJiYgZXZlbnQuYnV0dG9uID09IDEpIHsKLQkJCQkJc2hvd0NvbG9yRm9yRGF0YSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWRhdGFUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCXNob3dDb2xvckZvckRhdGEoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gTGFiZWwgdG8gc2hvdyBzdGF0dXMgYW5kIGN1cnNvciBsb2NhdGlvbiBpbiBpbWFnZS4KLQkJc3RhdHVzTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXN0YXR1c0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlNZW51IGNyZWF0ZU1lbnVCYXIoKSB7Ci0JCS8vIE1lbnUgYmFyLgotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCWNyZWF0ZUZpbGVNZW51KG1lbnVCYXIpOwotCQljcmVhdGVBbHBoYU1lbnUobWVudUJhcik7Ci0JCXJldHVybiBtZW51QmFyOwotCX0KLQkKLQl2b2lkIGNyZWF0ZUZpbGVNZW51KE1lbnUgbWVudUJhcikgewotCQkvLyBGaWxlIG1lbnUKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJGaWxlIikpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCi0JCS8vIEZpbGUgLT4gT3BlbiBGaWxlLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9wZW5GaWxlIikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ08nKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW5GaWxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBPcGVuIFVSTC4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPcGVuVVJMIikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1UnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW5VUkwoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IFJlb3BlbgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJSZW9wZW4iKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVSZW9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEZpbGUgLT4gTG9hZCBGaWxlLi4uIChuYXRpdmVseSkKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiTG9hZEZpbGUiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnTCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51TG9hZCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZSIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdTJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBTYXZlIEFzLi4uCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXMiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlQXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBGaWxlIC0+IFNhdmUgTWFzayBBcy4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX21hc2tfYXMiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVTYXZlTWFza0FzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCi0JCS8vIEZpbGUgLT4gUHJpbnQKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUHJpbnQiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCi0JCS8vIEZpbGUgLT4gRXhpdAotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJFeGl0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkKLQl9Ci0KLQl2b2lkIGNyZWF0ZUFscGhhTWVudShNZW51IG1lbnVCYXIpIHsKLQkJLy8gQWxwaGEgbWVudQotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFscGhhIikpOwotCQlNZW51IGFscGhhTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRNZW51KGFscGhhTWVudSk7Ci0KLQkJLy8gQWxwaGEgLT4gSwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGFscGhhTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIksiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUNvbXBvc2VBbHBoYShBTFBIQV9DT05TVEFOVCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFscGhhIC0+IChLICsgeCkgJSAyNTYKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShhbHBoYU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCIoSyArIHgpICUgMjU2Iik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVDb21wb3NlQWxwaGEoQUxQSEFfWCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFscGhhIC0+IChLICsgeSkgJSAyNTYKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShhbHBoYU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCIoSyArIHkpICUgMjU2Iik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVDb21wb3NlQWxwaGEoQUxQSEFfWSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgbWVudUNvbXBvc2VBbHBoYShpbnQgYWxwaGFfb3ApIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJaWYgKGFscGhhX29wID09IEFMUEhBX0NPTlNUQU5UKSB7Ci0JCQkJaW1hZ2VEYXRhLmFscGhhID0gYWxwaGE7Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlRGF0YS5hbHBoYSA9IC0xOwotCQkJCXN3aXRjaCAoYWxwaGFfb3ApIHsKLQkJCQkJY2FzZSBBTFBIQV9YOiAKLQkJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgaW1hZ2VEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IGltYWdlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJCQkJaW1hZ2VEYXRhLnNldEFscGhhKHgsIHksICh4ICsgYWxwaGEpICUgMjU2KTsKLQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX1k6IAotCQkJCQkJZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZURhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCQkJCWZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VEYXRhLndpZHRoOyB4KyspIHsKLQkJCQkJCQlpbWFnZURhdGEuc2V0QWxwaGEoeCwgeSwgKHkgKyBhbHBoYSkgJSAyNTYpOwotCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IGJyZWFrOwotCQkJCX0JCQkJCQotCQkJfQkJCQotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKiBKdXN0IHVzZSBJbWFnZShkZXZpY2UsIGZpbGVuYW1lKSB0byBsb2FkIGFuIGltYWdlIGZpbGUuICovCi0Jdm9pZCBtZW51TG9hZCgpIHsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYW4gaW1hZ2UgZmlsZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWlmIChsYXN0UGF0aCAhPSBudWxsKQotCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyUGF0aChsYXN0UGF0aCk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoT1BFTl9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKE9QRU5fRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJLy8gUmVhZCB0aGUgbmV3IGltYWdlIGZyb20gdGhlIGNob3NlbiBmaWxlLgotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUltYWdlIG5ld0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVuYW1lKTsKLQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7IC8vIGRvbid0IGluY2x1ZGUgZ2V0SW1hZ2VEYXRhIGluIGxvYWQgdGltZQotCQkJaW1hZ2VEYXRhID0gbmV3SW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0KLQkJCS8vIENhY2hlIHRoZSBmaWxlbmFtZS4KLQkJCWN1cnJlbnROYW1lID0gZmlsZW5hbWU7Ci0JCQlmaWxlTmFtZSA9IGZpbGVuYW1lOwotCQkJCi0JCQkvLyBGaWxsIGluIGFycmF5IGFuZCBsb2FkZXIgZGF0YS4KLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJaW1hZ2VEYXRhQXJyYXkgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlRGF0YX07Ci0JCQlsb2FkZXIuZGF0YSA9IGltYWdlRGF0YUFycmF5OwotCQkJCQotCQkJLy8gRGlzcGxheSB0aGUgaW1hZ2UuCi0JCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQlkaXNwbGF5SW1hZ2UoaW1hZ2VEYXRhKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIG1lbnVPcGVuRmlsZSgpIHsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYW4gaW1hZ2UgZmlsZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWlmIChsYXN0UGF0aCAhPSBudWxsKQotCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyUGF0aChsYXN0UGF0aCk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoT1BFTl9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKE9QRU5fRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlJbWFnZUxvYWRlciBvbGRMb2FkZXIgPSBsb2FkZXI7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWlmIChpbmNyZW1lbnRhbCkgewotCQkJCS8vIFByZXBhcmUgdG8gaGFuZGxlIGluY3JlbWVudGFsIGV2ZW50cy4KLQkJCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihuZXcgSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaW1hZ2VEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWluY3JlbWVudGFsRGF0YUxvYWRlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpbmNyZW1lbnRhbFRocmVhZFN0YXJ0KCk7Ci0JCQl9Ci0JCQkvLyBSZWFkIHRoZSBuZXcgaW1hZ2UocykgZnJvbSB0aGUgY2hvc2VuIGZpbGUuCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaW1hZ2VEYXRhQXJyYXkgPSBsb2FkZXIubG9hZChmaWxlbmFtZSk7Ci0JCQlsb2FkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkvLyBDYWNoZSB0aGUgZmlsZW5hbWUuCi0JCQkJY3VycmVudE5hbWUgPSBmaWxlbmFtZTsKLQkJCQlmaWxlTmFtZSA9IGZpbGVuYW1lOwotCQkJCQotCQkJCS8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBpbWFnZXMgaW4gdGhlIGZpbGUgKHR5cGljYWxseSBHSUYpCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIFByZXZpb3VzLCBOZXh0IGFuZCBBbmltYXRlIGJ1dHRvbnMuCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCA+IDAgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQgPiAwKTsKLQkKLQkJCQkvLyBEaXNwbGF5IHRoZSBmaXJzdCBpbWFnZSBpbiB0aGUgZmlsZS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBtZW51T3BlblVSTCgpIHsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYW4gaW1hZ2UgVVJMLgotCQlUZXh0UHJvbXB0ZXIgdGV4dFByb21wdGVyID0gbmV3IFRleHRQcm9tcHRlcihzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULkRJQUxPR19UUklNKTsKLQkJdGV4dFByb21wdGVyLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlblVSTERpYWxvZyIpKTsKLQkJdGV4dFByb21wdGVyLnNldE1lc3NhZ2UoYnVuZGxlLmdldFN0cmluZygiRW50ZXJVUkwiKSk7Ci0JCVN0cmluZyB1cmxuYW1lID0gdGV4dFByb21wdGVyLm9wZW4oKTsKLQkJaWYgKHVybG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJSW1hZ2VMb2FkZXIgb2xkTG9hZGVyID0gbG9hZGVyOwotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwodXJsbmFtZSk7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlpZiAoaW5jcmVtZW50YWwpIHsKLQkJCQkvLyBQcmVwYXJlIHRvIGhhbmRsZSBpbmNyZW1lbnRhbCBldmVudHMuCi0JCQkJbG9hZGVyLmFkZEltYWdlTG9hZGVyTGlzdGVuZXIobmV3IEltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGltYWdlRGF0YUxvYWRlZChJbWFnZUxvYWRlckV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpbmNyZW1lbnRhbERhdGFMb2FkZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJaW5jcmVtZW50YWxUaHJlYWRTdGFydCgpOwotCQkJfQotCQkJLy8gUmVhZCB0aGUgbmV3IGltYWdlKHMpIGZyb20gdGhlIGNob3NlbiBVUkwuCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaW1hZ2VEYXRhQXJyYXkgPSBsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJbG9hZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQljdXJyZW50TmFtZSA9IHVybG5hbWU7Ci0JCQkJZmlsZU5hbWUgPSBudWxsOwotCQkJCQotCQkJCS8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBpbWFnZXMgKHR5cGljYWxseSBHSUYpCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIFByZXZpb3VzLCBOZXh0IGFuZCBBbmltYXRlIGJ1dHRvbnMuCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCA+IDAgJiYgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQgPiAwKTsKLQkKLQkJCQkvLyBEaXNwbGF5IHRoZSBmaXJzdCBpbWFnZS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCB1cmxuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCB1cmxuYW1lLCBlKTsKLQkJCWxvYWRlciA9IG9sZExvYWRlcjsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHRvIHN0YXJ0IGEgdGhyZWFkIHRoYXQgZHJhd3MgaW5jcmVtZW50YWwgaW1hZ2VzCi0JICogYXMgdGhleSBhcmUgbG9hZGVkLgotCSAqLwotCXZvaWQgaW5jcmVtZW50YWxUaHJlYWRTdGFydCgpIHsKLQkJaW5jcmVtZW50YWxFdmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWluY3JlbWVudGFsVGhyZWFkID0gbmV3IFRocmVhZCgiSW5jcmVtZW50YWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gRHJhdyB0aGUgZmlyc3QgSW1hZ2VEYXRhIGluY3JlbWVudC4KLQkJCQl3aGlsZSAoaW5jcmVtZW50YWxFdmVudHMgIT0gbnVsbCkgewotCQkJCQkvLyBTeW5jaHJvbml6ZSBzbyB3ZSBkb24ndCB0cnkgdG8gcmVtb3ZlIHdoZW4gdGhlIHZlY3RvciBpcyBudWxsLgotCQkJCQlzeW5jaHJvbml6ZWQgKEltYWdlQW5hbHl6ZXIudGhpcykgewotCQkJCQkJaWYgKGluY3JlbWVudGFsRXZlbnRzICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoaW5jcmVtZW50YWxFdmVudHMuc2l6ZSgpID4gMCkgewotCQkJCQkJCQlJbWFnZUxvYWRlckV2ZW50IGV2ZW50ID0gKEltYWdlTG9hZGVyRXZlbnQpIGluY3JlbWVudGFsRXZlbnRzLnJlbW92ZSgwKTsKLQkJCQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZXZlbnQuaW1hZ2VEYXRhKTsKLQkJCQkJCQkJaW1hZ2VEYXRhID0gZXZlbnQuaW1hZ2VEYXRhOwotCQkJCQkJCQlpbWFnZUNhbnZhc0dDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCWltYWdlLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQlpbWFnZURhdGEueSwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXlpZWxkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9OwotCQlpbmNyZW1lbnRhbFRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCWluY3JlbWVudGFsVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gaW5jcmVtZW50YWwgaW1hZ2UgZGF0YSBoYXMgYmVlbiBsb2FkZWQsCi0JICogZm9yIGV4YW1wbGUsIGZvciBpbnRlcmxhY2VkIEdJRi9QTkcgb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLQkgKi8KLQl2b2lkIGluY3JlbWVudGFsRGF0YUxvYWRlZChJbWFnZUxvYWRlckV2ZW50IGV2ZW50KSB7Ci0JCS8vIFN5bmNocm9uaXplIHNvIHRoYXQgd2UgZG8gbm90IHRyeSB0byBhZGQgd2hpbGUKLQkJLy8gdGhlIGluY3JlbWVudGFsIGRyYXdpbmcgdGhyZWFkIGlzIHJlbW92aW5nLgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWluY3JlbWVudGFsRXZlbnRzLmFkZEVsZW1lbnQoZXZlbnQpOwotCQl9Ci0JfQotCQotCXZvaWQgbWVudVNhdmUoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0KLQkJLy8gSWYgdGhlIGltYWdlIGZpbGUgdHlwZSBpcyB1bmtub3duLCB3ZSBjYW4ndCAnU2F2ZScsCi0JCS8vIHNvIHdlIGhhdmUgdG8gdXNlICdTYXZlIEFzLi4uJy4KLQkJaWYgKGltYWdlRGF0YS50eXBlID09IFNXVC5JTUFHRV9VTkRFRklORUQgfHwgZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJbWVudVNhdmVBcygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJLy8gU2F2ZSB0aGUgY3VycmVudCBpbWFnZSB0byB0aGUgY3VycmVudCBmaWxlLgotCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlRGF0YX07Ci0JCQlsb2FkZXIuc2F2ZShmaWxlTmFtZSwgaW1hZ2VEYXRhLnR5cGUpOwotCQkJCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVOYW1lLCBlKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlTmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVTYXZlQXMoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0KLQkJLy8gR2V0IHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgbmFtZSBhbmQgdHlwZSB0byBzYXZlLgotCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TQVZFKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyUGF0aChsYXN0UGF0aCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGZpbGVOYW1lOwotCQkJaW50IG5hbWVTdGFydCA9IG5hbWUubGFzdEluZGV4T2YoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJaWYgKG5hbWVTdGFydCA+IC0xKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWVTdGFydCArIDEpOwotCQkJfQotCQkJZmlsZUNob29zZXIuc2V0RmlsZU5hbWUobmFtZSk7Ci0JCX0KLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhTQVZFX0ZJTFRFUl9FWFRFTlNJT05TKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoU0FWRV9GSUxURVJfTkFNRVMpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCWxhc3RQYXRoID0gZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpOwotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0eXBlIHRoZSB1c2VyIHdhbnRzIHNhdmVkLgotCQkvLyBXZSBuZWVkIHRvIHJlbHkgb24gdGhlIGZpbGUgZXh0ZW5zaW9uIGJlY2F1c2UgRmlsZURpYWxvZwotCQkvLyBkb2VzIG5vdCBoYXZlIEFQSSBmb3IgYXNraW5nIHdoYXQgZmlsdGVyIHR5cGUgd2FzIHNlbGVjdGVkLgotCQlpbnQgZmlsZXR5cGUgPSBkZXRlcm1pbmVGaWxlVHlwZShmaWxlbmFtZSk7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVU5ERUZJTkVEKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVW5rbm93bl9leHRlbnNpb24iKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSkpOwotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5PSyB8IFNXVC5DQU5DRUwpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk92ZXJ3cml0ZSIpLCBmaWxlbmFtZSkpOwotCQkJaWYgKGJveC5vcGVuKCkgPT0gU1dULkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCQkJYm9vbGVhbiBtdWx0aSA9IGZhbHNlOwotCQkJaWYgKGxvYWRlci5kYXRhLmxlbmd0aCA+IDEpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQkJCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiU2F2ZV9hbGwiKSwgbmV3IEludGVnZXIobG9hZGVyLmRhdGEubGVuZ3RoKSkpOwotCQkJCWludCByZXN1bHQgPSBib3gub3BlbigpOwotCQkJCWlmIChyZXN1bHQgPT0gU1dULkNBTkNFTCkgcmV0dXJuOwotCQkJCWlmIChyZXN1bHQgPT0gU1dULllFUykgbXVsdGkgPSB0cnVlOwotCQkJfQotCQkJLyogSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3kgYnV0IHRoZSB1c2VyIGhhcyB0cmFuc3BhcmVuY3kgdHVybmVkIG9mZiwKLQkJCSAqIHR1cm4gaXQgb2ZmIGluIHRoZSBzYXZlZCBpbWFnZS4gKi8KLQkJCWludCB0cmFuc3BhcmVudFBpeGVsID0gaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWw7Ci0JCQlpZiAoIW11bHRpICYmIHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQkJaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQkJCX0KLQkJCQotCQkJaWYgKCFtdWx0aSkgbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlRGF0YX07Ci0JCQlsb2FkZXIuc2F2ZShmaWxlbmFtZSwgZmlsZXR5cGUpOwotCQkJCi0JCQkvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyB0cmFuc3BhcmVuY3kgc2V0dGluZy4gKi8KLQkJCWlmICghbXVsdGkgJiYgdHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgc2hlbGwgdGl0bGUgYW5kIGZpbGUgdHlwZSBsYWJlbCwKLQkJCS8vIGFuZCB1c2UgdGhlIG5ldyBmaWxlLgotCQkJZmlsZU5hbWUgPSBmaWxlbmFtZTsKLQkJCXNoZWxsLnNldFRleHQoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkFuYWx5emVyX29uIiksIGZpbGVuYW1lKSk7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVHlwZV9zdHJpbmciKSwgZmlsZVR5cGVTdHJpbmcoZmlsZXR5cGUpKSk7Ci0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiU2F2aW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudVNhdmVNYXNrQXMoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsIHx8ICFzaG93TWFzaykgcmV0dXJuOwotCQlpZiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSA9PSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpIHJldHVybjsKLQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSBuYW1lIGFuZCB0eXBlIHRvIHNhdmUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNBVkUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJQYXRoKGxhc3RQYXRoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIGZpbGVDaG9vc2VyLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhTQVZFX0ZJTFRFUl9FWFRFTlNJT05TKTsKLQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoU0FWRV9GSUxURVJfTkFNRVMpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCWxhc3RQYXRoID0gZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpOwotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0eXBlIHRoZSB1c2VyIHdhbnRzIHNhdmVkLgotCQkvLyBXZSBuZWVkIHRvIHJlbHkgb24gdGhlIGZpbGUgZXh0ZW5zaW9uIGJlY2F1c2UgRmlsZURpYWxvZwotCQkvLyBkb2VzIG5vdCBoYXZlIEFQSSBmb3IgYXNraW5nIHdoYXQgZmlsdGVyIHR5cGUgd2FzIHNlbGVjdGVkLgotCQlpbnQgZmlsZXR5cGUgPSBkZXRlcm1pbmVGaWxlVHlwZShmaWxlbmFtZSk7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVU5ERUZJTkVEKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVW5rbm93bl9leHRlbnNpb24iKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSkpOwotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5PSyB8IFNXVC5DQU5DRUwpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk92ZXJ3cml0ZSIpLCBmaWxlbmFtZSkpOwotCQkJaWYgKGJveC5vcGVuKCkgPT0gU1dULkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIG1hc2sgb2YgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCQkJSW1hZ2VEYXRhIG1hc2tJbWFnZURhdGEgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge21hc2tJbWFnZURhdGF9OwotCQkJbG9hZGVyLnNhdmUoZmlsZW5hbWUsIGZpbGV0eXBlKTsKLQkJCQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UHJpbnQoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCS8vIEFzayB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwcmludGVyLgotCQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlQcmludGVyRGF0YSBwcmludGVyRGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocHJpbnRlckRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCi0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihwcmludGVyRGF0YSk7Ci0JCQlQb2ludCBzY3JlZW5EUEkgPSBkaXNwbGF5LmdldERQSSgpOwotCQkJUG9pbnQgcHJpbnRlckRQSSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlpbnQgc2NhbGVGYWN0b3IgPSBwcmludGVyRFBJLnggLyBzY3JlZW5EUEkueDsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCWlmIChwcmludGVyLnN0YXJ0Sm9iKGN1cnJlbnROYW1lKSkgewotCQkJCWlmIChwcmludGVyLnN0YXJ0UGFnZSgpKSB7Ci0JCQkJCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJCQlpbnQgdHJhbnNwYXJlbnRQaXhlbCA9IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JCQkJCX0KLQkJCQkJSW1hZ2UgcHJpbnRlckltYWdlID0gbmV3IEltYWdlKHByaW50ZXIsIGltYWdlRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZSgKLQkJCQkJCXByaW50ZXJJbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCS10cmltLngsCi0JCQkJCQktdHJpbS55LAotCQkJCQkJc2NhbGVGYWN0b3IgKiBpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlzY2FsZUZhY3RvciAqIGltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCQkJfQotCQkJCQlwcmludGVySW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJCX0KLQkJCQlwcmludGVyLmVuZEpvYigpOwotCQkJfQotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKGJ1bmRsZS5nZXRTdHJpbmcoIlByaW50aW5nX2Vycm9yIikgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlib3gub3BlbigpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UmVvcGVuKCkgewotCQlpZiAoY3VycmVudE5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCUltYWdlRGF0YVtdIG5ld0ltYWdlRGF0YTsKLQkJCWlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwoY3VycmVudE5hbWUpOwotCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQluZXdJbWFnZURhdGEgPSBsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJbmV3SW1hZ2VEYXRhID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQlkaXNwbGF5SW1hZ2UobmV3SW1hZ2VEYXRhW2ltYWdlRGF0YUluZGV4XSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewkKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIGNoYW5nZUJhY2tncm91bmQoKSB7Ci0JCVN0cmluZyBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZENvbWJvLmdldFRleHQoKTsKLQkJaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHdoaXRlQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIkJsYWNrIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKGJsYWNrQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIlJlZCIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChyZWRDb2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiR3JlZW4iKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQoZ3JlZW5Db2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiQmx1ZSIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChibHVlQ29sb3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBTY2FsZVggY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBzY2FsZVgoKSB7Ci0JCXRyeSB7Ci0JCQl4c2NhbGUgPSBGbG9hdC5wYXJzZUZsb2F0KHNjYWxlWENvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl4c2NhbGUgPSAxOwotCQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCX0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIFNjYWxlWSBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQl2b2lkIHNjYWxlWSgpIHsKLQkJdHJ5IHsKLQkJCXlzY2FsZSA9IEZsb2F0LnBhcnNlRmxvYXQoc2NhbGVZQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXlzY2FsZSA9IDE7Ci0JCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQWxwaGEgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBhbHBoYSgpIHsKLQkJdHJ5IHsKLQkJCWFscGhhID0gSW50ZWdlci5wYXJzZUludChhbHBoYUNvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlhbHBoYUNvbWJvLnNlbGVjdChhbHBoYUNvbWJvLmluZGV4T2YoIjI1NSIpKTsKLQkJCWFscGhhID0gMjU1OwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIG1vdmVzIGluIHRoZSBpbWFnZSBjYW52YXMuCi0JICogU2hvdyB0aGUgY29sb3Igb2YgdGhlIGltYWdlIGF0IHRoZSBwb2ludCB1bmRlciB0aGUgbW91c2UuCi0JICovCi0Jdm9pZCBzaG93Q29sb3JBdChpbnQgbXgsIGludCBteSkgewotCQlpbnQgeCA9IG14IC0gaW1hZ2VEYXRhLnggLSBpeDsKLQkJaW50IHkgPSBteSAtIGltYWdlRGF0YS55IC0gaXk7Ci0JCXNob3dDb2xvckZvclBpeGVsKHgsIHkpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIGEgbW91c2UgZG93biBvciBrZXkgcHJlc3MgaXMgZGV0ZWN0ZWQKLQkgKiBpbiB0aGUgZGF0YSB0ZXh0LiBTaG93IHRoZSBjb2xvciBvZiB0aGUgcGl4ZWwgYXQKLQkgKiB0aGUgY2FyZXQgcG9zaXRpb24gaW4gdGhlIGRhdGEgdGV4dC4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvckRhdGEoKSB7Ci0JCWludCBkZWxpbWl0ZXJMZW5ndGggPSBkYXRhVGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkubGVuZ3RoKCk7Ci0JCWludCBjaGFyYWN0ZXJzUGVyTGluZSA9IDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGRlbGltaXRlckxlbmd0aDsKLQkJaW50IHBvc2l0aW9uID0gZGF0YVRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJaW50IHkgPSBwb3NpdGlvbiAvIGNoYXJhY3RlcnNQZXJMaW5lOwotCQlpZiAoKHBvc2l0aW9uIC0geSAqIGNoYXJhY3RlcnNQZXJMaW5lKSA8IDYgfHwgKCh5ICsgMSkgKiBjaGFyYWN0ZXJzUGVyTGluZSAtIHBvc2l0aW9uKSA8PSBkZWxpbWl0ZXJMZW5ndGgpIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBkYXRhUG9zaXRpb24gPSBwb3NpdGlvbiAtIDYgKiAoeSArIDEpIC0gZGVsaW1pdGVyTGVuZ3RoICogeTsKLQkJaW50IGJ5dGVOdW1iZXIgPSBkYXRhUG9zaXRpb24gLyAzOwotCQlpbnQgd2hlcmUgPSBkYXRhUG9zaXRpb24gLSBieXRlTnVtYmVyICogMzsKLQkJaW50IHhCeXRlID0gYnl0ZU51bWJlciAlIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCWludCB4ID0gLTE7Ci0JCWludCBkZXB0aCA9IGltYWdlRGF0YS5kZXB0aDsKLQkJaWYgKGRlcHRoID09IDEpIHsgLy8gOCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA4KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDg7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogOCArIDM7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogOCArIDc7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDIpIHsgLy8gNCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA0KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDQ7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogNCArIDE7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogNCArIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDQpIHsgLy8gMiBwaXhlbHMgcGVyIGJ5dGUKLQkJCWlmICh3aGVyZSA9PSAwKSB4ID0geEJ5dGUgKiAyOwotCQkJaWYgKHdoZXJlID09IDEpIHggPSB4Qnl0ZSAqIDI7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogMiArIDE7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDgpIHsgLy8gMSBieXRlIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlOwotCQl9Ci0JCWlmIChkZXB0aCA9PSAxNikgeyAvLyAyIGJ5dGVzIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlIC8gMjsKLQkJfQotCQlpZiAoZGVwdGggPT0gMjQpIHsgLy8gMyBieXRlcyBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZSAvIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDMyKSB7IC8vIDQgYnl0ZXMgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGUgLyA0OwotCQl9Ci0JCWlmICh4ICE9IC0xKSB7Ci0JCQlzaG93Q29sb3JGb3JQaXhlbCh4LCB5KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCQotCS8qCi0JICogU2V0IHRoZSBzdGF0dXMgbGFiZWwgdG8gc2hvdyBjb2xvciBpbmZvcm1hdGlvbgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZSBpbWFnZS4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvclBpeGVsKGludCB4LCBpbnQgeSkgewotCQlpZiAoeCA+PSAwICYmIHggPCBpbWFnZURhdGEud2lkdGggJiYgeSA+PSAwICYmIHkgPCBpbWFnZURhdGEuaGVpZ2h0KSB7Ci0JCQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQlSR0IgcmdiID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLQkJCWJvb2xlYW4gaGFzQWxwaGEgPSBmYWxzZTsKLQkJCWludCBhbHBoYVZhbHVlID0gMDsKLQkJCWlmIChpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSB7Ci0JCQkJaGFzQWxwaGEgPSB0cnVlOwotCQkJCWFscGhhVmFsdWUgPSBpbWFnZURhdGEuZ2V0QWxwaGEoeCwgeSk7Ci0JCQl9Ci0JCQlTdHJpbmcgcmdiTWVzc2FnZUZvcm1hdCA9IGJ1bmRsZS5nZXRTdHJpbmcoaGFzQWxwaGEgPyAiUkdCQSIgOiAiUkdCIik7Ci0JCQlPYmplY3RbXSByZ2JBcmdzID0gewotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5yZWQpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5ncmVlbiksCi0JCQkJCUludGVnZXIudG9TdHJpbmcocmdiLmJsdWUpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGFscGhhVmFsdWUpCi0JCQl9OwotCQkJT2JqZWN0W10gcmdiSGV4QXJncyA9IHsKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhhbHBoYVZhbHVlKQotCQkJfTsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCW5ldyBJbnRlZ2VyKHgpLAotCQkJCQluZXcgSW50ZWdlcih5KSwKLQkJCQkJbmV3IEludGVnZXIocGl4ZWwpLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHBpeGVsKSwKLQkJCQkJY3JlYXRlTXNnKHJnYk1lc3NhZ2VGb3JtYXQsIHJnYkFyZ3MpLAotCQkJCQljcmVhdGVNc2cocmdiTWVzc2FnZUZvcm1hdCwgcmdiSGV4QXJncyksCi0JCQkJCShwaXhlbCA9PSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCkgPyBidW5kbGUuZ2V0U3RyaW5nKCJDb2xvcl9hdF90cmFuc3BhcmVudCIpIDogIiJ9OwotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ29sb3JfYXQiKSwgYXJncykpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQW5pbWF0ZSBidXR0b24gaXMgcHJlc3NlZC4KLQkgKi8KLQl2b2lkIGFuaW1hdGUoKSB7Ci0JCWFuaW1hdGUgPSAhYW5pbWF0ZTsKLQkJaWYgKGFuaW1hdGUgJiYgaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb24iKSkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gUHJlLWFuaW1hdGlvbiB3aWRnZXQgc2V0dXAuCi0JCQkJCXByZUFuaW1hdGlvbigpOwotCQkJCQkKLQkJCQkJLy8gQW5pbWF0ZS4KLQkJCQkJdHJ5IHsKLQkJCQkJCWFuaW1hdGVMb29wKCk7Ci0JCQkJCX0gY2F0Y2ggKGZpbmFsIFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXNob3dFcnJvckRpYWxvZyhjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfaW1hZ2UiKSwgCi0JCQkJCQkJCQkJICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUluZGV4KzEpKSwKLQkJCQkJCQkJCQkgICAgY3VycmVudE5hbWUsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBQb3N0IGFuaW1hdGlvbiB3aWRnZXQgcmVzZXQuCi0JCQkJCXBvc3RBbmltYXRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQkJYW5pbWF0ZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbWFnZXMgaW4gYSBtdWx0aS1pbWFnZSBmaWxlCi0JICogYW5kIGRpc3BsYXkgdGhlbSBvbmUgYWZ0ZXIgYW5vdGhlci4KLQkgKi8KLQl2b2lkIGFuaW1hdGVMb29wKCkgewotCQkvLyBDcmVhdGUgYW4gb2ZmLXNjcmVlbiBpbWFnZSB0byBkcmF3IG9uLCBhbmQgYSBHQyB0byBkcmF3IHdpdGguCi0JCS8vIEJvdGggYXJlIGRpc3Bvc2VkIGFmdGVyIHRoZSBhbmltYXRpb24uCi0JCUltYWdlIG9mZlNjcmVlbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQotCQl0cnkgewotCQkJLy8gVXNlIHN5bmNFeGVjIHRvIGdldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaW1hZ2VDYW52YXMuCi0JCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWNhbnZhc0JhY2tncm91bmQgPSBpbWFnZUNhbnZhcy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCS8vIEZpbGwgdGhlIG9mZi1zY3JlZW4gaW1hZ2Ugd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLgotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGNhbnZhc0JhY2tncm91bmQpOwotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKAotCQkJCTAsCi0JCQkJMCwKLQkJCQlsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLAotCQkJCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCi0JCQkvLyBEcmF3IHRoZSBjdXJyZW50IGltYWdlIG9udG8gdGhlIG9mZi1zY3JlZW4gaW1hZ2UuCi0JCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQlpbWFnZSwKLQkJCQkwLAotCQkJCTAsCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJaW1hZ2VEYXRhLngsCi0JCQkJaW1hZ2VEYXRhLnksCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCi0JCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXIucmVwZWF0Q291bnQ7Ci0JCQl3aGlsZSAoYW5pbWF0ZSAmJiAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSkgewotCQkJCWlmIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QgPT0gU1dULkRNX0ZJTExfQkFDS0dST1VORCkgewotCQkJCQkvLyBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuCi0JCQkJCUNvbG9yIGJnQ29sb3IgPSBudWxsOwotCQkJCQlpbnQgYmFja2dyb3VuZFBpeGVsID0gbG9hZGVyLmJhY2tncm91bmRQaXhlbDsKLQkJCQkJaWYgKHNob3dCYWNrZ3JvdW5kICYmIGJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJLy8gRmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotCQkJCQkJUkdCIGJhY2tncm91bmRSR0IgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IoYmFja2dyb3VuZFBpeGVsKTsKLQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgYmFja2dyb3VuZFJHQik7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChiZ0NvbG9yICE9IG51bGwgPyBiZ0NvbG9yIDogY2FudmFzQmFja2dyb3VuZCk7Ci0JCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoCi0JCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCA9PSBTV1QuRE1fRklMTF9QUkVWSU9VUykgewotCQkJCQkvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4KLQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQlpbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkvLyBHZXQgdGhlIG5leHQgaW1hZ2UgZGF0YS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkKLQkJCQkvLyBEcmF3IHRoZSBuZXcgaW1hZ2UgZGF0YS4KLQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJaW1hZ2UsCi0JCQkJCTAsCi0JCQkJCTAsCi0JCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCWltYWdlRGF0YS55LAotCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQotCQkJCS8vIERyYXcgdGhlIG9mZi1zY3JlZW4gaW1hZ2UgdG8gdGhlIHNjcmVlbi4KLQkJCQlpbWFnZUNhbnZhc0dDLmRyYXdJbWFnZShvZmZTY3JlZW5JbWFnZSwgMCwgMCk7Ci0JCQkJCi0JCQkJLy8gU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSBiZWZvcmUgZHJhd2luZyBhZ2Fpbi4KLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodmlzaWJsZURlbGF5KGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMCkpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlIGluIHRoZSBzZXQsCi0JCQkJLy8gdGhlbiBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudC4KLQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW9mZlNjcmVlbkltYWdlLmRpc3Bvc2UoKTsKLQkJCW9mZlNjcmVlbkltYWdlR0MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcmUgYW5pbWF0aW9uIHNldHVwLgotCSAqLwotCXZvaWQgcHJlQW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBDaGFuZ2UgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbiB0byAnU3RvcCcuCi0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlN0b3AiKSk7Ci0JCQkJCi0JCQkJLy8gRGlzYWJsZSBhbnl0aGluZyB3ZSBkb24ndCB3YW50IHRoZSB1c2VyCi0JCQkJLy8gdG8gc2VsZWN0IGR1cmluZyB0aGUgYW5pbWF0aW9uLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaW5jcmVtZW50YWxDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl0cmFuc3BhcmVudENoZWNrLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkvLyBsZWF2ZSBiYWNrZ3JvdW5kQ2hlY2sgZW5hYmxlZAotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyBhbmQgc2Nyb2xsYmFycy4KLQkJCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCQkJcmVzZXRTY3JvbGxCYXJzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogUG9zdCBhbmltYXRpb24gcmVzZXQuCi0JICovCi0Jdm9pZCBwb3N0QW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBFbmFibGUgYW55dGhpbmcgd2UgZGlzYWJsZWQgYmVmb3JlIHRoZSBhbmltYXRpb24uCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJc2NhbGVYQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlzY2FsZVlDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlpbmNyZW1lbnRhbENoZWNrLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdHJhbnNwYXJlbnRDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbi4KLQkJCQlhbmltYXRlQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0ZSIpKTsKLQkJCQotCQkJCWlmIChhbmltYXRlKSB7Ci0JCQkJCS8vIElmIGFuaW1hdGUgaXMgc3RpbGwgdHJ1ZSwgd2UgZmluaXNoZWQgdGhlCi0JCQkJCS8vIGZ1bGwgbnVtYmVyIG9mIHJlcGVhdHMuIExlYXZlIHRoZSBpbWFnZSBhcy1pcy4KLQkJCQkJYW5pbWF0ZSA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFJlZGlzcGxheSB0aGUgY3VycmVudCBpbWFnZSBhbmQgaXRzIHBhbGV0dGUuCi0JCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgUHJldmlvdXMgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgcHJldmlvdXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCSAqLwotCXZvaWQgcHJldmlvdXMoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSAwKSB7Ci0JCQkJaW1hZ2VEYXRhSW5kZXggPSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IGltYWdlRGF0YUluZGV4IC0gMTsKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQl9CQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIE5leHQgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgbmV4dCBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JICovCi0Jdm9pZCBuZXh0KCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCX0JCi0JfQotCi0Jdm9pZCBkaXNwbGF5SW1hZ2UoSW1hZ2VEYXRhIG5ld0ltYWdlRGF0YSkgewotCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCWlmIChpbmNyZW1lbnRhbCAmJiBpbmNyZW1lbnRhbFRocmVhZCAhPSBudWxsKSB7Ci0JCQkvLyBUZWxsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgdG8gc3RvcCBkcmF3aW5nLgotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaW5jcmVtZW50YWxFdmVudHMgPSBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBXYWl0IHVudGlsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgaXMgZG9uZS4KLQkJCXdoaWxlIChpbmNyZW1lbnRhbFRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQkJCQkKLQkJLy8gRGlzcG9zZSBvZiB0aGUgb2xkIGltYWdlLCBpZiB0aGVyZSB3YXMgb25lLgotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBDYWNoZSB0aGUgbmV3IGltYWdlIGFuZCBpbWFnZURhdGEuCi0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBuZXdJbWFnZURhdGEpOwotCQkJaW1hZ2VEYXRhID0gbmV3SW1hZ2VEYXRhOwotCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfZnJvbSIpICsgIiAiLCBjdXJyZW50TmFtZSwgZSk7Ci0JCQlpbWFnZSA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHdpZGdldHMgd2l0aCB0aGUgbmV3IGltYWdlIGluZm8uCi0JCVN0cmluZyBzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5hbHl6ZXJfb24iKSwgY3VycmVudE5hbWUpOwotCQlzaGVsbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX2luZGV4IiksIAotCQkJICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ZmlsZVR5cGVTdHJpbmcoaW1hZ2VEYXRhLnR5cGUpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhSW5kZXggKyAxKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUFycmF5Lmxlbmd0aCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX3N0cmluZyIpLCBmaWxlVHlwZVN0cmluZyhpbWFnZURhdGEudHlwZSkpOwotCQl9Ci0JCXR5cGVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlNpemVfdmFsdWUiKSwgCi0JCQkJCSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS53aWR0aCksCi0JCQkJCQkJICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmhlaWdodCl9KTsKLQkJc2l6ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfdmFsdWUiKSwgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmRlcHRoKSk7Ci0JCWRlcHRoTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudF9waXhlbF92YWx1ZSIpLCBwaXhlbEluZm8oaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwpKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVGltZV90b19sb2FkX3ZhbHVlIiksIG5ldyBMb25nKGxvYWRUaW1lKSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbl9zaXplX3ZhbHVlIiksIAotCQkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoKSwKLQkJCQkJCQkJbmV3IEludGVnZXIobG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpfSk7Ci0JCXNjcmVlblNpemVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfcGl4ZWxfdmFsdWUiKSwgcGl4ZWxJbmZvKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9sb2NhdGlvbl92YWx1ZSIpLCAKLQkJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLngpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEueSl9KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3Bvc2FsX3ZhbHVlIiksCi0JCSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCksCi0JCQkJCQkJICAgICAgZGlzcG9zYWxTdHJpbmcoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKX0pOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpbnQgZGVsYXkgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCWludCBkZWxheVVzZWQgPSB2aXNpYmxlRGVsYXkoZGVsYXkpOwotCQlpZiAoZGVsYXkgIT0gZGVsYXlVc2VkKSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVsYXlfdmFsdWUiKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihkZWxheSksIG5ldyBJbnRlZ2VyKGRlbGF5VXNlZCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV91c2VkIiksIG5ldyBJbnRlZ2VyKGRlbGF5KSk7Ci0JCX0KLQkJZGVsYXlUaW1lTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWlmIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCkgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKCBidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX2ZvcmV2ZXIiKSwgbmV3IEludGVnZXIobG9hZGVyLnJlcGVhdENvdW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUmVwZWF0c192YWx1ZSIpLCBuZXcgSW50ZWdlcihsb2FkZXIucmVwZWF0Q291bnQpKTsKLQkJfQotCQlyZXBlYXRDb3VudExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpZiAoaW1hZ2VEYXRhLnBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJCXN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfZGlyZWN0Iik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUGFsZXR0ZV92YWx1ZSIpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoKSk7Ci0JCX0KLQkJcGFsZXR0ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coCi0JCQkJYnVuZGxlLmdldFN0cmluZygiUGl4ZWxfZGF0YV92YWx1ZSIpLAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQluZXcgSW50ZWdlcihpbWFnZURhdGEuYnl0ZXNQZXJMaW5lKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKGltYWdlRGF0YS5zY2FubGluZVBhZCksCi0JCQkJCQlkZXB0aEluZm8oaW1hZ2VEYXRhLmRlcHRoKSwKLQkJCQkJCShpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSA/Ci0JCQkJCQkJCWJ1bmRsZS5nZXRTdHJpbmcoIlNjcm9sbF9mb3JfYWxwaGEiKSA6ICIiIH0pOwotCQlkYXRhTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCVN0cmluZyBkYXRhID0gZGF0YUhleER1bXAoZGF0YVRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQkJZGF0YVRleHQuc2V0VGV4dChkYXRhKTsKLQkJCi0JCS8vIGJvbGQgdGhlIGZpcnN0IGNvbHVtbiBhbGwgdGhlIHdheSBkb3duCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlKChpbmRleCA9IGRhdGEuaW5kZXhPZignOicsIGluZGV4KzEpKSAhPSAtMSkgewotCQkJaW50IHN0YXJ0ID0gaW5kZXggLSBJTkRFWF9ESUdJVFM7Ci0JCQlpbnQgbGVuZ3RoID0gSU5ERVhfRElHSVRTOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihkYXRhLmNoYXJBdChpbmRleC0xKSkpIHsKLQkJCQlzdGFydCA9IGluZGV4IC0gQUxQSEFfQ0hBUlM7Ci0JCQkJbGVuZ3RoID0gQUxQSEFfQ0hBUlM7Ci0JCQl9Ci0JCQlkYXRhVGV4dC5zZXRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBsZW5ndGgsIGRhdGFUZXh0LmdldEZvcmVncm91bmQoKSwgZGF0YVRleHQuZ2V0QmFja2dyb3VuZCgpLCBTV1QuQk9MRCkpOwotCQl9Ci0KLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0KLQkJLy8gUmVkcmF3IGJvdGggY2FudmFzZXMuCi0JCXJlc2V0U2Nyb2xsQmFycygpOwotCQlwYWxldHRlQ2FudmFzLnJlZHJhdygpOwotCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQl9Ci0KLQl2b2lkIHBhaW50SW1hZ2UoUGFpbnRFdmVudCBldmVudCkgewotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlJbWFnZSBwYWludEltYWdlID0gaW1hZ2U7Ci0JCQotCQkvKiBJZiB0aGUgdXNlciB3YW50cyB0byBzZWUgdGhlIHRyYW5zcGFyZW50IHBpeGVsIGluIGl0cyBhY3R1YWwgY29sb3IsCi0JCSAqIHRoZW4gdGVtcG9yYXJpbHkgdHVybiBvZmYgdHJhbnNwYXJlbmN5LgotCQkgKi8KLQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQl9Ci0JCQotCQkvKiBTY2FsZSB0aGUgaW1hZ2Ugd2hlbiBkcmF3aW5nLCB1c2luZyB0aGUgdXNlcidzIHNlbGVjdGVkIHNjYWxpbmcgZmFjdG9yLiAqLwotCQlpbnQgdyA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaW50IGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQkKLQkJLyogSWYgYW55IG9mIHRoZSBiYWNrZ3JvdW5kIGlzIHZpc2libGUsIGZpbGwgaXQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvci4gKi8KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQlpZiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSAhPSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpIHsKLQkJCS8qIElmIHRoZXJlIGlzIGFueSB0cmFuc3BhcmVuY3kgYXQgYWxsLCBmaWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kLiAqLwotCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQl9IGVsc2UgewotCQkJLyogT3RoZXJ3aXNlLCBqdXN0IGZpbGwgaW4gdGhlIGJhY2t3YXJkcyBMLiAqLwotCQkJaWYgKGl4ICsgdyA8IGJvdW5kcy53aWR0aCkgZ2MuZmlsbFJlY3RhbmdsZShpeCArIHcsIDAsIGJvdW5kcy53aWR0aCAtIChpeCArIHcpLCBib3VuZHMuaGVpZ2h0KTsKLQkJCWlmIChpeSArIGggPCBib3VuZHMuaGVpZ2h0KSBnYy5maWxsUmVjdGFuZ2xlKDAsIGl5ICsgaCwgaXggKyB3LCBib3VuZHMuaGVpZ2h0IC0gKGl5ICsgaCkpOwotCQl9Ci0JCQotCQkvKiBEcmF3IHRoZSBpbWFnZSAqLwotCQlnYy5kcmF3SW1hZ2UoCi0JCQlwYWludEltYWdlLAotCQkJMCwKLQkJCTAsCi0JCQlpbWFnZURhdGEud2lkdGgsCi0JCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJaXggKyBpbWFnZURhdGEueCwKLQkJCWl5ICsgaW1hZ2VEYXRhLnksCi0JCQl3LAotCQkJaCk7Ci0JCQotCQkvKiBJZiB0aGVyZSBpcyBhIG1hc2sgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNlZSBpdCwgZHJhdyBpdC4gKi8KLQkJaWYgKHNob3dNYXNrICYmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpICE9IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkpIHsKLQkJCUltYWdlRGF0YSBtYXNrSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIG1hc2tJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBtYXNrSW1hZ2VEYXRhKTsKLQkJCWdjLmRyYXdJbWFnZSgKLQkJCQltYXNrSW1hZ2UsCi0JCQkJMCwKLQkJCQkwLAotCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCXcgKyAxMCArIGl4ICsgaW1hZ2VEYXRhLngsCi0JCQkJaXkgKyBpbWFnZURhdGEueSwKLQkJCQl3LAotCQkJCWgpOwotCQkJbWFza0ltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJLyogSWYgdHJhbnNwYXJlbmN5IHdhcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCwgcmVzdG9yZSBpdC4gKi8KLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcGFpbnRQYWxldHRlKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJZ2MuZmlsbFJlY3RhbmdsZShwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCWlmIChpbWFnZURhdGEucGFsZXR0ZS5pc0RpcmVjdCkgewotCQkJLy8gRm9yIGEgZGlyZWN0IHBhbGV0dGUsIGRpc3BsYXkgdGhlIG1hc2tzLgotCQkJaW50IHkgPSBweSArIDEwOwotCQkJaW50IHhUYWIgPSA1MDsKLQkJCWdjLmRyYXdTdHJpbmcoInJNc2siLCAxMCwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiZ01zayIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuZ3JlZW5NYXNrKSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJiTXNrIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcodG9IZXg0Qnl0ZVN0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ibHVlTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiclNoZiIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImdTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmdyZWVuU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImJTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmJsdWVTaGlmdCksIHhUYWIsIHksIHRydWUpOwotCQl9IGVsc2UgewotCQkJLy8gRm9yIGFuIGluZGV4ZWQgcGFsZXR0ZSwgZGlzcGxheSB0aGUgcGFsZXR0ZSBjb2xvcnMgYW5kIGluZGljZXMuCi0JCQlSR0JbXSByZ2JzID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpOwotCQkJaWYgKHJnYnMgIT0gbnVsbCkgewotCQkJCWludCB4VGFiMSA9IDQwLCB4VGFiMiA9IDEwMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IHkgPSAoaSsxKSAqIDEwICsgcHk7Ci0JCQkJCWdjLmRyYXdTdHJpbmcoU3RyaW5nLnZhbHVlT2YoaSksIDEwLCB5LCB0cnVlKTsKLQkJCQkJZ2MuZHJhd1N0cmluZyh0b0hleEJ5dGVTdHJpbmcocmdic1tpXS5yZWQpICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uZ3JlZW4pICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uYmx1ZSksIHhUYWIxLCB5LCB0cnVlKTsKLQkJCQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdic1tpXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlKHhUYWIyLCB5KzIsIDEwLCAxMCk7Ci0JCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZXNpemVTaGVsbChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JfQotCi0JLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyB0byAxLgotCXZvaWQgcmVzZXRTY2FsZUNvbWJvcygpIHsKLQkJeHNjYWxlID0gMTsgeXNjYWxlID0gMTsKLQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWUNvbWJvLnNlbGVjdChzY2FsZVlDb21iby5pbmRleE9mKCIxIikpOwotCX0KLQkKLQkvLyBSZXNldCB0aGUgc2Nyb2xsIGJhcnMgdG8gMC4KLQl2b2lkIHJlc2V0U2Nyb2xsQmFycygpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJaXggPSAwOyBpeSA9IDA7IHB5ID0gMDsKLQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQlpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCQlpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0JCi0Jdm9pZCByZXNpemVTY3JvbGxCYXJzKCkgewotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBpbWFnZSBjYW52YXMgc2Nyb2xsIGJhcnMuCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWlmICh3aWR0aCA+IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJLy8gVGhlIGltYWdlIGlzIHdpZGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWhvcml6b250YWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWhvcml6b250YWwuc2V0TWF4aW11bSh3aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFRodW1iKGNhbnZhc0JvdW5kcy53aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLndpZHRoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBjYW52YXMgaXMgd2lkZXIgdGhhbiB0aGUgaW1hZ2UuCi0JCQlob3Jpem9udGFsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl4ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeCA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQkJaW50IGhlaWdodCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCWlmIChoZWlnaHQgPiBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkvLyBUaGUgaW1hZ2UgaXMgdGFsbGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl2ZXJ0aWNhbC5zZXRNYXhpbXVtKGhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRUaHVtYihjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgY2FudmFzIGlzIHRhbGxlciB0aGFuIHRoZSBpbWFnZS4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl5ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeSA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBwYWxldHRlIGNhbnZhcyBzY3JvbGwgYmFyLgotCQl2ZXJ0aWNhbCA9IHBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGltYWdlRGF0YS5wYWxldHRlLmlzRGlyZWN0KSB7Ci0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsgLy8gaW5kZXhlZCBwYWxldHRlCi0JCQljYW52YXNCb3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7IC8vIDEwIHBpeGVscyBlYWNoIGluZGV4ICsgMjAgZm9yIG1hcmdpbnMuCi0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJdmVydGljYWwuc2V0TWF4aW11bShwYWxldHRlSGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFRodW1iKGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQkJdmVydGljYWwuc2V0UGFnZUluY3JlbWVudChjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGNhbnZhcycgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWludCBoZWlnaHQgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQlpZiAod2lkdGggPiBjYW52YXNCb3VuZHMud2lkdGgpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHggPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHggKyB3aWR0aCA8IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJCS8vIERvbid0IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YgdGhlIGltYWdlLgotCQkJCXggPSBjYW52YXNCb3VuZHMud2lkdGggLSB3aWR0aDsKLQkJCX0KLQkJCWltYWdlQ2FudmFzLnNjcm9sbCh4LCBpeSwgaXgsIGl5LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7Ci0JCQlpeCA9IHg7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgY2FudmFzJyB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbGx5KFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGltYWdlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJaWYgKGhlaWdodCA+IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHkgKyBoZWlnaHQgPCBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkJLy8gRG9uJ3Qgc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuCi0JCQkJeSA9IGNhbnZhc0JvdW5kcy5oZWlnaHQgLSBoZWlnaHQ7Ci0JCQl9Ci0JCQlpbWFnZUNhbnZhcy5zY3JvbGwoaXgsIHksIGl4LCBpeSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwotCQkJaXkgPSB5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcGFsZXR0ZSBjYW52YXMnIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBzZWxlY3RlZC4KLQkgKi8KLQl2b2lkIHNjcm9sbFBhbGV0dGUoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7Ci0JCWlmIChwYWxldHRlSGVpZ2h0ID4gY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJLy8gT25seSBzY3JvbGwgaWYgdGhlIHBhbGV0dGUgaXMgYmlnZ2VyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWludCB5ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh5ICsgcGFsZXR0ZUhlaWdodCA8IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCQkvLyBEb24ndCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYWxldHRlLgotCQkJCXkgPSBjYW52YXNCb3VuZHMuaGVpZ2h0IC0gcGFsZXR0ZUhlaWdodDsKLQkJCX0KLQkJCXBhbGV0dGVDYW52YXMuc2Nyb2xsKDAsIHksIDAsIHB5LCBwYWxldHRlV2lkdGgsIHBhbGV0dGVIZWlnaHQsIGZhbHNlKTsKLQkJCXB5ID0geTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lLWJ5LWxpbmUgZHVtcCBvZgotCSAqIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IGltYWdlRGF0YS4gVGhlIGxpbmVEZWxpbWl0ZXIKLQkgKiBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMSBvciAyLgotCSAqLwotCVN0cmluZyBkYXRhSGV4RHVtcChTdHJpbmcgbGluZURlbGltaXRlcikgewotCQlmaW5hbCBpbnQgTUFYX0RVTVAgPSAxMDI0ICogMTAyNDsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybiAiIjsKLQkJYm9vbGVhbiB0cnVuY2F0ZWQgPSBmYWxzZTsKLQkJY2hhcltdIGR1bXAgPSBudWxsOwotCQlieXRlW10gYWxwaGFzID0gaW1hZ2VEYXRhLmFscGhhRGF0YTsKLQkJdHJ5IHsKLQkJCWludCBsZW5ndGggPSBpbWFnZURhdGEuaGVpZ2h0ICogKDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkpOwotCQkJaWYgKGFscGhhcyAhPSBudWxsICYmIGFscGhhcy5sZW5ndGggPiAwKSB7Ci0JCQkJbGVuZ3RoICs9IGltYWdlRGF0YS5oZWlnaHQgKiAoNiArIDMgKiBpbWFnZURhdGEud2lkdGggKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKSArIDYgKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpOwotCQkJfQotCQkJZHVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJLyogVG9vIG11Y2ggZGF0YSB0byBkdW1wIC0gdHJ1bmNhdGUuICovCi0JCQlkdW1wID0gbmV3IGNoYXJbTUFYX0RVTVBdOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpbnQgaW5kZXggPSAwOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICUgaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSA9PSAwKSB7Ci0JCQkJCWludCBsaW5lID0gaSAvIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnOic7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJfQotCQkJCWJ5dGUgYiA9IGltYWdlRGF0YS5kYXRhW2ldOwotCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGIgJiAweEYwKSA+PiA0LCAxNik7Ci0JCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChiICYgMHgwRiwgMTYpOwotCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJaWYgKChpICsgMSkgJSBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lID09IDApIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChhbHBoYXMgIT0gbnVsbCAmJiBhbHBoYXMubGVuZ3RoID4gMCkgewotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ldyBjaGFyW117J0EnLCdsJywncCcsJ2gnLCdhJywnOid9LCAwLCBkdW1wLCBpbmRleCwgNik7Ci0JCQkJaW5kZXggKz02OwotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAlIGltYWdlRGF0YS53aWR0aCA9PSAwKSB7Ci0JCQkJCQlpbnQgbGluZSA9IGkgLyBpbWFnZURhdGEud2lkdGg7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAwICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9ICc6JzsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCX0KLQkJCQkJYnl0ZSBiID0gYWxwaGFzW2ldOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiICYgMHhGMCkgPj4gNCwgMTYpOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGIgJiAweDBGLCAxNik7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCWlmICgoaSArIDEpICUgaW1hZ2VEYXRhLndpZHRoID09IDApIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7fQotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGR1bXApOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCS8qIFRvbyBtdWNoIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgdGV4dCB3aWRnZXQgLSB0cnVuY2F0ZS4gKi8KLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoZHVtcCwgMCwgTUFYX0RVTVApOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAodHJ1bmNhdGVkKSByZXN1bHQgKz0gIlxuIC4uLmRhdGEgZHVtcCB0cnVuY2F0ZWQgYXQgIiArIE1BWF9EVU1QICsgImJ5dGVzLi4uIjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoKLQkgKiBPcGVuIGFuIGVycm9yIGRpYWxvZyBkaXNwbGF5aW5nIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBzaG93RXJyb3JEaWFsb2coU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGZpbGVuYW1lLCBUaHJvd2FibGUgZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCVN0cmluZyBtZXNzYWdlID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkVycm9yIiksIG5ldyBTdHJpbmdbXSB7b3BlcmF0aW9uLCBmaWxlbmFtZX0pOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSB7Ci0JCQkJU1dURXhjZXB0aW9uIHN3dGUgPSAoU1dURXhjZXB0aW9uKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJCQlTV1RFcnJvciBzd3RlID0gKFNXVEVycm9yKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJYm94LnNldE1lc3NhZ2UobWVzc2FnZSArIGVycm9yTWVzc2FnZSk7Ci0JCWJveC5vcGVuKCk7Ci0JfQotCQotCS8qCi0JICogT3BlbiBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgQk1QIGZpbGUgdG8gc2F2ZS4KLQkgKi8KLQlpbnQgc2hvd0JNUERpYWxvZygpIHsKLQkJZmluYWwgaW50IFtdIGJtcFR5cGUgPSBuZXcgaW50WzFdOwotCQlibXBUeXBlWzBdID0gU1dULklNQUdFX0JNUDsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgcmFkaW9TZWxlY3RlZCA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJ1dHRvbiByYWRpbyA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCQlpZiAocmFkaW8uZ2V0U2VsZWN0aW9uKCkpIGJtcFR5cGVbMF0gPSAoKEludGVnZXIpcmFkaW8uZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9OwotCQkvLyBuZWVkIHRvIGV4dGVybmFsaXplIHN0cmluZ3MKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCi0JCWRpYWxvZy5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZSIpKTsKLQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9sYWJlbCIpKTsKLQkJCi0JCUJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUkFESU8pOwotCQlyYWRpby5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9ub19jb21wcmVzcyIpKTsKLQkJcmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0KLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfcmxlX2NvbXByZXNzIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVBfUkxFKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCQkKLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfb3MyIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9PUzJfQk1QKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlvay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9LIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCW9rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRpYWxvZy5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmV0dXJuIGJtcFR5cGVbMF07Ci0JfQkKLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIGhvdyB0byBhbmFseXplIHRoZSBieXRlcwotCSAqIGluIHRoZSBoZXggZHVtcC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGRlcHRoSW5mbyhpbnQgZGVwdGgpIHsKLQkJT2JqZWN0W10gYXJncyA9IHtuZXcgSW50ZWdlcihkZXB0aCksICIifTsKLQkJc3dpdGNoIChkZXB0aCkgewotCQkJY2FzZSAxOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksIAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcig4KSwgIiBbMDEyMzQ1NjddIn0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksCi0JCQkJICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDQpLCAiWzAwMTEyMjMzXSJ9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX3BpeGVscyIpLAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcigyKSwgIlswMDAwMTExMV0ifSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJYXJnc1sxXSA9IGJ1bmRsZS5nZXRTdHJpbmcoIk9uZV9ieXRlIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfYnl0ZXMiKSwgbmV3IEludGVnZXIoMikpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX2J5dGVzIiksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9ieXRlcyIpLCBuZXcgSW50ZWdlcig0KSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFyZ3NbMV0gPSBidW5kbGUuZ2V0U3RyaW5nKCJVbnN1cHBvcnRlZF9sYyIpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfaW5mbyIpLCBhcmdzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpcyB0b28gc21hbGwKLQkgKiB0byBzZWUgYSB2aXN1YWwgY2hhbmdlLCB0aGVuIHJldHVybiBhIGhpZ2hlciBudW1iZXIuCi0JICovCi0Jc3RhdGljIGludCB2aXNpYmxlRGVsYXkoaW50IG1zKSB7Ci0JCWlmIChtcyA8IDIwKSByZXR1cm4gbXMgKyAzMDsKLQkJaWYgKG1zIDwgMzApIHJldHVybiBtcyArIDEwOwotCQlyZXR1cm4gbXM7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXhCeXRlU3RyaW5nKGludCBpKSB7Ci0JCWlmIChpIDw9IDB4MGYpCi0JCQlyZXR1cm4gIjAiICsgSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaSAmIDB4ZmYpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgNC1ieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqIChhIGJpdCAnYnJ1dGUgZm9yY2UnLi4uIHNob3VsZCBwcm9iYWJseSB1c2UgYSBsb29wLi4uKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXg0Qnl0ZVN0cmluZyhpbnQgaSkgewotCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuICIwMDAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAyKQotCQkJcmV0dXJuICIwMDAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDMpCi0JCQlyZXR1cm4gIjAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA0KQotCQkJcmV0dXJuICIwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA1KQotCQkJcmV0dXJuICIwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDYpCi0JCQlyZXR1cm4gIjAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA3KQotCQkJcmV0dXJuICIwIiArIGhleDsKLQkJcmV0dXJuIGhleDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkCi0JICogdHJhbnNwYXJlbnQgb3IgYmFja2dyb3VuZCBwaXhlbC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHBpeGVsSW5mbyhpbnQgcGl4ZWwpIHsKLQkJaWYgKHBpeGVsID09IC0xKSB7Ci0JCQlyZXR1cm4gcGl4ZWwgKyAiICgiICsgYnVuZGxlLmdldFN0cmluZygiTm9uZV9sYyIpICsgIikiOwotCQl9Ci0JCXJldHVybiBwaXhlbCArICIgKDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpICsgIikiOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWwgbWV0aG9kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZGlzcG9zYWxTdHJpbmcoaW50IGRpc3Bvc2FsTWV0aG9kKSB7Ci0JCXN3aXRjaCAoZGlzcG9zYWxNZXRob2QpIHsKLQkJCWNhc2UgU1dULkRNX0ZJTExfTk9ORTogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIk5vbmVfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfUFJFVklPVVM6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91c19sYyIpOwotCQl9Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbnNwZWNpZmllZF9sYyIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZmlsZSB0eXBlLgotCSAqLwotCVN0cmluZyBmaWxlVHlwZVN0cmluZyhpbnQgZmlsZXR5cGUpIHsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9CTVApCi0JCQlyZXR1cm4gIkJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfQk1QX1JMRSkKLQkJCXJldHVybiAiUkxFIiArIGltYWdlRGF0YS5kZXB0aCArICIgQk1QIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9PUzJfQk1QKQotCQkJcmV0dXJuICJPUy8yIEJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfR0lGKQotCQkJcmV0dXJuICJHSUYiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0lDTykKLQkJCXJldHVybiAiSUNPIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9KUEVHKQotCQkJcmV0dXJuICJKUEVHIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9QTkcpCi0JCQlyZXR1cm4gIlBORyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVElGRikKLQkJCXJldHVybiAiVElGRiI7Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2FjIik7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZmlsZSdzIGltYWdlIHR5cGUsIGJhc2VkIG9uIGl0cyBleHRlbnNpb24uCi0JICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgdmVyeSByb2J1c3Qgd2F5IHRvIGRldGVybWluZSBpbWFnZSB0eXBlLAotCSAqIGFuZCBpdCBpcyBvbmx5IHRvIGJlIHVzZWQgaW4gdGhlIGFic2VuY2Ugb2YgYW55IGJldHRlciBtZXRob2QuCi0JICovCi0JaW50IGRldGVybWluZUZpbGVUeXBlKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmcgZXh0ID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJibXAiKSkgewotCQkJcmV0dXJuIHNob3dCTVBEaWFsb2coKTsKLQkJfQotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImdpZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9HSUY7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiaWNvIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0lDTzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqcGciKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgianBlZyIpIHx8IGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqZmlmIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0pQRUc7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgicG5nIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX1BORzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0aWYiKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgidGlmZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9USUZGOwotCQlyZXR1cm4gU1dULklNQUdFX1VOREVGSU5FRDsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjcmVhdGVNc2coU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgewotCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KG1zZyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGFyZ3MpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGNyZWF0ZU1zZyhTdHJpbmcgbXNnLCBPYmplY3QgYXJnKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE1lc3NhZ2VGb3JtYXQobXNnKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQobmV3IE9iamVjdFtde2FyZ30pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVkZTQ3Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWNsYXNzIEphdmFMaW5lU3R5bGVyIGltcGxlbWVudHMgTGluZVN0eWxlTGlzdGVuZXIgewotCUphdmFTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YVNjYW5uZXIoKTsKLQlpbnRbXSB0b2tlbkNvbG9yczsKLQlDb2xvcltdIGNvbG9yczsKLQlWZWN0b3IgYmxvY2tDb21tZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9MPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUkQ9CQkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFPQkJMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVk9CQkJMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UPQkJMzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HPQkJNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUj0JCTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSPQkJNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fVE9LRU49IDg7Ci0KLXB1YmxpYyBKYXZhTGluZVN0eWxlcigpIHsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci0Jc2Nhbm5lciA9IG5ldyBKYXZhU2Nhbm5lcigpOwotfQotCi1Db2xvciBnZXRDb2xvcihpbnQgdHlwZSkgewotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRva2VuQ29sb3JzLmxlbmd0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGNvbG9yc1t0b2tlbkNvbG9yc1t0eXBlXV07Ci19Ci0KLWJvb2xlYW4gaW5CbG9ja0NvbW1lbnQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGJsb2NrQ29tbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJaW50W10gb2Zmc2V0cyA9IChpbnRbXSlibG9ja0NvbW1lbnRzLmVsZW1lbnRBdChpKTsKLQkJLy8gc3RhcnQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMF0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzBdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQkvLyBlbmQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMV0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzFdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQlpZiAoKG9mZnNldHNbMF0gPD0gc3RhcnQpICYmIChvZmZzZXRzWzFdID49IGVuZCkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQljb2xvcnM9IG5ldyBDb2xvcltdIHsKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMCwgMCkpLAkJLy8gYmxhY2sKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjU1LCAwLCAwKSksCS8vIHJlZAotCQluZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAyNTUsIDApKSwJLy8gZ3JlZW4KLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgICAwLCAyNTUpKQkvLyBibHVlCi0JfTsKLQl0b2tlbkNvbG9ycz0gbmV3IGludFtNQVhJTVVNX1RPS0VOXTsKLQl0b2tlbkNvbG9yc1tXT1JEXT0JCTA7Ci0JdG9rZW5Db2xvcnNbV0hJVEVdPQkJMDsKLQl0b2tlbkNvbG9yc1tLRVldPQkJMzsgCi0JdG9rZW5Db2xvcnNbQ09NTUVOVF09CTE7IAotCXRva2VuQ29sb3JzW1NUUklOR109IAkyOyAKLQl0b2tlbkNvbG9yc1tPVEhFUl09CQkwOwotCXRva2VuQ29sb3JzW05VTUJFUl09CTA7Ci19Ci0KLXZvaWQgZGlzcG9zZUNvbG9ycygpIHsKLQlmb3IgKGludCBpPTA7aTxjb2xvcnMubGVuZ3RoO2krKykgewotCQljb2xvcnNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotLyoqCi0gKiBFdmVudC5kZXRhaWwJCQlsaW5lIHN0YXJ0IG9mZnNldCAoaW5wdXQpCQotICogRXZlbnQudGV4dCAJCQlsaW5lIHRleHQgKGlucHV0KQotICogTGluZVN0eWxlRXZlbnQuc3R5bGVzIAlFbnVtZXJhdGlvbiBvZiBTdHlsZVJhbmdlcywgbmVlZCB0byBiZSBpbiBvcmRlci4gKG91dHB1dCkKLSAqIExpbmVTdHlsZUV2ZW50LmJhY2tncm91bmQgCWxpbmUgYmFja2dyb3VuZCBjb2xvciAob3V0cHV0KQotICovCi1wdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQlWZWN0b3Igc3R5bGVzID0gbmV3IFZlY3RvcigpOwotCWludCB0b2tlbjsKLQlTdHlsZVJhbmdlIGxhc3RTdHlsZTsKLQkvLyBJZiB0aGUgbGluZSBpcyBwYXJ0IG9mIGEgYmxvY2sgY29tbWVudCwgY3JlYXRlIG9uZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBsaW5lLgotCWlmIChpbkJsb2NrQ29tbWVudChldmVudC5saW5lT2Zmc2V0LCBldmVudC5saW5lT2Zmc2V0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCkpKSB7Ci0JCXN0eWxlcy5hZGRFbGVtZW50KG5ldyBTdHlsZVJhbmdlKGV2ZW50LmxpbmVPZmZzZXQsIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpLCBnZXRDb2xvcihDT01NRU5UKSwgbnVsbCkpOwotCQlldmVudC5zdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtzdHlsZXMuc2l6ZSgpXTsKLQkJc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci0JCXJldHVybjsKLQl9Ci0JQ29sb3IgZGVmYXVsdEZnQ29sb3IgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRGb3JlZ3JvdW5kKCk7Ci0Jc2Nhbm5lci5zZXRSYW5nZShldmVudC5saW5lVGV4dCk7Ci0JdG9rZW4gPSBzY2FubmVyLm5leHRUb2tlbigpOwotCXdoaWxlICh0b2tlbiAhPSBFT0YpIHsKLQkJaWYgKHRva2VuID09IE9USEVSKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub24tY29sb3JlZCB0b2tlbnMKLQkJfSBlbHNlIGlmICh0b2tlbiAhPSBXSElURSkgewotCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcih0b2tlbik7Ci0JCQkvLyBPbmx5IGNyZWF0ZSBhIHN0eWxlIGlmIHRoZSB0b2tlbiBjb2xvciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgCi0JCQkvLyB3aWRnZXQncyBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IgYW5kIHRoZSB0b2tlbidzIHN0eWxlIGlzIG5vdCAKLQkJCS8vIGJvbGQuICBLZXl3b3JkcyBhcmUgYm9sZGVkLgotCQkJaWYgKCghY29sb3IuZXF1YWxzKGRlZmF1bHRGZ0NvbG9yKSkgfHwgKHRva2VuID09IEtFWSkpIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2Nhbm5lci5nZXRTdGFydE9mZnNldCgpICsgZXZlbnQubGluZU9mZnNldCwgc2Nhbm5lci5nZXRMZW5ndGgoKSwgY29sb3IsIG51bGwpOwotCQkJCWlmICh0b2tlbiA9PSBLRVkpIHsKLQkJCQkJc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCXN0eWxlcy5hZGRFbGVtZW50KHN0eWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBNZXJnZSBzaW1pbGFyIHN0eWxlcy4gIERvaW5nIHNvIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZS4KLQkJCQkJbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChsYXN0U3R5bGUuc2ltaWxhclRvKHN0eWxlKSAmJiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkpIHsKLQkJCQkJCWxhc3RTdHlsZS5sZW5ndGggKz0gc3R5bGUubGVuZ3RoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOyAKLQkJCQkJfQotCQkJCX0gCi0JCQl9IAotCQl9IGVsc2UgaWYgKCghc3R5bGVzLmlzRW1wdHkoKSkgJiYgKChsYXN0U3R5bGU9KFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCkpLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCkpIHsKLQkJCWludCBzdGFydCA9IHNjYW5uZXIuZ2V0U3RhcnRPZmZzZXQoKSArIGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCQlsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCS8vIEEgZm9udCBzdHlsZSBvZiBTV1QuQk9MRCBpbXBsaWVzIHRoYXQgdGhlIGxhc3Qgc3R5bGUKLQkJCS8vIHJlcHJlc2VudHMgYSBqYXZhIGtleXdvcmQuCi0JCQlpZiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdGFydCkgewotCQkJCS8vIEhhdmUgdGhlIHdoaXRlIHNwYWNlIHRha2Ugb24gdGhlIHN0eWxlIGJlZm9yZSBpdCB0byAKLQkJCQkvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHN0eWxlIHJhbmdlcyBjcmVhdGVkIGFuZCB0aGUKLQkJCQkvLyBudW1iZXIgb2YgZm9udCBzdHlsZSBjaGFuZ2VzIGR1cmluZyByZW5kZXJpbmcuCi0JCQkJbGFzdFN0eWxlLmxlbmd0aCArPSBzY2FubmVyLmdldExlbmd0aCgpOwotCQkJfQotCQl9IAotCQl0b2tlbj0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLQl9Ci0JZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLnNpemUoKV07Ci0Jc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci19Ci1wdWJsaWMgdm9pZCBwYXJzZUJsb2NrQ29tbWVudHMoU3RyaW5nIHRleHQpIHsKLQlibG9ja0NvbW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZ1JlYWRlciBidWZmZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotCWludCBjaDsKLQlib29sZWFuIGJsa0NvbW1lbnQgPSBmYWxzZTsKLQlpbnQgY250ID0gMDsKLQlpbnRbXSBvZmZzZXRzID0gbmV3IGludFsyXTsKLQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkKLQl0cnkgewotCXdoaWxlICghZG9uZSkgewotCQlzd2l0Y2ggKGNoID0gYnVmZmVyLnJlYWQoKSkgewotCQkJY2FzZSAtMSA6IHsKLQkJCQlpZiAoYmxrQ29tbWVudCkgewotCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQlibG9ja0NvbW1lbnRzLmFkZEVsZW1lbnQob2Zmc2V0cyk7Ci0JCQkJfQotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAnLycgOiB7Ci0JCQkJY2ggPSBidWZmZXIucmVhZCgpOwotCQkJCWlmICgoY2ggPT0gJyonKSAmJiAoIWJsa0NvbW1lbnQpKSB7Ci0JCQkJCW9mZnNldHMgPSBuZXcgaW50WzJdOwotCQkJCQlvZmZzZXRzWzBdID0gY250OwotCQkJCQlibGtDb21tZW50ID0gdHJ1ZTsKLQkJCQkJY250Kys7CQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNudCsrOwotCQkJCX0JCQkJCQkKLQkJCQljbnQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgJyonIDogewotCQkJCWlmIChibGtDb21tZW50KSB7Ci0JCQkJCWNoID0gYnVmZmVyLnJlYWQoKTsKLQkJCQkJY250Kys7Ci0JCQkJCWlmIChjaCA9PSAnLycpIHsKLQkJCQkJCWJsa0NvbW1lbnQgPSBmYWxzZTsJCi0JCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQkJYmxvY2tDb21tZW50cy5hZGRFbGVtZW50KG9mZnNldHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNudCsrOwkKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY250Kys7CQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQkJCi0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSBlcnJvcnMKLQl9Ci19Ci0KLS8qKgotICogQSBzaW1wbGUgZnV6enkgc2Nhbm5lciBmb3IgSmF2YQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmZ0tleXM9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmRG9jOwotCXByb3RlY3RlZCBpbnQgZlBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmQ7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnRUb2tlbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRW9mU2Vlbj0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZnS2V5d29yZHM9IHsgCi0JCSJhYnN0cmFjdCIsCi0JCSJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLAotCQkiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnRpbnVlIiwKLQkJImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwKLQkJImVsc2UiLCAiZXh0ZW5kcyIsCi0JCSJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0JCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludCIsICJpbnRlcmZhY2UiLAotCQkibG9uZyIsCi0JCSJuYXRpdmUiLCAibmV3IiwgIm51bGwiLAotCQkicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLAotCQkicmV0dXJuIiwKLQkJInNob3J0IiwgInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwKLQkJInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnVlIiwgInRyeSIsCi0JCSJ2b2lkIiwgInZvbGF0aWxlIiwKLQkJIndoaWxlIgotCX07Ci0KLQlwdWJsaWMgSmF2YVNjYW5uZXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlBvcyAtIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGxvb2t1cCB0YWJsZS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZnS2V5cz0gbmV3IEhhc2h0YWJsZSgpOwotCQlJbnRlZ2VyIGs9IG5ldyBJbnRlZ2VyKEtFWSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJZmdLZXlzLnB1dChmZ0tleXdvcmRzW2ldLCBrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgbGV4aWNhbCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oKSB7Ci0JCWludCBjOwotCQlmU3RhcnRUb2tlbj0gZlBvczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXN3aXRjaCAoYz0gcmVhZCgpKSB7CQkJCi0JCQljYXNlIEVPRjoKLQkJCQlyZXR1cm4gRU9GOwkJCQkKLQkJCWNhc2UgJy8nOgkvLyBjb21tZW50Ci0JCQkJYz0gcmVhZCgpOwotCQkJCWlmIChjID09ICcvJykgewotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQkJaWYgKChjID09IEVPRikgfHwgKGMgPT0gRU9MKSkgewotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gQ09NTUVOVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE9USEVSOwotCQkJY2FzZSAnXCcnOgkvLyBjaGFyIGNvbnN0Ci0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCXJldHVybiBTVFJJTkc7Ci0JCQkJCQljYXNlIEVPRjoKLQkJCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgJ1xcJzoKLQkJCQkJCQljPSByZWFkKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJfQotCi0JCQljYXNlICciJzoJLy8gc3RyaW5nCi0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgRU9GOgotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSAnXFwnOgotCQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQkJCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJCQlkbyB7Ci0JCQkJCWM9IHJlYWQoKTsKLQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMpKTsKLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE5VTUJFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpIHsKLQkJCQkJZG8gewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpOwotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCXJldHVybiBXSElURTsKLQkJCQl9Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpYykpIHsKLQkJCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJCWRvIHsKLQkJCQkJCWZCdWZmZXIuYXBwZW5kKChjaGFyKWMpOwotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoY2hhciljKSk7Ci0JCQkJCXVucmVhZChjKTsKLQkJCQkJSW50ZWdlciBpPSAoSW50ZWdlcikgZmdLZXlzLmdldChmQnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGkuaW50VmFsdWUoKTsKLQkJCQkJCXJldHVybiBXT1JEOwotCQkJCX0KLQkJCQlyZXR1cm4gT1RIRVI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVhZCgpIHsKLQkJaWYgKGZQb3MgPD0gZkVuZCkgewotCQkJcmV0dXJuIGZEb2MuY2hhckF0KGZQb3MrKyk7Ci0JCX0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZShTdHJpbmcgdGV4dCkgewotCQlmRG9jPSB0ZXh0OwotCQlmUG9zPSAwOwotCQlmRW5kPSBmRG9jLmxlbmd0aCgpIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVhZChpbnQgYykgewotCQlpZiAoYyAhPSBFT0YpCi0JICAgIAlmUG9zLS07Ci0JfQotfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYTM0Y2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyIHsgIAotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgdGV4dDsKLQlKYXZhTGluZVN0eWxlciBsaW5lU3R5bGVyID0gbmV3IEphdmFMaW5lU3R5bGVyKCk7Ci0JRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2phdmF2aWV3ZXIiKTsKLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JTWVudUl0ZW0gaXRlbTsKLQotCS8vIE9wZW4gCi0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiT3Blbl9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ08nKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJb3BlbkZpbGUoKTsKLQkJfQotCX0pOwotCi0JLy8gRXhpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkV4aXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbWVudUZpbGVFeGl0ICgpOwotCQl9Ci0JfSk7Ci0JcmV0dXJuIG1lbnU7Ci19Ci0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLX0KLQotdm9pZCBjcmVhdGVTaGVsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIldpbmRvd190aXRsZSIpKTsJCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQgKFNoZWxsRXZlbnQgZSkgewotCQkJbGluZVN0eWxlci5kaXNwb3NlQ29sb3JzKCk7Ci0JCQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpbmVTdHlsZXIpOwotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVN0eWxlZFRleHQoKSB7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaW5lU3R5bGVyKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlDb2xvciBiZyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQl0ZXh0LnNldEJhY2tncm91bmQoYmcpOwotfQotCi12b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlKYXZhVmlld2VyIGV4YW1wbGUgPSBuZXcgSmF2YVZpZXdlciAoKTsKLQlTaGVsbCBzaGVsbCA9IGV4YW1wbGUub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKQotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWNyZWF0ZVNoZWxsIChkaXNwbGF5KTsKLQljcmVhdGVNZW51QmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgb3BlbkZpbGUoKSB7CQotCWlmIChmaWxlRGlhbG9nID09IG51bGwpIHsKLQkJZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JfQotCi0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkKLQlvcGVuKG5hbWUpOwotfQotCi12b2lkIG9wZW4oU3RyaW5nIG5hbWUpIHsKLQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkKLQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHJldHVybjsKLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc291cmNlcy5nZXRTdHJpbmcoIkVycl9maWxlX25vX2V4aXN0IiksIG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXROYW1lKCl9KTsKLQkJZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JdHJ5IHsKLQkJRmlsZUlucHV0U3RyZWFtIHN0cmVhbT0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldFBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCWludCBuOwotCQkJd2hpbGUgKChuID0gaW4ucmVhZChyZWFkQnVmZmVyKSkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCX0KLQkJCXRleHRTdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFcnJfZmlsZV9pbwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJfZmlsZV9pbyIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQlkaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzb3VyY2VzLmdldFN0cmluZygiRXJyX25vdF9mb3VuZCIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCWRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBHdWFyZCBhZ2FpbnN0IHN1cGVyZmx1b3VzIG1vdXNlIG1vdmUgZXZlbnRzIC0tIGRlZmVyIGFjdGlvbiB1bnRpbCBsYXRlcgotCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQl9Ci0JfSk7CQotCQotCS8vIHBhcnNlIHRoZSBibG9jayBjb21tZW50cyB1cCBmcm9udCBzaW5jZSBibG9jayBjb21tZW50cyBjYW4gZ28gYWNyb3NzCi0JLy8gbGluZXMgLSBpbmVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhpcwotCWxpbmVTdHlsZXIucGFyc2VCbG9ja0NvbW1lbnRzKHRleHRTdHJpbmcpOwotfQotCi12b2lkIG1lbnVGaWxlRXhpdCAoKSB7Ci0Jc2hlbGwuY2xvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRiMDY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgRmlsbExheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JRmlsbExheW91dCBmaWxsTGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUZpbGxMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCQkJCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCQluZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvKiBBZGQgbGlzdGVuZXIgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHRhYmxlICovCi0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0ICgwLCBTdHJpbmcudmFsdWVPZiAodGFibGUuaW5kZXhPZiAoaXRlbSkpKTsKLQkJCQlpdGVtLnNldFRleHQgKDEsICJCdXR0b24iKTsKLQkJCQlkYXRhLmFkZEVsZW1lbnQgKCJCdXR0b24iKTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIEZpbGxMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlob3Jpem9udGFsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaG9yaXpvbnRhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdmVydGljYWwgPSBuZXcgQnV0dG9uICh0eXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJdmVydGljYWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOyAKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCQotCQkvKiBQb3NpdGlvbiB0aGUgc2FzaCAqLwotCQlzYXNoLnNldFdlaWdodHMgKG5ldyBpbnQgW10gezQsMX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCWZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAoZmlsbExheW91dCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTtcbiIpOwotCQlpZiAoZmlsbExheW91dC50eXBlID09IFNXVC5WRVJUSUNBTCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0ZmlsbExheW91dC50eXBlID0gU1dULlZFUlRJQ0FMO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQgKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTtcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyIiLCJDb250cm9sIn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZpbGxMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJaWYgKG9sZEl0ZW0gIT0gbnVsbCkgewotCQkJaW50IHJvdyA9IHRhYmxlLmluZGV4T2YgKG9sZEl0ZW0pOwotCQkJZGF0YS5pbnNlcnRFbGVtZW50QXQgKGNvbWJvLmdldFRleHQgKCksIHJvdyk7Ci0JCQlvbGRJdGVtLnNldFRleHQgKDEsIGRhdGEuZWxlbWVudEF0IChyb3cpLnRvU3RyaW5nICgpKTsKLQkJCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQlpZiAodmVydGljYWwuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKLQkJfSBlbHNlIHsKLQkJCWZpbGxMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Gb3JtTGF5b3V0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkYjZkYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIEZvcm1MYXlvdXRUYWIgZXh0ZW5kcyBUYWIgewotCS8qIENvbnRyb2xzIGZvciBzZXR0aW5nIGxheW91dCBwYXJhbWV0ZXJzICovCi0JQ29tYm8gbWFyZ2luSGVpZ2h0LCBtYXJnaW5XaWR0aDsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQ7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBjb21ib0VkaXRvciwgd2lkdGhFZGl0b3IsIGhlaWdodEVkaXRvcjsKLQlUYWJsZUVkaXRvciBsZWZ0RWRpdG9yLCByaWdodEVkaXRvciwgdG9wRWRpdG9yLCBib3R0b21FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCVRleHQgd2lkdGhUZXh0LCBoZWlnaHRUZXh0OwotCUJ1dHRvbiBsZWZ0QXR0YWNoLCByaWdodEF0dGFjaCwgdG9wQXR0YWNoLCBib3R0b21BdHRhY2g7Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBMRUZUX0NPTCA9IDQ7Ci0JZmluYWwgaW50IFJJR0hUX0NPTCA9IDU7Ci0JZmluYWwgaW50IFRPUF9DT0wgPSA2OwotCWZpbmFsIGludCBCT1RUT01fQ09MID0gNzsKLQkKLQlmaW5hbCBpbnQgTU9ESUZZX0NPTFMgPSA0OwkvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgd2l0aCBjb21ibyBvciB0ZXh0IGVkaXRvcnMKLQlmaW5hbCBpbnQgVE9UQUxfQ09MUyA9IDg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlGb3JtTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBmb3IgdGhlIGFsaWdubWVudCBmb3IgYW4KLQkgKiBhdHRhY2htZW50IGdpdmVuIGEgc3RyaW5nLgotCSAqLwotCWludCBhbGlnbm1lbnRDb25zdGFudCAoU3RyaW5nIGFsaWduKSB7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkxFRlQiKSkgcmV0dXJuIFNXVC5MRUZUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJSSUdIVCIpKSByZXR1cm4gU1dULlJJR0hUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJUT1AiKSkgcmV0dXJuIFNXVC5UT1A7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkJPVFRPTSIpKSByZXR1cm4gU1dULkJPVFRPTTsKLQkJaWYgKGFsaWduLmVxdWFscygiQ0VOVEVSIikpIHJldHVybiBTV1QuQ0VOVEVSOwotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhbGlnbm1lbnQgZm9yIGFuCi0JICogYXR0YWNobWVudCBnaXZlbiBhIGNvbnN0YW50LgotCSAqLwotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcgKGludCBhbGlnbikgewotCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCQljYXNlIFNXVC5MRUZUOiByZXR1cm4gIkxFRlQiOwotCQkJY2FzZSBTV1QuUklHSFQ6IHJldHVybiAiUklHSFQiOwotCQkJY2FzZSBTV1QuVE9QOiByZXR1cm4gIlRPUCI7Ci0JCQljYXNlIFNXVC5CT1RUT006IHJldHVybiAiQk9UVE9NIjsKLQkJCWNhc2UgU1dULkNFTlRFUjogcmV0dXJuICJDRU5URVIiOwotCQl9Ci0JCXJldHVybiAiREVGQVVMVCI7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYXR0YWNobWVudCBmaWVsZCBpbiBjYXNlIHRoZSB0eXBlIG9mIGNvbnRyb2wKLQkgKiBoYXMgY2hhbmdlZC4gCi0JICovCi0JU3RyaW5nIGNoZWNrQXR0YWNobWVudCAoU3RyaW5nIG9sZEF0dGFjaCwgRm9ybUF0dGFjaG1lbnQgbmV3QXR0YWNoKSB7Ci0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBuZXdBdHRhY2guY29udHJvbC5nZXRDbGFzcygpLnRvU3RyaW5nICgpOwotCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG9sZEF0dGFjaC5sZW5ndGggKCkgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KG9sZEF0dGFjaC5jaGFyQXQgKGkpKSkgewotCQkJaSsrOwotCQl9Ci0JCVN0cmluZyBpbmRleCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKGksIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJcmV0dXJuIGNvbnRyb2xUeXBlICsgaW5kZXggKyAiLCIgKyBuZXdBdHRhY2gub2Zmc2V0ICsgIjoiICsgYWxpZ25tZW50U3RyaW5nIChuZXdBdHRhY2guYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogUmVzaXplIHRoZSBjb2x1bW5zICovCi0JCXRhYmxlLmdldENvbHVtbiAoTEVGVF9DT0wpLnNldFdpZHRoICgxMDApOwotCQl0YWJsZS5nZXRDb2x1bW4gKFJJR0hUX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoVE9QX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoQk9UVE9NX0NPTCkuc2V0V2lkdGggKDEwMCk7Ci0JCQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8JCQkKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWxlZnRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJcmlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdG9wRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWJvdHRvbUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMoKTsKLQkJCQlpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4ICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChlLngsIGUueSk7Ci0gICAgICAgICAgICAgICAgbmV3SXRlbSA9IHRhYmxlLmdldEl0ZW0gKHB0KTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG9sZEl0ZW0gfHwgbmV3SXRlbSAhPSBsYXN0U2VsZWN0ZWQpIHsKLQkJCQkJbGFzdFNlbGVjdGVkID0gbmV3SXRlbTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0YWJsZS5zaG93U2VsZWN0aW9uICgpOwotCQkJCQotCQkJCWNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5SRUFEX09OTFkpOwotCQkJCWNyZWF0ZUNvbWJvRWRpdG9yIChjb21ibywgY29tYm9FZGl0b3IpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtXSURUSF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotCQkJCQotCQkJCWxlZnRBdHRhY2ggPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULlBVU0gpOwotCQkJCWxlZnRBdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWxlZnRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWxlZnRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWxlZnRFZGl0b3IubWluaW11bVdpZHRoID0gbGVmdEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWxlZnRFZGl0b3Iuc2V0RWRpdG9yIChsZWZ0QXR0YWNoLCBuZXdJdGVtLCBMRUZUX0NPTCk7Ci0JCQkJbGVmdEF0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJCQkJQXR0YWNoRGlhbG9nIGRpYWxvZyA9IG5ldyBBdHRhY2hEaWFsb2cgKHNoZWxsKTsKLQkJCQkJCWRpYWxvZy5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGVmdF9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoTEVGVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNoKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXJpZ2h0QXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlyaWdodEF0dGFjaC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQXR0YWNoX0VkaXQiKSk7Ci0JCQkJcmlnaHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXJpZ2h0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlyaWdodEVkaXRvci5taW5pbXVtV2lkdGggPSByaWdodEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXJpZ2h0RWRpdG9yLnNldEVkaXRvciAocmlnaHRBdHRhY2gsIG5ld0l0ZW0sIFJJR0hUX0NPTCk7Ci0JCQkJcmlnaHRBdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlJpZ2h0X0F0dGFjaG1lbnQiKSk7Ci0JCQkJCQlkaWFsb2cuc2V0Q29sdW1uIChSSUdIVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChSSUdIVF9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChMRUZUX0NPTCkuZW5kc1dpdGggKCIpIikpIG5ld0l0ZW0uc2V0VGV4dCAoTEVGVF9DT0wsICIiKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXRvcEF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJdG9wQXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQl0b3BFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXRvcEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdG9wRWRpdG9yLm1pbmltdW1XaWR0aCA9IHRvcEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXRvcEVkaXRvci5zZXRFZGl0b3IgKHRvcEF0dGFjaCwgbmV3SXRlbSwgVE9QX0NPTCk7Ci0JCQkJdG9wQXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUb3BfQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKFRPUF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCBhdHRhY2gpOwotCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYm90dG9tQXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlib3R0b21BdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWJvdHRvbUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJYm90dG9tRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlib3R0b21FZGl0b3IubWluaW11bVdpZHRoID0gYm90dG9tQXR0YWNoLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCQkJYm90dG9tRWRpdG9yLnNldEVkaXRvciAoYm90dG9tQXR0YWNoLCBuZXdJdGVtLCBCT1RUT01fQ09MKTsKLQkJCQlib3R0b21BdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvdHRvbV9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlTdHJpbmcgYXR0YWNoID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChUT1BfQ09MKS5lbmRzV2l0aCAoIikiKSkgbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCAiIik7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAJCQlyZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgICAgIAkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ09NQk9fQ09MIDoKLQkJCQkJCQkJY29tYm8uc2V0Rm9jdXMgKCk7CQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFdJRFRIX0NPTCA6CQotCQkJCQkJCQl3aWR0aFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEVJR0hUX0NPTCA6Ci0JCQkJCQkJCWhlaWdodFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwotCQkKLQkJLyogQWRkIGxpc3RlbmVyIHRvIGFkZCBhbiBlbGVtZW50IHRvIHRoZSB0YWJsZSAqLwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCQkJU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSwgIkJ1dHRvbiIsICItMSIsICItMSIsCi0JCQkJCSIwLDAgKCIgKyBMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVmYXVsdCIpICsgIikiLCAiIiwgCi0JCQkJCSIwLDAgKCIgKyBMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiRGVmYXVsdCIpICsgIikiLCAiIn07Ci0JCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJLyogQ29udHJvbHMgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgb2YgdGhlIEZvcm1MYXlvdXQgKi8KLQkJU3RyaW5nIFtdIG1hcmdpblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyIwIiwiMyIsIjUiLCIxMCJ9OwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5IZWlnaHQiKTsKLQkJbWFyZ2luSGVpZ2h0ID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5IZWlnaHQuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkhlaWdodC5zZWxlY3QgKDApOwotCQltYXJnaW5IZWlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDYwOwotCQltYXJnaW5IZWlnaHQuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbldpZHRoLnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5XaWR0aC5zZWxlY3QgKDApOwotCQltYXJnaW5XaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5XaWR0aC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luV2lkdGguc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2ggKi8KLQkJc2FzaC5zZXRXZWlnaHRzIChuZXcgaW50IFtdIHs2LDR9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKGZvcm1MYXlvdXQpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQlsZWZ0QXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCXJpZ2h0QXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCXRvcEF0dGFjaC5kaXNwb3NlICgpOwotCQlib3R0b21BdHRhY2guZGlzcG9zZSAoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTtcbiIpOwotCQlpZiAoZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGZvcm1MYXlvdXQubWFyZ2luV2lkdGggIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBmb3JtTGF5b3V0Lm1hcmdpbldpZHRoICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7XG4iKTsKLQkJCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKSBjb250cm9sLmdldExheW91dERhdGEgKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiRm9ybURhdGEgIik7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcbiIpOwkKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLndpZHRoID0gIiArIGRhdGEud2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhlaWdodCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhlaWdodCA9ICIgKyBkYXRhLmhlaWdodCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubGVmdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmxlZnQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEubGVmdC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5sZWZ0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCB8fCAoZGF0YS5sZWZ0Lm51bWVyYXRvciAhPSAwIHx8ZGF0YS5sZWZ0Lm9mZnNldCAhPSAwKSkgewotCQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEubGVmdC5udW1lcmF0b3IgKyAiLCAiICsgZGF0YS5sZWZ0Lm9mZnNldCArICIpO1xuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnJpZ2h0Lm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLnJpZ2h0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEucmlnaHQubnVtZXJhdG9yICsgIiwgIiArIGRhdGEucmlnaHQub2Zmc2V0ICsgIik7XG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGF0YS50b3AgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKFRPUF9DT0wpOwotCQkJCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGNvbnRyb2xTdHJpbmcuc3Vic3RyaW5nIChjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykgLSAxLCBjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykpKS5pbnRWYWx1ZSAoKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS50b3AuYWxpZ25tZW50KSArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGF0YS5ib3R0b20gIT0gbnVsbCB8fCAoZGF0YS50b3AubnVtZXJhdG9yICE9IDAgfHxkYXRhLnRvcC5vZmZzZXQgIT0gMCkpIHsKLQkJCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEudG9wLm51bWVyYXRvciArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLmJvdHRvbS5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgZGF0YS5ib3R0b20ubnVtZXJhdG9yICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIpO1xuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ci0JCQkiIiwKLQkJCSJDb250cm9sIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJsZWZ0IiwgCi0JCQkicmlnaHQiLCAKLQkJCSJ0b3AiLCAKLQkJCSJib3R0b20iCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZvcm1MYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoZWlnaHRUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10ge1N0cmluZy52YWx1ZU9mIChyb3cpLCBjb21iby5nZXRUZXh0ICgpLCB3aWR0aFRleHQuZ2V0VGV4dCAoKSwgaGVpZ2h0VGV4dC5nZXRUZXh0ICgpfTsKLQkJCWRhdGEuc2V0RWxlbWVudEF0IChpbnNlcnQsIHJvdyk7Ci0JCQlmb3IgKGludCBpID0gMCA7IGkgPCBNT0RJRllfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0TGF5b3V0RGF0YSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgYW4gYXR0YWNobWVudCB0byB0aGUgZWRnZSBvZiBhIHdpZGdldCB1c2luZyB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUuCi0JICovCi0JRm9ybUF0dGFjaG1lbnQgc2V0QXR0YWNobWVudCAoU3RyaW5nIGF0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIGNvbnRyb2wsIGFsaWduOwotCQlpbnQgcG9zaXRpb24sIG9mZnNldDsKLQkJaW50IGNvbW1hID0gYXR0YWNobWVudC5pbmRleE9mICgnLCcpOwotCQljaGFyIGZpcnN0ID0gYXR0YWNobWVudC5jaGFyQXQgKDApOwotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIGNvbnRyb2wgKi8KLQkJCWNvbnRyb2wgPSBhdHRhY2htZW50LnN1YnN0cmluZyAoMCwgY29tbWEpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBjb250cm9sLmxlbmd0aCAoKSAmJiAhQ2hhcmFjdGVyLmlzRGlnaXQgKGNvbnRyb2wuY2hhckF0IChpKSkpIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlTdHJpbmcgZW5kID0gY29udHJvbC5zdWJzdHJpbmcgKGkpOwotCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGVuZCkuaW50VmFsdWUgKCk7Ci0JCQlDb250cm9sIGF0dGFjaENvbnRyb2wgPSBjaGlsZHJlbiBbaW5kZXhdOwotCQkJaW50IGNvbG9uID0gYXR0YWNobWVudC5pbmRleE9mICgnOicpOwotCQkJdHJ5IHsKLQkJCQlvZmZzZXQgPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbW1hICsgMSwgY29sb24pKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWFsaWduID0gYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbG9uICsgMSk7Ci0JCQlyZXR1cm4gbmV3IEZvcm1BdHRhY2htZW50IChhdHRhY2hDb250cm9sLCBvZmZzZXQsIGFsaWdubWVudENvbnN0YW50IChhbGlnbikpOwotCQl9Ci0JCS8qIENhc2Ugd2hlcmUgdGhlcmUgaXMgYSBwb3NpdGlvbiAqLwotCQl0cnkgewotCQkJcG9zaXRpb24gPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKDAsY29tbWEpKS5pbnRWYWx1ZSAoKTsJCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlwb3NpdGlvbiA9IDA7Ci0JCX0KLQkJdHJ5IHsKLQkJCW9mZnNldCA9IG5ldyBJbnRlZ2VyIChhdHRhY2htZW50LnN1YnN0cmluZyAoY29tbWEgKyAxKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlvZmZzZXQgPSAwOwotCQl9Ci0JCXJldHVybiBuZXcgRm9ybUF0dGFjaG1lbnQgKHBvc2l0aW9uLCBvZmZzZXQpOwkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJRm9ybURhdGEgZGF0YTsKLQkJaW50IHdpZHRoLCBoZWlnaHQ7Ci0JCVN0cmluZyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXdpZHRoID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWhlaWdodCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQkJCWlmICh3aWR0aCA+IDApIGRhdGEud2lkdGggPSB3aWR0aDsKLQkJCWlmIChoZWlnaHQgPiAwKSBkYXRhLmhlaWdodCA9IGhlaWdodDsKLQkJCQotCQkJbGVmdCA9IGl0ZW1zIFtpXS5nZXRUZXh0IChMRUZUX0NPTCk7Ci0JCQlpZiAobGVmdC5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5sZWZ0ID0gc2V0QXR0YWNobWVudCAobGVmdCk7Ci0JCQkJaWYgKGRhdGEubGVmdC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKGxlZnQsIGRhdGEubGVmdCk7Ci0JCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmlnaHQgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCWlmIChyaWdodC5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5yaWdodCA9IHNldEF0dGFjaG1lbnQgKHJpZ2h0KTsKLQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKHJpZ2h0LCBkYXRhLnJpZ2h0KTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKFJJR0hUX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJdG9wID0gaXRlbXMgW2ldLmdldFRleHQgKFRPUF9DT0wpOwotCQkJaWYgKHRvcC5sZW5ndGggKCkgPiAwICkgewotCQkJCWRhdGEudG9wID0gc2V0QXR0YWNobWVudCAodG9wKTsKLQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50ICh0b3AsIGRhdGEudG9wKTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKFRPUF9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJvdHRvbSA9IGl0ZW1zIFtpXS5nZXRUZXh0IChCT1RUT01fQ09MKTsKLQkJCWlmIChib3R0b20ubGVuZ3RoICgpID4gMCkgewotCQkJCWRhdGEuYm90dG9tID0gc2V0QXR0YWNobWVudCAoYm90dG9tKTsKLQkJCQlpZiAoZGF0YS5ib3R0b20uY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50ID0gY2hlY2tBdHRhY2htZW50IChib3R0b20sIGRhdGEuYm90dG9tKTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaG1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gbmV3IEludGVnZXIgKG1hcmdpbkhlaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCW1hcmdpbkhlaWdodC5zZWxlY3QgKDApOwotCQl9Ci0JCXRyeSB7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gbmV3IEludGVnZXIgKG1hcmdpbldpZHRoLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQltYXJnaW5XaWR0aC5zZWxlY3QgKDApOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIDxjb2RlPkF0dGFjaERpYWxvZzwvY29kZT4gaXMgdGhlIGNsYXNzIHRoYXQgY3JlYXRlcyBhCi0JICogZGlhbG9nIHNwZWNpZmljIGZvciB0aGlzIGV4YW1wbGUuIEl0IGNyZWF0ZXMgYSBkaWFsb2cKLQkgKiB3aXRoIGNvbnRyb2xzIHRvIHNldCB0aGUgdmFsdWVzIGluIGEgRm9ybUF0dGFjaG1lbnQuCi0JICovCi0JcHVibGljIGNsYXNzIEF0dGFjaERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsKLQkJU3RyaW5nIGNvbnRyb2xJbnB1dCwgcG9zaXRpb25JbnB1dCwgYWxpZ25tZW50SW5wdXQsIG9mZnNldElucHV0OwotCQlpbnQgY29sID0gMDsKLQkJCi0JCXB1YmxpYyBBdHRhY2hEaWFsb2cgKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlciAocGFyZW50LCBzdHlsZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBdHRhY2hEaWFsb2cgKFNoZWxsIHBhcmVudCkgewotCQkJdGhpcyAocGFyZW50LCAwKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sdW1uIChpbnQgY29sKSB7Ci0JCQl0aGlzLmNvbCA9IGNvbDsKLQkJfQotCSAKLQkJcHVibGljIFN0cmluZyBvcGVuICgpIHsKLQkJCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudCAoKTsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQlzaGVsbC5zZXRUZXh0IChnZXRUZXh0ICgpKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQkJCQotCQkJLyogRmluZCBvdXQgd2hhdCB3YXMgcHJldmlvdXNseSBzZXQgYXMgYW4gYXR0YWNobWVudCAqLwotCQkJVGFibGVJdGVtIG5ld0l0ZW0gPSBsZWZ0RWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQlyZXN1bHQgPSBuZXdJdGVtLmdldFRleHQgKGNvbCk7Ci0JCQlTdHJpbmcgb2xkQXR0YWNoID0gcmVzdWx0OwotCQkJU3RyaW5nIG9sZFBvcyA9ICIwIiwgb2xkQ29udHJvbCA9ICIiLCBvbGRBbGlnbiA9ICJERUZBVUxUIiwgb2xkT2Zmc2V0ID0gIjAiOwotCQkJYm9vbGVhbiBpc0NvbnRyb2wgPSBmYWxzZTsKLQkJCWlmIChvbGRBdHRhY2gubGVuZ3RoICgpICE9IDApIHsKLQkJCQljaGFyIGZpcnN0ID0gb2xkQXR0YWNoLmNoYXJBdCAoMCk7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihmaXJzdCkpIHsKLQkJCQkJLyogV2UgaGF2ZSBhIGNvbnRyb2wgKi8KLQkJCQkJaXNDb250cm9sID0gdHJ1ZTsKLQkJCQkJb2xkQ29udHJvbCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKDAsIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJCQkJb2xkQWxpZ24gPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJzonKSArIDEpOwotCQkJCQlvbGRPZmZzZXQgPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJywnKSArIDEsIG9sZEF0dGFjaC5pbmRleE9mICgnOicpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBXZSBoYXZlIGEgcG9zaXRpb24gKi8KLQkJCQkJb2xkUG9zID0gb2xkQXR0YWNoLnN1YnN0cmluZyAoMCwgb2xkQXR0YWNoLmluZGV4T2YgKCcsJykpOwotCQkJCQlvbGRPZmZzZXQgPSBvbGRBdHRhY2guc3Vic3RyaW5nIChvbGRBdHRhY2guaW5kZXhPZiAoJywnKSArIDEpOwotCQkJCQlpZiAob2xkT2Zmc2V0LmVuZHNXaXRoICgiKSIpKSB7IC8vIGkuZS4gKERlZmF1bHQpCi0JCQkJCQlvbGRPZmZzZXQgPSBvbGRPZmZzZXQuc3Vic3RyaW5nICgwLCBvbGRPZmZzZXQuaW5kZXhPZiAoJyAnKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIEFkZCBwb3NpdGlvbiBmaWVsZCAqLwotCQkJZmluYWwgQnV0dG9uIHBvc0J1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQkJcG9zQnV0dG9uLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJQb3NpdGlvbiIpKTsKLQkJCXBvc0J1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc0NvbnRyb2wpOwkJCQotCQkJZmluYWwgQ29tYm8gcG9zaXRpb24gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwb3NpdGlvbi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjAiLCIyNSIsIjUwIiwiNzUiLCIxMDAifSk7Ci0JCQlwb3NpdGlvbi5zZXRUZXh0IChvbGRQb3MpOwotCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAoIWlzQ29udHJvbCk7CQkJCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlwb3NpdGlvbi5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIGNvbnRyb2wgZmllbGQgKi8KLQkJCWZpbmFsIEJ1dHRvbiBjb250QnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5SQURJTyk7Ci0JCQljb250QnV0dG9uLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb250cm9sIikpOwotCQkJY29udEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzQ29udHJvbCk7Ci0JCQlmaW5hbCBDb21ibyBjb250cm9sID0gbmV3IENvbWJvIChzaGVsbCwgU1dULlJFQURfT05MWSk7Ci0JCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJCVRhYmxlSXRlbSBjdXJyZW50SXRlbSA9IGxlZnRFZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpOyBpKyspIHsKLQkJCQlpZiAoaXRlbXMgW2ldLmdldFRleHQgKDApLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoaXRlbXMgW2ldICE9IGN1cnJlbnRJdGVtKSB7Ci0JCQkJCQljb250cm9sLmFkZCAoaXRlbXMgW2ldLmdldFRleHQgKENPTUJPX0NPTCkgKyBpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvbGRDb250cm9sLmxlbmd0aCAoKSAhPSAwKSBjb250cm9sLnNldFRleHQgKG9sZENvbnRyb2wpOwotCQkJZWxzZSBjb250cm9sLnNlbGVjdCAoMCk7Ci0JCQljb250cm9sLnNldEVuYWJsZWQgKGlzQ29udHJvbCk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb250cm9sLnNldExheW91dERhdGEgKGRhdGEpOwotCQkJCi0JCQkvKiBBZGQgYWxpZ25tZW50IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFsaWdubWVudCIpKTsKLQkJCWZpbmFsIENvbWJvIGFsaWdubWVudCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIGFsaWdubWVudFZhbHVlczsKLQkJCWlmIChjb2wgPT0gTEVGVF9DT0wgfHwgY29sID09IFJJR0hUX0NPTCkgewotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuTEVGVCIsICJTV1QuUklHSFQiLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb2wgPT0gVE9QX0NPTCB8fCBjb2wgPT0gQk9UVE9NX0NPTAotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuVE9QIiwgIlNXVC5CT1RUT00iLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfQotCQkJYWxpZ25tZW50LnNldEl0ZW1zIChhbGlnbm1lbnRWYWx1ZXMpOwotCQkJYWxpZ25tZW50LnNldFRleHQgKCJTV1QuIiArIG9sZEFsaWduKTsKLQkJCWFsaWdubWVudC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYWxpZ25tZW50LnNldExheW91dERhdGEgKGRhdGEpOwotCQkJCi0JCQkvKiBBZGQgb2Zmc2V0IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9mZnNldCIpKTsKLQkJCWZpbmFsIFRleHQgb2Zmc2V0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlvZmZzZXQuc2V0VGV4dCAob2xkT2Zmc2V0KTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCW9mZnNldC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCQotCQkJLyogQWRkIGxpc3RlbmVycyBmb3IgY2hvb3NpbmcgYmV0d2VlbiBwb3NpdGlvbiBhbmQgY29udHJvbCAqLwotCQkJcG9zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJCQlhbGlnbm1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQljb250QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcG9zaXRpb24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJCQljb250cm9sLnNldEVuYWJsZWQgKHRydWUpOwotCQkJCQlhbGlnbm1lbnQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJQnV0dG9uIGNsZWFyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJCWNsZWFyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCWNsZWFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmVzdWx0ID0gIiI7Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJLyogT0sgYnV0dG9uIHNldHMgZGF0YSBpbnRvIHRhYmxlICovCi0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk9LIikpOwotCQkJb2suc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQljb250cm9sSW5wdXQgPSBjb250cm9sLmdldFRleHQgKCk7Ci0JCQkJCWFsaWdubWVudElucHV0ID0gYWxpZ25tZW50LmdldFRleHQgKCkuc3Vic3RyaW5nICg0KTsKLQkJCQkJcG9zaXRpb25JbnB1dCA9IHBvc2l0aW9uLmdldFRleHQgKCk7Ci0JCQkJCWlmIChwb3NpdGlvbklucHV0Lmxlbmd0aCAoKSA9PSAwKSBwb3NpdGlvbklucHV0ID0gIjAiOwotCQkJCQl0cnkgewotCQkJCQkJbmV3IEludGVnZXIgKHBvc2l0aW9uSW5wdXQpLmludFZhbHVlICgpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkJCQlwb3NpdGlvbklucHV0ID0gIjAiOwotCQkJCQl9Ci0JCQkJCW9mZnNldElucHV0ID0gb2Zmc2V0LmdldFRleHQgKCk7Ci0JCQkJCWlmIChvZmZzZXRJbnB1dC5sZW5ndGggKCkgPT0gMCkgb2Zmc2V0SW5wdXQgPSAiMCI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgSW50ZWdlciAob2Zmc2V0SW5wdXQpLmludFZhbHVlICgpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0KSB7Ci0JCQkJCQlvZmZzZXRJbnB1dCA9ICIwIjsKLQkJCQkJfQotCQkJCQlpZiAocG9zQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IGNvbnRyb2xJbnB1dC5sZW5ndGggKCkgPT0gMCkgewotCQkJCQkJcmVzdWx0ID0gcG9zaXRpb25JbnB1dCArICIsIiArIG9mZnNldElucHV0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0ID0gY29udHJvbElucHV0ICsgIiwiICsgb2Zmc2V0SW5wdXQgKyAiOiIgKyBhbGlnbm1lbnRJbnB1dDsKLQkJCQkJfQotCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQkJY2FuY2VsLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDYW5jZWwiKSk7Ci0JCQljYW5jZWwuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCXNoZWxsLnBhY2sgKCk7Ci0JCQkvKiBDZW50ZXIgdGhlIGRpYWxvZyAqLwotCQkJUG9pbnQgY2VudGVyID0gcGFyZW50LmdldExvY2F0aW9uICgpOwotCQkJY2VudGVyLnggPSBjZW50ZXIueCArIChwYXJlbnQuZ2V0Qm91bmRzICgpLndpZHRoIC8gMikgLSAoc2hlbGwuZ2V0Qm91bmRzICgpLndpZHRoIC8gMik7Ci0JCQljZW50ZXIueSA9IGNlbnRlci55ICsgKHBhcmVudC5nZXRCb3VuZHMgKCkuaGVpZ2h0IC8gMikgLSAoc2hlbGwuZ2V0Qm91bmRzICgpLmhlaWdodCAvIDIpOwotCQkJc2hlbGwuc2V0TG9jYXRpb24gKGNlbnRlcik7Ci0JCQlzaGVsbC5vcGVuICgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTAxY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1jbGFzcyBHcmlkTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCVRleHQgbnVtQ29sdW1uczsKLQlCdXR0b24gbWFrZUNvbHVtbnNFcXVhbFdpZHRoOwotCUNvbWJvIG1hcmdpbkhlaWdodCwgbWFyZ2luV2lkdGgsIGhvcml6b250YWxTcGFjaW5nLCB2ZXJ0aWNhbFNwYWNpbmc7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JR3JpZExheW91dCBncmlkTGF5b3V0OwotCS8qIFRhYmxlRWRpdG9ycyBhbmQgcmVsYXRlZCBjb250cm9scyovCi0JVGFibGVFZGl0b3IgY29tYm9FZGl0b3IsIHdpZHRoRWRpdG9yLCBoZWlnaHRFZGl0b3I7Ci0JVGFibGVFZGl0b3IgdkFsaWduRWRpdG9yLCBoQWxpZ25FZGl0b3IsIGhJbmRlbnRFZGl0b3I7Ci0JVGFibGVFZGl0b3IgaFNwYW5FZGl0b3IsIHZTcGFuRWRpdG9yLCBoR3JhYkVkaXRvciwgdkdyYWJFZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvLCB2QWxpZ24sIGhBbGlnbiwgaEdyYWIsIHZHcmFiOwotCVRleHQgd2lkdGhUZXh0LCBoZWlnaHRUZXh0LCBoSW5kZW50LCBoU3BhbiwgdlNwYW47Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBIQUxJR05fQ09MID0gNDsKLQlmaW5hbCBpbnQgVkFMSUdOX0NPTCA9IDU7Ci0JZmluYWwgaW50IEhJTkRFTlRfQ09MID0gNjsKLQlmaW5hbCBpbnQgSFNQQU5fQ09MID0gNzsKLQlmaW5hbCBpbnQgVlNQQU5fQ09MID0gODsKLQlmaW5hbCBpbnQgSEdSQUJfQ09MID0gOTsKLQlmaW5hbCBpbnQgVkdSQUJfQ09MID0gMTA7Ci0JCi0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSAxMTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIExheW91dEV4YW1wbGUuCi0JICovCi0JR3JpZExheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgVHJhdmVyc2VMaXN0ZW5lciAqLwotCQlmaW5hbCBUcmF2ZXJzZUxpc3RlbmVyIHRyYXZlcnNlTGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQgKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkKLQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKQotCQkJCQlkaXNwb3NlRWRpdG9ycyAoKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8JCQotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl3aWR0aEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloZWlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdkFsaWduRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhBbGlnbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloSW5kZW50RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhTcGFuRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZTcGFuRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhHcmFiRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZHcmFiRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIgKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGUueCwgZS55KTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAocHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJd2lkdGhUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHdpZHRoVGV4dCwgd2lkdGhFZGl0b3IsIFdJRFRIX0NPTCk7Ci0JCQkJCi0JCQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0JCQkJU3RyaW5nIFtdIGFsaWduVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IkJFR0lOTklORyIsIkNFTlRFUiIsIkVORCIsIkZJTEwifTsKLQkJCQloQWxpZ24gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhBbGlnbi5zZXRJdGVtcyAoYWxpZ25WYWx1ZXMpOwotCQkJCWhBbGlnbi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhBTElHTl9DT0wpKTsKLQkJCQloQWxpZ25FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWhBbGlnbkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEFsaWduRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhBbGlnbkVkaXRvci5zZXRFZGl0b3IgKGhBbGlnbiwgbmV3SXRlbSwgSEFMSUdOX0NPTCk7Ci0JCQkJaEFsaWduLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJCQotCQkJCXZBbGlnbiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkFsaWduLnNldEl0ZW1zIChhbGlnblZhbHVlcyk7Ci0JCQkJdkFsaWduLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkFMSUdOX0NPTCkpOwotCQkJCXZBbGlnbkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJdkFsaWduRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2QWxpZ25FZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkFsaWduRWRpdG9yLnNldEVkaXRvciAodkFsaWduLCBuZXdJdGVtLCBWQUxJR05fQ09MKTsKLQkJCQl2QWxpZ24uYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJaEluZGVudCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaEluZGVudC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSElOREVOVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoSW5kZW50LCBoSW5kZW50RWRpdG9yLCBISU5ERU5UX0NPTCk7Ci0JCQkJCi0JCQkJaFNwYW4gPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhTcGFuLnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtIU1BBTl9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoU3BhbiwgaFNwYW5FZGl0b3IsIEhTUEFOX0NPTCk7Ci0JCQkJCi0JCQkJdlNwYW4gPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCXZTcGFuLnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtWU1BBTl9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh2U3BhbiwgdlNwYW5FZGl0b3IsIFZTUEFOX0NPTCk7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGJvb2xWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiZmFsc2UiLCJ0cnVlIn07Ci0JCQkJaEdyYWIgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhHcmFiLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQloR3JhYi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhHUkFCX0NPTCkpOwotCQkJCWhHcmFiRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQloR3JhYkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEdyYWJFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJaEdyYWJFZGl0b3Iuc2V0RWRpdG9yIChoR3JhYiwgbmV3SXRlbSwgSEdSQUJfQ09MKTsKLQkJCQloR3JhYi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCQkKLQkJCQl2R3JhYiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkdyYWIuc2V0SXRlbXMgKGJvb2xWYWx1ZXMpOwotCQkJCXZHcmFiLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkdSQUJfQ09MKSk7Ci0JCQkJdkdyYWJFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXZHcmFiRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2R3JhYkVkaXRvci5taW5pbXVtV2lkdGggPSA1MDsKLQkJCQl2R3JhYkVkaXRvci5zZXRFZGl0b3IgKHZHcmFiLCBuZXdJdGVtLCBWR1JBQl9DT0wpOwotCQkJCXZHcmFiLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVJlY3RhbmdsZSByZWN0ID0gbmV3SXRlbS5nZXRCb3VuZHMgKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzd2l0Y2ggKGkpIHsKLQkJCQkJCQljYXNlIENPTUJPX0NPTCA6Ci0JCQkJCQkJCWNvbWJvLnNldEZvY3VzICgpOwkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBXSURUSF9DT0wgOgkKLQkJCQkJCQkJd2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhFSUdIVF9DT0wgOgotCQkJCQkJCQloZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEhBTElHTl9DT0wgOgotCQkJCQkJCQloQWxpZ24uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkFMSUdOX0NPTCA6Ci0JCQkJCQkJCXZBbGlnbi5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBISU5ERU5UX0NPTCA6Ci0JCQkJCQkJCWhJbmRlbnQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSFNQQU5fQ09MIDoKLQkJCQkJCQkJaFNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVlNQQU5fQ09MIDoKLQkJCQkJCQkJdlNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEdSQUJfQ09MIDoKLQkJCQkJCQkJaEdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkdSQUJfQ09MIDoKLQkJCQkJCQkJdkdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBBZGQgbGlzdGVuZXIgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHRhYmxlICovCi0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10geyAKLQkJCQkJU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmluZGV4T2YgKGl0ZW0pKSwgIkJ1dHRvbiIsCi0JCQkJCSItMSIsIi0xIiwiQkVHSU5OSU5HIiwiQ0VOVEVSIiwKLQkJCQkJIjAiLCIxIiwiMSIsImZhbHNlIiwiZmFsc2UifTsKLQkJCQlpdGVtLnNldFRleHQgKGluc2VydCk7Ci0JCQkJZGF0YS5hZGRFbGVtZW50IChpbnNlcnQpOwotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBSZWFycmFuZ2UgdGhlIGxheW91dCBvZiB0aGUgY29udHJvbCBncm91cCAqLwotCQlzaXplLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoKSk7Ci0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgR3JpZExheW91dCAqLwotCQlTdHJpbmcgW10gbWFyZ2luVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IjAiLCIzIiwiNSIsIjEwIn07Ci0JCUdyb3VwIG1hcmdpbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIk1hcmdpbnNfU3BhY2luZyIpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBDb21ibyAobWFyZ2luR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luSGVpZ2h0LnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQltYXJnaW5IZWlnaHQuc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luSGVpZ2h0LnNldExheW91dERhdGEgKGRhdGEpOwotCQltYXJnaW5IZWlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbldpZHRoIik7Ci0JCW1hcmdpbldpZHRoID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5XaWR0aC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luV2lkdGguc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJbWFyZ2luV2lkdGguc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCW1hcmdpbldpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW1hcmdpbldpZHRoLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoImhvcml6b250YWxTcGFjaW5nIik7Ci0JCWhvcml6b250YWxTcGFjaW5nID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQlob3Jpem9udGFsU3BhY2luZy5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuc2VsZWN0ICgyKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCWhvcml6b250YWxTcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWhvcml6b250YWxTcGFjaW5nLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoInZlcnRpY2FsU3BhY2luZyIpOwotCQl2ZXJ0aWNhbFNwYWNpbmcgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXZlcnRpY2FsU3BhY2luZy5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJdmVydGljYWxTcGFjaW5nLnNlbGVjdCAoMik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCXZlcnRpY2FsU3BhY2luZy5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJdmVydGljYWxTcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsU3BhY2luZy5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENvbnRyb2xzIHRoZSBjb2x1bW5zIGluIHRoZSBHcmlkTGF5b3V0ICovCi0JCUdyb3VwIGNvbHVtbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY29sdW1uR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbHVtbnMiKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQludW1Db2x1bW5zID0gbmV3IFRleHQgKGNvbHVtbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbnVtQ29sdW1ucy5zZXRUZXh0ICgiMSIpOwotCQludW1Db2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW51bUNvbHVtbnMuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0gICAgICAgCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgCWRhdGEud2lkdGhIaW50ID0gMTU7Ci0gICAgICAgCW51bUNvbHVtbnMuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0gICAgICAgCW5ldyBMYWJlbCAoY29sdW1uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibnVtQ29sdW1ucyIpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBuZXcgQnV0dG9uIChjb2x1bW5Hcm91cCwgU1dULkNIRUNLKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldFRleHQgKCJtYWtlQ29sdW1uc0VxdWFsV2lkdGgiKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNDsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JCWNvbnRyb2xHcm91cC5wYWNrKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQl9Ci0JCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJd2lkdGhUZXh0LmRpc3Bvc2UgKCk7Ci0JCWhlaWdodFRleHQuZGlzcG9zZSAoKTsKLQkJaEFsaWduLmRpc3Bvc2UgKCk7Ci0JCXZBbGlnbi5kaXNwb3NlICgpOwotCQloSW5kZW50LmRpc3Bvc2UgKCk7Ci0JCWhTcGFuLmRpc3Bvc2UgKCk7Ci0JCXZTcGFuLmRpc3Bvc2UgKCk7Ci0JCWhHcmFiLmRpc3Bvc2UgKCk7Ci0JCXZHcmFiLmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpO1xuIik7Ci0JCWlmIChncmlkTGF5b3V0Lm51bUNvbHVtbnMgIT0gMSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5udW1Db2x1bW5zID0gIiArIGdyaWRMYXlvdXQubnVtQ29sdW1ucyArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9ICIgKyBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5XaWR0aCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gIiArIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9ICIgKyBncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9ICIgKyBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyArICI7XG4iKTsKLQkJfQotCQljb2RlLmFwcGVuZCAoIlx0XHRzaGVsbC5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpO1xuIik7Ci0JCQotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhICgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIpOwotCQkJCWlmIChmaXJzdCkgewotCQkJCQljb2RlLmFwcGVuZCAoIkdyaWREYXRhICIpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKTsJCi0JCQkJaWYgKGRhdGEud2lkdGhIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEud2lkdGhIaW50ID0gIiArIGRhdGEud2lkdGhIaW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5oZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuaGVpZ2h0SGludCA9ICIgKyBkYXRhLmhlaWdodEhpbnQgKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgIT0gR3JpZERhdGEuQkVHSU5OSU5HKSB7Ci0JCQkJCVN0cmluZyBhbGlnbm1lbnQ7Ci0JCQkJCWludCBoQWxpZ25tZW50ID0gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50OwotCQkJCQlpZiAoaEFsaWdubWVudCA9PSBHcmlkRGF0YS5DRU5URVIpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5DRU5URVIiOwotCQkJCQllbHNlIGlmIChoQWxpZ25tZW50ID09IEdyaWREYXRhLkVORCkgYWxpZ25tZW50ID0gIkdyaWREYXRhLkVORCI7Ci0JCQkJCWVsc2UgYWxpZ25tZW50ID0gIkdyaWREYXRhLkZJTEwiOwotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSAiICsgYWxpZ25tZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCAhPSBHcmlkRGF0YS5DRU5URVIpIHsKLQkJCQkJU3RyaW5nIGFsaWdubWVudDsKLQkJCQkJaW50IHZBbGlnbm1lbnQgPSBkYXRhLnZlcnRpY2FsQWxpZ25tZW50OwotCQkJCQlpZiAodkFsaWdubWVudCA9PSBHcmlkRGF0YS5CRUdJTk5JTkcpIGFsaWdubWVudCA9ICJHcmlkRGF0YS5CRUdJTk5JTkciOwotCQkJCQllbHNlIGlmICh2QWxpZ25tZW50ID09IEdyaWREYXRhLkVORCkgYWxpZ25tZW50ID0gIkdyaWREYXRhLkVORCI7Ci0JCQkJCWVsc2UgYWxpZ25tZW50ID0gIkdyaWREYXRhLkZJTEwiOwotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gIiArIGFsaWdubWVudCArICI7XG4iKTsKLQkJCQl9CQotCQkJCWlmIChkYXRhLmhvcml6b250YWxJbmRlbnQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxJbmRlbnQgPSAiICsgZGF0YS5ob3Jpem9udGFsSW5kZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ob3Jpem9udGFsU3BhbiAhPSAxKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAiICsgZGF0YS5ob3Jpem9udGFsU3BhbiArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEudmVydGljYWxTcGFuICE9IDEpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS52ZXJ0aWNhbFNwYW4gPSAiICsgZGF0YS52ZXJ0aWNhbFNwYW4gKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTtcbiIpOwotCQkJCX0KLQkJCQlpZiAoY29kZS5zdWJzdHJpbmcgKGNvZGUubGVuZ3RoICgpIC0gMzMpLmVxdWFscyAoIkdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKSkgewotCQkJCQljb2RlLmRlbGV0ZSAoY29kZS5sZW5ndGggKCkgLSAzMywgY29kZS5sZW5ndGggKCkpOwotCQkJCQlmaXJzdCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjb2RlLnN1YnN0cmluZyAoY29kZS5sZW5ndGggKCkgLSAyNCkuZXF1YWxzICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTtcbiIpKSB7IAotCQkJCQljb2RlLmRlbGV0ZSAoY29kZS5sZW5ndGggKCkgLSAyNCwgY29kZS5sZW5ndGggKCkpOwotCQkJCX0gZWxzZSB7CQotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRMYXlvdXREYXRhIChkYXRhKTtcbiIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ci0JCQkiIiwKLQkJCSJDb250cm9sIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJob3Jpem9udGFsQWxpZ25tZW50IiwgCi0JCQkidmVydGljYWxBbGlnbm1lbnQiLCAKLQkJCSJob3Jpem9udGFsSW5kZW50IiwgCi0JCQkiaG9yaXpvbnRhbFNwYW4iLAotCQkJInZlcnRpY2FsU3BhbiIsIAotCQkJImdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UiLCAKLQkJCSJncmFiRXhjZXNzVmVydGljYWxTcGFjZSIKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiR3JpZExheW91dCI7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICovCi0Jdm9pZCByZXNldEVkaXRvcnMgKCkgewotCQlyZXNldEVkaXRvcnMgKGZhbHNlKTsKLQl9Ci0JCi0Jdm9pZCByZXNldEVkaXRvcnMgKGJvb2xlYW4gdGFiKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJaWYgKG9sZEl0ZW0gIT0gbnVsbCkgewotCQkJaW50IHJvdyA9IHRhYmxlLmluZGV4T2YgKG9sZEl0ZW0pOwotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAod2lkdGhUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChXSURUSF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhlaWdodFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChIRUlHSFRfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoSW5kZW50LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloSW5kZW50LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSElOREVOVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhTcGFuLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloU3Bhbi5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhTUEFOX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAodlNwYW4uZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZTcGFuLnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoVlNQQU5fQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7Ci0JCQkJU3RyaW5nLnZhbHVlT2YgKHJvdyksIGNvbWJvLmdldFRleHQgKCksIHdpZHRoVGV4dC5nZXRUZXh0ICgpLCBoZWlnaHRUZXh0LmdldFRleHQgKCksCi0JCQkJaEFsaWduLmdldFRleHQgKCksIHZBbGlnbi5nZXRUZXh0ICgpLCBoSW5kZW50LmdldFRleHQgKCksIAotCQkJCWhTcGFuLmdldFRleHQgKCksIHZTcGFuLmdldFRleHQgKCksIGhHcmFiLmdldFRleHQgKCksIHZHcmFiLmdldFRleHQgKCkKLQkJCX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwkJCi0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldExheW91dERhdGEgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlHcmlkRGF0YSBkYXRhOwotCQlpbnQgaEluZGVudCwgaFNwYW4sIHZTcGFuOwotCQlTdHJpbmcgdkFsaWduLCBoQWxpZ24sIHZHcmFiLCBoR3JhYjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTsKLQkJCS8qIFNldCB3aWR0aEhpbnQgYW5kIGhlaWdodEhpbnQgKi8KLQkJCWRhdGEud2lkdGhIaW50ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJLyogU2V0IHZlcnRpY2FsIGFsaWdubWVudCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnQgKi8KLQkJCWhBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIQUxJR05fQ09MKTsKLQkJCWlmIChoQWxpZ24uZXF1YWxzICgiQ0VOVEVSIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQl9IGVsc2UgaWYgKGhBbGlnbi5lcXVhbHMgKCJFTkQiKSkgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJCX0gZWxzZSBpZiAoaEFsaWduLmVxdWFscyAoIkZJTEwiKSkgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCX0KLQkJCXZBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChWQUxJR05fQ09MKTsKLQkJCWlmICh2QWxpZ24uZXF1YWxzICgiQkVHSU5OSU5HIikpIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRU5EIikpIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQl9Ci0JCQkvKiBTZXQgaW5kZW50cyBhbmQgc3BhbnMgKi8KLQkJCWhJbmRlbnQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhJTkRFTlRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBoSW5kZW50OwotCQkJaFNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhTcGFuOwotCQkJdlNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFZTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSB2U3BhbjsKLQkJCS8qIFNldCBncmFiYmVycyAqLwotCQkJaEdyYWIgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoSEdSQUJfQ09MKTsKLQkJCWlmIChoR3JhYi5lcXVhbHMgKCJ0cnVlIikpIHsKLQkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCXZHcmFiID0gaXRlbXMgW2ldLmdldFRleHQgKFZHUkFCX0NPTCk7Ci0JCQlpZiAodkdyYWIuZXF1YWxzICgidHJ1ZSIpKSB7Ci0JCQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIGNvbHVtbnMgZm9yIHRoZSBsYXlvdXQgKi8KLQkJdHJ5IHsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IG5ldyBJbnRlZ2VyIChudW1Db2x1bW5zLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJfQotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IG1ha2VDb2x1bW5zRXF1YWxXaWR0aC5nZXRTZWxlY3Rpb24gKCk7Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gbmV3IEludGVnZXIgKG1hcmdpbkhlaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJCW1hcmdpbkhlaWdodC5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gbmV3IEludGVnZXIgKG1hcmdpbldpZHRoLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCQltYXJnaW5XaWR0aC5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gbmV3IEludGVnZXIgKGhvcml6b250YWxTcGFjaW5nLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDU7Ci0JCQlob3Jpem9udGFsU3BhY2luZy5zZWxlY3QgKDIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IG5ldyBJbnRlZ2VyICh2ZXJ0aWNhbFNwYWNpbmcuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCQl2ZXJ0aWNhbFNwYWNpbmcuc2VsZWN0ICgyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9MYXlvdXRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjcyNTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9MYXlvdXRFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIExheW91dEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19sYXlvdXQiKTsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIExheW91dEV4YW1wbGUgZW1iZWRkZWQgaW5zaWRlCi0JICogdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIExheW91dEV4YW1wbGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiIFtdIHRhYnMgPSBuZXcgVGFiIFtdIHsKLQkJCW5ldyBGaWxsTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBSb3dMYXlvdXRUYWIgKHRoaXMpLAotCQkJbmV3IEdyaWRMYXlvdXRUYWIgKHRoaXMpLAotCQkJbmV3IEZvcm1MYXlvdXRUYWIgKHRoaXMpLAotCQl9OwotCQlmb3IgKGludCBpPTA7IGk8dGFicy5sZW5ndGg7IGkrKykgewotCQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkgICAgaXRlbS5zZXRUZXh0ICh0YWJzIFtpXS5nZXRUYWJUZXh0ICgpKTsKLQkJICAgIGl0ZW0uc2V0Q29udHJvbCAodGFicyBbaV0uY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXRhYkZvbGRlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLQkgKiBpbnN0YW5jZSBvZiB0aGUgTGF5b3V0RXhhbXBsZS4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGFiRm9sZGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBMYXlvdXRFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJCVNoZWxsIFtdIHNoZWxscyA9IGRpc3BsYXkuZ2V0U2hlbGxzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGVsbHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNoZWxscyBbaV0gIT0gc2hlbGwpIHNoZWxscyBbaV0uY2xvc2UgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1Jvd0xheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzNzM1Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1Jvd0xheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgUm93TGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCUJ1dHRvbiBob3Jpem9udGFsLCB2ZXJ0aWNhbDsKLQlCdXR0b24gd3JhcCwgcGFjaywganVzdGlmeTsKLQlDb21ibyBtYXJnaW5SaWdodCwgbWFyZ2luTGVmdCwgbWFyZ2luVG9wLCBtYXJnaW5Cb3R0b20sIHNwYWNpbmc7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JUm93TGF5b3V0IHJvd0xheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQkKLQkvKiBDb25zdGFudHMgKi8KLQlmaW5hbCBpbnQgQ09NQk9fQ09MID0gMTsKLQlmaW5hbCBpbnQgV0lEVEhfQ09MID0gMjsKLQlmaW5hbCBpbnQgSEVJR0hUX0NPTCA9IDM7Ci0JCi0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSA0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCVJvd0xheW91dFRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwkJCQotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl3aWR0aEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloZWlnaHRFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQl3aWR0aFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCXdpZHRoVGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAod2lkdGhUZXh0LCB3aWR0aEVkaXRvciwgV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQloZWlnaHRUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtIRUlHSFRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAoaGVpZ2h0VGV4dCwgaGVpZ2h0RWRpdG9yLCBIRUlHSFRfQ09MKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciB0byBhZGQgYW4gZWxlbWVudCB0byB0aGUgdGFibGUgKi8KLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7IAotCQkJCQlTdHJpbmcudmFsdWVPZiAodGFibGUuaW5kZXhPZiAoaXRlbSkpLAotCQkJCQkiQnV0dG9uIiwgIi0xIiwgIi0xIn07Ci0JCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIFJvd0xheW91dCAqLwotCQlHcm91cCB0eXBlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQl0eXBlR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlR5cGUiKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdHlwZUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQlob3Jpem9udGFsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQlob3Jpem9udGFsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IAotCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJaG9yaXpvbnRhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2ZXJ0aWNhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWwuc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQl2ZXJ0aWNhbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIENvbnRyb2xzIHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nIG9mIHRoZSBSb3dMYXlvdXQgKi8KLQkJU3RyaW5nIFtdIG1hcmdpblZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyIwIiwiMyIsIjUiLCIxMCJ9OwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpblJpZ2h0Iik7Ci0JCW1hcmdpblJpZ2h0ID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5SaWdodC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luUmlnaHQuc2VsZWN0ICgxKTsKLQkJbWFyZ2luUmlnaHQuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5SaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5SaWdodC5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5MZWZ0Iik7Ci0JCW1hcmdpbkxlZnQgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkxlZnQuc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkxlZnQuc2VsZWN0ICgxKTsKLQkJbWFyZ2luTGVmdC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW1hcmdpbkxlZnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luTGVmdC5hZGRUcmF2ZXJzZUxpc3RlbmVyKHRyYXZlcnNlTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpblRvcCIpOwotCQltYXJnaW5Ub3AgPSBuZXcgQ29tYm8gKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpblRvcC5zZXRJdGVtcyAobWFyZ2luVmFsdWVzKTsKLQkJbWFyZ2luVG9wLnNlbGVjdCAoMSk7Ci0JCW1hcmdpblRvcC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW1hcmdpblRvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYXJnaW5Ub3AuYWRkVHJhdmVyc2VMaXN0ZW5lcih0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5Cb3R0b20iKTsKLQkJbWFyZ2luQm90dG9tID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQltYXJnaW5Cb3R0b20uc2V0SXRlbXMgKG1hcmdpblZhbHVlcyk7Ci0JCW1hcmdpbkJvdHRvbS5zZWxlY3QgKDEpOwotCQltYXJnaW5Cb3R0b20uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQltYXJnaW5Cb3R0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFyZ2luQm90dG9tLmFkZFRyYXZlcnNlTGlzdGVuZXIodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgic3BhY2luZyIpOwotCQlzcGFjaW5nID0gbmV3IENvbWJvIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpOwotCQlzcGFjaW5nLnNldEl0ZW1zIChtYXJnaW5WYWx1ZXMpOwotCQlzcGFjaW5nLnNlbGVjdCAoMSk7Ci0JCXNwYWNpbmcuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXNwYWNpbmcuYWRkVHJhdmVyc2VMaXN0ZW5lcih0cmF2ZXJzZUxpc3RlbmVyKTsKLQkJCi0JCS8qIENvbnRyb2xzIG90aGVyIHBhcmFtZXRlcnMgb2YgdGhlIFJvd0xheW91dCAqLwotCQlHcm91cCBzcGVjR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzcGVjR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlByb3BlcnRpZXMiKSk7Ci0JCXNwZWNHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzcGVjR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXdyYXAgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXAuc2V0VGV4dCAoIndyYXAiKTsKLQkJd3JhcC5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl3cmFwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IAotCQl3cmFwLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXBhY2sgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBhY2suc2V0VGV4dCAoInBhY2siKTsKLQkJcGFjay5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJcGFjay5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlwYWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWp1c3RpZnkgPSBuZXcgQnV0dG9uIChzcGVjR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWp1c3RpZnkuc2V0VGV4dCAoImp1c3RpZnkiKTsKLQkJanVzdGlmeS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAKLQkJanVzdGlmeS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIFBvc2l0aW9uIHRoZSBzYXNoICovCi0JCXNhc2guc2V0V2VpZ2h0cyAobmV3IGludCBbXSB7Niw1fSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAocm93TGF5b3V0KTsKLQl9Ci0JCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCXdpZHRoVGV4dC5kaXNwb3NlICgpOwotCQloZWlnaHRUZXh0LmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0ICgpO1xuIik7Ci0JCWlmIChyb3dMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC50eXBlID0gU1dULlZFUlRJQ0FMO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC53cmFwID09IGZhbHNlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQud3JhcCA9IGZhbHNlO1xuIik7Ci0JCX0gCi0JCWlmIChyb3dMYXlvdXQucGFjayA9PSBmYWxzZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LnBhY2sgPSBmYWxzZTtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQuanVzdGlmeSA9PSB0cnVlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQuanVzdGlmeSA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkxlZnQgIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5SaWdodCAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpblJpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQubWFyZ2luVG9wICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5tYXJnaW5Ub3AgPSAiICsgcm93TGF5b3V0Lm1hcmdpblRvcCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkJvdHRvbSAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIHJvd0xheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5zcGFjaW5nICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5zcGFjaW5nID0gIiArIHJvd0xheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAocm93TGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCWNvZGUuYXBwZW5kIChnZXRDaGlsZENvZGUgKGNvbnRyb2wsaSkpOwotCQkJUm93RGF0YSBkYXRhID0gKFJvd0RhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSAoKTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSAtMSB8fCBkYXRhLmhlaWdodCAhPSAtMSkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHQiKTsKLQkJCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlJvd0RhdGEgIik7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmIChkYXRhLndpZHRoID09IC0xKSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoImRhdGEgPSBuZXcgUm93RGF0YSAoU1dULkRFRkFVTFQsICIgKyBkYXRhLmhlaWdodCArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSBpZiAoZGF0YS5oZWlnaHQgPT0gLTEpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBSb3dEYXRhICgiICsgZGF0YS53aWR0aCArICIsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJkYXRhID0gbmV3IFJvd0RhdGEgKCIgKyBkYXRhLndpZHRoICsgIiwgIiArIGRhdGEuaGVpZ2h0ICsgIik7XG4iKTsJCQkJCi0JCQkJCX0KLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAKLQkJCSIiLAotCQkJIkNvbnRyb2wiLAotCQkJIndpZHRoIiwgCi0JCQkiaGVpZ2h0IgotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJSb3dMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCS8qIE1ha2Ugc3VyZSB1c2VyIGhhcyBlbnRlcmVkIHZhbGlkIGRhdGEgKi8KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoZWlnaHRUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpOwotCQkJfQotCQkJU3RyaW5nIFtdIGluc2VydCA9IG5ldyBTdHJpbmcgW10gewotCQkJCVN0cmluZy52YWx1ZU9mIChyb3cpLCBjb21iby5nZXRUZXh0ICgpLCB3aWR0aFRleHQuZ2V0VGV4dCAoKSwgaGVpZ2h0VGV4dC5nZXRUZXh0ICgpfTsKLQkJCWRhdGEuc2V0RWxlbWVudEF0IChpbnNlcnQsIHJvdyk7Ci0JCQlmb3IgKGludCBpID0gMCA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlzZXRMYXlvdXREYXRhICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlSb3dEYXRhIGRhdGE7Ci0JCWludCB3aWR0aCwgaGVpZ2h0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWR0aCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQloZWlnaHQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEgPSBuZXcgUm93RGF0YSAod2lkdGgsIGhlaWdodCk7Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgdHlwZSBvZiBsYXlvdXQgKi8KLQkJaWYgKHZlcnRpY2FsLmdldFNlbGVjdGlvbiAoKSkgewotCQkJcm93TGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCX0gZWxzZSB7Ci0JCQlyb3dMYXlvdXQudHlwZSA9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJdHJ5IHsKLQkJCXJvd0xheW91dC5tYXJnaW5SaWdodCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5SaWdodC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5SaWdodCA9IDM7Ci0JCQltYXJnaW5SaWdodC5zZWxlY3QgKDEpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IG5ldyBJbnRlZ2VyIChtYXJnaW5MZWZ0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAzOwotCQkJbWFyZ2luTGVmdC5zZWxlY3QgKDEpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyb3dMYXlvdXQubWFyZ2luVG9wID0gbmV3IEludGVnZXIgKG1hcmdpblRvcC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5tYXJnaW5Ub3AgPSAzOwotCQkJbWFyZ2luVG9wLnNlbGVjdCAoMSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJvd0xheW91dC5tYXJnaW5Cb3R0b20gPSBuZXcgSW50ZWdlciAobWFyZ2luQm90dG9tLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDM7Ci0JCQltYXJnaW5Cb3R0b20uc2VsZWN0ICgxKTsKLQkJfQotCQl0cnkgewotCQkJcm93TGF5b3V0LnNwYWNpbmcgPSBuZXcgSW50ZWdlciAoc3BhY2luZy5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJvd0xheW91dC5zcGFjaW5nID0gMzsKLQkJCXNwYWNpbmcuc2VsZWN0ICgxKTsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBvdGhlciBsYXlvdXQgcHJvcGVydGllcyAqLwotCQlyb3dMYXlvdXQud3JhcCA9IHdyYXAuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQucGFjayA9IHBhY2suZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQuanVzdGlmeSA9IGp1c3RpZnkuZ2V0U2VsZWN0aW9uICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmZTdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0gCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogPGNvZGU+VGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgbGF5b3V0LCBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIG1hbmlwdWxhdGUgdGhlCi0gKiBsYXlvdXQuCi0gKgotICogQSB0eXBpY2FsIHBhZ2UgaW4gYSBUYWIgY29udGFpbnMgYSB0d28gY29sdW1uIGNvbXBvc2l0ZS4KLSAqIFRoZSBsZWZ0IGNvbHVtbiBjb250YWlucyB0aGUgbGF5b3V0IGdyb3VwLCB3aGljaCBjb250YWlucwotICogdGhlICJsYXlvdXQgY29tcG9zaXRlIiAodGhlIG9uZSB0aGF0IGhhcyB0aGUgZXhhbXBsZSBsYXlvdXQpLgotICogVGhlIHJpZ2h0IGNvbHVtbiBjb250YWlucyB0aGUgImNvbnRyb2wiIGdyb3VwLiBUaGUgImNvbnRyb2wiCi0gKiBncm91cCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZXhhbXBsZS4gVHlwaWNhbAotICogb3BlcmF0aW9ucyBhcmUgbW9kaWZ5aW5nIGxheW91dCBwYXJhbWV0ZXJzLCBhZGRpbmcgY2hpbGRyZW4KLSAqIHRvIHRoZSAibGF5b3V0IGNvbXBvc2l0ZSIsIGFuZCBtb2RpZnlpbmcgY2hpbGQgbGF5b3V0IGRhdGEuCi0gKiBUaGUgIkNvZGUiIGJ1dHRvbiBpbiB0aGUgImNvbnRyb2wiIGdyb3VwIG9wZW5zIGEgbmV3IHdpbmRvdwotICogY29udGFpbmluZyBjb2RlIHRoYXQgd2lsbCByZWdlbmVyYXRlIHRoZSBsYXlvdXQuIFRoaXMgY29kZQotICogKG9yIHBhcnRzIG9mIGl0KSBjYW4gYmUgc2VsZWN0ZWQgYW5kIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotICovCi1hYnN0cmFjdCBjbGFzcyBUYWIgewkKLQkvKiBDb21tb24gZ3JvdXBzIGFuZCBjb21wb3NpdGVzICovCi0JQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JU2FzaEZvcm0gc2FzaDsKLQlHcm91cCBsYXlvdXRHcm91cCwgY29udHJvbEdyb3VwLCBjaGlsZEdyb3VwOwotCS8qIFRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQgKi8KLQlDb21wb3NpdGUgbGF5b3V0Q29tcG9zaXRlOwotCS8qIENvbW1vbiBjb250cm9scyBmb3IgbW9kaWZ5aW5nIHRoZSBleGFtcGxlIGxheW91dCAqLwotCVN0cmluZyBbXSBuYW1lczsKLQlDb250cm9sIFtdIGNoaWxkcmVuOwotCUJ1dHRvbiBzaXplLCBhZGQsIGRlbGV0ZSwgY2xlYXIsIGNvZGU7Ci0JLyogQ29tbW9uIHZhbHVlcyBmb3Igd29ya2luZyB3aXRoIFRhYmxlRWRpdG9ycyAqLwotCVRhYmxlIHRhYmxlOwotCWludCBpbmRleDsKLQlUYWJsZUl0ZW0gbmV3SXRlbSwgbGFzdFNlbGVjdGVkOwotCVZlY3RvciBkYXRhID0gbmV3IFZlY3RvciAoKTsKLQkvKiBDb250cm9sbGluZyBpbnN0YW5jZSAqLwotCWZpbmFsIExheW91dEV4YW1wbGUgaW5zdGFuY2U7Ci0KLQkvKiBMaXN0ZW5lcnMgKi8KLQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJfQotCX07Ci0JCQotCVRyYXZlcnNlTGlzdGVuZXIgdHJhdmVyc2VMaXN0ZW5lciA9IG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkIChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCVRhYihMYXlvdXRFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgImNoaWxkIiBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgdGhhdCBhbGxvd3MKLQkgKiB5b3UgdG8gYWRkIGNoaWxkcmVuIHRvIHRoZSBsYXlvdXQuIEl0IGV4aXN0cyB3aXRoaW4gdGhlCi0JICogY29udHJvbEdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRHcm91cCAoKSB7Ci0JCWNoaWxkR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljaGlsZEdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoaWxkcmVuIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNoaWxkR3JvdXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hpbGRHcm91cC5zZXRMYXlvdXREYXRhIChkYXRhKTsgCi0JCWNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIG1vZGlmeWluZyB0aGUgImNoaWxkcmVuIiAKLQkgKiB0YWJsZSwgYW5kIHRoZSB0YWJsZSBpdHNlbGYuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50IHRoZQotCSAqIHN0YW5kYXJkIHRhYmxlLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzICgpIHsKLQkJLyogQ29udHJvbHMgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgY2hpbGRyZW4gKi8KLQkJYWRkID0gbmV3IEJ1dHRvbiAoY2hpbGRHcm91cCwgU1dULlBVU0gpOwotCQlhZGQuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFkZCIpKTsKLQkJYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlID0gbmV3IEJ1dHRvbiAoY2hpbGRHcm91cCwgU1dULlBVU0gpOwotCQlkZWxldGUuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlbGV0ZSIpKTsKLQkJZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpbnQgW10gc2VsZWN0ZWQgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJCXRhYmxlLnJlbW92ZSAoc2VsZWN0ZWQpOwotCQkJCS8qIFJlZnJlc2ggdGhlIGNvbnRyb2wgaW5kaWNlcyBvZiB0aGUgdGFibGUgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCQkJdGFibGUuZ2V0SXRlbSAoaSkuc2V0VGV4dCAoMCwgU3RyaW5nLnZhbHVlT2YgKGkpKTsKLQkJCQl9Ci0JCQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJY2xlYXIgPSBuZXcgQnV0dG9uIChjaGlsZEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJY2xlYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZHJlbiBbaV0uZGlzcG9zZSAoKTsKLQkJCQl9Ci0JCQkJdGFibGUucmVtb3ZlQWxsICgpOwotCQkJCWRhdGEuY2xlYXIgKCk7Ci0JCQkJY2hpbGRyZW4gPSBuZXcgQ29udHJvbCBbMF07Ci0JCQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCS8qIENyZWF0ZSB0aGUgImNoaWxkcmVuIiB0YWJsZSAqLwotCQl0YWJsZSA9IG5ldyBUYWJsZSAoY2hpbGRHcm91cCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCXRhYmxlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkKLQkJLyogQWRkIGNvbHVtbnMgdG8gdGhlIHRhYmxlICovCi0JCVN0cmluZyBbXSBjb2x1bW5IZWFkZXJzID0gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMgKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVycy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoY29sdW1uSGVhZGVycyBbaV0pOwotCQkJaWYgKGkgPT0gMCkgY29sdW1uLnNldFdpZHRoICgyMCk7Ci0JCQllbHNlIGlmIChpID09IDEpIGNvbHVtbi5zZXRXaWR0aCAoODApOwotCQkJZWxzZSBjb2x1bW4ucGFjayAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYmxlRWRpdG9yIHdpdGggYSBDQ29tYm8gaW4gdGhlIGZpcnN0IGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4gVGhpcyBDQ29tYm8gbGlzdHMgYWxsIHRoZSBjb250cm9scyB0aGF0Ci0JICogdGhlIHVzZXIgY2FuIHNlbGVjdCB0byBwbGFjZSBvbiB0aGVpciBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVDb21ib0VkaXRvciAoQ0NvbWJvIGNvbWJvLCBUYWJsZUVkaXRvciBjb21ib0VkaXRvcikgewotCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7Ci0JCQkiQnV0dG9uIiwgIkNhbnZhcyIsICJDb21ibyIsICJDb21wb3NpdGUiLAotCQkJIkNvb2xCYXIiLCAiR3JvdXAiLCAiTGFiZWwiLCAiTGlzdCIsCi0JCQkiUHJvZ3Jlc3NCYXIiLCAiU2NhbGUiLCAiU2xpZGVyIiwgIlN0eWxlZFRleHQiLAotCQkJIlRhYmxlIiwgIlRleHQiLCAiVG9vbEJhciIsICJUcmVlIn0pOwotCQljb21iby5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKDEpKTsKLQkJCi0JCS8qIFNldCB1cCBlZGl0b3IgKi8KLQkJY29tYm9FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQljb21ib0VkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWNvbWJvRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKGNvbWJvLCBuZXdJdGVtLCAxKTsKLQkJCi0JCS8qIEFkZCBsaXN0ZW5lciAqLwotCQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotICAgICAgICAgICAgCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotICAgICAgICAgICAgICAgICAgICByZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjb250cm9sIiBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiBJdCBjb250YWlucyBjb250cm9scwotCSAqIGZvciBhZGRpbmcgbmV3IGNoaWxkcmVuIHRvIHRoZSBsYXlvdXRDb21wb3NpdGUsIGFuZAotCSAqIGZvciBtb2RpZnlpbmcgdGhlIGNoaWxkcmVuJ3MgbGF5b3V0IGRhdGEuCi0JICovCQotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCXNpemUgPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNpemUuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlByZWZlcnJlZF9TaXplIikpOwotCQlzaXplLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQlzaXplLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpZiAoc2l6ZS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoKSk7Ci0JCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNpemUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCWNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkJCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgImNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGF1Z21lbnQKLQkgKiB0aGUgc3RhbmRhcmQgY29udHJvbHMgY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJY3JlYXRlQ2hpbGRHcm91cCAoKTsKLQkJY29kZSA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULlBVU0gpOwotCQljb2RlLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDb2RlIikpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvZGUuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQljb2RlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwkKLQkJCQlzaGVsbC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiR2VuZXJhdGVkX0NvZGUiKSk7Ci0JCQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JCQkJZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlTdHJpbmcgbGF5b3V0Q29kZSA9IGdlbmVyYXRlQ29kZSAoKS50b1N0cmluZyAoKTsKLQkJCQlpZiAobGF5b3V0Q29kZS5sZW5ndGggKCkgPT0gMCkgcmV0dXJuOwotCQkJCXRleHQuc2V0VGV4dCAobGF5b3V0Q29kZSk7Ci0JCQkJCi0JCQkJTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCQkJCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JCQkJTWVudUl0ZW0gZWRpdEl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCQkJCWVkaXRJdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFZGl0IikpOwotCQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChiYXIpOwotCQkJCU1lbnVJdGVtIHNlbGVjdCA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCXNlbGVjdC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0FsbCIpKTsKLQkJCQlzZWxlY3Quc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkJCQlzZWxlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJTWVudUl0ZW0gY29weSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCWNvcHkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvcHkiKSk7Ci0JCQkJY29weS5zZXRBY2NlbGVyYXRvciAoU1dULk1PRDEgKyAnQycpOwotCQkJCWNvcHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuY29weSAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCU1lbnVJdGVtIGV4aXQgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQlleGl0LnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJFeGl0IikpOwotCQkJCWV4aXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZWRpdEl0ZW0uc2V0TWVudSAobWVudSk7Ci0JCQkJCi0JCQkJc2hlbGwucGFjayAoKTsKLQkJCQlzaGVsbC5zZXRTaXplICg0MDAsIDUwMCk7Ci0JCQkJc2hlbGwub3BlbiAoKTsKLQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRDb21wb3NpdGUgKCkgewotCQlsYXlvdXRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChsYXlvdXRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVMYXlvdXQgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxheW91dCBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogbGVmdCBoYWxmIG9mIGVhY2ggZXhhbXBsZSB0YWIuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXRHcm91cCAoKSB7Ci0JCWxheW91dEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWxheW91dEdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxheW91dCIpKTsKLQkJbGF5b3V0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNyZWF0ZUxheW91dENvbXBvc2l0ZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDcmVhdGUgYSB0d28gY29sdW1uIHBhZ2Ugd2l0aCBhIFNhc2hGb3JtKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQlzYXNoID0gbmV3IFNhc2hGb3JtICh0YWJGb2xkZXJQYWdlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgImxheW91dCIgYW5kICJjb250cm9sIiBjb2x1bW5zICovCi0JCWNyZWF0ZUxheW91dEdyb3VwICgpOwotCQljcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFibGVFZGl0b3Igd2l0aCBhIFRleHQgaW4gdGhlIGdpdmVuIGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGNyZWF0ZVRleHRFZGl0b3IgKFRleHQgdGV4dCwgVGFibGVFZGl0b3IgdGV4dEVkaXRvciwgaW50IGNvbHVtbikgewotCQl0ZXh0LnNldEZvbnQgKHRhYmxlLmdldEZvbnQgKCkpOwotCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJdGV4dEVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCXRleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZXh0RWRpdG9yLnNldEVkaXRvciAodGV4dCwgbmV3SXRlbSwgY29sdW1uKTsKLQkJCi0JCXRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIAlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0RWRpdG9ycyAodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHByb2R1Y2UgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVDb2RlICgpIHsKLQkJLyogTWFrZSBzdXJlIGFsbCBpbmZvcm1hdGlvbiBiZWluZyBlbnRlcmVkIGlzIHN0b3JlZCBpbiB0aGUgdGFibGUgKi8KLQkJcmVzZXRFZGl0b3JzICgpOwotCQkKLQkJLyogR2V0IG5hbWVzIGZvciBjb250cm9scyBpbiB0aGUgbGF5b3V0ICovCi0JCW5hbWVzID0gbmV3IFN0cmluZyBbY2hpbGRyZW4ubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2wuZ2V0Q2xhc3MgKCkudG9TdHJpbmcgKCk7Ci0JCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJCW5hbWVzIFtpXSA9IGNvbnRyb2xUeXBlLnRvTG93ZXJDYXNlICgpICsgaTsKLQkJfQotCQotCQkvKiBDcmVhdGUgU3RyaW5nQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZGUgKi8KLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjtcbiIpOwotCQljb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7XG5cbiIpOwotCQljb2RlLmFwcGVuZCAoInB1YmxpYyBjbGFzcyBNeUxheW91dCB7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykge1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTtcbiIpOwotCQkKLQkJLyogR2V0IGxheW91dCBzcGVjaWZpYyBjb2RlICovCi0JCWNvZGUuYXBwZW5kIChnZW5lcmF0ZUxheW91dENvZGUgKCkpOwotCQkKLQkJY29kZS5hcHBlbmQgKCJcblx0XHRzaGVsbC5wYWNrICgpO1xuXHRcdHNoZWxsLm9wZW4gKCk7XG5cbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHR3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRcdGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0XHRcdGRpc3BsYXkuc2xlZXAgKCk7XG5cdFx0fVxuXHRcdGRpc3BsYXkuZGlzcG9zZSAoKTtcblx0fVxufSIpOwotCQkKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBsYXlvdXQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyICgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdHJpbmdCdWZmZXIgZm9yIHRoZSBjb2RlIHdoaWNoIHdpbGwgCi0JICogY3JlYXRlIGEgY2hpbGQgY29udHJvbC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2V0Q2hpbGRDb2RlIChDb250cm9sIGNvbnRyb2wsIGludCBpKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJLyogRmluZCB0aGUgdHlwZSBvZiBjb250cm9sICovCi0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBjb250cm9sLmdldENsYXNzKCkudG9TdHJpbmcgKCk7Ci0JCVN0cmluZyBjb250cm9sVHlwZSA9IGNvbnRyb2xDbGFzcy5zdWJzdHJpbmcgKGNvbnRyb2xDbGFzcy5sYXN0SW5kZXhPZiAoJy4nKSArIDEpOwotCQkvKiBGaW5kIHRoZSBzdHlsZSBvZiB0aGUgY29udHJvbCAqLwotCQlTdHJpbmcgc3R5bGVTdHJpbmc7Ci0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULlBVU0giOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlRleHQiKSkgewotCQkJc3R5bGVTdHJpbmcgPSAiU1dULkJPUkRFUiI7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIjsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDYW52YXMiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJDb21wb3NpdGUiKSB8fCAKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVGFibGUiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJTdHlsZWRUZXh0IikgfHwKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIlRyZWUiKSB8fAotCQkJCQljb250cm9sVHlwZS5lcXVhbHMgKCJMaXN0IikpIHsKLQkJCXN0eWxlU3RyaW5nID0gIlNXVC5CT1JERVIiOwotCQl9IGVsc2Ugc3R5bGVTdHJpbmcgPSAiU1dULk5PTkUiOwotCQkvKiBXcml0ZSBvdXQgdGhlIGNvbnRyb2wgYmVpbmcgZGVjbGFyZWQgKi8KLQkJY29kZS5hcHBlbmQgKCJcblx0XHQiICsgY29udHJvbFR5cGUgKyAiICIgKyBuYW1lcyBbaV0gKyAKLQkJCQkJICIgPSBuZXcgIiArIGNvbnRyb2xUeXBlICsgIiAoc2hlbGwsICIgKyBzdHlsZVN0cmluZyArICIpO1xuIik7Ci0JCS8qIEFkZCBpdGVtcyB0byB0aG9zZSBjb250cm9scyB0aGF0IG5lZWQgaXRlbXMgKi8KLQkJaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIkNvbWJvIikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiTGlzdCIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7XCJJdGVtIDFcIiwgXCJJdGVtIDJcIiwgXCJJdGVtIDJcIn0pO1xuIik7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVGFibGUiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGluZXNWaXNpYmxlICh0cnVlKTtcbiIpOwotCQkJZm9yIChpbnQgaiA9IDE7IGogPCAzOyBqKyspIHsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHRUYWJsZUl0ZW0gdGFibGVJdGVtIiArIGogKyAiID0gbmV3IFRhYmxlSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJCWNvZGUuYXBwZW5kICgiXHRcdHRhYmxlSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUcmVlIikpIHsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VHJlZUl0ZW0gdHJlZUl0ZW0iICsgaiArICIgPSBuZXcgVHJlZUl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0cmVlSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJUb29sQmFyIikpIHsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VG9vbEl0ZW0gdG9vbEl0ZW0iICsgaiArICIgPSBuZXcgVG9vbEl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0b29sSXRlbSIgKyBqICsgIi5zZXRUZXh0IChcIkl0ZW0iICsgaiArICJcIik7XG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDb29sQmFyIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFRvb2xCYXIgY29vbFRvb2xCYXIgPSBuZXcgVG9vbEJhciAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5CT1JERVIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUb29sSXRlbSBjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gMVwiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDJcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdENvb2xJdGVtIGNvb2xJdGVtMSA9IG5ldyBDb29sSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0xLnNldENvbnRyb2wgKGNvb2xUb29sQmFyKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0UG9pbnQgc2l6ZSA9IGNvb2xUb29sQmFyLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTEuc2V0U2l6ZSAoY29vbEl0ZW0xLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEJhciA9IG5ldyBUb29sQmFyICgiICsgbmFtZXMgW2ldICsgIiwgU1dULkJPUkRFUik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSAzXCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gNFwiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Q29vbEl0ZW0gY29vbEl0ZW0yID0gbmV3IENvb2xJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTIuc2V0Q29udHJvbCAoY29vbFRvb2xCYXIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRzaXplID0gY29vbFRvb2xCYXIuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMi5zZXRTaXplIChjb29sSXRlbTIuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFNpemUgKCIgKyBuYW1lcyBbaV0gKyAiLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTtcbiIpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlByb2dyZXNzQmFyIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFNlbGVjdGlvbiAoNTApO1xuIik7Ci0JCX0gCi0JCS8qIFNldCB0ZXh0IGZvciB0aG9zZSBjb250cm9scyB0aGF0IHN1cHBvcnQgaXQgKi8JCQkgCi0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJCdXR0b24iKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiQ29tYm8iKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiR3JvdXAiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiTGFiZWwiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJUZXh0IikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFRleHQgKFwiIiArIG5hbWVzIFtpXSArICJcIik7XG4iKTsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10ge307Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb21wb3NpdGUgYW5kIGRyYXdzIGFsbCBjb250cm9scwotCSAqIGluIHRoZSBsYXlvdXQgZXhhbXBsZS4KLQkgKi8KLQl2b2lkIHJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCkgewotCQkvKiBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgYWxyZWFkeSBsYWlkIG91dCAqLwotCQljaGlsZHJlbiA9IGxheW91dENvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4gW2ldLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJLyogQWRkIGFsbCBjaGlsZHJlbiBsaXN0ZWQgaW4gdGhlIHRhYmxlICovCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQljaGlsZHJlbiA9IG5ldyBDb250cm9sIFtpdGVtcy5sZW5ndGhdOwotCQlTdHJpbmcgW10gaXRlbVZhbHVlcyA9IG5ldyBTdHJpbmcgW10gewotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pLAotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pLAotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIzIn0pfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbnRyb2wgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoMSk7Ci0JCQlpZiAoY29udHJvbC5lcXVhbHMgKCJCdXR0b24iKSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChsYXlvdXRDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJ1dHRvbl9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBidXR0b247Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ2FudmFzIikpIHsKLQkJCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjYW52YXM7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ29tYm8iKSkgewotCQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljb21iby5zZXRJdGVtcyAoaXRlbVZhbHVlcyk7Ci0JCQkJY29tYm8uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbWJvX0luZGV4IiwgbmV3IFN0cmluZyBbXSB7bmV3IEludGVnZXIgKGkpLnRvU3RyaW5nICgpfSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvbWJvOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNvbXBvc2l0ZSIpKSB7IAotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvbXBvc2l0ZTsKLQkJICAgIH0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDb29sQmFyIikpIHsgCi0JCSAgICAJQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChjb29sQmFyLCBTV1QuQk9SREVSKTsKLQkJCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjIifSkpOwotCQkgICAgCUNvb2xJdGVtIGNvb2xJdGVtMSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgMCk7Ci0JCSAgICAJY29vbEl0ZW0xLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQkJCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgU1dULkJPUkRFUik7Ci0JCQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjMifSkpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyI0In0pKTsKLQkJICAgIAlDb29sSXRlbSBjb29sSXRlbTIgPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIDApOwotCQkgICAgCWNvb2xJdGVtMi5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJICAgIAlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICAJCWNvb2xJdGVtMS5zZXRTaXplKGNvb2xJdGVtMS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTsKLSAgICAgICAgCQljb29sSXRlbTIuc2V0U2l6ZShjb29sSXRlbTIuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0gICAgICAgCQkJY29vbEJhci5zZXRTaXplKGNvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY29vbEJhcjsKLQkJICAgIH0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJHcm91cCIpKSB7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJHcm91cF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBncm91cDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJMYWJlbCIpKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWxhYmVsLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMYWJlbF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBsYWJlbDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJMaXN0IikpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgTGlzdCAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlsaXN0LnNldEl0ZW1zIChpdGVtVmFsdWVzKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBsaXN0OwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlByb2dyZXNzQmFyIikpIHsKLQkJCQlQcm9ncmVzc0JhciBwcm9ncmVzcyA9IG5ldyBQcm9ncmVzc0JhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJcHJvZ3Jlc3Muc2V0U2VsZWN0aW9uICg1MCk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gcHJvZ3Jlc3M7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU2NhbGUiKSkgewotCQkJCVNjYWxlIHNjYWxlID0gbmV3IFNjYWxlIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzY2FsZTsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJTbGlkZXIiKSkgewotCQkJCVNsaWRlciBzbGlkZXIgPSBuZXcgU2xpZGVyIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzbGlkZXI7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU3R5bGVkVGV4dCIpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQgKGxheW91dENvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJc3R5bGVkVGV4dC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9JbmRleCIsIG5ldyBTdHJpbmcgW10ge25ldyBJbnRlZ2VyIChpKS50b1N0cmluZyAoKX0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBzdHlsZWRUZXh0OwkJCQotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRhYmxlIikpIHsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjEifSkpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjIifSkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHRhYmxlOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlRleHQiKSkgewotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRleHQuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlRleHRfSW5kZXgiLCBuZXcgU3RyaW5nIFtdIHtuZXcgSW50ZWdlciAoaSkudG9TdHJpbmcgKCl9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdGV4dDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJUb29sQmFyIikpIHsKLQkJCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUb29sSXRlbSBpdGVtMSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUb29sSXRlbSBpdGVtMiA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0b29sQmFyOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0cmVlOwotCQkJfSAKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzICgpIHsKLQkJcmVzZXRFZGl0b3JzIChmYWxzZSk7Ci0JfQotCQotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBsYXlvdXQuIAotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXREYXRhICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmM2ZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIGFpcmJydXNoIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBBaXJicnVzaFRvb2wgZXh0ZW5kcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQlwcml2YXRlIFJhbmRvbSByYW5kb207Ci0JcHJpdmF0ZSBpbnQgY2FjaGVkUmFkaXVzU3F1YXJlZDsKLQlwcml2YXRlIGludCBjYWNoZWROdW1Qb2ludHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEFpcmJydXNoVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQkJc2V0UmV0cmlnZ2VyVGltZXIoMTApOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJLy8gY29tcHV0ZSB0aGluZ3Mgd2UgbmVlZCB0byBrbm93IGZvciBkcmF3aW5nCi0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCQljYWNoZWRSYWRpdXNTcXVhcmVkID0gc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiBzZXR0aW5ncy5haXJicnVzaFJhZGl1czsKLQkJY2FjaGVkTnVtUG9pbnRzID0gMzE0ICogc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgKiBjYWNoZWRSYWRpdXNTcXVhcmVkIC8gMjUwMDAwOwotCQlpZiAoY2FjaGVkTnVtUG9pbnRzID09IDAgJiYgc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgIT0gMCkKLQkJCWNhY2hlZE51bVBvaW50cyA9IDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuQWlyYnJ1c2gubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlcihQb2ludCBwb2ludCkgewotCQkvLyBEcmF3cyBhIGJ1bmNoIChjYWNoZWROdW1Qb2ludHMpIG9mIHJhbmRvbSBwaXhlbHMgd2l0aGluIGEgc3BlY2lmaWVkIGNpcmNsZSAoY2FjaGVkUmFkaXVzU3F1YXJlZCkuCi0JCUNvbnRhaW5lckZpZ3VyZSBjZmlnID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkTnVtUG9pbnRzOyArK2kpIHsKLQkJCWludCByYW5kWCwgcmFuZFk7Ci0JCQlkbyB7Ci0JCQkJcmFuZFggPSAoaW50KSAoKHJhbmRvbS5uZXh0RG91YmxlKCkgLSAwLjUpICogc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiAyLjApOwotCQkJCXJhbmRZID0gKGludCkgKChyYW5kb20ubmV4dERvdWJsZSgpIC0gMC41KSAqIHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogMi4wKTsKLQkJCX0gd2hpbGUgKHJhbmRYICogcmFuZFggKyByYW5kWSAqIHJhbmRZID4gY2FjaGVkUmFkaXVzU3F1YXJlZCk7Ci0JCQljZmlnLmFkZChuZXcgUG9pbnRGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBwb2ludC54ICsgcmFuZFgsIHBvaW50LnkgKyByYW5kWSkpOwotCQl9Ci0JCWdldFBhaW50U3VyZmFjZSgpLmRyYXdGaWd1cmUoY2ZpZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmZkZjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgcGFpbnQgc3VyZmFjZQotCSAqLwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBCYXNpY1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXRoaXMucGFpbnRTdXJmYWNlID0gcGFpbnRTdXJmYWNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhaW50IHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCkgewotCQlyZXR1cm4gcGFpbnRTdXJmYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzc1M2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBDb250YWluZXIgZm9yIEZpZ3VyZSBvYmplY3RzIHdpdGggc3RhY2tpbmcgcHJldmlldyBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0FSUkFZX1NJWkUgPSAxNjsKLQkKLQlGaWd1cmVbXSAgIG9iamVjdFN0YWNrID0gbnVsbDsKLQlpbnQgICAgICBuZXh0SW5kZXggPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBlbXB0eSBDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyRmlndXJlKCkgewotCX0KLQkvKioKLQkgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgY29udGFpbmVyIGZvciBsYXRlciBkcmF3aW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChGaWd1cmUgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3RTdGFjayA9PSBudWxsKSB7Ci0JCQlvYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbSU5JVElBTF9BUlJBWV9TSVpFXTsKLQkJfSBlbHNlIGlmIChvYmplY3RTdGFjay5sZW5ndGggPD0gbmV4dEluZGV4KSB7Ci0JCQlGaWd1cmVbXSBuZXdPYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbb2JqZWN0U3RhY2subGVuZ3RoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdFN0YWNrLCAwLCBuZXdPYmplY3RTdGFjaywgMCwgb2JqZWN0U3RhY2subGVuZ3RoKTsKLQkJCW9iamVjdFN0YWNrID0gbmV3T2JqZWN0U3RhY2s7Ci0JCX0KLQkJb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG9iamVjdDsKLQkJKytuZXh0SW5kZXg7Ci0JfQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBuZXh0SW5kZXggPT0gMDsKLQl9Ci0JLyoqCi0JICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRhaW5lciBhbmQgZHJhd3MgaXRzIHByZXZpZXcgdGhlbiB1cGRhdGVzIHRoZSBzdXBwbGllZCBwcmV2aWV3IHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqIEBwYXJhbSBnYyB0aGUgR0MgdG8gZHJhdyBvbgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBhZGQgdG8gdmlydHVhbCBjb29yZGluYXRlcyB0byBnZXQgZGlzcGxheSBjb29yZGluYXRlcwotCSAqIEBwYXJhbSByZW1lbWJlcmVkU3RhdGUgdGhlIHN0YXRlIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgZHJhd1ByZXZpZXcoKSBvciBhZGRBbmRQcmV2aWV3KCkKLQkgKiAgICAgICAgdXNpbmcgdGhpcyBDb250YWluZXIsIG1heSBiZSBudWxsIGlmIHRoZXJlIHdhcyBubyBzdWNoIHByZXZpb3VzIGNhbGwKLQkgKiBAcmV0dXJuIG9iamVjdCBzdGF0ZSB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIGVyYXNlUHJldmlldygpIGxhdGVyIHRvIGVyYXNlIHRoaXMgb2JqZWN0Ci0JICovCi0vLwlwdWJsaWMgT2JqZWN0IGFkZEFuZFByZXZpZXcoRmlndXJlIG9iamVjdCwgR0MgZ2MsIFBvaW50IG9mZnNldCwgT2JqZWN0IHJlbWVtYmVyZWRTdGF0ZSkgewotLy8JCU9iamVjdFtdIHN0YXRlU3RhY2sgPSAoT2JqZWN0W10pIHJlbWVtYmVyZWRTdGF0ZTsKLS8vCQlpZiAoc3RhdGVTdGFjayA9PSBudWxsKSB7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXcgT2JqZWN0W0lOSVRJQUxfQVJSQVlfU0laRV07Ci0vLwkJfSBlbHNlIGlmIChzdGF0ZVN0YWNrLmxlbmd0aCA8PSBuZXh0SW5kZXgpIHsKLS8vCQkJT2JqZWN0W10gbmV3U3RhdGVTdGFjayA9IG5ldyBPYmplY3Rbc3RhdGVTdGFjay5sZW5ndGggKiAyXTsKLS8vCQkJU3lzdGVtLmFycmF5Y29weShzdGF0ZVN0YWNrLCAwLCBuZXdTdGF0ZVN0YWNrLCAwLCBzdGF0ZVN0YWNrLmxlbmd0aCk7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXdTdGF0ZVN0YWNrOwotLy8JCX0KLS8vCQlhZGQob2JqZWN0KTsKLS8vCQlzdGF0ZVN0YWNrW25leHRJbmRleCAtIDFdID0gb2JqZWN0LmRyYXdQcmV2aWV3KGdjLCBvZmZzZXQpOwotLy8JCXJldHVybiBzdGF0ZVN0YWNrOwotLy8JfQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGFpbmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBlcmFzZVByZXZpZXcoKSBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgcG9pbnQgdG8gZXJhc2UgYW55IHByZXZpb3VzCi0JICogZHJhd1ByZXZpZXcoKSdzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJd2hpbGUgKC0tbmV4dEluZGV4ID4gMCkgb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG51bGw7Ci0JCW5leHRJbmRleCA9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dEluZGV4OyArK2kpIG9iamVjdFN0YWNrW2ldLmRyYXcoZmRjKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0SW5kZXg7ICsraSkgb2JqZWN0U3RhY2tbaV0uYWRkRGFtYWdlZFJlZ2lvbihmZGMsIHJlZ2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE1MzUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBkcmF3IGNvbnRpbnVvdXNseSBhbG9uZyB0aGUgcGF0aAotICogdHJhY2VkIGJ5IHRoZSBtb3VzZSdzIG1vdmVtZW50IHdoaWxlIHRoZSBidXR0b24gaXMgZGVwcmVzc2VkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQotCS8qKgotCSAqIEEgY2FjaGVkIFBvaW50IGFycmF5IGZvciBkcmF3aW5nLgotCSAqLwotCXByaXZhdGUgUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbXSB7IG5ldyBQb2ludCgtMSwgLTEpLCBuZXcgUG9pbnQoLTEsIC0xKSB9OwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZ2dlcnMgaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXByaXZhdGUgaW50IHJldHJpZ2dlckludGVydmFsID0gMDsKLQkKLQkvKioKLQkgKiBUaGUgY3VycmVudGx5IHZhbGlkIFJldHJpZ2dlckhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgUnVubmFibGUgcmV0cmlnZ2VySGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgQ29udGludW91c1BhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBkcmF3aW5nIHN1cmZhY2UgdG8gdXNlCi0JICovCi0JcHJvdGVjdGVkIENvbnRpbnVvdXNQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJldHJpZ2dlciB0aW1lci4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgdGltZXIgZWxhcHNlcywgaWYgdGhlIG1vdXNlIGlzIHN0aWxsIGhvdmVyaW5nIG92ZXIgdGhlIHNhbWUgcG9pbnQgd2l0aCB0aGUKLQkgKiBkcmFnIGJ1dHRvbiBwcmVzc2VkLCBhIG5ldyByZW5kZXIgb3JkZXIgaXMgaXNzdWVkIGFuZCB0aGUgdGltZXIgaXMgcmVzdGFydGVkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiByZXRyaWdnZXJzLCAwIHRvIGRpc2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXRyaWdnZXJUaW1lcihpbnQgaW50ZXJ2YWwpIHsKLQkJcmV0cmlnZ2VySW50ZXJ2YWwgPSBpbnRlcnZhbDsKLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS4KLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLkNvbnRpbnVvdXNQYWludC5tZXNzYWdlIikpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCQlhYm9ydFJldHJpZ2dlcigpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChkcmFnSW5Qcm9ncmVzcykgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQlkcmFnSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLQkJcG9pbnRzWzBdLnggPSBldmVudC54OwotCQlwb2ludHNbMF0ueSA9IGV2ZW50Lnk7Ci0JCXJlbmRlcihwb2ludHNbMF0pOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSBhIHJlbmRlcmluZyBzZWdtZW50Ci0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgbW91c2VTZWdtZW50RmluaXNoZWQoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAocG9pbnRzWzBdLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJaWYgKHBvaW50c1swXS54ICE9IGV2ZW50LnggfHwgcG9pbnRzWzBdLnkgIT0gZXZlbnQueSkgewotCQkJLy8gZHJhdyBuZXcgc2VnbWVudAotCQkJcG9pbnRzWzFdLnggPSBldmVudC54OwotCQkJcG9pbnRzWzFdLnkgPSBldmVudC55OwotCQkJcmVuZGVyQ29udGludW91c1NlZ21lbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgY29udGludW91cyBzZWdtZW50IGZyb20gcG9pbnRzWzBdIHRvIHBvaW50c1sxXS4KLQkgKiBBc3N1bWVzIHBvaW50c1swXSBoYXMgYmVlbiBkcmF3biBhbHJlYWR5LgotCSAqIAotCSAqIEBwb3N0IHBvaW50c1swXSB3aWxsIHJlZmVyIHRvIHRoZSBzYW1lIHBvaW50IGFzIHBvaW50c1sxXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlckNvbnRpbnVvdXNTZWdtZW50KCkgewotCQkvKiBBIGxhenkgYnV0IGVmZmVjdGl2ZSBsaW5lIGRyYXdpbmcgYWxnb3JpdGhtICovCi0JCWZpbmFsIGludCBkWCA9IHBvaW50c1sxXS54IC0gcG9pbnRzWzBdLng7Ci0JCWZpbmFsIGludCBkWSA9IHBvaW50c1sxXS55IC0gcG9pbnRzWzBdLnk7Ci0JCWludCBhYnNkWCA9IE1hdGguYWJzKGRYKTsKLQkJaW50IGFic2RZID0gTWF0aC5hYnMoZFkpOwotCi0JCWlmICgoZFggPT0gMCkgJiYgKGRZID09IDApKSByZXR1cm47Ci0JCQotCQlpZiAoYWJzZFkgPiBhYnNkWCkgewotCQkJZmluYWwgaW50IGluY2ZwWCA9IChkWCA8PCAxNikgLyBhYnNkWTsKLQkJCWZpbmFsIGludCBpbmNZID0gKGRZID4gMCkgPyAxIDogLTE7Ci0JCQlpbnQgZnBYID0gcG9pbnRzWzBdLnggPDwgMTY7IC8vIFggaW4gZml4ZWRwb2ludCBmb3JtYXQKLQotCQkJd2hpbGUgKC0tYWJzZFkgPj0gMCkgewotCQkJCXBvaW50c1swXS55ICs9IGluY1k7Ci0JCQkJcG9pbnRzWzBdLnggPSAoZnBYICs9IGluY2ZwWCkgPj4gMTY7Ci0JCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQl9Ci0JCQlpZiAocG9pbnRzWzBdLnggPT0gcG9pbnRzWzFdLngpIHJldHVybjsKLQkJCXBvaW50c1swXS54ID0gcG9pbnRzWzFdLng7Ci0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBpbnQgaW5jZnBZID0gKGRZIDw8IDE2KSAvIGFic2RYOwotCQkJZmluYWwgaW50IGluY1ggPSAoZFggPiAwKSA/IDEgOiAtMTsKLQkJCWludCBmcFkgPSBwb2ludHNbMF0ueSA8PCAxNjsgLy8gWSBpbiBmaXhlZHBvaW50IGZvcm1hdAotCi0JCQl3aGlsZSAoLS1hYnNkWCA+PSAwKSB7Ci0JCQkJcG9pbnRzWzBdLnggKz0gaW5jWDsKLQkJCQlwb2ludHNbMF0ueSA9IChmcFkgKz0gaW5jZnBZKSA+PiAxNjsKLQkJCQlyZW5kZXIocG9pbnRzWzBdKTsKLQkJCX0KLQkJCWlmIChwb2ludHNbMF0ueSA9PSBwb2ludHNbMV0ueSkgcmV0dXJuOwotCQkJcG9pbnRzWzBdLnkgPSBwb2ludHNbMV0ueTsKLQkJfQotCQlyZW5kZXIocG9pbnRzWzBdKTsKLQl9CQkKLQotCS8qKgotCSAqIFByZXBhcmUgdGhlIHJldHJpZ2dlciB0aW1lcgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBwcmVwYXJlUmV0cmlnZ2VyKCkgewotCQlpZiAocmV0cmlnZ2VySW50ZXJ2YWwgPiAwKSB7Ci0JCQkvKgotCQkJICogdGltZXJFeGVjKCkgcHJvdmlkZXMgYSBsaWdodHdlaWdodCBtZWNoYW5pc20gZm9yIHJ1bm5pbmcgY29kZSBhdCBpbnRlcnZhbHMgZnJvbSB3aXRoaW4KLQkJCSAqIHRoZSBldmVudCBsb29wIHdoZW4gdGltaW5nIGFjY3VyYWN5IGlzIG5vdCBpbXBvcnRhbnQuCi0JCQkgKgotCQkJICogU2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbmNlbCBhIHRpbWVyRXhlYygpLCB3ZSByZW1lbWJlciB0aGUgUnVubmFibGUgdGhhdCBpcwotCQkJICogYWN0aXZlIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIHRoZSB2YWxpZCBvbmUgZnJvbSB0aGUgc3RhbGUgb25lcy4gIEluIHByYWN0aWNlLAotCQkJICogaWYgdGhlIGludGVydmFsIGlzIDEvMTAwdGggb2YgYSBzZWNvbmQsIHRoZW4gY3JlYXRpbmcgYSBmZXcgaHVuZHJlZCBuZXcgUmV0cmlnZ2VySGFuZGxlcnMKLQkJCSAqIGVhY2ggc2Vjb25kIHdpbGwgbm90IGNhdXNlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaGl0LgotCQkJICovCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYWludFN1cmZhY2UoKS5nZXREaXNwbGF5KCk7Ci0JCQlyZXRyaWdnZXJIYW5kbGVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHJldHJpZ2dlckhhbmRsZXIgPT0gdGhpcykgewotCQkJCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQkJCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwkJCQotCQkJZGlzcGxheS50aW1lckV4ZWMocmV0cmlnZ2VySW50ZXJ2YWwsIHJldHJpZ2dlckhhbmRsZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJvcnRzIHRoZSByZXRyaWdnZXIgdGltZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYWJvcnRSZXRyaWdnZXIoKSB7Ci0JCXJldHJpZ2dlckhhbmRsZXIgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wbGF0ZSBtZXRob2Q6IFJlbmRlcnMgYSBwb2ludC4KLQkgKiBAcGFyYW0gcG9pbnQsIHRoZSBwb2ludCB0byByZW5kZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXIoUG9pbnQgcG9pbnQpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAxY2EyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgdXNlIGNsaWNrLWRyYWctcmVsZWFzZSBtb3Rpb25zIHRvCi0gKiBkcmF3IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEcmFnUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjbGljayBpbiBhIGNsaWNrLWRyYWcKLQkgKi8KLQlwcml2YXRlIFBvaW50IGFuY2hvclBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQkvKioKLQkgKiBBIHRlbXBvcmFyeSBwb2ludAotCSAqLwotCXByaXZhdGUgUG9pbnQgdGVtcFBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZ2V0UGFpbnRTdXJmYWNlKCkgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgRHJhZ1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JfQotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuCi0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5EcmFnSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlIikpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdG9vbC4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOwotCQkKLQkJYW5jaG9yUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCWFuY2hvclBvc2l0aW9uLnkgPSBldmVudC55OwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSB7Ci0JCQlyZXNldFNlc3Npb24oKTsgLy8gYWJvcnQgaWYgcmlnaHQgb3IgbWlkZGxlIG1vdXNlIGJ1dHRvbiBwcmVzc2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJaWYgKGFuY2hvclBvc2l0aW9uLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLmNvbW1pdFJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlpZiAoISBkcmFnSW5Qcm9ncmVzcykgewotCQkJcHMuc2V0U3RhdHVzQ29vcmQocHMuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBzLnNldFN0YXR1c0Nvb3JkUmFuZ2UoYW5jaG9yUG9zaXRpb24sIHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCXRlbXBQb3NpdGlvbi54ID0gZXZlbnQueDsKLQkJdGVtcFBvc2l0aW9uLnkgPSBldmVudC55OwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKGNyZWF0ZUZpZ3VyZShhbmNob3JQb3NpdGlvbiwgdGVtcFBvc2l0aW9uKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlbXBsYXRlIE1ldGhvZDogQ3JlYXRlcyBhIEZpZ3VyZSBmb3IgZHJhd2luZyBydWJiZXJiYW5kIGVudGl0aWVzIGFuZCB0aGUgZmluYWwgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSBhbmNob3IgdGhlIGFuY2hvciBwb2ludAotCSAqIEBwYXJhbSBjdXJzb3IgdGhlIHBvaW50IG1hcmtpbmcgdGhlIGN1cnJlbnQgcG9pbnRlciBsb2NhdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGFuY2hvciwgUG9pbnQgY3Vyc29yKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwN2VmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBFbGxpcHNlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gRWxsaXBzZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMgb2YgYSBib3gKLQkgKiBib3VuZGluZyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgRWxsaXBzZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JCWZkYy5nYy5kcmF3T3ZhbChyLngsIHIueSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExYzc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgRWxsaXBzZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEVsbGlwc2VUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5FbGxpcHNlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkRWxsaXBzZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIGEueCwgYS55LCBiLngsIGIueSkpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0U29saWQpCi0JCQljb250YWluZXIuYWRkKG5ldyBFbGxpcHNlRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZTdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFN1cGVyaW50ZXJmYWNlIGZvciBhbGwgZHJhd2luZyBvYmplY3RzLgotICogQWxsIGRyYXdpbmcgb2JqZWN0cyBrbm93IGhvdyB0byByZW5kZXIgdGhlbXNlbHZlZCB0byB0aGUgc2NyZWVuIGFuZCBjYW4gZHJhdyBhCi0gKiB0ZW1wb3JhcnkgdmVyc2lvbiBvZiB0aGVtc2VsdmVzIGZvciBwcmV2aWV3aW5nIHRoZSBnZW5lcmFsIGFwcGVhcmFuY2Ugb2YgdGhlCi0gKiBvYmplY3Qgb25zY3JlZW4gYmVmb3JlIGl0IGdldHMgY29tbWl0dGVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlndXJlIHsKLQkvKioKLQkgKiBEcmF3cyB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpOwotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGRhbWFnZWQgc2NyZWVuIHJlZ2lvbiBjYXVzZWQgYnkgZHJhd2luZyB0aGlzIG9iamVjdCAoaW1wcmVjaXNlKSwgdGhlbgotCSAqIGFwcGVuZHMgaXQgdG8gdGhlIHN1cHBsaWVkIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICogQHBhcmFtIHJlZ2lvbiBhIHJlZ2lvbiB0byB3aGljaCBhZGRpdGlvbmFsIGRhbWFnZSBhcmVhcyB3aWxsIGJlIGFkZGVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWIxOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRmlndXJlRHJhd0NvbnRleHQgewotCS8qCi0JICogPHA+Ci0JICogVGhlIEdDIG11c3QgYmUgc2V0IHVwIGFzIGZvbGxvd3MKLQkgKiAoaXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGlzIHN0YXRlIHVwb24gY29tcGxldGlvbiBvZiBkcmF3aW5nIG9wZXJhdGlvbnMpCi0JICogPHVsPgotCSAqICAgPGxpPnNldFhPUk1vZGUoZmFsc2UpCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEdDIGdjID0gbnVsbDsKLQlwdWJsaWMgaW50IHhPZmZzZXQgPSAwLCB5T2Zmc2V0ID0gMDsgLy8gc3Vic3RyYWN0IHRvIGdldCBHQyBjb29yZHMKLQlwdWJsaWMgaW50IHhTY2FsZSA9IDEsIHlTY2FsZSA9IDE7Ci0JCi0JcHVibGljIFJlY3RhbmdsZSB0b0NsaWVudFJlY3RhbmdsZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoCi0JCQlNYXRoLm1pbih4MSwgeDIpICogeFNjYWxlIC0geE9mZnNldCwKLQkJCU1hdGgubWluKHkxLCB5MikgKiB5U2NhbGUgLSB5T2Zmc2V0LAotCQkJKE1hdGguYWJzKHgyIC0geDEpICsgMSkgKiB4U2NhbGUsCi0JCQkoTWF0aC5hYnMoeTIgLSB5MSkgKyAxKSAqIHlTY2FsZSk7Ci0JfQotCXB1YmxpYyBQb2ludCB0b0NsaWVudFBvaW50KGludCB4LCBpbnQgeSkgewotCQlyZXR1cm4gbmV3IFBvaW50KHggKiB4U2NhbGUgLSB4T2Zmc2V0LCB5ICogeVNjYWxlIC0geU9mZnNldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZDE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIExpbmUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIHR3byBlbmQtcG9pbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgZW5kLXBvaW50Ci0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGVuZC1wb2ludAotCSAqLwotCXB1YmxpYyBMaW5lRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwMSA9IGZkYy50b0NsaWVudFBvaW50KHgxLCB5MSk7Ci0JCVBvaW50IHAyID0gZmRjLnRvQ2xpZW50UG9pbnQoeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd0xpbmUocDEueCwgcDEueSwgcDIueCwgcDIueSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE2NGEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGxpbmUgZHJhd2luZyB0b29sCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5MaW5lLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlyZXR1cm4gbmV3IExpbmVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCWEueCwgYS55LCBiLngsIGIueSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMTBhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFBhaW50RXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX3BhaW50Iik7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKLQlwcml2YXRlIENhbnZhcyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXM7Ci0JcHJpdmF0ZSBDYW52YXMgYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzOwotCXByaXZhdGUgQ29sb3IgcGFpbnRDb2xvckJsYWNrLCBwYWludENvbG9yV2hpdGU7IC8vIGFsaWFzIGZvciBwYWludENvbG9yc1swXSBhbmQgWzFdCi0JcHJpdmF0ZSBDb2xvcltdIHBhaW50Q29sb3JzOwotCXByaXZhdGUgRm9udCBwYWludERlZmF1bHRGb250OyAvLyBkbyBub3QgZnJlZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1QYWxldHRlUm93cyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG51bVBhbGV0dGVDb2xzID0gNTA7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzOyAvLyBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsgLy8gcGFpbnQgc3VyZmFjZSBmb3IgZHJhd2luZwotCi0Jc3RhdGljIGZpbmFsIGludCBQZW5jaWxfdG9vbCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBBaXJicnVzaF90b29sID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExpbmVfdG9vbCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQb2x5TGluZV90b29sID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJlY3RhbmdsZV90b29sID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IFJvdW5kZWRSZWN0YW5nbGVfdG9vbCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBFbGxpcHNlX3Rvb2wgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVGV4dF90b29sID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IE5vbmVfZmlsbCA9IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBPdXRsaW5lX2ZpbGwgPSA5OwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfZmlsbCA9IDEwOwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfbGluZXN0eWxlID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBEYXNoX2xpbmVzdHlsZSA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgRG90X2xpbmVzdHlsZSA9IDEzOwotCXN0YXRpYyBmaW5hbCBpbnQgRGFzaERvdF9saW5lc3R5bGUgPSAxNDsKLQlzdGF0aWMgZmluYWwgaW50IEZvbnRfb3B0aW9ucyA9IDE1OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF90b29sID0gUGVuY2lsX3Rvb2w7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2ZpbGwgPSBOb25lX2ZpbGw7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2xpbmVzdHlsZSA9IFNvbGlkX2xpbmVzdHlsZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvb2xbXSB0b29scyA9IHsKLQkJbmV3IFRvb2woUGVuY2lsX3Rvb2wsICJQZW5jaWwiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKEFpcmJydXNoX3Rvb2wsICJBaXJicnVzaCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTGluZV90b29sLCAiTGluZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUG9seUxpbmVfdG9vbCwgIlBvbHlMaW5lIiwgInRvb2wiLCBTV1QuUkFESU8pLAotCQluZXcgVG9vbChSZWN0YW5nbGVfdG9vbCwgIlJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUm91bmRlZFJlY3RhbmdsZV90b29sLCAiUm91bmRlZFJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woRWxsaXBzZV90b29sLCAiRWxsaXBzZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woVGV4dF90b29sLCAiVGV4dCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTm9uZV9maWxsLCAiTm9uZSIsICJmaWxsIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihUb29sU2V0dGluZ3MuZnROb25lKSksCi0JCW5ldyBUb29sKE91dGxpbmVfZmlsbCwgIk91dGxpbmUiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0T3V0bGluZSkpLAotCQluZXcgVG9vbChTb2xpZF9maWxsLCAiU29saWQiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0U29saWQpKSwKLQkJbmV3IFRvb2woU29saWRfbGluZXN0eWxlLCAiU29saWQiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9TT0xJRCkpLAotCQluZXcgVG9vbChEYXNoX2xpbmVzdHlsZSwgIkRhc2giLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9EQVNIKSksCi0JCW5ldyBUb29sKERvdF9saW5lc3R5bGUsICJEb3QiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9ET1QpKSwKLQkJbmV3IFRvb2woRGFzaERvdF9saW5lc3R5bGUsICJEYXNoRG90IiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfREFTSERPVCkpLAotCQluZXcgVG9vbChGb250X29wdGlvbnMsICJGb250IiwgIm9wdGlvbnMiLCBTV1QuUFVTSCkKLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFBhaW50RXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgUGFpbnRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFpbkNvbXBvc2l0ZSA9IHBhcmVudDsKLQkJaW5pdFJlc291cmNlcygpOwotCQlpbml0QWN0aW9ucygpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJUGFpbnRFeGFtcGxlIGluc3RhbmNlID0gbmV3IFBhaW50RXhhbXBsZShzaGVsbCk7Ci0JCWluc3RhbmNlLmNyZWF0ZVRvb2xCYXIoc2hlbGwpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWluc3RhbmNlLmNyZWF0ZUdVSShjb21wb3NpdGUpOwotCQlpbnN0YW5jZS5zZXREZWZhdWx0cygpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIgKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgZ3JvdXAgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCWlmIChncm91cCAhPSBudWxsICYmICF0b29sLmdyb3VwLmVxdWFscyhncm91cCkpIHsKLQkJCQluZXcgVG9vbEl0ZW0gKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IpOwotCQkJfQotCQkJZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJVG9vbEl0ZW0gaXRlbSA9IGFkZFRvb2xJdGVtKHRvb2xiYXIsIHRvb2wpOwotCQkJaWYgKGkgPT0gRGVmYXVsdF90b29sIHx8IGkgPT0gRGVmYXVsdF9maWxsIHx8IGkgPT0gRGVmYXVsdF9saW5lc3R5bGUpIGl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgaXRlbSB0byB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgVG9vbEl0ZW0gYWRkVG9vbEl0ZW0oZmluYWwgVG9vbEJhciB0b29sYmFyLCBmaW5hbCBUb29sIHRvb2wpIHsKLQkJZmluYWwgU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbGJhciwgdG9vbC50eXBlKTsKLQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZyhpZCArICIubGFiZWwiKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLnRvb2x0aXAiKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UodG9vbC5pbWFnZSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9vbC5hY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBpbnQgY2hpbGRJRCA9IHRvb2xiYXIuaW5kZXhPZihpdGVtKTsKLQkJdG9vbGJhci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IGNoaWxkSUQpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuZGVzY3JpcHRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHRvb2wgaXRlbSBzdGF0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXNldFBhaW50VG9vbChEZWZhdWx0X3Rvb2wpOwotCQlzZXRGaWxsVHlwZShEZWZhdWx0X2ZpbGwpOwotCQlzZXRMaW5lU3R5bGUoRGVmYXVsdF9saW5lc3R5bGUpOwotCQlzZXRGb3JlZ3JvdW5kQ29sb3IocGFpbnRDb2xvckJsYWNrKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKHBhaW50Q29sb3JXaGl0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR1VJLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUdVSShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0KLQkJLyoqKiBDcmVhdGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkJCi0JCUNvbXBvc2l0ZSBkaXNwbGF5QXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gQ3JlYXRpbmcgdGhlc2UgZWxlbWVudHMgaGVyZSBhdm9pZHMgdGhlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIEdVSSBlbGVtZW50cwotCQkvLyBpbiBzdHJpY3QgbGF5b3V0IG9yZGVyLiAgVGhlIG5hdHVyYWwgbGF5b3V0IG9yZGVyaW5nIGlzIGFuIGFydGlmYWN0IG9mIHVzaW5nCi0JCS8vIFNXVCBsYXlvdXRzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdGhlIHNhbWUgb3JkZXIgYXMgdGhhdCByZXF1aXJlZCB0bwotCQkvLyBpbnN0YW50aWF0ZSBhbGwgb2YgdGhlIG5vbi1HVUkgYXBwbGljYXRpb24gZWxlbWVudHMgdG8gc2F0aXNmeSByZWZlcmVudGlhbAotCQkvLyBkZXBlbmRlbmNpZXMuICBJdCBpcyBwb3NzaWJsZSB0byByZW9yZGVyIHRoZSBpbml0aWFsaXphdGlvbiB0byBzb21lIGV4dGVudCwgYnV0Ci0JCS8vIHRoaXMgY2FuIGJlIHZlcnkgdGVkaW91cy4KLQkJCi0JCS8vIHBhaW50IGNhbnZhcwotCQlmaW5hbCBDYW52YXMgcGFpbnRDYW52YXMgPSBuZXcgQ2FudmFzKGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwKLQkJCVNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJcGFpbnRDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhaW50Q2FudmFzLnNldEJhY2tncm91bmQocGFpbnRDb2xvcldoaXRlKTsKLQkJCi0JCS8vIGNvbG9yIHNlbGVjdG9yIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSBjb2xvckZyYW1lID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29sb3JGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyB0b29sIHNldHRpbmdzIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSB0b29sU2V0dGluZ3NGcmFtZSA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXRvb2xTZXR0aW5nc0ZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHN0YXR1cyB0ZXh0Ci0JCWZpbmFsIFRleHQgc3RhdHVzVGV4dCA9IG5ldyBUZXh0KGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJc3RhdHVzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvKioqIENyZWF0ZSB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnRzIGluc2lkZSB0aGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkKLQkJLy8gcGFpbnRTdXJmYWNlCi0JCXBhaW50U3VyZmFjZSA9IG5ldyBQYWludFN1cmZhY2UocGFpbnRDYW52YXMsIHN0YXR1c1RleHQsIHBhaW50Q29sb3JXaGl0ZSk7Ci0KLQkJLy8gZmluaXNoIGluaXRpYWxpemluZyB0aGUgdG9vbCBkYXRhCi0JCXRvb2xzW1BlbmNpbF90b29sXS5kYXRhID0gbmV3IFBlbmNpbFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tBaXJicnVzaF90b29sXS5kYXRhID0gbmV3IEFpcmJydXNoVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0xpbmVfdG9vbF0uZGF0YSA9IG5ldyBMaW5lVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1BvbHlMaW5lX3Rvb2xdLmRhdGEgPSBuZXcgUG9seUxpbmVUb29sKHRvb2xTZXR0aW5ncywgcGFpbnRTdXJmYWNlKTsKLQkJdG9vbHNbUmVjdGFuZ2xlX3Rvb2xdLmRhdGEgPSBuZXcgUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1JvdW5kZWRSZWN0YW5nbGVfdG9vbF0uZGF0YSA9IG5ldyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0VsbGlwc2VfdG9vbF0uZGF0YSA9IG5ldyBFbGxpcHNlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1RleHRfdG9vbF0uZGF0YSA9IG5ldyBUZXh0VG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0KLQkJLy8gY29sb3JGcmFtZQkJCi0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb2xvckZyYW1lLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMsIGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI0OwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNDsKLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHBhbGV0dGVDYW52YXMKLQkJZmluYWwgQ2FudmFzIHBhbGV0dGVDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIgfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJcGFsZXR0ZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3JBdChib3VuZHMsIGUueCwgZS55KTsJCQkJCi0JCQkJCQotCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSBzZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQkJCWVsc2Ugc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLQkJCX0KLQkJCXByaXZhdGUgQ29sb3IgZ2V0Q29sb3JBdChSZWN0YW5nbGUgYm91bmRzLCBpbnQgeCwgaW50IHkpIHsKLQkJCQlpZiAoYm91bmRzLmhlaWdodCA8PSAxICYmIGJvdW5kcy53aWR0aCA8PSAxKSByZXR1cm4gcGFpbnRDb2xvcldoaXRlOwotCQkJCWZpbmFsIGludCByb3cgPSAoeSAtIGJvdW5kcy55KSAqIG51bVBhbGV0dGVSb3dzIC8gYm91bmRzLmhlaWdodDsKLQkJCQlmaW5hbCBpbnQgY29sID0gKHggLSBib3VuZHMueCkgKiBudW1QYWxldHRlQ29scyAvIGJvdW5kcy53aWR0aDsKLQkJCQlyZXR1cm4gcGFpbnRDb2xvcnNbTWF0aC5taW4oTWF0aC5tYXgocm93ICogbnVtUGFsZXR0ZUNvbHMgKyBjb2wsIDApLCBwYWludENvbG9ycy5sZW5ndGggLSAxKV07Ci0JCQl9Ci0JCX0pOwotCQlMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2MgPT0gbnVsbCkgcmV0dXJuOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1QYWxldHRlUm93czsgKytyb3cpIHsKLQkJCQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgbnVtUGFsZXR0ZUNvbHM7ICsrY29sKSB7Ci0JCQkJCQlmaW5hbCBpbnQgeCA9IGJvdW5kcy53aWR0aCAqIGNvbCAvIG51bVBhbGV0dGVDb2xzOwotCQkJCQkJZmluYWwgaW50IHkgPSBib3VuZHMuaGVpZ2h0ICogcm93IC8gbnVtUGFsZXR0ZVJvd3M7Ci0JCQkJCQlmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heChib3VuZHMud2lkdGggKiAoY29sICsgMSkgLyBudW1QYWxldHRlQ29scyAtIHgsIDEpOwotCQkJCQkJZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQgKiAocm93ICsgMSkgLyBudW1QYWxldHRlUm93cyAtIHksIDEpOwotCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKHBhaW50Q29sb3JzW3JvdyAqIG51bVBhbGV0dGVDb2xzICsgY29sXSk7Ci0JCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLnggKyB4LCBib3VuZHMueSArIHksIHdpZHRoLCBoZWlnaHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlwYWxldHRlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHJlZnJlc2hMaXN0ZW5lcik7Ci0JCXBhbGV0dGVDYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCByZWZyZXNoTGlzdGVuZXIpOwotCQkvL3BhbGV0dGVDYW52YXMucmVkcmF3KCk7Ci0JCQotCQkvLyB0b29sU2V0dGluZ3NGcmFtZQotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdG9vbFNldHRpbmdzRnJhbWUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoUmFkaXVzLnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hSYWRpdXNTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldE1pbmltdW0oNSk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TWF4aW11bSg1MCk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0U2VsZWN0aW9uKHRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyA9IGFpcmJydXNoUmFkaXVzU2NhbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoSW50ZW5zaXR5LnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldE1pbmltdW0oMSk7Ci0JCWFpcmJydXNoSW50ZW5zaXR5U2NhbGUuc2V0TWF4aW11bSgxMDApOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldFNlbGVjdGlvbih0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgPSBhaXJicnVzaEludGVuc2l0eVNjYWxlLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBQYWludEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYWludFN1cmZhY2UgIT0gbnVsbCkgcGFpbnRTdXJmYWNlLmRpc3Bvc2UoKTsJCQotCQlpZiAocGFpbnRDb2xvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWludENvbG9ycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIENvbG9yIGNvbG9yID0gcGFpbnRDb2xvcnNbaV07Ci0JCQkJaWYgKGNvbG9yICE9IG51bGwpIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYWludERlZmF1bHRGb250ID0gbnVsbDsKLQkJcGFpbnRDb2xvcnMgPSBudWxsOwotCQlwYWludFN1cmZhY2UgPSBudWxsOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlIGJ1bmRsZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlmaW5hbCBJbWFnZSBpbWFnZSA9IHRvb2wuaW1hZ2U7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJdG9vbC5pbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IHdlJ3JlIHVzaW5nCi0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIG1haW5Db21wb3NpdGUuZ2V0RGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbG9ycywgZm9udHMsIGFuZCB0b29sIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBtYWluQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCi0JCXBhaW50Q29sb3JXaGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQkJcGFpbnRDb2xvckJsYWNrID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCQkKLQkJcGFpbnREZWZhdWx0Rm9udCA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpOwotCi0JCXBhaW50Q29sb3JzID0gbmV3IENvbG9yW251bVBhbGV0dGVDb2xzICogbnVtUGFsZXR0ZVJvd3NdOwotCQlwYWludENvbG9yc1swXSA9IHBhaW50Q29sb3JCbGFjazsKLQkJcGFpbnRDb2xvcnNbMV0gPSBwYWludENvbG9yV2hpdGU7Ci0JCWZvciAoaW50IGkgPSAyOyBpIDwgcGFpbnRDb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXBhaW50Q29sb3JzW2ldID0gbmV3IENvbG9yKGRpc3BsYXksCi0JCQkJKChpKjcpJTI1NSksKChpKjIzKSUyNTUpLCAoKGkqNTEpJTI1NSkpOwotCQl9Ci0KLQkJdG9vbFNldHRpbmdzID0gbmV3IFRvb2xTZXR0aW5ncygpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yID0gcGFpbnRDb2xvckJsYWNrOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gcGFpbnRDb2xvcldoaXRlOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9udCA9IHBhaW50RGVmYXVsdEZvbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uIGZpZWxkIG9mIHRoZSB0b29scwotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0QWN0aW9ucygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlTdHJpbmcgZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJaWYgKGdyb3VwLmVxdWFscygidG9vbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldFBhaW50VG9vbCh0b29sLmlkKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKGdyb3VwLmVxdWFscygiZmlsbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldEZpbGxUeXBlKHRvb2wuaWQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAoZ3JvdXAuZXF1YWxzKCJsaW5lc3R5bGUiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRMaW5lU3R5bGUodG9vbC5pZCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmIChncm91cC5lcXVhbHMoIm9wdGlvbnMiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhwYWludFN1cmZhY2UuZ2V0U2hlbGwoKSwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCQkJRm9udERhdGFbXSBmb250RGF0dW0gPSB0b29sU2V0dGluZ3MuY29tbW9uRm9udC5nZXRGb250RGF0YSgpOwotCQkJCQkJaWYgKGZvbnREYXR1bSAhPSBudWxsICYmIGZvbnREYXR1bS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChmb250RGF0dW0pOwotCQkJCQkJfQotCQkJCQkJZm9udERpYWxvZy5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJvcHRpb25zLkZvbnQuZGlhbG9nLnRpdGxlIikpOwotCi0JCQkJCQlwYWludFN1cmZhY2UuaGlkZVJ1YmJlcmJhbmQoKTsKLQkJCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JCQkJCQlwYWludFN1cmZhY2Uuc2hvd1J1YmJlcmJhbmQoKTsKLQkJCQkJCWlmIChmb250RGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRm9udCBmb250ID0gbmV3IEZvbnQobWFpbkNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIGZvbnREYXRhKTsKLQkJCQkJCQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQgPSBmb250OwotCQkJCQkJCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQkJCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGltYWdlIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlmaW5hbCBDbGFzcyBjbGF6eiA9IFBhaW50RXhhbXBsZS5jbGFzczsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCQkJU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuaW1hZ2UiKSk7Ci0JCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHNvdXJjZVN0cmVhbSk7Ci0JCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJdG9vbC5pbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQl0cnkgewotCQkJCQkJc291cmNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyb3IgPSAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPwotCQkJZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDoKLQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBHcmFicyBpbnB1dCBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIGZvcmVncm91bmQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWlmIChhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgIT0gbnVsbCkKLQkJCWFjdGl2ZUZvcmVncm91bmRDb2xvckNhbnZhcy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciA9IGNvbG9yOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRvb2wgYmFja2dyb3VuZCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBjb2xvciB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJaWYgKGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcyAhPSBudWxsKQotCQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldEJhY2tncm91bmQoY29sb3IpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gY29sb3I7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgYSB0b29sIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWludFRvb2woaW50IGlkKSB7Ci0JCVBhaW50VG9vbCBwYWludFRvb2wgPSAoUGFpbnRUb29sKSB0b29sc1tpZF0uZGF0YTsKLQkJcGFpbnRTdXJmYWNlLnNldFBhaW50U2Vzc2lvbihwYWludFRvb2wpOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VsZWN0cyBhIGZpbGx0eXBlIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxsVHlwZShpbnQgaWQpIHsKLQkJSW50ZWdlciBmaWxsVHlwZSA9IChJbnRlZ2VyKSB0b29sc1tpZF0uZGF0YTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZpbGxUeXBlID0gZmlsbFR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGxpbmUgdHlwZSBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZVN0eWxlKGludCBpZCkgewotCQlJbnRlZ2VyIGxpbmVUeXBlID0gKEludGVnZXIpIHRvb2xzW2lkXS5kYXRhOwotCQl0b29sU2V0dGluZ3MuY29tbW9uTGluZVN0eWxlID0gbGluZVR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgYmlnZ2VyIHRoYW4gdGhlIGRpc3BsYXksCi0JICogaW4gd2hpY2ggY2FzZSBzZXQgaXQgdG8gOS8xMCBvZiBkaXNwbGF5IHNpemUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTaGVsbFNpemUgKERpc3BsYXkgZGlzcGxheSwgU2hlbGwgc2hlbGwpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKHNpemUueCA+IGJvdW5kcy53aWR0aCkgc2l6ZS54ID0gYm91bmRzLndpZHRoICogOSAvIDEwOwotCQlpZiAoc2l6ZS55ID4gYm91bmRzLmhlaWdodCkgc2l6ZS55ID0gYm91bmRzLmhlaWdodCAqIDkgLyAxMDsKLQkJc2hlbGwuc2V0U2l6ZSAoc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHRvb2wgdGhhdCBpdHMgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUb29sU2V0dGluZ3MoKSB7Ci0JCWZpbmFsIFBhaW50VG9vbCBhY3RpdmVQYWludFRvb2wgPSBwYWludFN1cmZhY2UuZ2V0UGFpbnRUb29sKCk7Ci0JCWlmIChhY3RpdmVQYWludFRvb2wgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJYWN0aXZlUGFpbnRUb29sLmVuZFNlc3Npb24oKTsKLQkJYWN0aXZlUGFpbnRUb29sLnNldCh0b29sU2V0dGluZ3MpOwotCQlhY3RpdmVQYWludFRvb2wuYmVnaW5TZXNzaW9uKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE4NmY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYW4gaW50ZXJhY3RpdmUgcGFpbnQgc2Vzc2lvbi4KLSAqIE5vdGUgdGhhdCB0aGUgY29vcmRpbmF0ZXMgcmVjZWl2ZWQgdmlhIHRoZSBsaXN0ZW5lciBpbnRlcmZhY2VzIGFyZSB2aXJ0dWFsaXplZCB0byB6ZXJvLW9yaWdpbgotICogcmVsYXRpdmUgdG8gdGhlIHBhaW50aW5nIHN1cmZhY2UuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50U2Vzc2lvbiBleHRlbmRzIE1vdXNlTGlzdGVuZXIsIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWludCBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhaW50IHNlc3Npb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHNlc3Npb24uCi0JICogCi0JICogTm90ZTogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBjYWxsIHN1cGVyLmJlZ2luU2Vzc2lvbigpIGF0IG1ldGhvZCBzdGFydC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpblNlc3Npb24oKTsKLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgc2Vzc2lvbi4KLSAgICAgKgotCSAqIE5vdGU6IFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgY2FsbCBzdXBlci5lbmRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0gICAgICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZW5kU2Vzc2lvbigpOwotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc2Vzc2lvbi4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKiAKLQkgKiBOb3RlOiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGNhbGwgc3VwZXIucmVzZXRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRTZXNzaW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjY0MDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYSBzaW1wbGUgZHJhd2luZyBzdXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRTdXJmYWNlIHsKLQlwcml2YXRlIFBvaW50IGN1cnJlbnRQb3NpdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQlwcml2YXRlIENhbnZhcyBwYWludENhbnZhczsKLQotCXByaXZhdGUgUGFpbnRTZXNzaW9uIHBhaW50U2Vzc2lvbjsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgSW1hZ2UgcGFpbnRJbWFnZTsgLy8gYnVmZmVyIGZvciByZWZyZXNoIGJsaXRzCi0JcHJpdmF0ZSBpbnQgICBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodDsKLQlwcml2YXRlIGludCAgIHZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodDsKLQotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgZGlzcGxheUZEQyA9IG5ldyBGaWd1cmVEcmF3Q29udGV4dCgpOwotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgaW1hZ2VGREMgPSBuZXcgRmlndXJlRHJhd0NvbnRleHQoKTsKLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IHBhaW50RkRDID0gbmV3IEZpZ3VyZURyYXdDb250ZXh0KCk7Ci0KLQkvKiBSdWJiZXJiYW5kICovCi0JcHJpdmF0ZSBDb250YWluZXJGaWd1cmUgcnViYmVyYmFuZCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJLy8gdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbgotCXByaXZhdGUgaW50IHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPSAwOwotCQkvLyBhbHdheXMgPj0gMCwgaWYgPiAwIHJ1YmJlcmJhbmQgaGFzIGJlZW4gaGlkZGVuCi0KLQkvKiBTdGF0dXMgKi8KLQlwcml2YXRlIFRleHQgc3RhdHVzVGV4dDsKLQlwcml2YXRlIFN0cmluZyBzdGF0dXNBY3Rpb25JbmZvLCBzdGF0dXNNZXNzYWdlSW5mbywgc3RhdHVzQ29vcmRJbmZvOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U3VyZmFjZS4KLQkgKiA8cD4KLQkgKiBwYWludENhbnZhcyBtdXN0IGhhdmUgU1dULk5PX1JFRFJBV19SRVNJWkUgYW5kIFNXVC5OT19CQUNLR1JPVU5EIHN0eWxlcywKLQkgKiAgICAgYW5kIG1heSBoYXZlIFNXVC5WX1NDUk9MTCBhbmQvb3IgU1dULkhfU0NST0xMLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcGFpbnRDYW52YXMgdGhlIENhbnZhcyBvYmplY3QgaW4gd2hpY2ggdG8gcmVuZGVyCi0JICogQHBhcmFtIHBhaW50U3RhdHVzIHRoZSBQYWludFN0YXR1cyBvYmplY3QgdG8gdXNlIGZvciBwcm92aWRpbmcgdXNlciBmZWVkYmFjawotCSAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGNvbG9yIHRvIGZpbGwgdGhlIGNhbnZhcyB3aXRoIGluaXRpYWxseQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UoQ2FudmFzIHBhaW50Q2FudmFzLCBUZXh0IHN0YXR1c1RleHQsIENvbG9yIGZpbGxDb2xvcikgewotCQl0aGlzLnBhaW50Q2FudmFzID0gcGFpbnRDYW52YXM7Ci0JCXRoaXMuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQ7Ci0JCWNsZWFyU3RhdHVzKCk7Ci0KLQkJLyogU2V0IHVwIHRoZSBkcmF3aW5nIHN1cmZhY2UgKi8KLQkJUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gcGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKTsKLQkJaW1hZ2VXaWR0aCA9IGRpc3BsYXlSZWN0LndpZHRoOwotCQlpbWFnZUhlaWdodCA9IGRpc3BsYXlSZWN0LmhlaWdodDsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UocGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7Ci0KLQkJaW1hZ2VGREMuZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlpbWFnZUZEQy5nYy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCWltYWdlRkRDLmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotCQlkaXNwbGF5RkRDLmdjID0gbmV3IEdDKHBhaW50Q2FudmFzKTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBzZXNzaW9uICovCi0JCXNldFBhaW50U2Vzc2lvbihudWxsKTsKLQotCQkvKiBBZGQgb3VyIGxpc3RlbmVycyAqLwotCQlwYWludENhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZGlzcGxheUZEQy5nYy5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlwYWludENhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG93bihldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZVVwKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQkJCQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZU1vdmUoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHJ1YmJlcmJhbmQuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIE5vdGhpbmcgdG8gbWVyZ2UsIHNvIHdlIGp1c3QgcmVmcmVzaAotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsCi0JCQkJCQlkaXNwbGF5RkRDLnhPZmZzZXQgKyBldmVudC54LCBkaXNwbGF5RkRDLnlPZmZzZXQgKyBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0LAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogQXZvaWQgZmxpY2tlciB3aGVuIG1lcmdpbmcgb3ZlcmxheWVkIG9iamVjdHMgYnkgY29uc3RydWN0aW5nIHRoZSBpbWFnZSBvbgotCQkJCQkgKiBhIGJhY2tidWZmZXIgZmlyc3QsIHRoZW4gYmxpdHRpbmcgaXQgdG8gdGhlIHNjcmVlbi4KLQkJCQkJICovCi0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGJhY2tidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCi0JCQkJCWlmIChwYWludEltYWdlICE9IG51bGwpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gcGFpbnRJbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJCWlmICgoZXZlbnQud2lkdGggKyBldmVudC54ID4gcmVjdC53aWR0aCkgfHwKLQkJCQkJCQkoZXZlbnQuaGVpZ2h0ICsgZXZlbnQueSA+IHJlY3QuaGVpZ2h0KSkgewotCQkJCQkJCXBhaW50RkRDLmdjLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFpbnRJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LAotCQkJCQkJCU1hdGgubWF4KHJlY3Qud2lkdGgsIGV2ZW50LndpZHRoICsgZXZlbnQueCksCi0JCQkJCQkJTWF0aC5tYXgocmVjdC5oZWlnaHQsIGV2ZW50LmhlaWdodCArIGV2ZW50LnkpKTsKLQkJCQkJCXBhaW50RkRDLmdjID0gbmV3IEdDKHBhaW50SW1hZ2UpOwotCQkJCQl9Ci0JCQkJCS8vIFNldHVwIGNsaXBwaW5nIGFuZCB0aGUgRkRDCi0JCQkJCVJlZ2lvbiBjbGlwUmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJCQlldmVudC5nYy5nZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsJCQkJCQotCQkJCQlwYWludEZEQy5nYy5zZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsKLQkJCQkJY2xpcFJlZ2lvbi5kaXNwb3NlKCk7Ci0KLQkJCQkJcGFpbnRGREMueE9mZnNldCA9IGRpc3BsYXlGREMueE9mZnNldDsKLQkJCQkJcGFpbnRGREMueU9mZnNldCA9IGRpc3BsYXlGREMueU9mZnNldDsKLQkJCQkJcGFpbnRGREMueFNjYWxlID0gZGlzcGxheUZEQy54U2NhbGU7Ci0JCQkJCXBhaW50RkRDLnlTY2FsZSA9IGRpc3BsYXlGREMueVNjYWxlOwotCQkJCQkKLQkJCQkJLy8gTWVyZ2UgdGhlIG92ZXJsYXllZCBvYmplY3RzIGludG8gdGhlIGltYWdlLCB0aGVuIGJsaXQKLQkJCQkJcGFpbnRGREMuZ2MuZHJhd0ltYWdlKGltYWdlLAotCQkJCQkJZGlzcGxheUZEQy54T2Zmc2V0ICsgZXZlbnQueCwgZGlzcGxheUZEQy55T2Zmc2V0ICsgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlydWJiZXJiYW5kLmRyYXcocGFpbnRGREMpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UocGFpbnRJbWFnZSwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlwYWludENhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzaXplKCk7Ci0JCQl9CQkJCi0JCX0pOwotCi0JCS8qIFNldCB1cCB0aGUgcGFpbnQgY2FudmFzIHNjcm9sbCBiYXJzICovCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gcGFpbnRDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbEhvcml6b250YWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBwYWludENhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsVmVydGljYWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVSZXNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFBhaW50U3VyZmFjZSdzIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbWFnZUZEQy5nYy5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaWYgKHBhaW50SW1hZ2UgIT0gbnVsbCkgewotCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlwYWludEZEQy5nYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQljdXJyZW50UG9zaXRpb24gPSBudWxsOwotCQlwYWludENhbnZhcyA9IG51bGw7Ci0JCXBhaW50U2Vzc2lvbiA9IG51bGw7Ci0JCWltYWdlID0gbnVsbDsKLQkJcGFpbnRJbWFnZSA9IG51bGw7Ci0JCWRpc3BsYXlGREMgPSBudWxsOwotCQlpbWFnZUZEQyA9IG51bGw7Ci0JCXBhaW50RkRDID0gbnVsbDsKLQkJcnViYmVyYmFuZCA9IG51bGw7Ci0JCXN0YXR1c1RleHQgPSBudWxsOwotCQlzdGF0dXNBY3Rpb25JbmZvID0gbnVsbDsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSBudWxsOwotCQlzdGF0dXNDb29yZEluZm8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCXBhaW50Q2FudmFzLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheSBvbiB3aGljaCB0aGUgUGFpbnRTdXJmYWNlIHJlc2lkZXMuCi0JICogQHJldHVybiB0aGUgRGlzcGxheQotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBwYWludENhbnZhcy5nZXREaXNwbGF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2hlbGwgaW4gd2hpY2ggdGhlIFBhaW50U3VyZmFjZSByZXNpZGVzLgotCSAqIEByZXR1cm4gdGhlIFNoZWxsCi0JICovCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gcGFpbnRDYW52YXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24uCi0JICogPHA+Ci0JICogSWYgb2xkUGFpbnRTZXNzaW9uICE9IHBhaW50U2Vzc2lvbiBjYWxscyBvbGRQYWludFNlc3Npb24uZW5kKCkKLQkgKiBhbmQgcGFpbnRTZXNzaW9uLmJlZ2luKCkKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhaW50U2Vzc2lvbiB0aGUgcGFpbnQgc2Vzc2lvbiB0byBhY3RpdmF0ZTsgbnVsbCB0byBkaXNhYmxlIGFsbCBzZXNzaW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhaW50U2Vzc2lvbihQYWludFNlc3Npb24gcGFpbnRTZXNzaW9uKSB7Ci0JCWlmICh0aGlzLnBhaW50U2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5wYWludFNlc3Npb24gPT0gcGFpbnRTZXNzaW9uKSByZXR1cm47Ci0JCQl0aGlzLnBhaW50U2Vzc2lvbi5lbmRTZXNzaW9uKCk7Ci0JCX0KLQkJdGhpcy5wYWludFNlc3Npb24gPSBwYWludFNlc3Npb247Ci0JCWNsZWFyU3RhdHVzKCk7Ci0JCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgewotCQkJc2V0U3RhdHVzQWN0aW9uKHBhaW50U2Vzc2lvbi5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCXBhaW50U2Vzc2lvbi5iZWdpblNlc3Npb24oKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1c0FjdGlvbihQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuTnVsbC5sYWJlbCIpKTsKLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLk51bGwubWVzc2FnZSIpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24sIG51bGwgaWYgbm9uZSBpcyBhY3RpdmUKLQkgKi8KLQlwdWJsaWMgUGFpbnRTZXNzaW9uIGdldFBhaW50U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHBhaW50U2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhaW50IHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwYWludCB0b29sLCBudWxsIGlmIG5vbmUgaXMgYWN0aXZlICh0aG91Z2ggc29tZSBvdGhlciBzZXNzaW9uCi0JICogICAgICAgICBtaWdodCBiZSkKLQkgKi8KLQlwdWJsaWMgUGFpbnRUb29sIGdldFBhaW50VG9vbCgpIHsKLQkJcmV0dXJuIChwYWludFNlc3Npb24gIT0gbnVsbCAmJiBwYWludFNlc3Npb24gaW5zdGFuY2VvZiBQYWludFRvb2wpID8KLQkJCShQYWludFRvb2wpcGFpbnRTZXNzaW9uIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGFuIGludGVyYWN0aXZlIG9wZXJhdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgRmlndXJlIG9iamVjdCB0byB0aGUgc2NyZWVuIGFuZCB0byB0aGUgYmFja2luZyBzdG9yZSBwZXJtYW5lbnRseS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gZHJhdyBvbnNjcmVlbgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYXdGaWd1cmUoRmlndXJlIG9iamVjdCkgewotCQlvYmplY3QuZHJhdyhpbWFnZUZEQyk7Ci0JCW9iamVjdC5kcmF3KGRpc3BsYXlGREMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBGaWd1cmUgb2JqZWN0IHRvIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBvYmplY3Qgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuIGFzIGEgcHJldmlldyBhbmQgcmVmcmVzaGVkIGFwcHJvcHJpYXRlbHkKLQkgKiB1bnRpbCB0aGUgc2VsZWN0aW9uIGlzIGVpdGhlciBjbGVhcmVkIG9yIGNvbW1pdHRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnViYmVyYmFuZFNlbGVjdGlvbihGaWd1cmUgb2JqZWN0KSB7Ci0JCXJ1YmJlcmJhbmQuYWRkKG9iamVjdCk7Ci0JCWlmICghIGlzUnViYmVyYmFuZEhpZGRlbigpKSBvYmplY3QuZHJhdyhkaXNwbGF5RkRDKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBFcmFzZXMgYW55IHJ1YmJlcmJhbmQgb2JqZWN0cyBvbiB0aGUgc2NyZWVuIHRoZW4gY2xlYXJzIHRoZSBzZWxlY3Rpb24uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpIHsKLQkJaWYgKCEgaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHsKLQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQlydWJiZXJiYW5kLmFkZERhbWFnZWRSZWdpb24oZGlzcGxheUZEQywgcmVnaW9uKTsKLQkJCVJlY3RhbmdsZSByID0gcmVnaW9uLmdldEJvdW5kcygpOwotCQkJcGFpbnRDYW52YXMucmVkcmF3KHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgdHJ1ZSk7Ci0JCQlyZWdpb24uZGlzcG9zZSgpOwotCQl9Ci0JCXJ1YmJlcmJhbmQuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBSZWRyYXdzIGFueSBydWJiZXJiYW5kIG9iamVjdHMgb24gdGhlIHNjcmVlbiBhcyBwZXJtYW5lbnQgb2JqZWN0cyB0aGVuIGNsZWFycyB0aGUgc2VsZWN0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCkgewotCQlydWJiZXJiYW5kLmRyYXcoaW1hZ2VGREMpOwotCQlpZiAoaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHJ1YmJlcmJhbmQuZHJhdyhkaXNwbGF5RkRDKTsKLQkJcnViYmVyYmFuZC5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBIaWRlcyB0aGUgcnViYmVyYmFuZCAoYnV0IGRvZXMgbm90IGVsaW1pbmF0ZSBpdCkuCi0JICogPHA+Ci0JICogSW5jcmVtZW50cyBieSBvbmUgdGhlIHJ1YmJlcmJhbmQgImhpZGUiIG5lc3RpbmcgY291bnQuICBUaGUgcnViYmVyYmFuZAotCSAqIGlzIGhpZGRlbiBmcm9tIHZpZXcgKGJ1dCByZW1haW5zIGFjdGl2ZSkgaWYgaXQgd2Fzbid0IGFscmVhZHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoaWRlUnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQrKyA8PSAwKSB7Ci0JCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJcnViYmVyYmFuZC5hZGREYW1hZ2VkUmVnaW9uKGRpc3BsYXlGREMsIHJlZ2lvbik7Ci0JCQlSZWN0YW5nbGUgciA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQkJCXBhaW50Q2FudmFzLnJlZHJhdyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIHRydWUpOwotCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJfQotCX0JCQotCi0JLyoqCi0JICogU2hvd3MgKHVuLWhpZGVzKSB0aGUgcnViYmVyYmFuZC4KLQkgKiA8cD4KLQkgKiBEZWNyZW1lbnRzIGJ5IG9uZSB0aGUgcnViYmVyYmFuZCAiaGlkZSIgbmVzdGluZyBjb3VudC4gIFRoZSBydWJiZXJiYW5kCi0JICogaXMgb25seSBtYWRlIHZpc2libGUgd2hlbiBzaG93UnViYmVyYmFuZCgpIGhhcyBiZWVuIGNhbGxlZCBvbmNlIGZvciBlYWNoCi0JICogcHJldmlvdXMgaGlkZVJ1YmJlcmJhbmQoKS4gIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gY2FsbCBzaG93UnViYmVyYmFuZCgpIGlmCi0JICogdGhlIHJ1YmJlciBiYW5kIGlzIG5vdCBwcmVzZW50bHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPD0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPiAwIik7Ci0JCWlmICgtLXJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPT0gMCkgewotCQkJcnViYmVyYmFuZC5kcmF3KGRpc3BsYXlGREMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHJ1YmJlcmJhbmQgaXMgaGlkZGVuLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIHJ1YmJlciBpcyBoaWRkZW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1YmJlcmJhbmRIaWRkZW4oKSB7Ci0JCXJldHVybiBydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgaG9yaXpvbnRhbCBzY3JvbGwgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsYmFyIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgdGhhdCBwb3N0ZWQgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNjcm9sbEhvcml6b250YWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZVdpZHRoID4gdmlzaWJsZVdpZHRoKSB7Ci0JCQlmaW5hbCBpbnQgb2xkT2Zmc2V0ID0gZGlzcGxheUZEQy54T2Zmc2V0OwotCQkJZmluYWwgaW50IG5ld09mZnNldCA9IE1hdGgubWluKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VXaWR0aCAtIHZpc2libGVXaWR0aCk7Ci0JCQlpZiAob2xkT2Zmc2V0ICE9IG5ld09mZnNldCkgewotCQkJCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCQkJCWRpc3BsYXlGREMueE9mZnNldCA9IG5ld09mZnNldDsKLQkJCQlwYWludENhbnZhcy5zY3JvbGwoTWF0aC5tYXgob2xkT2Zmc2V0IC0gbmV3T2Zmc2V0LCAwKSwgMCwgTWF0aC5tYXgobmV3T2Zmc2V0IC0gb2xkT2Zmc2V0LCAwKSwgMCwKLQkJCQkJdmlzaWJsZVdpZHRoLCB2aXNpYmxlSGVpZ2h0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgdmVydGljYWwgc2Nyb2xsIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHNjcm9sbGJhciB0aGUgdmVydGljYWwgc2Nyb2xsIGJhciB0aGF0IHBvc3RlZCB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2Nyb2xsVmVydGljYWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZUhlaWdodCA+IHZpc2libGVIZWlnaHQpIHsKLQkJCWZpbmFsIGludCBvbGRPZmZzZXQgPSBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgbmV3T2Zmc2V0ID0gTWF0aC5taW4oc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKG9sZE9mZnNldCAhPSBuZXdPZmZzZXQpIHsKLQkJCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQkJCQlkaXNwbGF5RkRDLnlPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQkJcGFpbnRDYW52YXMuc2Nyb2xsKDAsIE1hdGgubWF4KG9sZE9mZnNldCAtIG5ld09mZnNldCwgMCksIDAsIE1hdGgubWF4KG5ld09mZnNldCAtIG9sZE9mZnNldCwgMCksCi0JCQkJCXZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgcmVzaXplIGV2ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNpemUoKSB7Ci0JCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCi0JCVJlY3RhbmdsZSB2aXNpYmxlUmVjdCA9IHBhaW50Q2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJdmlzaWJsZVdpZHRoID0gdmlzaWJsZVJlY3Qud2lkdGg7Ci0JCXZpc2libGVIZWlnaHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQ7Ci0KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBwYWludENhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWlmIChob3Jpem9udGFsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueE9mZnNldCA9IE1hdGgubWluKGhvcml6b250YWwuZ2V0U2VsZWN0aW9uKCksIGltYWdlV2lkdGggLSB2aXNpYmxlV2lkdGgpOwotCQkJaWYgKGltYWdlV2lkdGggPD0gdmlzaWJsZVdpZHRoKSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbigwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWhvcml6b250YWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueE9mZnNldCwgMCwgaW1hZ2VXaWR0aCwgdmlzaWJsZVdpZHRoLAotCQkJCQk4LCB2aXNpYmxlV2lkdGgpOwotCQkJfQotCQl9Ci0KLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gcGFpbnRDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKHZlcnRpY2FsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueU9mZnNldCA9IE1hdGgubWluKHZlcnRpY2FsLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKGltYWdlSGVpZ2h0IDw9IHZpc2libGVIZWlnaHQpIHsKLQkJCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl2ZXJ0aWNhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdmVydGljYWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueU9mZnNldCwgMCwgaW1hZ2VIZWlnaHQsIHZpc2libGVIZWlnaHQsCi0JCQkJCTgsIHZpc2libGVIZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlydHVhbGl6ZXMgTW91c2VFdmVudCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJY3VycmVudFBvc2l0aW9uLnggPSBldmVudC54ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LngsIDApLCB2aXNpYmxlV2lkdGggLSAxKSArIGRpc3BsYXlGREMueE9mZnNldDsKLQkJY3VycmVudFBvc2l0aW9uLnkgPSBldmVudC55ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LnksIDApLCB2aXNpYmxlSGVpZ2h0IC0gMSkgKyBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyB0aGUgc3RhdHVzIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclN0YXR1cygpIHsKLQkJc3RhdHVzQWN0aW9uSW5mbyA9ICIiOwotCQlzdGF0dXNNZXNzYWdlSW5mbyA9ICIiOwotCQlzdGF0dXNDb29yZEluZm8gPSAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIGJhciBhY3Rpb24gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBpbiBwcm9ncmVzcywgbnVsbCB0byBjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0FjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0JCXN0YXR1c0FjdGlvbkluZm8gPSAoYWN0aW9uICE9IG51bGwpID8gYWN0aW9uIDogIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgYmFyIG1lc3NhZ2UgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBkaXNwbGF5LCBudWxsIHRvIGNsZWFyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdGF0dXNNZXNzYWdlSW5mbyA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOwotCQl1cGRhdGVTdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gY29vcmQgdGhlIGNvb3JkaW5hdGVzIHRvIGRpc3BsYXksIG51bGwgdG8gY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNDb29yZChQb2ludCBjb29yZCkgewotCQlzdGF0dXNDb29yZEluZm8gPSAoY29vcmQgIT0gbnVsbCkgPyBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5Db29yZC5mb3JtYXQiLCBuZXcgT2JqZWN0W10KLQkJCXsgbmV3IEludGVnZXIoY29vcmQueCksIG5ldyBJbnRlZ2VyKGNvb3JkLnkpfSkgOiAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29vcmRpbmF0ZSByYW5nZSBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYSB0aGUgImZyb20iIGNvb3JkaW5hdGUsIG11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gYiB0aGUgInRvIiBjb29yZGluYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzQ29vcmRSYW5nZShQb2ludCBhLCBQb2ludCBiKSB7Ci0JCXN0YXR1c0Nvb3JkSW5mbyA9IFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic3RhdHVzLkNvb3JkUmFuZ2UuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IG5ldyBJbnRlZ2VyKGEueCksIG5ldyBJbnRlZ2VyKGEueSksIG5ldyBJbnRlZ2VyKGIueCksIG5ldyBJbnRlZ2VyKGIueSl9KTsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotCQlzdGF0dXNUZXh0LnNldFRleHQoCi0JCQlQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5CYXIuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IHN0YXR1c0FjdGlvbkluZm8sIHN0YXR1c01lc3NhZ2VJbmZvLCBzdGF0dXNDb29yZEluZm8gfSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTYxNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50VG9vbCBleHRlbmRzIFBhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdlNTAzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcGVuY2lsIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZW5jaWxUb29sIGV4dGVuZHMgQ29udGludW91c1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHBlbmNpbCB0b29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIGdldFBhaW50U3VyZmFjZSgpIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBlbmNpbFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGVuY2lsLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXIoZmluYWwgUG9pbnQgcG9pbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLmRyYXdGaWd1cmUobmV3IFBvaW50RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgcG9pbnQueCwgcG9pbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4MzE3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBQb2ludCBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFBvaW50RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgsIHk7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBvaW50Ci0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geCB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGVuZC1wb2ludAotCSAqIEBwYXJhbSB5IHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICovCi0JcHVibGljIFBvaW50RmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwID0gZmRjLnRvQ2xpZW50UG9pbnQoeCwgeSk7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxSZWN0YW5nbGUocC54LCBwLnksIDEsIDEpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4LCB5LCB4LCB5KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ODE1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcG9seWxpbmUgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUG9seUxpbmVUb29sIGV4dGVuZHMgU2VnbWVudGVkUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQb2x5TGluZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBvbHlMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Qb2x5TGluZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50W10gcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBib29sZWFuIGNsb3NlZCkgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoY2xvc2VkICYmIHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUgJiYgbnVtUG9pbnRzID49IDMpIHsKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUG9seWdvbkZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHBvaW50cywgbnVtUG9pbnRzKSk7Ci0JCX0KLQkJaWYgKCEgY2xvc2VkIHx8IHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkIHx8IG51bVBvaW50cyA8IDMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzIC0gMTsgKytpKSB7Ci0JCQkJZmluYWwgUG9pbnQgYSA9IHBvaW50c1tpXTsKLQkJCQlmaW5hbCBQb2ludCBiID0gcG9pbnRzW2kgKyAxXTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBMaW5lRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQkJfQotCQkJaWYgKGNsb3NlZCkgewotCQkJCWZpbmFsIFBvaW50IGEgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOwotCQkJCWZpbmFsIFBvaW50IGIgPSBwb2ludHNbMF07Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgTGluZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODBlNjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JcHJpdmF0ZSBpbnQgbGluZVN0eWxlLCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDEpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzNiYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZWN0YW5nbGUubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJc3dpdGNoIChzZXR0aW5ncy5jb21tb25GaWxsVHlwZSkgewotCQkJZGVmYXVsdDoKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0Tm9uZToKLQkJCQlyZXR1cm4gbmV3IFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpOwotCQkJY2FzZSBUb29sU2V0dGluZ3MuZnRTb2xpZDoKLQkJCQlyZXR1cm4gbmV3IFNvbGlkUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgYS54LCBhLnksIGIueCwgYi55KTsKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0T3V0bGluZTogewotCQkJCUNvbnRhaW5lckZpZ3VyZSBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgU29saWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MWQ2Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTIsIGRpYW1ldGVyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSBkaWFtZXRlciB0aGUgZGlhbWV0ZXIgb2YgY3VydmF0dXJlIG9mIGFsbCBmb3VyIGNvcm5lcnMKLQkgKi8KLQlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZGlhbWV0ZXIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCQl0aGlzLmRpYW1ldGVyID0gZGlhbWV0ZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAxLCBkaWFtZXRlciwgZGlhbWV0ZXIpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YzA2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvdW5kZWRSZWN0YW5nbGVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBSb3VuZGVkUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsCi0JCQkJYS54LCBhLnksIGIueCwgYi55LCBzZXR0aW5ncy5yb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXIpKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkKQotCQkJY29udGFpbmVyLmFkZChuZXcgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwKLQkJCQlzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsIGEueCwgYS55LCBiLngsIGIueSwgc2V0dGluZ3Mucm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhYmM4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBjb250cnVjdCBvYmplY3RzIGZyb20gaW5kaXZpZHVhbGx5Ci0gKiBwaWNrZWQgc2VnbWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWdtZW50ZWRQYWludFNlc3Npb24gZXh0ZW5kcyBCYXNpY1BhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogVGhlIHNldCBvZiBjb250cm9sIHBvaW50cyBtYWtpbmcgdXAgdGhlIHNlZ21lbnRlZCBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIFZlY3RvciAvKiBvZiBQb2ludCAqLyBjb250cm9sUG9pbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogVGhlIHByZXZpb3VzIGZpZ3VyZSAoc28gdGhhdCB3ZSBjYW4gYWJvcnQgd2l0aCByaWdodC1idXR0b24pCi0JICovCi0JcHJpdmF0ZSBGaWd1cmUgcHJldmlvdXNGaWd1cmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgZmlndXJlIChzbyB0aGF0IHdlIGNhbiBhYm9ydCB3aXRoIHJpZ2h0LWJ1dHRvbikKLQkgKi8KLQlwcml2YXRlIEZpZ3VyZSBjdXJyZW50RmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBTZWdtZW50ZWRQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVzZXRzIHRoZSB0b29sLgotCSAqIEFib3J0cyBhbnkgb3BlcmF0aW9uIGluIHByb2dyZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0KLQkJZ2V0UGFpbnRTdXJmYWNlKCkuc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkic2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuaW50ZXJhY3RpdmVNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IGN1cnJlbnRGaWd1cmU7Ci0KLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJZmluYWwgUG9pbnQgbGFzdFBvaW50ID0gKFBvaW50KSBjb250cm9sUG9pbnRzLmVsZW1lbnRBdChjb250cm9sUG9pbnRzLnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RQb2ludC54ID09IGV2ZW50LnggfHwgbGFzdFBvaW50LnkgPT0gZXZlbnQueSkgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQl9Ci0JCWNvbnRyb2xQb2ludHMuYWRkKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA+PSAyKSB7Ci0JCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJCXByZXZpb3VzRmlndXJlID0gY3JlYXRlRmlndXJlKAotCQkJCShQb2ludFtdKSBjb250cm9sUG9pbnRzLnRvQXJyYXkobmV3IFBvaW50W2NvbnRyb2xQb2ludHMuc2l6ZSgpXSksCi0JCQkJY29udHJvbFBvaW50cy5zaXplKCksIHRydWUpOwotCQl9Ci0JCXJlc2V0U2Vzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJcmVzZXRTZXNzaW9uKCk7IC8vIGFib3J0IGlmIHJpZ2h0IG9yIG1pZGRsZSBtb3VzZSBidXR0b24gcHJlc3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID09IDApIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJCXJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJfQotCQlwcy5zZXRTdGF0dXNDb29yZFJhbmdlKChQb2ludCkgY29udHJvbFBvaW50cy5lbGVtZW50QXQoY29udHJvbFBvaW50cy5zaXplKCkgLSAxKSwKLQkJCXBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCVBvaW50W10gcG9pbnRzID0gKFBvaW50W10pIGNvbnRyb2xQb2ludHMudG9BcnJheShuZXcgUG9pbnRbY29udHJvbFBvaW50cy5zaXplKCkgKyAxXSk7Ci0JCXBvaW50c1tjb250cm9sUG9pbnRzLnNpemUoKV0gPSBwcy5nZXRDdXJyZW50UG9zaXRpb24oKTsKLQkJY3VycmVudEZpZ3VyZSA9IGNyZWF0ZUZpZ3VyZShwb2ludHMsIHBvaW50cy5sZW5ndGgsIGZhbHNlKTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbihjdXJyZW50RmlndXJlKTsKLQl9CQotCi0JLyoqCi0JICogVGVtcGxhdGUgTWV0aG9kOiBDcmVhdGVzIGEgRmlndXJlIGZvciBkcmF3aW5nIHJ1YmJlcmJhbmQgZW50aXRpZXMgYW5kIHRoZSBmaW5hbCBwcm9kdWN0Ci0JICogCi0JICogQHBhcmFtIHBvaW50cyB0aGUgYXJyYXkgb2YgY29udHJvbCBwb2ludHMKLQkgKiBAcGFyYW0gbnVtUG9pbnRzIHRoZSBudW1iZXIgb2YgdmFsaWQgcG9pbnRzIGluIHRoZSBhcnJheSAobiA+PSAyKQotCSAqIEBwYXJhbSBjbG9zZWQgdHJ1ZSBpZiB0aGUgdXNlciBkb3VibGUtY2xpY2tlZCBvbiB0aGUgZmluYWwgY29udHJvbCBwb2ludAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50W10gcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBib29sZWFuIGNsb3NlZCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkRWxsaXBzZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U5YWRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkRWxsaXBzZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgU29saWQgRWxsaXBzZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkRWxsaXBzZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRFbGxpcHNlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycyBvZiBhIGJveAotCSAqIGJvdW5kaW5nIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgU29saWRFbGxpcHNlRmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbE92YWwoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUG9seWdvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUxNDAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUG9seWdvbkZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgTGluZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkUG9seWdvbkZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludFtdIHBvaW50czsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRQb2x5Z29uCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhIHNlcXVlbmNlIG9mIHZlcnRpY2VzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHZlcnRpY2VzIHRoZSBhcnJheSBvZiB2ZXJ0aWNlcyBtYWtpbmcgdXAgdGhlIHBvbHlnb24KLQkgKiBAcGFyYW0gbnVtUG9pbnQgdGhlIG51bWJlciBvZiB2YWxpZCBwb2ludHMgaW4gdGhlIGFycmF5IChuID49IDMpCi0JICovCi0JcHVibGljIFNvbGlkUG9seWdvbkZpZ3VyZShDb2xvciBjb2xvciwgUG9pbnRbXSB2ZXJ0aWNlcywgaW50IG51bVBvaW50cykgewotCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCXRoaXMucG9pbnRzID0gbmV3IGludFtudW1Qb2ludHMgKiAyXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qb2ludHM7ICsraSkgewotCQkJcG9pbnRzW2kgKiAyXSA9IHZlcnRpY2VzW2ldLng7Ci0JCQlwb2ludHNbaSAqIDIgKyAxXSA9IHZlcnRpY2VzW2ldLnk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJaW50W10gZHJhd1BvaW50cyA9IG5ldyBpbnRbcG9pbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlkcmF3UG9pbnRzW2ldID0gcG9pbnRzW2ldICogZmRjLnhTY2FsZSAtIGZkYy54T2Zmc2V0OwotCQkJZHJhd1BvaW50c1tpICsgMV0gPSBwb2ludHNbaSArIDFdICogZmRjLnlTY2FsZSAtIGZkYy55T2Zmc2V0OwotCQl9Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxQb2x5Z29uKGRyYXdQb2ludHMpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlpbnQgeG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFLCB5bWluID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCB4bWF4ID0gSW50ZWdlci5NSU5fVkFMVUUsIHltYXggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMikgewotCQkJaWYgKHBvaW50c1tpXSA8IHhtaW4pIHhtaW4gPSBwb2ludHNbaV07Ci0JCQlpZiAocG9pbnRzW2ldID4geG1heCkgeG1heCA9IHBvaW50c1tpXTsKLQkJCWlmIChwb2ludHNbaSsxXSA8IHltaW4pIHltaW4gPSBwb2ludHNbaSsxXTsKLQkJCWlmIChwb2ludHNbaSsxXSA+IHltYXgpIHltYXggPSBwb2ludHNbaSsxXTsKLQkJfQkJCi0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHhtaW4sIHltaW4sIHhtYXgsIHltYXgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMmZiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgU29saWRSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgU29saWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgY29sb3IsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLmNvbG9yID0gY29sb3I7IHRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZDJlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgxLCB5MSwgeDIsIHkyLCBkaWFtZXRlcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0gZGlhbWV0ZXIgdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBhbGwgZm91ciBjb3JuZXJzCi0JICovCi0JcHVibGljIFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZGlhbWV0ZXIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JCXRoaXMuZGlhbWV0ZXIgPSBkaWFtZXRlcjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUm91bmRSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0LCBkaWFtZXRlciwgZGlhbWV0ZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZDBjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yICBjb2xvcjsKLQlwcml2YXRlIEZvbnQgICBmb250OwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgeCwgeTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgVGV4dEZpZ3VyZQotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGZvbnQgIHRoZSBmb250IGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB0ZXh0ICB0aGUgdGV4dCB0byBkcmF3LCB0YWIgYW5kIG5ldy1saW5lIGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQKLQkgKiBAcGFyYW0geCAgICAgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHRleHQgYm91bmRpbmcgYm94Ci0JICogQHBhcmFtIHkgICAgIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSB0ZXh0IGJvdW5kaW5nIGJveAotCSAqLwotCXB1YmxpYyBUZXh0RmlndXJlKENvbG9yIGNvbG9yLCBGb250IGZvbnQsIFN0cmluZyB0ZXh0LCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLmZvbnQgPSBmb250OyB0aGlzLnRleHQgPSB0ZXh0OyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwID0gZmRjLnRvQ2xpZW50UG9pbnQoeCwgeSk7Ci0JCWZkYy5nYy5zZXRGb250KGZvbnQpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5kcmF3VGV4dCh0ZXh0LCBwLngsIHAueSwgdHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCUZvbnQgb2xkRm9udCA9IGZkYy5nYy5nZXRGb250KCk7Ci0JCWZkYy5nYy5zZXRGb250KGZvbnQpOwotCQlQb2ludCB0ZXh0RXh0ZW50ID0gZmRjLmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCWZkYy5nYy5zZXRGb250KG9sZEZvbnQpOwotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4LCB5LCB4ICsgdGV4dEV4dGVudC54LCB5ICsgdGV4dEV4dGVudC55KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Njc4N2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQSB0ZXh0IGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIFRleHRUb29sIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCXByaXZhdGUgU3RyaW5nIGRyYXdUZXh0ID0gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuc2V0dGluZ3MuZGVmYXVsdHRleHQiKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFRleHRUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQubGFiZWwiKTsKLQl9Ci0JCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkic2Vzc2lvbi5UZXh0Lm1lc3NhZ2UiKSk7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvd24gZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uID09IDEpIHsKLQkJCS8vIGRyYXcgd2l0aCBsZWZ0IG1vdXNlIGJ1dHRvbgotCQkJZ2V0UGFpbnRTdXJmYWNlKCkuY29tbWl0UnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJLy8gc2V0IHRleHQgd2l0aCByaWdodCBtb3VzZSBidXR0b24KLQkJCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQkJU2hlbGwgc2hlbGwgPSBnZXRQYWludFN1cmZhY2UoKS5nZXRTaGVsbCgpOwotCQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJZGlhbG9nLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuZGlhbG9nLnRpdGxlIikpOwotCQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuVGV4dC5kaWFsb2cubWVzc2FnZSIpKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCWZpbmFsIFRleHQgZmllbGQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWZpZWxkLnNldFRleHQoZHJhd1RleHQpOwotCQkJZmllbGQuc2VsZWN0QWxsKCk7Ci0JCQlmaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShkaWFsb2csIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPSyIpKTsKLQkJCW9rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZHJhd1RleHQgPSBmaWVsZC5nZXRUZXh0KCk7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNhbmNlbCIpKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCQlkaWFsb2cucGFjaygpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGRpYWxvZy5nZXREaXNwbGF5KCk7Ci0JCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkgJiYgISBkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9CQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKAotCQkJbmV3IFRleHRGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25Gb250LAotCQkJCWRyYXdUZXh0LCBldmVudC54LCBldmVudC55KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxY2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFRvb2wgewotCXB1YmxpYyBpbnQgaWQ7Ci0JcHVibGljIFN0cmluZyBuYW1lOwotCXB1YmxpYyBTdHJpbmcgZ3JvdXA7Ci0JcHVibGljIGludCB0eXBlOwotCXB1YmxpYyBSdW5uYWJsZSBhY3Rpb247Ci0JcHVibGljIEltYWdlIGltYWdlID0gbnVsbDsKLQlwdWJsaWMgT2JqZWN0IGRhdGE7Ci0JCi0JcHVibGljIFRvb2woaW50IGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGdyb3VwLCBpbnQgdHlwZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZ3JvdXAgPSBncm91cDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgVG9vbChpbnQgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXAsIGludCB0eXBlLCBPYmplY3QgZGF0YSkgewotCQl0aGlzKGlkLCBuYW1lLCBncm91cCwgdHlwZSk7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YmVkYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUb29sIFNldHRpbmdzIG9iamVjdHMgZ3JvdXAgdG9vbC1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sU2V0dGluZ3MgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ0Tm9uZSA9IDAsIGZ0T3V0bGluZSA9IDEsIGZ0U29saWQgPSAyOwotCi0JLyoqCi0JICogY29tbW9uRm9yZWdyb3VuZENvbG9yOiBjdXJyZW50IHRvb2wgZm9yZWdyb3VuZCBjb2xvdXIKLQkgKi8KLQlwdWJsaWMgQ29sb3IgY29tbW9uRm9yZWdyb3VuZENvbG9yOwotCi0JLyoqCi0JICogY29tbW9uQmFja2dyb3VuZENvbG9yOiBjdXJyZW50IHRvb2wgYmFja2dyb3VuZCBjb2xvdXIKLQkgKi8KLQlwdWJsaWMgQ29sb3IgY29tbW9uQmFja2dyb3VuZENvbG9yOwotCi0JLyoqCi0JICogY29tbW9uRm9udDogY3VycmVudCBmb250Ci0JICovCi0JcHVibGljIEZvbnQgY29tbW9uRm9udDsKLQotCS8qKgotCSAqIGNvbW1vbkZpbGxUeXBlOiBjdXJyZW50IGZpbGwgdHlwZQotCSAqIDxwPk9uZSBvZiBmdE5vbmUsIGZ0T3V0bGluZSwgZnRTb2xpZC48L3A+Ci0JICovCi0JcHVibGljIGludCBjb21tb25GaWxsVHlwZSA9IGZ0Tm9uZTsKLQotCS8qKgotCSAqIGNvbW1vbkxpbmVTdHlsZTogY3VycmVudCBsaW5lIHR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGNvbW1vbkxpbmVTdHlsZSA9IFNXVC5MSU5FX1NPTElEOwotCQotCS8qKgotCSAqIGFpcmJydXNoUmFkaXVzOiBjb3ZlcmFnZSByYWRpdXMgaW4gcGl4ZWxzCi0JICovCi0JcHVibGljIGludCBhaXJicnVzaFJhZGl1cyA9IDEwOwotCQotCS8qKgotCSAqIGFpcmJydXNoSW50ZW5zaXR5OiBhdmVyYWdlIHN1cmZhY2UgYXJlYSBjb3ZlcmFnZSBpbiByZWdpb24gZGVmaW5lZCBieSByYWRpdXMgcGVyICJqb3QiCi0JICovCi0JcHVibGljIGludCBhaXJicnVzaEludGVuc2l0eSA9IDMwOwotCQotCS8qKgotCSAqIHJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlcjogdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBjb3JuZXJzIGluIGEgcm91bmRlZCByZWN0YW5nbGUKLQkgKi8KLQlwdWJsaWMgaW50IHJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlciA9IDE2OwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9ub25lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRkNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9ub25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfb3V0bGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmNjZmVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfb3V0bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfc29saWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM0ZTY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfc29saWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU3YmIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoZG90LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoZG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyOTY4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kb3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTM3Y2NiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kb3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX3NvbGlkLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTU3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX3NvbGlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L29wdGlvbnNfZm9udC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVmZTA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L29wdGlvbnNfZm9udC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfYWlyYnJ1c2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzEwZWRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfYWlyYnJ1c2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9lbGxpcHNlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjE0MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9lbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfbGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY4MTlmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BlbmNpbC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BlbmNpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmEyMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BvbHlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzODRlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BvbHlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcmVjdGFuZ2xlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcmVjdGFuZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZGQ1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NDVkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF90ZXh0LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzQ1N2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvSW1hZ2VzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzkxOWNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3I7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VzIHsKLQotCS8vIEJpdG1hcCBJbWFnZXMKLQlwdWJsaWMgSW1hZ2UgQm9sZDsKLQlwdWJsaWMgSW1hZ2UgSXRhbGljOwotCXB1YmxpYyBJbWFnZSBVbmRlcmxpbmU7Ci0JcHVibGljIEltYWdlIFN0cmlrZW91dDsKLQlwdWJsaWMgSW1hZ2UgUmVkOwotCXB1YmxpYyBJbWFnZSBHcmVlbjsKLQlwdWJsaWMgSW1hZ2UgQmx1ZTsKLQlwdWJsaWMgSW1hZ2UgRXJhc2U7Ci0JCi0JSW1hZ2UgIFtdIEFsbEJpdG1hcHM7Ci0KLUltYWdlcyAoKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIGZyZWVBbGwgKCkgewotCWZvciAoaW50IGk9MDsgaTxBbGxCaXRtYXBzLmxlbmd0aDsgaSsrKSBBbGxCaXRtYXBzIFtpXS5kaXNwb3NlICgpOwotCUFsbEJpdG1hcHMgPSBudWxsOwotfQotCi1JbWFnZSBjcmVhdGVCaXRtYXBJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBmaWxlTmFtZSkgewotCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IEltYWdlcy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChmaWxlTmFtZSArICIuYm1wIik7Ci0JSW5wdXRTdHJlYW0gbWFza1N0cmVhbSA9IEltYWdlcy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChmaWxlTmFtZSArICJfbWFzay5ibXAiKTsKLQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlU3RyZWFtKTsKLQlJbWFnZURhdGEgbWFzayA9IG5ldyBJbWFnZURhdGEgKG1hc2tTdHJlYW0pOwotCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQl0cnkgewotCQlzb3VyY2VTdHJlYW0uY2xvc2UgKCk7Ci0JCW1hc2tTdHJlYW0uY2xvc2UgKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIHZvaWQgbG9hZEFsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JLy8gQml0bWFwIEltYWdlcwotCUJvbGQgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJvbGQiKTsKLQlJdGFsaWMgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgIml0YWxpYyIpOwotCVVuZGVybGluZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAidW5kZXJsaW5lIik7Ci0JU3RyaWtlb3V0ID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJzdHJpa2VvdXQiKTsKLQlSZWQgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInJlZCIpOwotCUdyZWVuID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJncmVlbiIpOwotCUJsdWUgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJsdWUiKTsKLQlFcmFzZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiZXJhc2UiKTsKLQkKLQlBbGxCaXRtYXBzID0gbmV3IEltYWdlIFtdIHsKLQkJQm9sZCwKLQkJSXRhbGljLAotCQlVbmRlcmxpbmUsCi0JCVN0cmlrZW91dCwKLQkJUmVkLAotCQlHcmVlbiwKLQkJQmx1ZSwKLQkJRXJhc2UsCi0JfTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MDMyMmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFRleHRFZGl0b3IgeyAgCi0JU2hlbGwgc2hlbGw7Ci0JVG9vbEJhciB0b29sQmFyOwotCVN0eWxlZFRleHQgdGV4dDsKLQotCUltYWdlcyBpbWFnZXMgPSBuZXcgSW1hZ2VzKCk7Ci0JVmVjdG9yIGNhY2hlZFN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlDb2xvciBSRUQgPSBudWxsOyAKLQlDb2xvciBCTFVFID0gbnVsbDsgCi0JQ29sb3IgR1JFRU4gPSBudWxsOyAKLQlGb250IGZvbnQgPSBudWxsOwotCVRvb2xJdGVtIGJvbGRCdXR0b24sIGl0YWxpY0J1dHRvbiwgdW5kZXJsaW5lQnV0dG9uLCBzdHJpa2VvdXRCdXR0b247Ci0JCi0Jc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlcyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfdGV4dGVkaXRvciIpOwotCi1NZW51IGNyZWF0ZUVkaXRNZW51KCkgewotCU1lbnUgYmFyID0gc2hlbGwuZ2V0TWVudUJhciAoKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoYmFyKTsKLQkKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJDdXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdYJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZUN1dENvcHkoKTsKLQkJCXRleHQuY3V0KCk7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJDb3B5X21lbnVpdGVtIikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQycpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVDdXRDb3B5KCk7Ci0JCQl0ZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIlBhc3RlX21lbnVpdGVtIikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVicpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl0ZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQluZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJGb250X21lbnVpdGVtIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzZXRGb250KCk7Ci0JCX0KLQl9KTsKLQlyZXR1cm4gbWVudTsKLX0KLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRXhpdF9tZW51aXRlbSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCX0KLQl9KTsKLQotCXJldHVybiBtZW51OwotfQotCi0vKgotICogU2V0IGEgc3R5bGUKLSAqLwotdm9pZCBzZXRTdHlsZShXaWRnZXQgd2lkZ2V0KSB7Ci0JUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJU3R5bGVSYW5nZSByYW5nZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJfSBlbHNlIHsKLQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoaSwgMSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCX0KLQkJaWYgKHdpZGdldCA9PSBib2xkQnV0dG9uKSB7Ci0JCQlzdHlsZS5mb250U3R5bGUgXj0gU1dULkJPTEQ7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0ID09IGl0YWxpY0J1dHRvbikgewotCQkJc3R5bGUuZm9udFN0eWxlIF49IFNXVC5JVEFMSUM7CQkJCQkJCi0JCX0gZWxzZSBpZiAod2lkZ2V0ID09IHVuZGVybGluZUJ1dHRvbikgewotCQkJc3R5bGUudW5kZXJsaW5lID0gIXN0eWxlLnVuZGVybGluZTsKLQkJfSBlbHNlIGlmICh3aWRnZXQgPT0gc3RyaWtlb3V0QnV0dG9uKSB7Ci0JCQlzdHlsZS5zdHJpa2VvdXQgPSAhc3R5bGUuc3RyaWtlb3V0OwotCQl9Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsLnggKyBzZWwueSwgMCk7CQkJCi19Ci0KLS8qCi0gKiBDbGVhciBhbGwgc3R5bGUgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0gKi8KLXZvaWQgY2xlYXIoKSB7Ci0JUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCWlmIChzZWwueSAhPSAwKSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2VsLngsIHNlbC55LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLS8qCi0gKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotICovCi12b2lkIGZnQ29sb3IoQ29sb3IgZmcpIHsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZSwgcmFuZ2U7Ci0JZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJcmFuZ2UgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQlzdHlsZS5mb3JlZ3JvdW5kID0gZmc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlIChpLCAxLCBmZywgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCX0KLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRWRpdF9tZW51aXRlbSIpKTsKLQllZGl0SXRlbS5zZXRNZW51IChjcmVhdGVFZGl0TWVudSAoKSk7Ci19Ci0KLXZvaWQgY3JlYXRlU2hlbGwgKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJXaW5kb3dfdGl0bGUiKSk7CQotCWltYWdlcy5sb2FkQWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lciAobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkIChEaXNwb3NlRXZlbnQgZSkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlpbWFnZXMuZnJlZUFsbCAoKTsKLQkJCVJFRC5kaXNwb3NlKCk7Ci0JCQlHUkVFTi5kaXNwb3NlKCk7Ci0JCQlCTFVFLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVTdHlsZWRUZXh0KCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCXRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBlKSB7Ci0JCQloYW5kbGVFeHRlbmRlZE1vZGlmeShlKTsKLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZVRvb2xCYXIoKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2V0U3R5bGUgKGV2ZW50LndpZGdldCk7Ci0JCX0KLQl9OwotCWJvbGRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlib2xkQnV0dG9uLnNldEltYWdlKGltYWdlcy5Cb2xkKTsKLQlib2xkQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIkJvbGQiKSk7Ci0JYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JaXRhbGljQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JaXRhbGljQnV0dG9uLnNldEltYWdlKGltYWdlcy5JdGFsaWMpOwotCWl0YWxpY0J1dHRvbi5zZXRUb29sVGlwVGV4dChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJJdGFsaWMiKSk7Ci0JaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl1bmRlcmxpbmVCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQl1bmRlcmxpbmVCdXR0b24uc2V0SW1hZ2UoaW1hZ2VzLlVuZGVybGluZSk7Ci0JdW5kZXJsaW5lQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIlVuZGVybGluZSIpKTsKLQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZShpbWFnZXMuU3RyaWtlb3V0KTsKLQlzdHJpa2VvdXRCdXR0b24uc2V0VG9vbFRpcFRleHQocmVzb3VyY2VzLmdldFN0cmluZygiU3RyaWtlb3V0IikpOwotCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuUmVkKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJZmdDb2xvcihSRUQpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuR3JlZW4pOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEdSRUVOKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWl0ZW0uc2V0SW1hZ2UoaW1hZ2VzLkJsdWUpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEJMVUUpOwotCQl9Ci0JfSk7CQotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuRXJhc2UpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQljbGVhcigpOwotCQl9Ci0JfSk7Ci19Ci0vKgotICogQ2FjaGUgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZvciB0ZXh0IHRoYXQgaGFzIGJlZW4gY3V0IG9yIGNvcGllZC4KLSAqLwotdm9pZCBoYW5kbGVDdXRDb3B5KCkgewotCS8vIFNhdmUgdGhlIGN1dC9jb3BpZWQgc3R5bGUgaW5mbyBzbyB0aGF0IGR1cmluZyBwYXN0ZSB3ZSB3aWxsIG1haW50YWluCi0JLy8gdGhlIHN0eWxlIGluZm9ybWF0aW9uLiAgQ3V0L2NvcGllZCB0ZXh0IGlzIHB1dCBpbiB0aGUgY2xpcGJvYXJkIGluCi0JLy8gUlRGIGZvcm1hdCwgYnV0IGlzIG5vdCBwYXN0ZWQgaW4gUlRGIGZvcm1hdC4gIFRoZSBvdGhlciB3YXkgdG8gCi0JLy8gaGFuZGxlIHRoZSBwYXN0aW5nIG9mIHN0eWxlcyB3b3VsZCBiZSB0byBhY2Nlc3MgdGhlIENsaXBib2FyZCBkaXJlY3RseSBhbmQgCi0JLy8gcGFyc2UgdGhlIFJURiB0ZXh0LgotCWNhY2hlZFN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaW50IHN0YXJ0WCA9IHNlbC54OwotCWZvciAoaW50IGk9c2VsLng7IGk8PXNlbC54K3NlbC55LTE7IGkrKykgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlzdHlsZS5zdGFydCA9IHN0eWxlLnN0YXJ0IC0gc3RhcnRYOwotCQkJaWYgKCFjYWNoZWRTdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3R5bGVSYW5nZSBsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSljYWNoZWRTdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCQlpZiAobGFzdFN0eWxlLnNpbWlsYXJUbyhzdHlsZSkgJiYgbGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkgewotCQkJCQlsYXN0U3R5bGUubGVuZ3RoKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJfQotCQl9Ci0JfQotfQotdm9pZCBoYW5kbGVFeHRlbmRlZE1vZGlmeShFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JaWYgKGV2ZW50Lmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZTsKLQlpZiAoZXZlbnQubGVuZ3RoID09IDEgfHwgdGV4dC5nZXRUZXh0UmFuZ2UoZXZlbnQuc3RhcnQsIGV2ZW50Lmxlbmd0aCkuZXF1YWxzKHRleHQuZ2V0TGluZURlbGltaXRlcigpKSkgewotCQkvLyBIYXZlIHRoZSBuZXcgdGV4dCB0YWtlIG9uIHRoZSBzdHlsZSBvZiB0aGUgdGV4dCB0byBpdHMgcmlnaHQgKGR1cmluZwotCQkvLyB0eXBpbmcpIGlmIG5vIHN0eWxlIGluZm9ybWF0aW9uIGlzIGFjdGl2ZS4KLQkJaW50IGNhcmV0T2Zmc2V0ID0gdGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQlzdHlsZSA9IG51bGw7Ci0JCWlmIChjYXJldE9mZnNldCA8IHRleHQuZ2V0Q2hhckNvdW50KCkpIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoY2FyZXRPZmZzZXQpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSkgc3R5bGUuY2xvbmUgKCk7Ci0JCQlzdHlsZS5zdGFydCA9IGV2ZW50LnN0YXJ0OwotCQkJc3R5bGUubGVuZ3RoID0gZXZlbnQubGVuZ3RoOwotCQl9IGVsc2UgewotCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShldmVudC5zdGFydCwgZXZlbnQubGVuZ3RoLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJfQkJCi0JCWlmIChib2xkQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZS5mb250U3R5bGUgfD0gU1dULkJPTEQ7Ci0JCWlmIChpdGFsaWNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlLmZvbnRTdHlsZSB8PSBTV1QuSVRBTElDOwotCQlzdHlsZS51bmRlcmxpbmUgPSB1bmRlcmxpbmVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0eWxlLnN0cmlrZW91dCA9IHN0cmlrZW91dEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzdHlsZS5pc1Vuc3R5bGVkKCkpIHRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfSBlbHNlIHsKLQkJLy8gcGFzdGUgb2NjdXJyaW5nLCBoYXZlIHRleHQgdGFrZSBvbiB0aGUgc3R5bGVzIGl0IGhhZCB3aGVuIGl0IHdhcwotCQkvLyBjdXQvY29waWVkCi0JCWZvciAoaW50IGk9MDsgaTxjYWNoZWRTdHlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpY2FjaGVkU3R5bGVzLmVsZW1lbnRBdChpKTsKLQkJCVN0eWxlUmFuZ2UgbmV3U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZS5jbG9uZSgpOwotCQkJbmV3U3R5bGUuc3RhcnQgPSBzdHlsZS5zdGFydCArIGV2ZW50LnN0YXJ0OwotCQkJdGV4dC5zZXRTdHlsZVJhbmdlKG5ld1N0eWxlKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JVGV4dEVkaXRvciBleGFtcGxlID0gbmV3IFRleHRFZGl0b3IgKCk7Ci0JU2hlbGwgc2hlbGwgPSBleGFtcGxlLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQljcmVhdGVTaGVsbCAoZGlzcGxheSk7Ci0JY3JlYXRlTWVudUJhciAoKTsKLQljcmVhdGVUb29sQmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgc2V0Rm9udCgpIHsKLQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhzaGVsbCk7Ci0JZm9udERpYWxvZy5zZXRGb250TGlzdCgodGV4dC5nZXRGb250KCkpLmdldEZvbnREYXRhKCkpOwotCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JaWYgKGZvbnREYXRhICE9IG51bGwpIHsKLQkJRm9udCBuZXdGb250ID0gbmV3IEZvbnQoc2hlbGwuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7IAotCQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0JCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQlmb250ID0gbmV3Rm9udDsKLQl9Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlSRUQgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMjU1LDAsMCkpOwotCUJMVUUgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMCwwLDI1NSkpOwotCUdSRUVOID0gbmV3IENvbG9yIChkaXNwbGF5LCBuZXcgUkdCKDAsMjU1LDApKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGM3YWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZTkyNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMTg0YmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzgyNzUxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDJhY2U3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2VfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YWIyMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW4uYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjYTAyM2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbl9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM2NzIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDc2MmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YzYzYmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMjk4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlhYjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNhY2ZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWRlOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjMxNmI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5OGQxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGdsZXhhbXBsZXMuamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHNyYy8KLSAgICAgICAgICAgICAgIAotc291cmNlLmdsZXhhbXBsZXMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzY2U2NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uT3BlbkdMRXhhbXBsZVNldC5uYW1lID0gU1dUIE9wZW5HTCBFeGFtcGxlcyBQbHVnaW4KLQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLm5hbWUgPSBPcGVuR0wgRXhhbXBsZQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoZSBPcGVuR0wgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIG1hbnkgT3BlbkdMIGZlYXR1cmVzIGluIFwKLQlhbiBTV1QgYXBwbGljYXRpb24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExODcyNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5PcGVuR0xFeGFtcGxlU2V0Lm5hbWUiCi0gICB2ZXJzaW9uPSIwLjUuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0iIj4KLQotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9wZW5nbCIgdmVyc2lvbj0iMC41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSBSdW50aW1lIC0tPgotPHJ1bnRpbWU+Ci0gICA8bGlicmFyeSBuYW1lPSJnbGV4YW1wbGVzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9wZW5HTEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLk9wZW5HTEV4YW1wbGUuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy5PcGVuR0xFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTI3MTMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgT3BlbkdMIEV4YW1wbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZhY2I5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBBbnRpYWxpYXNpbmdUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgQnV0dG9uIGFudGlBbGlhc0J1dHRvbjsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC02LjBmOwotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDExOwotCQkJfQotCQl9KTsKLQotCQlhbnRpQWxpYXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFRleHQoIkFudGktQWxpYXNpbmciKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYW50aUFsaWFzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoYW50aUFsaWFzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTC5nbERpc2FibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTC5nbERlbGV0ZUxpc3RzKDEsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkFudGktYWxpYXNpbmciOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCWZpbmFsIGZsb2F0W10gQkVaSUVSX1BPSU5UUyA9IHsKLQkJCS0xLjVmLCAtMS41ZiwgNC4wZiwgLTAuNWYsIC0xLjVmLCAyLjBmLCAwLjVmLCAtMS41ZiwKLQkJCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJCS0wLjVmLCAzLjBmLCAwLjVmLCAtMC41ZiwgMC4wZiwgMS41ZiwgLTAuNWYsIC0xLjBmLAotCQkJLTEuNWYsIDAuNWYsIDQuMGYsIC0wLjVmLCAwLjVmLCAwLjBmLCAwLjVmLCAwLjVmLAotCQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJCTEuNWYsIC0yLjBmLCAwLjVmLCAxLjVmLCAwLjBmLCAxLjVmLCAxLjVmLCAtMS4wZiwKLQkJfTsKLQkJR0wuZ2xIaW50KEdMLkdMX0xJTkVfU01PT1RIX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcEdyaWQyZigzMCwgMC4wZiwgMS4wZiwgMzAsIDAuMGYsIDEuMGYpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0FVVE9fTk9STUFMKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NUSVBQTEUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfVkVSVEVYXzMpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfTElORSwgMCwgMzAsIDAsIDMwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdCgxKTsJLy8gZHJhdyB0aGUgYmVpemVyIHN1cmZhY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVlZTcyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQXJlYVRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JYWJzdHJhY3QgY2xhc3MgU2hhcGUgewotCQlhYnN0cmFjdCB2b2lkIGRyYXcoKTsKLQl9Ci0JY2xhc3MgU3RhdGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHN0YXRlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdGF0ZQotCQkgKi8KLQkJU3RhdGUgKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXZvaWQgZGlzcGxheSgpIHsKLQkJCUdMLmdsQ2FsbExpc3QoaW5kZXgpOwotCQl9Ci0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCUdMLmdsRGVsZXRlTGlzdHMoaW5kZXgsIDEpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0YXRlW10gc3RhdGVzOwotCXByaXZhdGUgU3RhdGUgY3VycmVudFN0YXRlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTMwLjBmOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDkwLjBmLCB5Um90ID0gMC4wZiwgelJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljLCBkaXNrOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA0MDsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDkwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgb3B0aW9uc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQluZXcgTGFiZWwob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2hhcGU6Iik7Ci0KLQkJZmluYWwgQ29tYm8gc3RhdGVzQ29tYm8gPSBuZXcgQ29tYm8ob3B0aW9uc0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXN0YXRlc0NvbWJvLmFkZChzdGF0ZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzdGF0ZXNDb21iby5zZWxlY3QoMCk7Ci0JCXN0YXRlc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbc3RhdGVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBsaWdodHNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJbGlnaHRzQnV0dG9uLnNldFRleHQoIkxpZ2h0cyIpOwotCQlsaWdodHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlsaWdodHNCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChsaWdodHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMLmdsRGlzYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMoZGlzayk7Ci0JCWlmIChzdGF0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGF0ZXMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIEFORCBvZiB0d28gc2hhcGVzLgotCSAqCi0JICogQHBhcmFtIGEgc2hhcGUgQQotCSAqIEBwYXJhbSBiIHNoYXBlIEIKLQkgKi8KLQl2b2lkIGRyYXdBYW5kQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQiB0aGF0IGFyZSBpbnNpZGUgQQotCQlkcmF3QWluc2lkZUIoYSwgYiwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyB0dXJuIG9uIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0FMV0FZUyk7Ci0JCS8vIHJlbmRlciB0aGUgZnJvbnQgZmFjZSBvZiBCCi0JCWIuZHJhdygpOwotCQkvLyByZXNldCB0aGUgZGVwdGggZnVuY3Rpb24KLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVTUyk7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQSB0aGF0IGFyZSBpbnNpZGUgQgotCQlkcmF3QWluc2lkZUIoYiwgYSwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBjb250ZW50cyBvZiBvbmUgc2hhcGUgdGhhdCBhcHBlYXIgd2l0aGluIGFub3RoZXIuCi0JICoKLQkgKiBAcGFyYW0gYSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqIEBwYXJhbSBiIHRoZSBjb25zdHJhaW5pbmcgc2hhcGUKLQkgKiBAcGFyYW0gZmFjZQotCSAqIEBwYXJhbSB0ZXN0Ci0JICovCi0Jdm9pZCBkcmF3QWluc2lkZUIoU2hhcGUgYSwgU2hhcGUgYiwgaW50IGZhY2UsIGludCB0ZXN0KSB7Ci0JCS8vIHR1cm4gb2ZmIHRoZSBjb2xvciBidWZmZXIKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIEN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIHNoYXBlIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIHNldCBkZXB0aCBtYXNrCi0JCUdMLmdsRGVwdGhNYXNrKGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgdGVzdAotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMCwgMCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gaW5jcmVtZW50IGlmIHRoZSBkZXB0aCB0ZXN0IHBhc3NlcwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9JTkNSKTsKLQkJLy8gdHVybiBvbiBiYWNrIGZhY2UgY3VsbGluZwotCQlHTC5nbEN1bGxGYWNlKEdMLkdMX0JBQ0spOwotCQkvLyByZW5kZXIgQgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IHRoZSBzdGVuY2lsIGJ1ZmZlciB0byBkZWNyZW1lbnQgaWYgdGhlIGRlcHRoIHRlc3QgcGFzc2VzCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0RFQ1IpOwotCQkvLyBjdWxsIHRoZSBmcm9udCBmYWNlCi0JCUdMLmdsQ3VsbEZhY2UoR0wuR0xfRlJPTlQpOwotCQkvLyByZW5kZXIgQiBhZ2FpbgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IGRlcHRoIG1hc2sKLQkJR0wuZ2xEZXB0aE1hc2sodHJ1ZSk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyCi0JCUdMLmdsU3RlbmNpbEZ1bmModGVzdCwgMCwgMSk7Ci0JCS8vIHR1cm4gb2ZmIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIGN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIGRpc2FibGUgc3RlbmNpbCB0ZXN0Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIE9SIG9mIHR3byBzaGFwZXMuCi0JICoKLQkgKiBAcGFyYW0gYSBzaGFwZSBBCi0JICogQHBhcmFtIGIgc2hhcGUgQgotCSAqLwotCXZvaWQgZHJhd0FvckIoU2hhcGUgYSwgU2hhcGUgYikgewotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJYS5kcmF3KCk7Ci0JCWIuZHJhdygpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3Mgb25lIHNoYXBlIHN1YnRyYWN0ZWQgZnJvbSBhbm90aGVyLgotCSAqCi0JICogQHBhcmFtIGEgdGhlIGJhc2Ugc2hhcGUKLQkgKiBAcGFyYW0gYiB0aGUgc2hhcGUgdG8gc3VidHJhY3QKLQkgKi8KLQl2b2lkIGRyYXdBc3ViQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgYmFjayBwYXJ0cyBvZiBCIGluc2lkZSBBCi0JCWRyYXdBaW5zaWRlQihiLCBhLCBHTC5HTF9GUk9OVCwgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gY2hhbmdlIHRoZSBkZXB0aCB0ZXN0IHRvIEdMX0FMV0FZUwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9BTFdBWVMpOwotCQkvLyByZW5kZXIgdGhlIGZyb250IGZhY2Ugb2YgQgotCQlhLmRyYXcoKTsKLQkJLy8gcmVzZXQgdGhlIGRlcHRoIGZ1bmN0aW9uCi0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFU1MpOwotCQkvLyBkcmF3IGZyb250IHBhcnRzIG9mIEEgb3V0c2lkZSBCCi0JCWRyYXdBaW5zaWRlQihhLCBiLCBHTC5HTF9CQUNLLCBHTC5HTF9FUVVBTCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIHNwZWNpZmVkIHNoYXBlLgotCSAqIAotCSAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqLwotCXZvaWQgZHJhd1NoYXBlKFNoYXBlIHNoYXBlKSB7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlzaGFwZS5kcmF3KCk7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJBcmVhIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQkJCi0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJZmxvYXRbXSBsaWdodFBvcyA9IHsgMC4wZiwgNS4wZiwgLTEwLjBmLCAxLjBmIH07Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvcyk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCWRpc2sgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSVNUX01PREUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCUdMLmdsTGlnaHRNb2RlbGkoR0wuR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsIEdMLkdMX1RSVUUpOwotCi0JCWZpbmFsIGZsb2F0W10gc3BoZXJlTWF0ZXJpYWwgPSB7IDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYgfTsKLQkJZmluYWwgZmxvYXRbXSBjeWxpbmRlck1hdGVyaWFsID0geyAxLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0KLQkJU2hhcGUgc3BoZXJlID0gbmV3IFNoYXBlKCkgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbE1hdGVyaWFsZnYoCi0JCQkJCUdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9BTUJJRU5UX0FORF9ESUZGVVNFLAotCQkJCQlzcGhlcmVNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQkJfQotCQl9OwotCQlTaGFwZSBjeWxpbmRlciA9IG5ldyBTaGFwZSgpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KAotCQkJCQlHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwKLQkJCQkJY3lsaW5kZXJNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9JTlNJREUpOwotCQkJCUdMLmdsUHVzaE1hdHJpeCgpOwotCQkJCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDMsIDMsIDYsIDMyLCAzMik7Ci0JCQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIDYuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9PVVRTSURFKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMLmdsUG9wTWF0cml4KCk7Ci0JCQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBjcmVhdGUgdGhlIGRpc3BsYXkgbGlzdHMgYW5kIHN0YXRlcwotCQlzdGF0ZXMgPSBuZXcgU3RhdGVbNl07Ci0JCWludCBpbmRleCA9IDE7Ci0JCQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3U2hhcGUoY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzBdID0gbmV3IFN0YXRlKCJDeWxpbmRlciIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NoYXBlKHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMV0gPSBuZXcgU3RhdGUoIlNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FvckIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMl0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIE9SIFNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FhbmRCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzNdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBBTkQgU3BoZXJlIixpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3QXN1YkIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbNF0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIFNVQiBTcGhlcmUiLGluZGV4KyspOwotCQkKLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FzdWJCKHNwaGVyZSwgY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzVdID0gbmV3IFN0YXRlKCJTcGhlcmUgU1VCIEN5bGluZGVyIixpbmRleCsrKTsKLQotCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2lzU3RlbmNpbFN1cHBvcnROZWVkZWQKLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLQkJY3VycmVudFN0YXRlLmRpc3BsYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRiYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDb2xvclNlbGVjdGlvbkdyb3VwIGltcGxlbWVudHMgTGlzdGVuZXIgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlIHN0eWxlIGJpdHMgdG8gYmUgYXBwbGllZCB0byB0aGUgY29sb3IgZ3JvdXAKLQkgKi8KLQlDb2xvclNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcigpOwotCQlpbml0Q29sb3IocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbG9yR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29sb3JHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoYnV0dG9uLmdldERpc3BsYXkoKSwgMTIsIDEyKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY29sb3IgIT0gbnVsbCkgY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IiKTsKLS8vCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFyZ3VtZW50IHRvIHRoaXMgZ3JvdXAncyBjb2xsZWN0aW9uIG9mCi0JICogY29sb3Igc2VsZWN0aW9uIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIoSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBEcmF3cyB0aGUgY29sb3JlZCBzcXVhcmUgb24gdGhlIHNlbGVjdGlvbiBidXR0b24uCi0JICovCi0Jdm9pZCBkcmF3QnV0dG9uSW1hZ2UoKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlTaGVsbCBzaGVsbCA9IGJ1dHRvbi5nZXRTaGVsbCgpOwotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQigKLQkJCW5ldyBSR0IoY29sb3IuZ2V0UmVkKCksIGNvbG9yLmdldEdyZWVuKCksIGNvbG9yLmdldEJsdWUoKSkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJc2V0UkdCKHJnYik7Ci0JCW5vdGlmeUxpc3RlbmVycyhyZ2IpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb2xvciBieSBxdWVyeWluZyBmb3IgdGhlIGN1cnJlbnQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKi8KLQl2b2lkIGluaXRDb2xvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZG91YmxlW10gY3VycmVudENvbG9yID0gbmV3IGRvdWJsZVs0XTsKLQkJR0wuZ2xHZXREb3VibGV2KEdMLkdMX0NVUlJFTlRfQ09MT1IsIGN1cnJlbnRDb2xvcik7Ci0JCVJHQiByZ2IgPQotCQkJbmV3IFJHQigKLQkJCQkoaW50KSBjdXJyZW50Q29sb3JbMF0gKiAyNTUsCi0JCQkJKGludCkgY3VycmVudENvbG9yWzFdICogMjU1LAotCQkJCShpbnQpIGN1cnJlbnRDb2xvclsyXSAqIDI1NSk7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIGNvbG9yIHNlbGVjdGlvbiBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0Jdm9pZCBub3RpZnlMaXN0ZW5lcnMoUkdCIHJnYikgewotCQlJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcltdIGxpc3RlbmVyc0FyciA9Ci0JCQluZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV07Ci0JCWxpc3RlbmVycy5jb3B5SW50byhsaXN0ZW5lcnNBcnIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyc0Fyci5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzQXJyIFtpXS5oYW5kbGVDb2xvclNlbGVjdGlvbihyZ2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYXJndW1lbnQgZnJvbSB0aGlzIGdyb3VwJ3MgY29sbGVjdGlvbiBvZiBjb2xvciBzZWxlY3Rpb24KLQkgKiBsaXN0ZW5lcnMuICBJZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcmVnaXN0ZXJlZCBsaXN0ZW5lciB0aGVuIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwJ3MgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmdiIHRoZSByZ2Igb2YgdGhlIG5ldyBjb2xvcgotCSAqLwotCXZvaWQgc2V0UkdCKFJHQiByZ2IpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJY29sb3IgPSBuZXcgQ29sb3IoYnV0dG9uLmdldERpc3BsYXkoKSwgcmdiKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjBkNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEZvZ1RhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0KLQlwcml2YXRlIGZsb2F0IHJvdFkgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgeVBvcyA9IDAuMGYsIHhQb3MgPSAwLjBmLCB6UG9zID0gLTE1LjBmOwotCXByaXZhdGUgaW50IGN1YmVMaXN0SW5kZXhCYXNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludFtdIEZPR19UWVBFUyA9IHsgR0wuR0xfTElORUFSLCBHTC5HTF9FWFAsIEdMLkdMX0VYUDIgfTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBGT0dfTkFNRVMgPSB7ICJMSU5FQVIiLCAiR0xfRVhQIiwgIkdMX0VYUDIiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyNCk7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDQpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMjU7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBmb2dUeXBlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQluZXcgTGFiZWwoZm9nVHlwZXNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIkZvZyBUeXBlczoiKTsKLQkJZmluYWwgQ29tYm8gZm9nVHlwZUNvbWJvID0gbmV3IENvbWJvKGZvZ1R5cGVzR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWZvZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmb2dUeXBlQ29tYm8uc2V0SXRlbXMoRk9HX05BTUVTKTsKLQkJZm9nVHlwZUNvbWJvLnNlbGVjdCgwKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiRm9nIERlbnNpdHk6Iik7Ci0JCWZpbmFsIFNsaWRlciBmb2dEZW5zaXR5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWF4aW11bSgzMik7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRUaHVtYigyKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDUpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgZm9nRGVuc2l0eSA9ICgoZmxvYXQpZm9nRGVuc2l0eVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19ERU5TSVRZLCBmb2dEZW5zaXR5KTsKLQkJCX0KLQkJfSk7Ci0JCWZvZ1R5cGVDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50IGN1cnJlbnRTZWxlY3Rpb24gPSBmb2dUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkvLyBmb2cgdHlwZSBHTC5HTF9MSU5FQVIgZG9lcyBub3QgdXRpbGl6ZSBmb2dEZW5zaXR5LCBidXQgdGhlIG90aGVyIGZvZyB0eXBlcyBkbwotCQkJCWZvZ0RlbnNpdHlTbGlkZXIuc2V0RW5hYmxlZChjdXJyZW50U2VsZWN0aW9uICE9IDApOwotCQkJCUdMLmdsRm9nZihHTC5HTF9GT0dfTU9ERSwgRk9HX1RZUEVTW2N1cnJlbnRTZWxlY3Rpb25dKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGN1YmUgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKi8KLSAJdm9pZCBjcmVhdGVDdWJlKCkgewotCQlHTC5nbE5ld0xpc3QoY3ViZUxpc3RJbmRleEJhc2UsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZnJvbnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIC0wLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAtMC41Zik7CS8vIHRvcCByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gbGVmdAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgbGVmdAkKLQkJLy8gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIGxlZnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgbGVmdAotCQkvLyB0b3AKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIC0wLjVmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgLTAuNWYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhjdWJlTGlzdEluZGV4QmFzZSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsJCi0JfQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkZvZyI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCS8vIGZvZyBjb2xvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGNsZWFyIGNvbG9yCi0JCS8vIHRvIGxvb2sgYXBwcm9wcmlhdGUKLQkJZmxvYXRbXSBmb2dDb2xvciA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTC5nbEZvZ2Z2KEdMLkdMX0ZPR19DT0xPUiwgZm9nQ29sb3IpOwotCQlHTC5nbEhpbnQoR0wuR0xfRk9HX0hJTlQsIEdMLkdMX0RPTlRfQ0FSRSk7Ci0JCUdMLmdsRm9nZihHTC5HTF9GT0dfU1RBUlQsIDApOwotCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX0RFTlNJVFksIDAuMGYpOwotCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQgZGlzdGFuY2U7IGFueXRoaW5nID4gMTUKLQkJLy8gdW5pdHMgZnJvbSB0aGUgY2FtZXJhIHdpbGwgYmUgY292ZXJlZCBpbiBmb2cKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19FTkQsIDE1KTsKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19NT0RFLCBGT0dfVFlQRVNbMF0pOwotCQlHTC5nbEVuYWJsZShHTC5HTF9GT0cpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQljdWJlTGlzdEluZGV4QmFzZSA9IEdMLmdsR2VuTGlzdHMoMSk7Ci0JCWNyZWF0ZUN1YmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHJvdFksIDAuMGYsIDEuMGYsIDAuMGYpOwotCi0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMywgMCwgLTMpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0zLCAwLCAtMyk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMCwgMCwgNCk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCXJvdFkgKz0gMC42ZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWQ1ZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgR3JhZGllbnRUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTcuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMTgwLjBmLCB5Um90ID0gMTgwLjBmLCB6Um90ID0gMTgwLjBmOwotCXByaXZhdGUgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0W10gQkVaSUVSX0NPTE9SUyA9IHsKLQkJMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4zZiwgMC42ZiwgMC4xZiwgMC4wZiwKLQkJMC44ZiwgMC4yZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKLQkJMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC44ZiwgMC44ZiwgMC44ZiwgMC4wZgotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXRbXSBCRVpJRVJfUE9JTlRTID0gewotCQktMS41ZiwgLTEuNWYsIDQuMGYsIC0wLjVmLCAtMS41ZiwgMi4wZiwgMC41ZiwgLTEuNWYsCi0JCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJLTAuNWYsIDMuMGYsIDAuNWYsIC0wLjVmLCAwLjBmLCAxLjVmLCAtMC41ZiwgLTEuMGYsCi0JCS0xLjVmLCAwLjVmLCA0LjBmLCAtMC41ZiwgMC41ZiwgMC4wZiwgMC41ZiwgMC41ZiwKLQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJMS41ZiwgLTIuMGYsIDAuNWYsIDEuNWYsIDAuMGYsIDEuNWYsIDEuNWYsIC0xLjBmLAotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUX05BTUVTID0geyAiQmV6aWVyIiwgIlNxdWFyZSIgfTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEyOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMTgwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigxODApOwotCQl5Um90YXRpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlSb3QgPSB5Um90YXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl6Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJelJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJelJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXpSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJelJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl6Um90YXRpb24uc2V0U2VsZWN0aW9uKDE4MCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgb2JqZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMixmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvYmplY3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJbmV3IExhYmVsKG9iamVjdEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiT2JqZWN0OiIpOwotCQlmaW5hbCBDb21ibyBvYmplY3RDb21ibyA9IG5ldyBDb21ibyhvYmplY3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJb2JqZWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2JqZWN0Q29tYm8uc2V0SXRlbXMoT0JKRUNUX05BTUVTKTsKLQkJb2JqZWN0Q29tYm8uc2VsZWN0KDApOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoMSwgMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkdyYWRpZW50cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEhpbnQoR0wuR0xfTElORV9TTU9PVEhfSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRklMTCk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfQ09MT1JfNCwgMCwgMSwgNCwgMSwgMCwgMSwgNCwgNiwgQkVaSUVSX0NPTE9SUyk7Ci0JCUdMLmdsTWFwR3JpZDJmKDIwLCAwLjBmLCAxLjBmLCAyMCwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsU2hhZGVNb2RlbChHTC5HTF9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU1RJUFBMRSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9DT0xPUl80KTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9WRVJURVhfMyk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfRklMTCwgMCwgMjAsIDAsIDIwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCUdMLmdsTmV3TGlzdCgyLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9GQU4pOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KGN1cnJlbnRTZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzU0MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE2NmFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1OwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+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/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMWMyMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMMTE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIExXSkdMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKi8KLXB1YmxpYyBjbGFzcyBMV0pHTEV4YW1wbGUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotICAgICAgIAkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIAkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJICAgICAgICB9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotICAgICAgICAJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZTk0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBMaWdodFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdFtdIG1hdGVyaWFsU2hpbmluZXNzID0geyAyNS4wZiB9OwotCXByaXZhdGUgZmxvYXRbXSBsaWdodFBvc2l0aW9uID0geyAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0JcHJpdmF0ZSBmbG9hdFtdW10gY29sb3JWYWx1ZXMgPSB7Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBkaWZmdXNlCi0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBzcGVjdWxhcgotCQl7IDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYgfSwJLy8gbGlnaHQgbWFpbiBhbWJpZW50Ci0JCXsgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBkaWZmdXNlCi0JCXsgMC4zZiwgMC4zZiwgMC4zZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9CS8vIG1hdGVyaWFsIHNwZWN1bGFyCi0JfTsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmLCB4UG9zID0gMC4wZiwgelBvcyA9IC0yMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWMsIHNwaGVyZTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMzA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIHBvc2l0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBvc2l0aW9uR3JvdXAuc2V0VGV4dCgiTGlnaHQgUG9zaXRpb24iKTsKLQkJcG9zaXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciBsaWdodFggPSBuZXcgU2xpZGVyKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRYLnNldEluY3JlbWVudCgxKTsKLQkJbGlnaHRYLnNldE1heGltdW0oMjIpOwotCQlsaWdodFguc2V0TWluaW11bSgwKTsKLQkJbGlnaHRYLnNldFRodW1iKDIpOwotCQlsaWdodFguc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJbGlnaHRYLnNldFNlbGVjdGlvbigxMCk7Ci0JCWxpZ2h0WC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbGlnaHRQb3NpdGlvblswXSA9ICgoZmxvYXQpIGxpZ2h0WC5nZXRTZWxlY3Rpb24oKSAqIDEwKSAtIDEwMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgbGlnaHRZID0gbmV3IFNsaWRlcihwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0WS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWxpZ2h0WS5zZXRNYXhpbXVtKDIyKTsKLQkJbGlnaHRZLnNldE1pbmltdW0oMCk7Ci0JCWxpZ2h0WS5zZXRUaHVtYigyKTsKLQkJbGlnaHRZLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWxpZ2h0WS5zZXRTZWxlY3Rpb24oMTApOwotCQlsaWdodFkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWxpZ2h0UG9zaXRpb25bMV0gPSAoKGZsb2F0KSBsaWdodFkuZ2V0U2VsZWN0aW9uKCkgKiAxMCkgLSAxMDA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIGxpZ2h0WiA9IG5ldyBTbGlkZXIocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsaWdodFouc2V0SW5jcmVtZW50KDEpOwotCQlsaWdodFouc2V0TWF4aW11bSgyMik7Ci0JCWxpZ2h0Wi5zZXRNaW5pbXVtKDApOwotCQlsaWdodFouc2V0VGh1bWIoMik7Ci0JCWxpZ2h0Wi5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlsaWdodFouc2V0U2VsZWN0aW9uKDEwKTsKLQkJbGlnaHRaLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlsaWdodFBvc2l0aW9uWzJdID0gKChmbG9hdCkgbGlnaHRaLmdldFNlbGVjdGlvbigpICogMTApIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIGxpZ2h0Q29sb3JzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0VGV4dCgiTGlnaHQgQ29sb3JzIik7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0RGlmZnVzZUJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRUZXh0KCJEaWZmdXNlIik7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1swXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzBdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMF1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzBdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMF1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzBdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRBbWJpZW50QnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFRleHQoIkFtYmllbnQiKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzFdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMV1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1sxXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1sxXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBsaWdodFNwZWN1bGFyQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbi5zZXRUZXh0KCJTcGVjdWxhciIpOwotCQlsaWdodFNwZWN1bGFyQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzJdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMl1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1syXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzJdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMl1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzJdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRNYWluQW1iaWVudEJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0VGV4dCgiTWFpbiBBbWJpZW50Iik7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbM11bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1szXVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzNdWzJdICogMjU1KSkpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1szXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbWF0ZXJpYWxDb2xvcnNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRUZXh0KCJNYXRlcmlhbCBDb2xvcnMiKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbWF0ZXJpYWxEaWZmdXNlQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFRleHQoIkRpZmZ1c2UiKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzRdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNF1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s0XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s0XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBtYXRlcmlhbEFtYmllbnRCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0VGV4dCgiQW1iaWVudCIpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNV1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s1XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzVdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1s1XVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzVdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s1XVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIG1hdGVyaWFsU3BlY3VsYXJCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uLnNldFRleHQoIlNwZWN1bGFyIik7Ci0JCW1hdGVyaWFsU3BlY3VsYXJCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNl1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s2XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzZdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s2XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIk1hdGVyaWFsIFNoaW5pbmVzczoiKTsKLQkJZmluYWwgU2xpZGVyIHNoaW5lU2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2hpbmVTbGlkZXIuc2V0SW5jcmVtZW50KDUpOwotCQlzaGluZVNsaWRlci5zZXRNYXhpbXVtKDEwMik7Ci0JCXNoaW5lU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCXNoaW5lU2xpZGVyLnNldFRodW1iKDIpOwotCQlzaGluZVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDEwKTsKLQkJc2hpbmVTbGlkZXIuc2V0U2VsZWN0aW9uKDI1KTsKLQkJc2hpbmVTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW1hdGVyaWFsU2hpbmluZXNzWzBdID0gc2hpbmVTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9TSElOSU5FU1MsCi0JCQkJCW1hdGVyaWFsU2hpbmluZXNzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoc3BoZXJlLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJMaWdodCI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlzZXRDb2xvclZhbHVlcygpOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NISU5JTkVTUywgbWF0ZXJpYWxTaGluaW5lc3MpOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsSGludChHTC5HTF9MSU5FX1NNT09USF9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbFBvaW50U2l6ZSgyLjBmKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJc3BoZXJlID0gR0wuZ2xHZW5MaXN0cygxKTsKLQkJR0wuZ2xOZXdMaXN0KHNwaGVyZSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvc2l0aW9uKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbENhbGxMaXN0KHNwaGVyZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvciB2YWx1ZXMgaW50byB0aGUgcmVuZGVyZWQgZGlzcGxheS4KLQkgKi8KLQl2b2lkIHNldENvbG9yVmFsdWVzKCkgewotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBjb2xvclZhbHVlc1swXSk7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRElGRlVTRSwgY29sb3JWYWx1ZXNbNF0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzVdKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgY29sb3JWYWx1ZXNbMV0pOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9TUEVDVUxBUiwgY29sb3JWYWx1ZXNbMl0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NQRUNVTEFSLCBjb2xvclZhbHVlc1s2XSk7Ci0JCUdMLmdsTGlnaHRNb2RlbGZ2KEdMLkdMX0xJR0hUX01PREVMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzNdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdGVyaWFsU2hpbmluZXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODNmMDQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgTnVyYlRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gLTUuMGYsIHlQb3MgPSAtNS4wZiwgelBvcyA9IC0yNS4wZjsKLQlwcml2YXRlIGZsb2F0IHhSb3QgPSAzMzAuMGYsIHlSb3QgPSAwLjBmLCB6Um90ID0gMC4wZjsKLQlwcml2YXRlIGludCBudXJiOwotCi0JLyoqCi0JICogUmV0dXJucyBhIDMgZGltZW5zaW9uYWwgYXJyYXkgdG8gc3RvcmUgdmVydGV4IHBvaW50cyBmb3IgdGhlIG51cmIKLQkgKiBzdXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5Ci0JICovCi0JZmxvYXRbXVtdW10gYnVpbGROdXJiKCkgewotCQlmbG9hdFtdW11bXSBjdHJsID0gbmV3IGZsb2F0WzRdWzRdWzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQkvLyBzZXQgdGhlIHggdmFsdWUKLQkJCQljdHJsW2ldW2pdWzBdID0gMiAqIChpICsgKGZsb2F0KSBNYXRoLmNvcyhpICsgaikpOwotCQkJCS8vIHNldCB0aGUgeSB2YWx1ZQotCQkJCWN0cmxbaV1bal1bMV0gPSAyICogKGogKyAoZmxvYXQpIE1hdGguY29zKGkgKyBqKSk7Ci0JCQkJLy8gc2V0IHRoZSB6IHZhbHVlCi0JCQkJaWYgKChpID09IDEgJiYgaiA9PSAxKSB8fCAoaSA9PSAyICYmIGogPT0gMikpIHsKLQkJCQkJLy8gdGhpcyBtYWtlcyB0aGUgaGlsbAotCQkJCQljdHJsW2ldW2pdWzJdID0gNi4wZjsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsW2ldW2pdWzJdID0gMC4wZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc2V0cyB0aGlzIHBhcnRpY3VsYXIgeiB2YWx1ZSB0byBhIGxhcmdlIG51bWJlciB0byBtYWtlIGEgaGlnaAotCQkvLyBoaWxsCi0JCWN0cmxbMl1bMl1bMl0gPSA4LjBmOwotCi0JCXJldHVybiBjdHJsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgMSBkaW1lbnNpb25hbCBhcnJheSByZXByZXNlbnRpbmcgdGhlIDMgZGltZW5zaW9uYWwKLQkgKiBhcmd1bWVudC4gIFRoaXMgcmVzdWx0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIG51cmIgcmVuZGVyZXIKLQkgKiAKLQkgKiBAcGFyYW0gY3RybCBzb3VyY2UgM0QgYXJyYXkKLQkgKiBAcmV0dXJuIDFEIGFycmF5Ci0JICovCi0JZmxvYXRbXSBjb252ZXJ0KGZsb2F0W11bXVtdIGN0cmwpIHsKLQkJZmxvYXRbXSBwdHMgPQotCQkJbmV3IGZsb2F0W2N0cmwubGVuZ3RoICogY3RybFswXS5sZW5ndGggKiBjdHJsWzBdWzBdLmxlbmd0aF07Ci0JCWludCByb3cgPSAwOwotCQlpbnQgY29sID0gMDsKLQkJLy8gc2V0IHJvd0luY3IgdG8gbnVtYmVyIG9mIGNvbHVtbnMgKiBkZXB0aCAKLQkJaW50IHJvd0luY3IgPSBjdHJsWzBdLmxlbmd0aCAqIGN0cmxbMF1bMF0ubGVuZ3RoOwotCQkvLyBzZXQgY29sSW5jciB0byBkZXB0aCAKLQkJaW50IGNvbEluY3IgPSBjdHJsWzBdWzBdLmxlbmd0aDsKLQkJLy8gbG9vcCB0aHJvdWdoIHJvd3MgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RybC5sZW5ndGg7IGkrKykgewotCQkJY29sID0gMDsKLQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW5zCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGN0cmxbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkvLyBsb29wIHRocm91Z2ggdG8gZ2V0IHRoZSBkZXB0aCB2YWx1ZXMKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGN0cmxbMF1bMF0ubGVuZ3RoOyBrKyspIHsKLQkJCQkJcHRzW3JvdyArIGNvbCArIGtdID0gY3RybFtpXVtqXVtrXTsKLQkJCQl9Ci0JCQkJY29sICs9IGNvbEluY3I7Ci0JCQl9Ci0JCQlyb3cgKz0gcm93SW5jcjsKLQkJfQotCQlyZXR1cm4gcHRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMzMwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2FtcGxpbmcgVG9sZXJhbmNlOiIpOwotCQlmaW5hbCBTbGlkZXIgc1NsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzU2xpZGVyLnNldE1heGltdW0oMTAxKTsKLQkJc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzU2xpZGVyLnNldFRodW1iKDIpOwotCQlzU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNTbGlkZXIuc2V0U2VsZWN0aW9uKDc1KTsKLQkJc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCW51cmIsCi0JCQkJCUdMVS5HTFVfU0FNUExJTkdfVE9MRVJBTkNFLAotCQkJCQlzU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBmaWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZpbGxCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCQludXJiLAotCQkJCQkJR0xVLkdMVV9ESVNQTEFZX01PREUsCi0JCQkJCQlHTFUuR0xVX0ZJTEwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQkJbnVyYiwKLQkJCQkJCUdMVS5HTFVfRElTUExBWV9NT0RFLAotCQkJCQkJR0xVLkdMVV9PVVRMSU5FX1BPTFlHT04pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZU51cmJzUmVuZGVyZXIobnVyYik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIk51cmIiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXQgdXAgbWF0ZXJpYWwgY29sb3Igd2hpY2ggaGVscHMgc2hvdyBjdXJ2ZXMKLQkJZmxvYXQgbWF0X3NwZWN1bGFyW10gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJZmxvYXQgbWF0X3NoaW5pbmVzc1tdID0geyAxMDAuMGYgfTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TUEVDVUxBUiwgbWF0X3NwZWN1bGFyKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdF9zaGluaW5lc3MpOwotCQlHTC5nbENvbG9yTWF0ZXJpYWwoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlRfQU5EX0RJRkZVU0UpOwotCQkKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DT0xPUl9NQVRFUklBTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9BVVRPX05PUk1BTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX05PUk1BTElaRSk7Ci0JCQotCQludXJiID0gR0xVLmdsdU5ld051cmJzUmVuZGVyZXIoKTsKLQotCQlHTFUuZ2x1TnVyYnNQcm9wZXJ0eSgKLQkJCW51cmIsCi0JCQlHTFUuR0xVX1NBTVBMSU5HX01FVEhPRCwKLQkJCUdMVS5HTFVfUEFUSF9MRU5HVEgpOwotCQkvLyBzYW1wbGluZyB0b2xlcmFuY2UgaXMgc3BlY2lmaWMgZm9yIEdMVS5HTFVfUEFUSF9MRU5HVEgKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9TQU1QTElOR19UT0xFUkFOQ0UsIDc1LjBmKTsKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9ESVNQTEFZX01PREUsIEdMVS5HTFVfRklMTCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJLy8gZG8gdHJhbnNsYXRpb24gYW5kIHJvdGF0aW9uCi0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJLy8gZGVmaW5lIG51cmJzIHN1cmZhY2UKLQkJZmxvYXRbXSBrbm90cyA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTFUuZ2x1QmVnaW5TdXJmYWNlKG51cmIpOwotCQlHTFUuZ2x1TnVyYnNTdXJmYWNlKAotCQkJbnVyYiwgOCwga25vdHMsIDgsIGtub3RzLCAxMiwgMywKLQkJCWNvbnZlcnQoYnVpbGROdXJiKCkpLCA0LCA0LCBHTC5HTF9NQVAyX1ZFUlRFWF8zKTsKLQkJR0xVLmdsdUVuZFN1cmZhY2UobnVyYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MWUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIE9iamVjdHNUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgY2xhc3MgU2hhcGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHNoYXBlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzaGFwZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJdm9pZCBkaXNwb3NlKCkgewotCQkJR0wuZ2xEZWxldGVMaXN0cyhpbmRleCwgMSk7Ci0JCX0KLQkJdm9pZCBkcmF3KCkgewotCQkJR0wuZ2xDYWxsTGlzdChpbmRleCk7Ci0JCX0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU2hhcGVbXSBzaGFwZXM7Ci0JcHJpdmF0ZSBTaGFwZSBjdXJyZW50U2hhcGU7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMC4wZiwgeVJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBib29sZWFuIGZpbGwgPSB0cnVlOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfTEVOR1RIID0gNTA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb250cm9scy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCW5ldyBMYWJlbChjb250cm9scywgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0c0NvbWJvID0gbmV3IENvbWJvKGNvbnRyb2xzLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW9iamVjdHNDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJb2JqZWN0c0NvbWJvLnNlbGVjdCgwKTsKLQkJb2JqZWN0c0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbb2JqZWN0c0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gZmlsbFRvZ2dsZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbHMsIFNXVC5DSEVDSyk7Ci0JCWZpbGxUb2dnbGVCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsVG9nZ2xlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbFRvZ2dsZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmlsbCA9IGZpbGxUb2dnbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNoYXBlcyBbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaXJjbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcmFkaXVzCi0JICogQHBhcmFtIHhTaHJpbmsKLQkgKiBAcGFyYW0geVNocmluawotCSAqLwotCXZvaWQgZHJhd0NpcmNsZShmbG9hdCByYWRpdXMsIGZsb2F0IHhTaHJpbmssIGZsb2F0IHlTaHJpbmspIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9QT0xZR09OKTsKLQkJZmxvYXQgZGlhID0gKGZsb2F0KSAyLjAgKiAoZmxvYXQpIE1hdGguUEk7Ci0JCWZvciAoZmxvYXQgYW5nbGUgPSAwLjBmOyBhbmdsZSA8PSBkaWE7IGFuZ2xlICs9IDAuMWYpIHsKLQkJCUdMLmdsVmVydGV4MmQocmFkaXVzICogTWF0aC5jb3MoYW5nbGUpLCByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpOwotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjdWJlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXZvaWQgZHJhd0N1YmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0IAkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIGxlZnQgCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgbGVmdAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gbGVmdAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCBsZWZ0CQotCQkvLyByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0CQkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCBsZWZ0Ci0JCS8vIHRvcAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHB5cmFtaWQgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHBhcmFtIGRlcHRoCi0JICovCi0Jdm9pZCBkcmF3UHlyYW1pZChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBkZXB0aCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyByaWdodAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIHJpZ2h0CQotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wCQkJCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIHJpZ2h0Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBsZWZ0CQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyByaWdodAkJCQotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNxdWFyZSBjZW50ZXJlZCBhdCAwLDAgaW4gdGhlIHZpZXdwb3J0LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQl2b2lkIGRyYXdTcXVhcmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBib3R0b20gbGVmdCAJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgMC4wZik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIDAuMGYpOwkvLyB0b3AgbGVmdAotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmcm9tIGdsdXRfc2hhcGVzLmMgLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICogQHBhcmFtIFIKLQkgKiBAcGFyYW0gbnNpZGVzCi0JICogQHBhcmFtIHJpbmdzCi0JICovCi0Jdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmOwotCQlmbG9hdCBjb3NUaGV0YSA9IDEuMGY7Ci0JCWZsb2F0IHNpblRoZXRhID0gMC4wZjsKLQkJCi0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMLmdsQmVnaW4oR0wuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJCi0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCQotCQkJR0wuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdHJpYW5nbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0Jdm9pZCBkcmF3VHJpYW5nbGUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIG1pZGRsZSAKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBsZWZ0IAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gcmlnaHQJCSAJCQotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiT2JqZWN0cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsTGluZVdpZHRoKDIpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGlzcGxheSBsaXN0cyBhbmQgc2hhcGVzCi0JCXNoYXBlcyA9IG5ldyBTaGFwZVsxMV07Ci0JCWludCBpbmRleCA9IDE7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1RyaWFuZ2xlKDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdQeXJhbWlkKDIuMGYsIDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJQeXJhbWlkIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NxdWFyZSgyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1syXSA9IG5ldyBTaGFwZSgiU3F1YXJlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0N1YmUoMi4wZiwgMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkN1YmUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3Q2lyY2xlKDIuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJDaXJjbGUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UGFydGlhbERpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4LCA5MCwgMTI1KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s1XSA9IG5ldyBTaGFwZSgiUGFydGlhbCBEaXNrIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s2XSA9IG5ldyBTaGFwZSgiRGlzayIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdUb3J1cygxLCAyLCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzddID0gbmV3IFNoYXBlKCJUb3J1cyIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAyLjAsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbOF0gPSBuZXcgU2hhcGUoIlNwaGVyZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDIuMCwgMi4wLCA0LCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzldID0gbmV3IFNoYXBlKCJDeWxpbmRlciIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDAsIDIuMCwgNCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1sxMF0gPSBuZXcgU2hhcGUoIkNvbmUiLCBpbmRleCsrKTsKLQotCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xNC4wZik7Ci0JCS8vIHJvdGF0ZSBhcm91bmQgWCBhbmQgWSBheGlzCi0JCUdMLmdsUm90YXRlZih5Um90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXRzIHBvbHlnb24gZmlsbCBtb2RlCi0JCWlmIChmaWxsKSB7Ci0JCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9GSUxMKTsKLQkJfSBlbHNlIHsKLQkJCUdMLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0xJTkUpOwotCQl9Ci0JCWN1cnJlbnRTaGFwZS5kcmF3KCk7Ci0JCXlSb3QgKz0gMS41OwotCQl4Um90ICs9IDEuNTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNkYTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgT3BlbkdMRXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX29wZW5nbCIpOwotCXByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIE9wZW5HTFRhYltdIHRhYnM7Ci0JcHJpdmF0ZSBpbnQgc2xlZXA7Ci0JCi0JcHVibGljIE9wZW5HTEV4YW1wbGUoKSB7fQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBPcGVuR0xFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBPcGVuR0xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFicyA9Ci0JCQluZXcgT3BlbkdMVGFiW10gewotCQkJCW5ldyBBbnRpYWxpYXNpbmdUYWIoKSwKLQkJCQluZXcgQXJlYVRhYigpLAotCQkJCW5ldyBGb2dUYWIoKSwKLQkJCQluZXcgR3JhZGllbnRUYWIoKSwKLQkJCQluZXcgTGlnaHRUYWIoKSwKLQkJCQluZXcgTnVyYlRhYigpLAotCQkJCW5ldyBPYmplY3RzVGFiKCksCi0JCQkJbmV3IFJlZmxlY3Rpb25UYWIoKSwKLQkJCQluZXcgU3RlbmNpbFRhYigpLAotCQkJCW5ldyBUZXh0dXJlVGFiKCksCi0JCQkJbmV3IFRyYW5zcGFyZW5jeVRhYigpCi0JCQl9OwotCQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KHRhYnNbaV0uZ2V0VGFiVGV4dCgpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbCh0YWJzW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UodGFiRm9sZGVyKSk7Ci0JCX0KLQkJCi0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJT3BlbkdMVGFiIHRhYiA9IHRhYnNbdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCXRhYi5zZXRDdXJyZW50KCk7Ci0JCQkJc2xlZXAgPSB0YWIuZ2V0U2xlZXBMZW5ndGgoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmICh0YWJzLmxlbmd0aCA+IDApIHsKLQkJCXRhYnNbMF0uc2V0Q3VycmVudCgpOwotCQkJc2xlZXAgPSB0YWJzWzBdLmdldFNsZWVwTGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCVJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0YWJGb2xkZXIuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJZGlzcGxheSgpOwotCQkJCXRhYkZvbGRlci5nZXREaXNwbGF5KCkudGltZXJFeGVjKHNsZWVwLCB0aGlzKTsKLQkJCX0KLQkJfTsKLQkJdGltZXIucnVuKCk7Ci0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgb2YgdGhlIGN1cnJlbnQgdGFiLgotCSAqLwotCXZvaWQgZGlzcGxheSgpIHsKLQkJaW50IGluZGV4ID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXRhYnNbaW5kZXhdLnJlbmRlcigpOwotCQl0YWJzW2luZGV4XS5zd2FwKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCBjb250YWluZWQgdGFicy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJdGFic1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlPcGVuR0xFeGFtcGxlIGluc3RhbmNlID0gbmV3IE9wZW5HTEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBPcGVuR0xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5OWU4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci0KLS8qKgotICogPGNvZGU+T3BlbkdMVGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgZGlmZmVyZW50IGV4YW1wbGUuCi0gKgotICogQW4gT3BlbkdMVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEgaGllcmFyY2h5Ci0gKiB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICovCi1hYnN0cmFjdCBjbGFzcyBPcGVuR0xUYWIgewotCXByaXZhdGUgR0xDYW52YXMgZ2xDYW52YXM7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFiRm9sZGVyUGFnZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RlbmNpbFN1cHBvcnQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU0xFRVBfTEVOR1RIID0gMTAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHRhYidzIGNvbnRyb2xzLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCWFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIHRoZSBwYXJlbnQgdGFiIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlkYXRhLnN0ZW5jaWxTaXplID0gODsKLQkJZ2xDYW52YXMgPSBuZXcgR0xDYW52YXModGFiRm9sZGVyUGFnZSwgU1dULk5PX0JBQ0tHUk9VTkQsIGRhdGEpOwotCQlnbENhbnZhcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdsQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlnbENhbnZhcy5zZXRTaXplKDQwMCwgNDAwKTsJCS8vIG5lZWRlZCBmb3Igd2luZG93cwotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlDb21wb3NpdGUgY29udHJvbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBjcmVhdGUgdGhlIE9wZW5HTCBTY3JlZW4gYW5kIGNvbnRyb2xzCi0JCXNldEN1cnJlbnQoKTsKLQkJc2V0dXBWaWV3aW5nQXJlYSgpOwotCi0JCS8vIGRldGVybWluZSBpZiBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotCQlpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2V0SW50ZWdlcnYoR0wuR0xfU1RFTkNJTF9CSVRTLCBwYXJhbSk7Ci0JCXN0ZW5jaWxTdXBwb3J0ID0gcGFyYW1bMF0gIT0gMDsKLQotCQlpbml0KCk7Ci0KLQkJaWYgKCFpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgfHwgaGFzU3RlbmNpbFN1cHBvcnQoKSkgewotCQkJY3JlYXRlQ29udHJvbHMoY29udHJvbENvbXBvc2l0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250cm9sQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KCJUaGlzIHRhYiByZXF1aXJlcyBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0LiIpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyB0YWIuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdsQ2FudmFzIGZvciB0aGlzIHRhYi4KLQkgKiAKLQkgKiBAcmV0dXJuIENhbnZhcwotCSAqLwotCUdMQ2FudmFzIGdldEdsQ2FudmFzKCkgewotCQlyZXR1cm4gZ2xDYW52YXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGV4YW1wbGUKLQkgKiBzaG91bGQgc2xlZXAgYmV0d2VlbiBhbmltYXRpb24gcmVkcmF3cy4gIEFzIHRoaXMgbGVuZ3RoCi0JICogaW5jcmVhc2VzLCB1c2VyIHJlc3BvbnNpdmVuZXNzIGluY3JlYXNlcyBhbmQgdGhlIGZyZXF1ZW5jeSBvZgotCSAqIGFuaW1hdGlvbiByZWRyYXdzIGRlY3JlYXNlcy4gIFN1YmNsYXNzZXMgd2l0aCBtb3ZpbmcgYW5pbWF0aW9ucwotCSAqIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYQotCSAqIHNtYWxsZXIgdmFsdWUgaWYgdGhlaXIgYW5pbWF0aW9ucyBkbyBub3Qgb2NjdXIgZnJlcXVlbnRseSBlbm91Z2guIAotCSAqCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJldHdlZW4gcmVkcmF3cwotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0xFRVBfTEVOR1RIOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXRUYWJUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYWNoaW5lIGhhcyBuYXRpdmUgc3RlbmNpbHMgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1N0ZW5jaWxTdXBwb3J0KCkgewotCQlyZXR1cm4gc3RlbmNpbFN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBPcGVuR0wgcmVzb3VyY2VzIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGluaXQoKTsKLQotCS8qKgotCSAqIExvYWRzIGEgdGV4dHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSB0ZXh0dXJlW10KLQkgKi8KLQlzdGF0aWMgdm9pZCBsb2FkVGV4dHVyZShHTENhbnZhcyBjb250ZXh0LCBTdHJpbmcgZmlsZU5hbWUsIGludCBpbmRleCwgaW50W10gdGV4dHVyZSkgewotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVbaW5kZXhdKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9Ci0JCQluZXcgSW1hZ2VEYXRhKE9wZW5HTFRhYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBzb3VyY2UpOwotCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU2LCAyNTYpOwotCQlHQyBnYyA9IG5ldyBHQyhuZXdJbWFnZSk7Ci0JCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLCAwLCAyNTYsIDI1Nik7Ci0JCXNvdXJjZSA9IG5ld0ltYWdlLmdldEltYWdlRGF0YSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNvdXJjZSA9IEltYWdlRGF0YVV0aWwuY29udmVydEltYWdlRGF0YShzb3VyY2UpOwotCQluZXdJbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJR0wuZ2xUZXhJbWFnZTJEKAotCQkJR0wuR0xfVEVYVFVSRV8yRCwgMCwgMywgCi0JCQlzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQsIDAsCi0JCQlHTC5HTF9SR0IsIEdMLkdMX1VOU0lHTkVEX0JZVEUsIHNvdXJjZS5kYXRhKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXJzIHRoaXMgdGFiLgotCSAqLwotCXZvaWQgcmVuZGVyKCkgewotCQlzZXRDdXJyZW50KCk7Ci0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCXJlbmRlclNjZW5lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgZm9yIHRoaXMgdGFiLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqLwotCWFic3RyYWN0IHZvaWQgcmVuZGVyU2NlbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhYiByZXF1aXJlcyBzdGVuY2lsIHN1cHBvcnQgaW4gb3JkZXIgdG8gZGlzcGxheQotCSAqIHByb3Blcmx5LiBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyByZW5kZXJpbmcgY29udGV4dCB0byBiZSBjdXJyZW50LgotCSAqLwotCXZvaWQgc2V0Q3VycmVudCgpIHsKLQkJZ2xDYW52YXMuc2V0Q3VycmVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSB2aWV3aW5nIGFyZWEgZm9yIHRoZSBPcGVuR0wgc2NyZWVuLiAgVGhlIGRlZmF1bHQKLQkgKiBiZWhhdmlvciBpcyB0byB1c2UgYSBwZXJzcGVjdGl2ZSB2aWV3LCBidXQgdGhlcmUgYWxzbyBleGlzdCBmcnVzdHJ1bQotCSAqIGFuZCBvcnRobyB2aWV3cy4gIFN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXR1cFZpZXdpbmdBcmVhKCkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGdsQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLQkJaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDEpOwotCQlHTC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7CS8vIHNlbGVjdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsJCQkJLy8gcmVzZXQgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0JCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7CS8vIHNlbGVjdCB0aGUgbW9kZWx2aWV3IG1hdHJpeAotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSBidWZmZXJzLgotCSAqLwotCXZvaWQgc3dhcCgpIHsKLQkJZ2xDYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY1NGIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgUmVmbGVjdGlvblRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWSA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWiA9IDEuNjY2NjY2NmY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsUm90ID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVYID0gMi41ZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVZID0gLTIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWiA9IDIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgelBvcyA9IDIyLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdFNwZWVkID0gMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnRbXSB0ZXh0dXJlcyA9IG5ldyBpbnRbM107Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUxJU1RfSU5ERVhfQkFMTCA9IDEsTElTVF9JTkRFWF9CT1ggPSAyLAotCQlMSVNUX0lOREVYX01JUlJPUiA9IDMsIExJU1RfSU5ERVhfUk9PTSA9IDQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCVRFWFRVUkVfSU5ERVhfQkFMTCA9IDAsIFRFWFRVUkVfSU5ERVhfRkxPT1IgPSAxLAotCQlURVhUVVJFX0lOREVYX0JPWCA9IDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSU1BR0VTID0gewotCQkiaW1hZ2VzL0JhbGwuanBnIiwgImltYWdlcy9GbG9vci5qcGciLCAiaW1hZ2VzL0JveC5ibXAiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJhbGwKLQkgKi8KLQl2b2lkIGNyZWF0ZUJhbGwoKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JBTEwsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9CQUxMXSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAwLjM1ZiwgMzIsIDE2KTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJveAotCSAqLwotCXZvaWQgY3JlYXRlQm94KCkgewotCQlmbG9hdCBzaXplID0gMS4wZjsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfQk9YLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJLy8gYmFjawkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAtMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyBsZWZ0CQotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAtc2l6ZSk7Ci0JCS8vIHJpZ2h0CQotCQlHTC5nbE5vcm1hbDNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyB0b3AJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJvdHRvbQkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGJhbGxUcmFuc2xhdGlvbiA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQliYWxsVHJhbnNsYXRpb24uc2V0VGV4dCgiQmFsbCBUcmFuc2xhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldE1heGltdW0oMzgpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDE4KTsKLQkJYmFsbFhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJhbGxYID0gKGZsb2F0KSAoYmFsbFhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAxOCkgLyA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWVBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWSA9IChmbG9hdCkgKGJhbGxZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0TWF4aW11bSgyNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldFRodW1iKDEpOwotCQliYWxsWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWlBvc1NsaWRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWiA9IChmbG9hdCkgKGJhbGxaUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSkgLyAzOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBjdWJlVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3ViZVRyYW5zbGF0aW9uLnNldFRleHQoIkN1YmUgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWFBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxMSk7Ci0JCWN1YmVYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWCA9IChmbG9hdCkgKGN1YmVYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWVBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVlQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVZID0gKGZsb2F0KSAoY3ViZVlQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSA2KSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgY3ViZVpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQljdWJlWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldE1heGltdW0oMTApOwotCQljdWJlWlBvc1NsaWRlci5zZXRNaW5pbXVtKDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIpOwotCQljdWJlWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVogPSAoZmxvYXQpIChjdWJlWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDIpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJSb29tIFJvdGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHNjcmVlblhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHNjcmVlbllQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHNjcmVlblpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQmFsbCBSb3RhdGlvbiBTcGVlZDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxSb3RTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQliYWxsUm90U2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNYXhpbXVtKDIyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsUm90U2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsUm90U2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCQliYWxsUm90U2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsUm90U3BlZWQgPSBiYWxsUm90U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIG1pcnJvcgotCSAqLwotCXZvaWQgY3JlYXRlTWlycm9yKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9NSVJST1IsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAwLjRmKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIHJvb20KLQkgKi8KLQl2b2lkIGNyZWF0ZVJvb20oKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX1JPT00sIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBsZWZ0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gcmlnaHQgd2FsbAotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gY2VpbGluZwkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBiYWNrIHdhbGwgd2l0aCB0cmlhbmdsZSBzdHJpcCB0byBpbGxpbWluYXRlIHQtaW50ZXJzZWN0aW9ucyAKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9TVFJJUCk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJLy8gZHJhdyBmbG9vcgotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9GTE9PUl0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZmxvb3IKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBkcmF3IG1pcnJvciBmcmFtZQotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyB0b3AKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4yZiwgMC4wZik7Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQkvLyBib3R0b20KLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMmYsIDAuMGYpOwotCQkvLyBsZWZ0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CQUxMLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX0JPWCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9NSVJST1IsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfUk9PTSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUmVmbGVjdGlvbiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsR2VuVGV4dHVyZXMoSU1BR0VTLmxlbmd0aCwgdGV4dHVyZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElNQUdFUy5sZW5ndGg7IGkrKykgewotCQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0VTW2ldLCBpLCB0ZXh0dXJlcyk7Ci0JCX0KLQotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0wuR0xfU01PT1RIKTsKLQkJR0xVLmdsdVF1YWRyaWNUZXh0dXJlKHF1YWRyYXRpYywgdHJ1ZSk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFUVVBTCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0KLQkJLy8gc2V0IHVwIHRoZSBsaWdodHMKLQkJZmxvYXRbXSBMaWdodEFtYiA9IHsgMC43ZiwgMC43ZiwgMC43ZiwgMS4wZiB9OwotCQlmbG9hdFtdIExpZ2h0RGlmID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0W10gbGlnaHRzQW1iaWVudCA9IHsgMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsaWdodHNBbWJpZW50KTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgTGlnaHRBbWIpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBMaWdodERpZik7Ci0KLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCi0JCWNyZWF0ZVJvb20oKTsKLQkJY3JlYXRlQmFsbCgpOwotCQljcmVhdGVCb3goKTsKLQkJY3JlYXRlTWlycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMVS5nbHVMb29rQXQoeFBvcywgeVBvcywgelBvcywgMCwgMCwgMCwgMCwgMSwgMCk7Ci0JCS8vIGNsaXAgcGxhbmUgZXF1YXRpb24KLQkJZG91YmxlIGNsaXBFcXVhdGlvbltdID0geyAwLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiB9OwotCQlmbG9hdFtdIExpZ2h0UG9zID0geyAwLjBmLCAyLjBmLCA3LjBmLCAxLjBmIH07Ci0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgYnVmZmVyIGZvciAibWFya2luZyIgdGhlIG1pcnJvcgkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gMSB3aGVyZSBhIHBvbHlnb24gaXMgZHJhd24KLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0VRVUFMLCAxLCAxKTsKLQkJLy8gZHJhdyB3aGVyZSB0aGUgc3RlbmNpbCBpcyAxCQkJCQkJCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DTElQX1BMQU5FMCk7Ci0JCUdMLmdsQ2xpcFBsYW5lKEdMLkdMX0NMSVBfUExBTkUwLCBjbGlwRXF1YXRpb24pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xTY2FsZWYoMS4wZiwgMS4wZiwgLTEuMGYpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgTGlnaHRQb3MpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsJCQkvLyByZWZsZWN0aW9uCi0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihiYWxsWCwgYmFsbFksIGJhbGxaKTsKLQkJR0wuZ2xSb3RhdGVmKGJhbGxSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQkFMTCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7Ci0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoY3ViZVgsIGN1YmVZLCBjdWJlWik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CT1gpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwotCQliYWxsUm90ICs9IGJhbGxSb3RTcGVlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMzN2U2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU3RlbmNpbFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBTaGFwZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIHNoYXBlJ3MgbmFtZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCS8qKgotCQkgKiBEcmF3cyB0aGlzIHNoYXBlLgotCQkgKi8KLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCQkgKiAKLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzID0gbmV3IFNoYXBlWzVdOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAsIHlQb3MgPSAwOwotCXByaXZhdGUgZmxvYXQgc2l6ZSA9IDAuNDVmOwotCXByaXZhdGUgaW50IHRleHR1cmU7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRyb2xzLnNldExheW91dChsYXlvdXQpOwotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIHNoYXBlQ29tYm8gPSBuZXcgQ29tYm8oY29udHJvbHMsIFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkrKykgewotCQkJc2hhcGVDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2hhcGVDb21iby5zZWxlY3QoMCk7Ci0JCXNoYXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1tzaGFwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2l6ZToiKTsKLQkJZmluYWwgU2xpZGVyIHNpemVTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCQlzaXplU2xpZGVyLnNldFZhbHVlcygwLCAxNSwgNzUsIDUsIDUsIDEwKTsKLQkJc2l6ZVNsaWRlci5zZXRTZWxlY3Rpb24oNDUpOwotCQlzaXplU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzaXplID0gKChmbG9hdCkgc2l6ZVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlN0ZW5jaWwiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJaW50W10gdGV4dHVyZU91dCA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2VuVGV4dHVyZXMoMSwgdGV4dHVyZU91dCk7Ci0JCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFLCAwLCB0ZXh0dXJlT3V0KTsKLQkJdGhpcy50ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNyZWF0ZSBzaGFwZXMKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoMC4wZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJEaXNrIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuMGYsIHNpemUsIDMyLCAzMik7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzJdID0gbmV3IFNoYXBlKCJTcXVhcmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsUmVjdGYoLXNpemUsIC1zaXplLCBzaXplLCBzaXplKTsKLQkJCX0KLQkJfTsKLQotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkhvdXIgR2xhc3MiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJTdGFyIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtMC4zZiwgMCwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigyICogc2l6ZSAtIDAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSAtIDAuM2YsIDIgKiBzaXplICogMC44NWYsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAtc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1swXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKAotCQkJKGZsb2F0KSAoMS41ICogTWF0aC5jb3MoeFBvcykpLAotCQkJKGZsb2F0KSAoMS4wICogTWF0aC5zaW4oeVBvcykpLAotCQkJLTMuMGYpOwotCQl4UG9zICs9IDAuMTVmOwotCQl5UG9zICs9IDAuM2Y7Ci0KLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX1JFUExBQ0UpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGxvYWQgdGhlIHRleHR1cmUgYmVoaW5kIHRoZSBzdGVuY2lsIG9iamVjdAotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTMuMWYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAtMC44NWYsIDEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgMC44NWYsIDEuMGYpOwotCQlHTC5nbEVuZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWUxMWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUZXh0dXJlVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHlyb3QgPSAwLCB6cm90ID0gMDsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0yMDsKLQlwcml2YXRlIGludCB0ZXh0dXJlID0gMDsKLQlwcml2YXRlIGZsb2F0W11bXVtdIHBvaW50cyA9IG5ldyBmbG9hdFs0NV1bNDVdWzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUZXh0dXJlIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCS8vR0wuZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuM2YsIDEuMGYpOyAKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRleHR1cmUgPSB0ZXh0dXJlT3V0WzBdOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05ULCBHTC5HTF9MSU5FKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBpbml0aWFsaXplIHBvaW50cwkKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NTsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ1OyB5KyspIHsKLQkJCQlwb2ludHNbeF1beV1bMF0gPSB4IC8gNS4wZiAtIDQuNWY7Ci0JCQkJcG9pbnRzW3hdW3ldWzFdID0geSAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsyXSA9Ci0JCQkJCShmbG9hdCkgTWF0aC5zaW4oCi0JCQkJCQkoKCh4IC8gNS4wZikgKiA0MC4wZikgLyAzNjAuMGYpICogTWF0aC5QSSAqIDIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih5cm90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpyb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCi0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ0OyB4KyspIHsKLQkJCWZvciAoaW50IHkgPSAwOyB5IDwgNDQ7IHkrKykgewotCQkJCWZsb2F0IGZ4ID0geCAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ5ID0geSAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ4YiA9ICh4ICsgMSkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeWIgPSAoeSArIDEpIC8gNDQuMGY7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3hdW3ldWzBdLAotCQkJCQlwb2ludHNbeF1beV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5XVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5Yik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4YiwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMV0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMl0pOwotCQkJfQotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JCS8vIHBlcmZvcm0gd2F2ZSBtb3Rpb24KLQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQlmbG9hdCBob2xkID0gcG9pbnRzWzBdW3ldWzJdOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzJdID0gcG9pbnRzW3ggKyAxXVt5XVsyXTsKLQkJCX0KLQkJCXBvaW50c1s0NF1beV1bMl0gPSBob2xkOwotCQl9Ci0JCXlyb3QgKz0gMC45ZjsKLQkJenJvdCArPSAwLjZmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlkYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUcmFuc3BhcmVuY3lUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBhbHBoYXMgPSB7IDAuM2YsIDAuNWYsIDEuMGYgfTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudFNlbGVjdGlvbiA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUlOREVYX1RSSUFOR0xFID0gMSwgSU5ERVhfU1BIRVJFID0gMiwgSU5ERVhfRElTSyA9IDM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUUyA9IHsiVHJpYW5nbGUiLCAiU3BoZXJlIiwgIkRpc2siIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBvYmplY3RHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVFMpOwotCQlvYmplY3RDb21iby5zZWxlY3QoMCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiVHJhbnNwYXJlbmN5OiIpOwotCQlmaW5hbCBTbGlkZXIgdHJhbnNwYXJlbmN5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJdHJhbnNwYXJlbmN5U2xpZGVyLnNldFZhbHVlcygwLCAwLCAxMSwgMSwgMSwgMik7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oNyk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgYWxwaGEgPSB0cmFuc3BhcmVuY3lTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWxwaGEgPSAxLjBmIC0gYWxwaGEgLyAxMDsKLQkJCQlhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdID0gYWxwaGE7Ci0JCQl9Ci0JCX0pOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oCi0JCQkJCShpbnQpICgoMS4wZiAtIGFscGhhc1tjdXJyZW50U2VsZWN0aW9uIC0gMV0pICogMTApKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfRElTSywgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfU1BIRVJFLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhJTkRFWF9UUklBTkdMRSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVHJhbnNwYXJlbmN5IjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwkJCi0JCUdMLmdsTmV3TGlzdChJTkRFWF9TUEhFUkUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAxLjUsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfRElTSywgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9GSUxMKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAxLjAsIDMsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfVFJJQU5HTEUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uVGFiLnByb2Nlc3NQaWNrIChpbnRbXSwgaW50KQotCSAqLwotCXZvaWQgcHJvY2Vzc1BpY2soaW50W10gcFNlbGVjdEJ1ZmYsIGludCBoaXRzKSB7Ci0JCWludCB6RGVwdGg7Ci0JCWludCB0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbM107Ci0JCXpEZXB0aCA9IHBTZWxlY3RCdWZmWzJdOwotCQkvLyBwaWNrIG9iamVjdCB3aXRoIGxhcmdlc3QgeiB2YWx1ZQotCQlmb3IgKGludCBpID0gNDsgaSA8PSA0ICogKGhpdHMgLSAxKTsgaSA9IGkgKyA0KSB7Ci0JCQlpZiAoekRlcHRoID4gcFNlbGVjdEJ1ZmZbaSArIDJdKSB7Ci0JCQkJekRlcHRoID0gcFNlbGVjdEJ1ZmZbaSArIDJdOwotCQkJCXRlbXBTZWxlY3Rpb24gPSBwU2VsZWN0QnVmZltpICsgM107Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBTZWxlY3Rpb24gPiAwKSBjdXJyZW50U2VsZWN0aW9uID0gdGVtcFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJLy8gZHJhdyBpdGVtcyB3aXRoIHRyYW5zcGFyZW50IHF1YWxpdGllcyBpbiByZXZlcnNlIFogb3JkZXIKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQlHTC5nbFB1c2hOYW1lKDApOwotCi0JCS8vIGRyYXcgZGlzawotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0xLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjRmKDAuMGYsIDEuMGYsIDAuMGYsIGFscGhhc1syXSk7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfRElTSyk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfRElTSyk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX0RJU0spIHsKLQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9MSU5FKTsKLQkJCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC45OCwgMy4wMiwgMzIsIDMyKTsKLQkJfQotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCS8vIGRyYXcgdHJpYW5nbGUKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsICszLjBmKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAwLjBmLCAwLjBmLCBhbHBoYXNbMF0pOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1RSSUFOR0xFKTsKLQkJR0wuZ2xQb2ludFNpemUoNS4wZik7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1RSSUFOR0xFKSB7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1BPSU5UUyk7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCQlHTC5nbEVuZCgpOwotCQl9Ci0KLQkJLy8gZHJhdyBzcGhlcmUKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAwLjBmLCAxLjBmLCBhbHBoYXNbMV0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX1NQSEVSRSk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfU1BIRVJFKTsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gPT0gSU5ERVhfU1BIRVJFKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41MSwgOCwgOCk7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODkwZDI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWY2NjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNGM5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNzVkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ2YWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVjZTE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFhYTkzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHNuaXBwZXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMDIxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU1dUIFNuaXBwZXRzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZDVhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTBiMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThjOTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBEcmF3aW5nIHdpdGggdHJhbnNmb3JtYXRpb25zLCBwYXRocyBhbmQgYWxwaGEgYmxlbmRpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJBZHZhbmNlZCBHcmFwaGljcyIpOwotCQlGb250RGF0YSBmZCA9IHNoZWxsLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlmaW5hbCBGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIDYwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCA2NDAsIDQ4MCk7Ci0JCWZpbmFsIFJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbE92YWwocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsJCQkJCi0JCQkJVHJhbnNmb3JtIHRyID0gbmV3IFRyYW5zZm9ybShkaXNwbGF5KTsKLQkJCQl0ci50cmFuc2xhdGUoNTAsIDEyMCk7Ci0JCQkJdHIucm90YXRlKC0zMCk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgcmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQkJZ2Muc2V0QWxwaGEoMTAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHIpOwotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQkJCXBhdGguYWRkU3RyaW5nKCJTV1QiLCAwLCAwLCBmb250KTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQkJdHIuZGlzcG9zZSgpOwotCQkJCXBhdGguZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShyZWN0LndpZHRoIC8gMiwgcmVjdC5oZWlnaHQgLyAyKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZmODBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb250IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFyZ2UgZm9udCBmb3IgdXNlIGJ5IGEgdGV4dCB3aWRnZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRCb3VuZHMoMTAsIDEwLCAxNTAsIDE1MCk7Ci0JRm9udCBpbml0aWFsRm9udCA9IHRleHQuZ2V0Rm9udCgpOwotCUZvbnREYXRhW10gZm9udERhdGEgPSBpbml0aWFsRm9udC5nZXRGb250RGF0YSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHsKLQkJZm9udERhdGFbaV0uc2V0SGVpZ2h0KDI0KTsKLQl9Ci0JRm9udCBuZXdGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCXRleHQuc2V0Rm9udChuZXdGb250KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQluZXdGb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZTk3Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0YWJsZSBpdGVtIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUsIDEpOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgdGFibGUuaW5kZXhPZiAoaXRlbSkgKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNTZiNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGluc2VydCBhIHRyZWUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUsIDEpOwotCVRyZWVJdGVtIFtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcyAoKTsKLQlpbnQgaW5kZXggPSAwOwotCXdoaWxlIChpbmRleCA8IGl0ZW1zLmxlbmd0aCAmJiBpdGVtcyBbaW5kZXhdICE9IGl0ZW0pIGluZGV4Kys7Ci0JaXRlbS5zZXRUZXh0ICgiKioqIE5ldyBJdGVtICIgKyBpbmRleCArICIgKioqIik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiNzNmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgdGFibGUgaXRlbSB0ZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAzIHsKLQotc3RhdGljIGNoYXIgY29udGVudCA9ICdhJzsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjQwKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwgMTAsIDE2MCwgMTYwKTsKLQotCWZpbmFsIFRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVs0XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKS5zZXRXaWR0aCg0MCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCX0KLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSIpOwotCWJ1dHRvbi5wYWNrKCk7Ci0JYnV0dG9uLnNldExvY2F0aW9uKDEwLCAxODApOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJCXBvcHVsYXRlSXRlbShpdGVtc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvcHVsYXRlSXRlbShUYWJsZUl0ZW0gaXRlbSkgewotCVN0cmluZyBzdHJpbmdDb250ZW50ID0gU3RyaW5nLnZhbHVlT2YoY29udGVudCk7Ci0JaXRlbS5zZXRUZXh0KAotCQluZXcgU3RyaW5nW10gewotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCB9KTsKLQljb250ZW50Kys7Ci0JaWYgKGNvbnRlbnQgPiAneicpIGNvbnRlbnQgPSAnYSc7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkMzhkMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc3BsYXNoIHNjcmVlbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBpbnQgW10gY291bnQgPSBuZXcgaW50IFtdIHs0fTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMDAsIDMwMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTikpOwotCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCWdjLmRyYXdUZXh0KCJTcGxhc2ggU2NyZWVuIiwgMTAsIDEwKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgU2hlbGwgc3BsYXNoID0gbmV3IFNoZWxsKFNXVC5PTl9UT1ApOwotCWZpbmFsIFByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhcihzcGxhc2gsIFNXVC5OT05FKTsKLQliYXIuc2V0TWF4aW11bShjb3VudFswXSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQlzcGxhc2guc2V0TGF5b3V0KGxheW91dCk7Ci0JRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLQlGb3JtRGF0YSBwcm9ncmVzc0RhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JcHJvZ3Jlc3NEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDUpOwotCXByb2dyZXNzRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtNSk7Ci0JcHJvZ3Jlc3NEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtNSk7Ci0JYmFyLnNldExheW91dERhdGEocHJvZ3Jlc3NEYXRhKTsKLQlzcGxhc2gucGFjaygpOwotCVJlY3RhbmdsZSBzcGxhc2hSZWN0ID0gc3BsYXNoLmdldEJvdW5kcygpOwotCVJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JaW50IHggPSAoZGlzcGxheVJlY3Qud2lkdGggLSBzcGxhc2hSZWN0LndpZHRoKSAvIDI7Ci0JaW50IHkgPSAoZGlzcGxheVJlY3QuaGVpZ2h0IC0gc3BsYXNoUmVjdC5oZWlnaHQpIC8gMjsKLQlzcGxhc2guc2V0TG9jYXRpb24oeCwgeSk7Ci0Jc3BsYXNoLm9wZW4oKTsKLQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNoZWxsIFtdIHNoZWxscyA9IG5ldyBTaGVsbFtjb3VudFswXV07Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0gPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJc2hlbGxzIFtpXS5zZXRTaXplICgzMDAsIDMwMCk7Ci0JCQkJc2hlbGxzIFtpXS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCS0tY291bnRbMF07Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQliYXIuc2V0U2VsZWN0aW9uKGkrMSk7Ci0JCQkJdHJ5IHtUaHJlYWQuc2xlZXAoMTAwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9Ci0JCQl9Ci0JCQlzcGxhc2guY2xvc2UoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjb3VudFswXTsgaSsrKSB7Ci0JCQkJc2hlbGxzIFtpXS5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl3aGlsZSAoY291bnQgWzBdICE9IDApIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzZDMyNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGludm9rZSBhbiBleHRlcm5hbCBiYXRjaCBmaWxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JUHJvZ3JhbS5sYXVuY2goImM6XFxjeWd3aW5cXGN5Z3dpbi5iYXQiKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjM2FjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0YWJsZSBjb2x1bW4gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZpbmFsIFRhYmxlQ29sdW1uIFtdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zICgpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaj0wOyBqPGNvbHVtbnMubGVuZ3RoOyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkpOwotCQl9Ci0JfQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5zLmxlbmd0aDsgaSsrKSBjb2x1bW5zIFtpXS5wYWNrICgpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWZpbmFsIGludCBpbmRleCA9IDE7Ci0JYnV0dG9uLnNldFRleHQgKCJJbnNlcnQgQ29sdW1uICIgKyBpbmRleCArICJhIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpbmRleCArICJhIik7Ci0JCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWl0ZW1zIFtpXS5zZXRUZXh0IChpbmRleCwgIkl0ZW0gIiArIGkgKyAiYSIpOwotCQkJfQotCQkJY29sdW1uLnBhY2sgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEzNjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKgotICogU2FzaCBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCBhIHNpbXBsZSBzcGxpdHRlciAod2l0aCBhIDIwIHBpeGVsIGxpbWl0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2ggKHNoZWxsLCBTV1QuVkVSVElDQUwpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJCdXR0b24gMiIpOwotCQotCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCXNoZWxsLnNldExheW91dCAoZm9ybSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMURhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JYnV0dG9uMURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKHNhc2gsIDApOwotCWJ1dHRvbjFEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JYnV0dG9uMURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjEuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMURhdGEpOwotCi0JZmluYWwgaW50IGxpbWl0ID0gMjAsIHBlcmNlbnQgPSA1MDsKLQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChwZXJjZW50LCAwKTsKLQlzYXNoRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCXNhc2hEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlzYXNoLnNldExheW91dERhdGEgKHNhc2hEYXRhKTsKLQlzYXNoLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHNhc2hSZWN0ID0gc2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgc2hlbGxSZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWludCByaWdodCA9IHNoZWxsUmVjdC53aWR0aCAtIHNhc2hSZWN0LndpZHRoIC0gbGltaXQ7Ci0JCQllLnggPSBNYXRoLm1heCAoTWF0aC5taW4gKGUueCwgcmlnaHQpLCBsaW1pdCk7Ci0JCQlpZiAoZS54ICE9IHNhc2hSZWN0LngpICB7Ci0JCQkJc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgZS54KTsKLQkJCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlGb3JtRGF0YSBidXR0b24yRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24yRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24yRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24yRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjJEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24yLnNldExheW91dERhdGEgKGJ1dHRvbjJEYXRhKTsKLQkKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZhM2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJ1dHRvbiBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiRW50ZXIgeW91ciBuYW1lOiIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoMTAwLCBTV1QuREVGQVVMVCkpOwotCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jb2suc2V0VGV4dCAoIk9LIik7Ci0Jb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLQkJfQotCX0pOwotCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbmNlbCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbiAoY2FuY2VsKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IyNWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2FzaEZvcm0gZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzYXNoIGZvcm0gd2l0aCB0aHJlZSBjaGlsZHJlbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQotCVNhc2hGb3JtIGZvcm0gPSBuZXcgU2FzaEZvcm0oc2hlbGwsU1dULkhPUklaT05UQUwpOwotCWZvcm0uc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDEgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IExhYmVsKGNoaWxkMSxTV1QuTk9ORSkuc2V0VGV4dCgiTGFiZWwgaW4gcGFuZSAxIik7Ci0JCi0JQ29tcG9zaXRlIGNoaWxkMiA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgQnV0dG9uKGNoaWxkMixTV1QuUFVTSCkuc2V0VGV4dCgiQnV0dG9uIGluIHBhbmUyIik7Ci0KLQlDb21wb3NpdGUgY2hpbGQzID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDMuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDMsU1dULlBVU0gpLnNldFRleHQoIkxhYmVsIGluIHBhbmUzIik7Ci0JCi0JZm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7MzAsNDAsMzB9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc0ODA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc2V0IHRoZSBzZWxlY3Rpb24gKGktYmVhbSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoIkxpbmUgIiArIGkgKyAiXG4iKTsKLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoMzApOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoInNlbGVjdGlvbj0iICsgdGV4dC5nZXRTZWxlY3Rpb24gKCkpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhcmV0IHBvc2l0aW9uPSIgKyB0ZXh0LmdldENhcmV0UG9zaXRpb24gKCkpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhcmV0IGxvY2F0aW9uPSIgKyB0ZXh0LmdldENhcmV0TG9jYXRpb24gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGEwYzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZmluZCBhIHRhYmxlIGNlbGwgZnJvbSBtb3VzZSBkb3duICh3b3JrcyBmb3IgYW55IHRhYmxlIHN0eWxlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZmluYWwgaW50IHJvd0NvdW50ID0gNjQsIGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmb3IgKGludCBpPTA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaj0wOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0IChqLCAiSXRlbSAiICsgaSArICItIiArIGopOwotCQl9Ci0JfQotCWZvciAoaW50IGk9MDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0KLQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCAyMDApOwotCXRhYmxlLnNldFNpemUgKHNpemUpOwotCXNoZWxsLnBhY2sgKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0VG9wSW5kZXggKCk7Ci0JCQl3aGlsZSAoaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKGkpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJdGVtICIgKyBpbmRleCArICItIiArIGkpOwotCQkJCQl9Ci0JCQkJCWlmICghdmlzaWJsZSAmJiByZWN0LmludGVyc2VjdHMgKGNsaWVudEFyZWEpKSB7Ci0JCQkJCQl2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpc2libGUpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2U1OTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCB0aGUgdGV4dCBvZiBhIHRyZWUgaXRlbSAoaW4gcGxhY2UsIGZhbmN5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTExIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW1JID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW1JLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDE2OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW1KID0gbmV3IFRyZWVJdGVtIChpdGVtSSwgU1dULk5PTkUpOwotCQkJaXRlbUouc2V0VGV4dCAoIkl0ZW0gIiArIGopOwotCQl9Ci0JfQotCWZpbmFsIFRyZWVJdGVtIFtdIGxhc3RJdGVtID0gbmV3IFRyZWVJdGVtIFsxXTsKLQlmaW5hbCBUcmVlRWRpdG9yIGVkaXRvciA9IG5ldyBUcmVlRWRpdG9yICh0cmVlKTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gPT0gbGFzdEl0ZW0gWzBdKSB7Ci0JCQkJYm9vbGVhbiBpc0NhcmJvbiA9IFNXVC5nZXRQbGF0Zm9ybSAoKS5lcXVhbHMgKCJjYXJib24iKTsKLQkJCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAodHJlZSwgU1dULk5PTkUpOwotCQkJCWlmICghaXNDYXJib24pIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kIChibGFjayk7Ci0JCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWZpbmFsIGludCBpbnNldCA9IGlzQ2FyYm9uID8gMCA6IDE7Ci0JCQkJY29tcG9zaXRlLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCXRleHQuc2V0Qm91bmRzIChyZWN0LnggKyBpbnNldCwgcmVjdC55ICsgaW5zZXQsIHJlY3Qud2lkdGggLSBpbnNldCAqIDIsIHJlY3QuaGVpZ2h0IC0gaW5zZXQgKiAyKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCUxpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChmaW5hbCBFdmVudCBlKSB7Ci0JCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQkJCQlpdGVtLnNldFRleHQgKHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCWNvbXBvc2l0ZS5kaXNwb3NlICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFNXVC5WZXJpZnk6Ci0JCQkJCQkJCVN0cmluZyBuZXdUZXh0ID0gdGV4dC5nZXRUZXh0ICgpOwotCQkJCQkJCQlTdHJpbmcgbGVmdFRleHQgPSBuZXdUZXh0LnN1YnN0cmluZyAoMCwgZS5zdGFydCk7Ci0JCQkJCQkJCVN0cmluZyByaWdodFRleHQgPSBuZXdUZXh0LnN1YnN0cmluZyAoZS5lbmQsIG5ld1RleHQubGVuZ3RoICgpKTsKLQkJCQkJCQkJR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCQkJCQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudCAobGVmdFRleHQgKyBlLnRleHQgKyByaWdodFRleHQpOwotCQkJCQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJCQkJCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJCQkJCVJlY3RhbmdsZSBpdGVtUmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpLCByZWN0ID0gdHJlZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCQkJCQllZGl0b3IubWluaW11bVdpZHRoID0gTWF0aC5tYXggKHNpemUueCwgaXRlbVJlY3Qud2lkdGgpICsgaW5zZXQgKiAyOwotCQkJCQkJCQlpbnQgbGVmdCA9IGl0ZW1SZWN0LngsIHJpZ2h0ID0gcmVjdC54ICsgcmVjdC53aWR0aDsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWluIChlZGl0b3IubWluaW11bVdpZHRoLCByaWdodCAtIGxlZnQpOwotCQkJCQkJCQllZGl0b3IubWluaW11bUhlaWdodCA9IHNpemUueSArIGluc2V0ICogMjsKLQkJCQkJCQkJZWRpdG9yLmxheW91dCAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVHJhdmVyc2U6Ci0JCQkJCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCB0ZXh0TGlzdGVuZXIpOwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVmVyaWZ5LCB0ZXh0TGlzdGVuZXIpOwotCQkJCWVkaXRvci5zZXRFZGl0b3IgKGNvbXBvc2l0ZSwgaXRlbSk7Ci0JCQkJdGV4dC5zZXRUZXh0IChpdGVtLmdldFRleHQgKCkpOwotCQkJCXRleHQuc2VsZWN0QWxsICgpOwotCQkJCXRleHQuc2V0Rm9jdXMgKCk7Ci0JCQl9Ci0JCQlsYXN0SXRlbSBbMF0gPSBpdGVtOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1MzJhNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSW1hZ2UgZXhhbXBsZSBzbmlwcGV0OiBkaXNwbGF5IGFuIGltYWdlIGluIGEgZ3JvdXAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwIChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWdyb3VwLnNldFRleHQgKCJhIHNxdWFyZSIpOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzIChncm91cCwgU1dULk5PTkUpOwotCWNhbnZhcy5hZGRQYWludExpc3RlbmVyIChuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbCAoUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLmRyYXdJbWFnZSAoaW1hZ2UsIDAsIDApOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0JCQlkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiYTM0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdGFibGUgKFNXVC5DSEVDSykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjNmZjNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgYSBzZWxlY3Rpb24gb3IgY2hlY2sgZXZlbnQgaW4gYSB0cmVlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdHJlZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSyA/ICJDaGVja2VkIiA6ICJTZWxlY3RlZCI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGV2ZW50Lml0ZW0gKyAiICIgKyBzdHJpbmcpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQyMjQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBmb3JjZSByYWRpbyBiZWhhdmlvciBvbiB0d28gZGlmZmVyZW50IGNvbXBvc2l0ZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTk9fUkFESU9fR1JPVVApOwotCWMxLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTk9fUkFESU9fR1JPVVApOwotCWMyLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JZmluYWwgQ29tcG9zaXRlIFtdIGNvbXBvc2l0ZXMgPSBuZXcgQ29tcG9zaXRlIFtdIHtjMSwgYzJ9OwotCUxpc3RlbmVyIHJhZGlvR3JvdXAgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxjb21wb3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNvbXBvc2l0ZXMgW2ldOwotCQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQkJZm9yIChpbnQgaj0wOyBqPGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbiBbal07Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbikgewotCQkJCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoaWxkOwotCQkJCQkJaWYgKChidXR0b24uZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApIGJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlidXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX07Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uICIgKyBpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCByYWRpb0dyb3VwKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoYzIsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uICIgKyAoaSArIDQpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCByYWRpb0dyb3VwKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5NWVmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgQ1IgZnJvbSBnb2luZyB0byB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNiAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQl0ZXh0LnNldFRleHQoIkhlcmUgaXMgc29tZSB0ZXh0Iik7Ci0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGV4dCBkZWZhdWx0IHNlbGVjdGVkIChvdmVycmlkZXMgZGVmYXVsdCBidXR0b24pIik7Ci0JCX0KLQl9KTsKLQl0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJZS5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIk9rIik7Ci0JYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1dHRvbiBzZWxlY3RlZCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2ZTk4OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IGFkZCBhIHNlbGVjdCBhbGwgbWVudSBpdGVtIHRvIHRoZSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNyAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLSAgICB0LnNldFRleHQgKCJoZXJlIGlzIHNvbWUgdGV4dCB0byBiZSBzZWxlY3RlZCIpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQllZGl0SXRlbS5zZXRUZXh0ICgiRWRpdCIpOwotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JZWRpdEl0ZW0uc2V0TWVudSAoc3VibWVudSk7Ci0KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChzdWJtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9KTsKLQlpdGVtLnNldFRleHQgKCJTZWxlY3QgJkFsbFx0Q3RybCtBIik7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvciAoU1dULk1PRDEgKyAnQScpOwotCQotCS8vIE5vdGUgdGhhdCBhcyBsb25nIGFzIHlvdXIgYXBwbGljYXRpb24gaGFzIG5vdCBvdmVycmlkZGVuIAotCS8vIHRoZSBnbG9iYWwgYWNjZWxlcmF0b3JzIGZvciBjb3B5LCBwYXN0ZSwgYW5kIGN1dCAKLQkvLyhDVFJMK0Mgb3IgQ1RSTCtJTlNFUlQsIENUUkwrViBvciBTSElGVCtJTlNFUlQsIGFuZCBDVFJMK1ggb3IgU0hJRlQrREVMRVRFKQotCS8vIHRoZXNlIGJlaGF2aW91cnMgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGJ5IGRlZmF1bHQuCi0JLy8gSWYgeW91ciBhcHBsaWNhdGlvbiBvdmVycmlkZXMgdGhlc2UgYWNjZWxlcmF0b3JzLAotCS8vIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBUZXh0LmNvcHkoKSwgVGV4dC5wYXN0ZSgpIGFuZCBUZXh0LmN1dCgpCi0JLy8gZnJvbSB0aGUgU2VsZWN0aW9uIGNhbGxiYWNrIGZvciB0aGUgYWNjZWxlcmF0b3Igd2hlbiB0aGUgCi0JLy8gdGV4dCB3aWRnZXQgaGFzIGZvY3VzLgotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUwYzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb2xvciBjdXJzb3IgZnJvbSBhbiBpbWFnZSBmaWxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCWZpbmFsIEN1cnNvcltdIGN1cnNvciA9IG5ldyBDdXJzb3JbMV07Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQ2hhbmdlIGN1cnNvciIpOwotCVBvaW50IHNpemUgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlidXR0b24uc2V0U2l6ZShzaXplKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouaWNvIiwgIiouZ2lmIiwgIiouKiJ9KTsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChuYW1lID09IG51bGwpIHJldHVybjsKLQkJCUltYWdlRGF0YSBpbWFnZSA9IG5ldyBJbWFnZURhdGEobmFtZSk7Ci0JCQlDdXJzb3Igb2xkQ3Vyc29yID0gY3Vyc29yWzBdOwotCQkJY3Vyc29yWzBdID0gbmV3IEN1cnNvcihkaXNwbGF5LCBpbWFnZSwgMCwgMCk7Ci0JCQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yWzBdKTsKLQkJCWlmIChvbGRDdXJzb3IgIT0gbnVsbCkgb2xkQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChjdXJzb3JbMF0gIT0gbnVsbCkgY3Vyc29yWzBdLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNzkzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb2xvciBjdXJzb3IgZnJvbSBhIHNvdXJjZSBhbmQgYSBtYXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE5IHsKLQotc3RhdGljIGJ5dGVbXSBzcmNEYXRhID0gewotCShieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwgCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDAyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMwLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMywgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwKLQkoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDUwLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotfTsKLQotc3RhdGljIGJ5dGVbXSBtc2tEYXRhID0gewotCShieXRlKTB4MDMsIChieXRlKTB4YzAsIAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgzZiwgKGJ5dGUpMHhmYywKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweGZmLCAoYnl0ZSkweGZmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZSwgKGJ5dGUpMHg3ZiwKLQkoYnl0ZSkweGZmLCAoYnl0ZSkweGZmLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHgxZiwgKGJ5dGUpMHhmOCwKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwCi19OwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JQ29sb3IgeWVsbG93ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVyk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgZ3JlZW4gPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy9DcmVhdGUgYSBzb3VyY2UgSW1hZ2VEYXRhIG9mIGRlcHRoIDQKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCW10gewotCQlibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksIHllbGxvdy5nZXRSR0IoKSwgCi0JCXJlZC5nZXRSR0IoKSwgYmx1ZS5nZXRSR0IoKSwgZ3JlZW4uZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgNCwgcGFsZXR0ZSwgMSwgc3JjRGF0YSk7Ci0JCi0JLy9DcmVhdGUgYSBtYXNrIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCXBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge2JsYWNrLmdldFJHQigpLCB3aGl0ZS5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDEsIHBhbGV0dGUsIDEsIG1za0RhdGEpOwotCi0JLy9TZXQgbWFzawotCXNvdXJjZURhdGEubWFza0RhdGEgPSBtYXNrRGF0YS5kYXRhOwotCXNvdXJjZURhdGEubWFza1BhZCA9IG1hc2tEYXRhLnNjYW5saW5lUGFkOwotCi0JLy9DcmVhdGUgY3Vyc29yCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgc291cmNlRGF0YSwgMTAsIDEwKTsKLQotCS8vUmVtb3ZlIG1hc2sgdG8gZHJhdyB0aGVtIHNlcGFyYXRlbHkganVzdCB0byBzaG93IHdoYXQgdGhleSBsb29rIGxpa2UKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbnVsbDsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSAtMTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEltYWdlIHNvdXJjZSA9IG5ldyBJbWFnZSAoZGlzcGxheSxzb3VyY2VEYXRhKTsKLQlmaW5hbCBJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJaW50IHggPSAxMCwgeSA9IDEwOwotCQkJU3RyaW5nIHN0cmluZ1NvdXJjZSA9ICJzb3VyY2U6ICI7Ci0JCQlTdHJpbmcgc3RyaW5nTWFzayA9ICJtYXNrOiAiOwotCQkJZ2MuZHJhd1N0cmluZyhzdHJpbmdTb3VyY2UsIHgsIHkpOwotCQkJZ2MuZHJhd1N0cmluZyhzdHJpbmdNYXNrLCB4LCB5ICsgMzApOwotCQkJeCArPSBNYXRoLm1heChnYy5zdHJpbmdFeHRlbnQoc3RyaW5nU291cmNlKS54LCBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nTWFzaykueCk7Ci0JCQlnYy5kcmF3SW1hZ2Uoc291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdJbWFnZShtYXNrLCB4LCB5ICsgMzApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlzb3VyY2UuZGlzcG9zZSgpOwotCW1hc2suZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3YTk5Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChzdGFydCwgZW5kKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMTAwLCAxMDApOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kICgiTGluZSAiICsgaSArICJcbiIpOwotCX0KLQlzaGVsbC5vcGVuICgpOwotCXRleHQuc2V0U2VsZWN0aW9uICgzMCwgMzgpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoInNlbGVjdGlvbj0iICsgdGV4dC5nZXRTZWxlY3Rpb24gKCkpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhcmV0IHBvc2l0aW9uPSIgKyB0ZXh0LmdldENhcmV0UG9zaXRpb24gKCkpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhcmV0IGxvY2F0aW9uPSIgKyB0ZXh0LmdldENhcmV0TG9jYXRpb24gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19IAotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA3MGNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTW9uaXRvciBleGFtcGxlIHNuaXBwZXQ6IGNlbnRlciBhIHNoZWxsIG9uIHRoZSBwcmltYXJ5IG1vbml0b3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0JTW9uaXRvciBwcmltYXJ5ID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvciAoKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRCb3VuZHMgKCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMgKCk7Ci0JaW50IHggPSBib3VuZHMueCArIChib3VuZHMud2lkdGggLSByZWN0LndpZHRoKSAvIDI7Ci0JaW50IHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMjsKLQlzaGVsbC5zZXRMb2NhdGlvbiAoeCwgeSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTAxNmEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBwYXNzd29yZCAoc2V0IHRoZSBlY2hvIGNoYXJhY3RlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0RWNob0NoYXIgKCcqJyk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWZiZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENsaXBib2FyZCBleGFtcGxlIHNuaXBwZXQ6IGVuYWJsZS9kaXNhYmxlIG1lbnUgZGVwZW5kaW5nIG9uIGNsaXBib2FyZCBjb250ZW50IGF2YWlsYWJpbGl0eQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTIyIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIENsaXBib2FyZCBjYiA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JY29weUl0ZW0uc2V0VGV4dCgiQ29weSIpOwotCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCQkJT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbXXtzZWxlY3Rpb259OwotCQkJVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCQljYi5zZXRDb250ZW50cyhkYXRhLCB0eXBlcyk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCXBhc3RlSXRlbS5zZXRUZXh0ICgiUGFzdGUiKTsKLQlwYXN0ZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpKGNiLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSk7Ci0JCQlpZiAoc3RyaW5nICE9IG51bGwpIHRleHQuaW5zZXJ0KHN0cmluZyk7Ci0JCX0KLQl9KTsKLQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJLy8gaXMgY29weSB2YWxpZD8KLQkJCVN0cmluZyBzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uLmxlbmd0aCgpID4gMCk7Ci0JCQkvLyBpcyBwYXN0ZSB2YWxpZD8KLQkJCVRyYW5zZmVyRGF0YVtdIGF2YWlsYWJsZSA9IGNiLmdldEF2YWlsYWJsZVR5cGVzKCk7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShhdmFpbGFibGVbaV0pKSB7Ci0JCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0pOwotCXRleHQuc2V0TWVudSAobWVudSk7Ci0KLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQljYi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTQ1OWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogT0xFIGFuZCBBY3RpdmVYIGV4YW1wbGUgc25pcHBldDogZ2V0IGV2ZW50cyBmcm9tIElFIGNvbnRyb2wgKHdpbjMyIG9ubHkpCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQl0cnkgewotCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlyZXR1cm47Ci0JfQotCXNoZWxsLm9wZW4oKTsKLQkKLQkvLyBJV2ViQnJvd3NlcgotCWZpbmFsIE9sZUF1dG9tYXRpb24gd2ViQnJvd3NlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQotCS8vIFdoZW4gYSBuZXcgZG9jdW1lbnQgaXMgbG9hZGVkLCBhY2Nlc3MgdGhlIGRvY3VtZW50IG9iamVjdCBmb3IgdGhlIG5ldyBwYWdlLgotCWludCBEb3dubG9hZENvbXBsZXRlID0gMTA0OwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJaW50W10gaHRtbERvY3VtZW50SUQgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJEb2N1bWVudCJ9KTsgCi0JCQlpZiAoaHRtbERvY3VtZW50SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gd2ViQnJvd3Nlci5nZXRQcm9wZXJ0eShodG1sRG9jdW1lbnRJRFswXSk7Ci0JCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCS8vSUhUTUxEb2N1bWVudDIKLQkJCU9sZUF1dG9tYXRpb24gaHRtbERvY3VtZW50ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0KLQkJCS8vIFJlcXVlc3QgdG8gYmUgbm90aWZpZWQgb2YgY2xpY2ssIGRvdWJsZSBjbGljayBhbmQga2V5IGRvd24gZXZlbnRzCi0JCQlFdmVudERpc3BhdGNoIG15RGlzcGF0Y2ggPSBuZXcgRXZlbnREaXNwYXRjaChFdmVudERpc3BhdGNoLm9uY2xpY2spOwotCQkJSURpc3BhdGNoIGlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJVmFyaWFudCBkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmNsaWNrLCBkaXNwYXRjaCk7Ci0KLQkJCW15RGlzcGF0Y2ggPSBuZXcgRXZlbnREaXNwYXRjaChFdmVudERpc3BhdGNoLm9uZGJsY2xpY2spOwotCQkJaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmRibGNsaWNrLCBkaXNwYXRjaCk7Ci0KLQkJCW15RGlzcGF0Y2ggPSBuZXcgRXZlbnREaXNwYXRjaChFdmVudERpc3BhdGNoLm9ua2V5ZG93bik7Ci0JCQlpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCWRpc3BhdGNoID0gbmV3IFZhcmlhbnQoaWRpc3BhdGNoKTsKLQkJCWh0bWxEb2N1bWVudC5zZXRQcm9wZXJ0eShFdmVudERpc3BhdGNoLm9ua2V5ZG93biwgZGlzcGF0Y2gpOwotCQkJCi0JCQkvL1JlbWVtYmVyIHRvIHJlbGVhc2UgT2xlQXV0b21hdGlvbiBPYmplY3QKLQkJCWh0bWxEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byBhIHdlYiBzaXRlCi0JaW50W10gaWRzID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIpfTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbXXtpZHNbMV19OwotCXdlYkJyb3dzZXIuaW52b2tlKGlkc1swXSwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0Jd2ViQnJvd3Nlci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JCi19Ci19Ci0vLyBFdmVudERpc3BhdGNoIGltcGxlbWVudHMgYSBzaW1wbGUgSURpc3BhdGNoIGludGVyZmFjZSB3aGljaCB3aWxsIGJlIGNhbGxlZCAKLS8vIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLgotY2xhc3MgRXZlbnREaXNwYXRjaCB7Ci0JcHJpdmF0ZSBDT01PYmplY3QgaURpc3BhdGNoOwotCXByaXZhdGUgaW50IHJlZkNvdW50ID0gMDsKLQlwcml2YXRlIGludCBldmVudElEOwotCQotCWZpbmFsIHN0YXRpYyBpbnQgb25oZWxwID0gMHg4MDAxMTc3ZDsKLQlmaW5hbCBzdGF0aWMgaW50IG9uY2xpY2sgPSAweDgwMDExNzc4OwotCWZpbmFsIHN0YXRpYyBpbnQgb25kYmxjbGljayA9IDB4ODAwMTE3Nzk7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleXVwID0gMHg4MDAxMTc3NjsKLQlmaW5hbCBzdGF0aWMgaW50IG9ua2V5ZG93biA9IDB4ODAwMTE3NzU7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleXByZXNzID0gMHg4MDAxMTc3NzsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2V1cCA9IDB4ODAwMTE3NzM7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlZG93biA9IDB4ODAwMTE3NzI7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlbW92ZSA9IDB4ODAwMTE3NzQ7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlb3V0ID0gMHg4MDAxMTc3MTsKLQlmaW5hbCBzdGF0aWMgaW50IG9ubW91c2VvdmVyID0gMHg4MDAxMTc3MDsKLQlmaW5hbCBzdGF0aWMgaW50IG9ucmVhZHlzdGF0ZWNoYW5nZSA9IDB4ODAwMTE3ODk7Ci0JZmluYWwgc3RhdGljIGludCBvbmFmdGVydXBkYXRlID0gMHg4MDAxMTc4NjsKLQlmaW5hbCBzdGF0aWMgaW50IG9ucm93ZXhpdD0gMHg4MDAxMTc4MjsKLQlmaW5hbCBzdGF0aWMgaW50IG9ucm93ZW50ZXIgPSAweDgwMDExNzgzOwotCWZpbmFsIHN0YXRpYyBpbnQgb25kcmFnc3RhcnQgPSAweDgwMDExNzkzOwotCWZpbmFsIHN0YXRpYyBpbnQgb25zZWxlY3RzdGFydCA9IDB4ODAwMTE3OTU7Ci0KLQlFdmVudERpc3BhdGNoKGludCBldmVudElEKSB7Ci0JCXRoaXMuZXZlbnRJRCA9IGV2ZW50SUQ7Ci0JCWNyZWF0ZUNPTUludGVyZmFjZXMoKTsKLQl9Ci0JaW50IGdldEFkZHJlc3MoKSB7Ci0JCXJldHVybiBpRGlzcGF0Y2guZ2V0QWRkcmVzcygpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ09NSW50ZXJmYWNlcygpIHsKLQkJaURpc3BhdGNoID0gbmV3IENPTU9iamVjdChuZXcgaW50W117MiwgMCwgMCwgMSwgMywgNCwgOH0pewotCQkJcHVibGljIGludCBtZXRob2QwKGludFtdIGFyZ3MpIHtyZXR1cm4gUXVlcnlJbnRlcmZhY2UoYXJnc1swXSwgYXJnc1sxXSk7fQotCQkJcHVibGljIGludCBtZXRob2QxKGludFtdIGFyZ3MpIHtyZXR1cm4gQWRkUmVmKCk7fQotCQkJcHVibGljIGludCBtZXRob2QyKGludFtdIGFyZ3MpIHtyZXR1cm4gUmVsZWFzZSgpO30KLQkJCS8vIG1ldGhvZDMgR2V0VHlwZUluZm9Db3VudCAtIG5vdCBpbXBsZW1lbnRlZAotCQkJLy8gbWV0aG9kNCBHZXRUeXBlSW5mbyAtIG5vdCBpbXBsZW1lbnRlZAotCQkJLy8gbWV0aG9kNSBHZXRJRHNPZk5hbWVzIC0gbm90IGltcGxlbWVudGVkCi0JCQlwdWJsaWMgaW50IG1ldGhvZDYoaW50W10gYXJncykge3JldHVybiBJbnZva2UoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSwgYXJnc1s3XSk7fQotCQl9OwotCX0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUNPTUludGVyZmFjZXMoKSB7Ci0JCWlmIChpRGlzcGF0Y2ggIT0gbnVsbCkKLQkJCWlEaXNwYXRjaC5kaXNwb3NlKCk7Ci0JCWlEaXNwYXRjaCA9IG51bGw7Ci0JCQotCX0KLQlwcml2YXRlIGludCBBZGRSZWYoKSB7Ci0JCXJlZkNvdW50Kys7Ci0JCXJldHVybiByZWZDb3VudDsKLQl9Ci0JcHJpdmF0ZSBpbnQgSW52b2tlKGludCBkaXNwSWRNZW1iZXIsIGludCByaWlkLCBpbnQgbGNpZCwgaW50IGR3RmxhZ3MsIGludCBwRGlzcFBhcmFtcywgaW50IHBWYXJSZXN1bHQsIGludCBwRXhjZXBJbmZvLCBpbnQgcEFyZ0VycikJewotCQlzd2l0Y2ggKGV2ZW50SUQpIHsKLQkJCWNhc2Ugb25oZWxwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uaGVscCIpOyBicmVhazsKLQkJCWNhc2Ugb25jbGljazogU3lzdGVtLm91dC5wcmludGxuKCJvbmNsaWNrIik7IGJyZWFrOwotCQkJY2FzZSBvbmRibGNsaWNrOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uZGJsY2xpY2siKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5dXA6IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXl1cCIpOyBicmVhazsKLQkJCWNhc2Ugb25rZXlkb3duOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5ZG93biIpOyBicmVhazsKLQkJCWNhc2Ugb25rZXlwcmVzczogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleXByZXNzIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNldXA6IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZXVwIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlZG93bjogU3lzdGVtLm91dC5wcmludGxuKCJvbm1vdXNlZG93biIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZW1vdmU6IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZW1vdmUiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2VvdXQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZW91dCIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZW92ZXI6IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZW92ZXIiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucmVhZHlzdGF0ZWNoYW5nZTogU3lzdGVtLm91dC5wcmludGxuKCJvbnJlYWR5c3RhdGVjaGFuZ2UiKTsgYnJlYWs7Ci0JCQljYXNlIG9uYWZ0ZXJ1cGRhdGU6IFN5c3RlbS5vdXQucHJpbnRsbigib25hZnRlcnVwZGF0ZSIpOyBicmVhazsKLQkJCWNhc2Ugb25yb3dleGl0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ucm93ZXhpdCIpOyBicmVhazsKLQkJCWNhc2Ugb25yb3dlbnRlcjogU3lzdGVtLm91dC5wcmludGxuKCJvbnJvd2VudGVyIik7IGJyZWFrOwotCQkJY2FzZSBvbmRyYWdzdGFydDogU3lzdGVtLm91dC5wcmludGxuKCJvbmRyYWdzdGFydCIpOyBicmVhazsKLQkJCWNhc2Ugb25zZWxlY3RzdGFydDogU3lzdGVtLm91dC5wcmludGxuKCJvbnNlbGVjdHN0YXJ0Iik7IGJyZWFrOwotCQl9Ci0JCXJldHVybiBDT00uU19PSzsKLQl9Ci0JcHJpdmF0ZSBpbnQgUXVlcnlJbnRlcmZhY2UoaW50IHJpaWQsIGludCBwcHZPYmplY3QpIHsKLQkJaWYgKHJpaWQgPT0gMCB8fCBwcHZPYmplY3QgPT0gMCkgcmV0dXJuIENPTS5FX0lOVkFMSURBUkc7Ci0JCUdVSUQgZ3VpZCA9IG5ldyBHVUlEKCk7Ci0JCUNPTS5Nb3ZlTWVtb3J5KGd1aWQsIHJpaWQsIEdVSUQuc2l6ZW9mKTsKLQkKLQkJaWYgKCBDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElVbmtub3duKSB8fCBDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElEaXNwYXRjaCkpIHsKLQkJCUNPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHtpRGlzcGF0Y2guZ2V0QWRkcmVzcygpfSwgNCk7Ci0JCQlBZGRSZWYoKTsKLQkJCXJldHVybiBDT00uU19PSzsKLQkJfQotCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnRbXSB7MH0sIDQpOwotCQlyZXR1cm4gQ09NLkVfTk9JTlRFUkZBQ0U7Ci0JfQotCWludCBSZWxlYXNlKCkgewotCQlyZWZDb3VudC0tOwotCQlpZiAocmVmQ291bnQgPT0gMCkgewotCQkJZGlzcG9zZUNPTUludGVyZmFjZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDFmYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IGEgY2VsbCBpbiBhIHRhYmxlIChpbiBwbGFjZSwgZmFuY3kpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjQgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyIiICsgaSwgIiIgKyBpICwgIiIgKyBpfSk7Ci0JfQotCWZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRUb3BJbmRleCAoKTsKLQkJCXdoaWxlIChpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCWJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkJCWZpbmFsIFRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKGkpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJCQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJdGV4dC5kaXNwb3NlICgpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTV1QuVHJhdmVyc2U6Ci0JCQkJCQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKGNvbHVtbiwgdGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQllZGl0b3Iuc2V0RWRpdG9yICh0ZXh0LCBpdGVtLCBpKTsKLQkJCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0IChpKSk7Ci0JCQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQkJCXRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyAoY2xpZW50QXJlYSkpIHsKLQkJCQkJCXZpc2libGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghdmlzaWJsZSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhYjc1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBmYWtlIHRvb2wgdGlwcyBmb3IgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIml0ZW0gIiArIGkpOwotCX0KLQkvLyBEaXNhYmxlIG5hdGl2ZSB0b29sdGlwCi0JdGFibGUuc2V0VG9vbFRpcFRleHQgKCIiKTsKLQkKLQkvLyBJbXBsZW1lbnQgYSAiZmFrZSIgdG9vbHRpcAotCWZpbmFsIExpc3RlbmVyIGxhYmVsTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gbGFiZWwuZ2V0U2hlbGwgKCk7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQkJCWUuaXRlbSA9IChUYWJsZUl0ZW0pIGxhYmVsLmdldERhdGEgKCJfVEFCTEVJVEVNIik7Ci0JCQkJCS8vIEFzc3VtaW5nIHRhYmxlIGlzIHNpbmdsZSBzZWxlY3QsIHNldCB0aGUgc2VsZWN0aW9uIGFzIGlmCi0JCQkJCS8vIHRoZSBtb3VzZSBkb3duIGV2ZW50IHdlbnQgdGhyb3VnaCB0byB0aGUgdGFibGUKLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uIChuZXcgVGFibGVJdGVtIFtdIHsoVGFibGVJdGVtKSBlLml0ZW19KTsKLQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJdGFibGUuc2V0Rm9jdXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJCQlzaGVsbC5kaXNwb3NlICgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JCi0JTGlzdGVuZXIgdGFibGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVNoZWxsIHRpcCA9IG51bGw7Ci0JCUxhYmVsIGxhYmVsID0gbnVsbDsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCWNhc2UgU1dULktleURvd246Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiB7Ci0JCQkJCWlmICh0aXAgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCXRpcC5kaXNwb3NlICgpOwotCQkJCQl0aXAgPSBudWxsOwotCQkJCQlsYWJlbCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAobmV3IFBvaW50IChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJCWlmICh0aXAgIT0gbnVsbCAgJiYgIXRpcC5pc0Rpc3Bvc2VkICgpKSB0aXAuZGlzcG9zZSAoKTsKLQkJCQkJCXRpcCA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0JCQkJCQl0aXAuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCQkJCQl0aXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwgKHRpcCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0RGF0YSAoIl9UQUJMRUlURU0iLCBpdGVtKTsKLQkJCQkJCWxhYmVsLnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoKSk7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlQb2ludCBzaXplID0gdGlwLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoMCk7Ci0JCQkJCQlQb2ludCBwdCA9IHRhYmxlLnRvRGlzcGxheSAocmVjdC54LCByZWN0LnkpOwotCQkJCQkJdGlwLnNldEJvdW5kcyAocHQueCwgcHQueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJdGlwLnNldFZpc2libGUgKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmFjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYXJiaXRyYXJ5IGNvbnRyb2xzIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGggKDEwMCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JfQotCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJY29tYm8uc2V0VGV4dCgiQ0NvbWJvIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAxIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAyIik7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IoY29tYm8sIGl0ZW1zW2ldLCAwKTsKLQkJZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQl0ZXh0LnNldFRleHQoIlRleHQiKTsKLQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0LCBpdGVtc1tpXSwgMSk7Ci0JCWVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrICgpOwotCQllZGl0b3IubWluaW11bVdpZHRoID0gYnV0dG9uLmdldFNpemUgKCkueDsKLQkJZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJZWRpdG9yLnNldEVkaXRvciAoYnV0dG9uLCBpdGVtc1tpXSwgMik7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGVmZWJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBUYWIgZnJvbSB0cmF2ZXJzaW5nIG91dCBvZiBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiQ2FuJ3QgVHJhdmVyc2UiKTsKLQlidXR0b24xLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX05FWFQ6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOiB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQoIkNhbiBUcmF2ZXJzZSIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODkxZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVRvb2xJdGVtIGl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUJhY2suc2V0VGV4dCgiQmFjayIpOwotCQlUb29sSXRlbSBpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Gb3J3YXJkLnNldFRleHQoIkZvcndhcmQiKTsKLQkJVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtU3RvcC5zZXRUZXh0KCJTdG9wIik7Ci0JCVRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVJlZnJlc2guc2V0VGV4dCgiUmVmcmVzaCIpOwotCQlUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtR28uc2V0VGV4dCgiR28iKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBsYWJlbEFkZHJlc3MgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbGFiZWxBZGRyZXNzLnNldFRleHQoIkFkZHJlc3MiKTsKLQkJCi0JCWZpbmFsIFRleHQgbG9jYXRpb24gPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2F0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgc3RhdHVzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIFByb2dyZXNzQmFyIHByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qIGV2ZW50IGhhbmRsaW5nICovCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgc3RyaW5nID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHN0cmluZy5lcXVhbHMoIkJhY2siKSkgYnJvd3Nlci5iYWNrKCk7IAotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkZvcndhcmQiKSkgYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiU3RvcCIpKSBicm93c2VyLnN0b3AoKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJSZWZyZXNoIikpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkdvIikpIGJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCSAgIH0KLQkJfTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KGV2ZW50LnRleHQpOwkKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50b3ApIGxvY2F0aW9uLnNldFRleHQoZXZlbnQubG9jYXRpb24pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1TdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlsb2NhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL2VjbGlwc2Uub3JnIik7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDFiYTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNvbG9yIGNlbGxzIGFuZCByb3dzIGluIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI5IHsKLSAKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRhYmxlLnNldEJhY2tncm91bmQoZ3JheSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBmb3JlZ3JvdW5kIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJub3JtYWwiLCJibHVlIGZvcmVncm91bmQiLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMSwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBiYWNrZ3JvdW5kIiwicmVkIGJhY2tncm91bmQifSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IndoaXRlIGZvcmUvYmx1ZSBiYWNrIiwibm9ybWFsIiwid2hpdGUgZm9yZS9yZWQgYmFjayJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMCwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQlpdGVtLnNldEZvcmVncm91bmQoMiwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCWNvbHVtbjMucGFjaygpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YThkMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogZHJhdyBhIHRoaWNrIGxpbmUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2Muc2V0TGluZVdpZHRoICg0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlICgyMCwgMjAsIDEwMCwgMTAwKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwY2I4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXN5SW5kaWNhdG9yIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBidXN5IGN1cnNvciBkdXJpbmcgbG9uZyBydW5uaW5nIHRhc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIGludFtdIG5leHRJZCA9IG5ldyBpbnRbMV07Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludm9rZSBsb25nIHJ1bm5pbmcgam9iIik7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUnVubmFibGUgbG9uZ0pvYiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCWludCBpZDsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJaWQgPSBuZXh0SWRbMF0rKzsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuU3RhcnQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZG8gdGFzayB0aGF0IHRha2VzIGEgbG9uZyB0aW1lIGluIGEgc2VwYXJhdGUgdGhyZWFkICIraWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodGV4dC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCQl0ZXh0LmFwcGVuZCgiXG5Db21wbGV0ZWQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCQkJZGlzcGxheS53YWtlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQl0aHJlYWQuc3RhcnQoKTsKLQkJCQkJCXdoaWxlICghZG9uZSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIGxvbmdKb2IpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgyNTAsIDE1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwYzA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSBwb3B1cCBtZW51ICh3YWl0IGZvciBpdCB0byBjbG9zZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKCJNZW51IEl0ZW0iKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSBTZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0pOwotCQkJbWVudS5zZXRMb2NhdGlvbiAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJd2hpbGUgKCFtZW51LmlzRGlzcG9zZWQgKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJbWVudS5kaXNwb3NlICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTgxYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCAiSGVsbG8gV29ybGQhIiBpbiBibGFjaywgb3V0bGluZWQgaW4gcmVkLCB0byBkZWZhdWx0IHByaW50ZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IE5vIGRlZmF1bHQgcHJpbnRlci4iKTsKLQkJcmV0dXJuOwotCX0KLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlpZiAocHJpbnRlci5zdGFydEpvYigiU1dUIFByaW50aW5nIFNuaXBwZXQiKSkgewotCQlDb2xvciBibGFjayA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJQ29sb3Igd2hpdGUgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JCUNvbG9yIHJlZCA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQkJaW50IGxlZnRNYXJnaW4gPSBkcGkueCArIHRyaW0ueDsgLy8gb25lIGluY2ggZnJvbSBsZWZ0IHNpZGUgb2YgcGFwZXIKLQkJaW50IHRvcE1hcmdpbiA9IGRwaS55IC8gMiArIHRyaW0ueTsgLy8gb25lLWhhbGYgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQlGb250IGZvbnQgPSBnYy5nZXRGb250KCk7IC8vIGV4YW1wbGUganVzdCB1c2VzIHByaW50ZXIncyBkZWZhdWx0IGZvbnQKLQkJaWYgKHByaW50ZXIuc3RhcnRQYWdlKCkpIHsKLQkJCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0JCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJIZWxsbyBXb3JsZCEiOwotCQkJUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHRlc3RTdHJpbmcpOwotCQkJZ2MuZHJhd1N0cmluZyh0ZXN0U3RyaW5nLCBsZWZ0TWFyZ2luLCB0b3BNYXJnaW4gKyBmb250LmdldEZvbnREYXRhKClbMF0uZ2V0SGVpZ2h0KCkpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJZ2MuZHJhd1JlY3RhbmdsZShsZWZ0TWFyZ2luLCB0b3BNYXJnaW4sIGV4dGVudC54LCBleHRlbnQueSk7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCXByaW50ZXIuZW5kSm9iKCk7Ci0JCX0KLQlwcmludGVyLmRpc3Bvc2UoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTljNjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBQcmludGluZyBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHRleHQgdG8gcHJpbnRlciwgd2l0aCB3b3JkIHdyYXAgYW5kIHBhZ2luYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzMgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHRleHQ7Ci0JRm9udCBmb250OwotCUNvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCQotCVByaW50ZXIgcHJpbnRlcjsKLQlHQyBnYzsKLQlGb250RGF0YVtdIHByaW50ZXJGb250RGF0YTsKLQlSR0IgcHJpbnRlckZvcmVncm91bmQsIHByaW50ZXJCYWNrZ3JvdW5kOwotCi0JaW50IGxpbmVIZWlnaHQgPSAwOwotCWludCB0YWJXaWR0aCA9IDA7Ci0JaW50IGxlZnRNYXJnaW4sIHJpZ2h0TWFyZ2luLCB0b3BNYXJnaW4sIGJvdHRvbU1hcmdpbjsKLQlpbnQgeCwgeTsKLQlpbnQgaW5kZXgsIGVuZDsKLQlTdHJpbmcgdGV4dFRvUHJpbnQ7Ci0JU3RyaW5nIHRhYnM7Ci0JU3RyaW5nQnVmZmVyIHdvcmRCdWZmZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTMzKCkub3BlbigpOwotCX0KLQkKLQl2b2lkIG9wZW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJQcmludCBUZXh0Iik7Ci0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCImT3Blbi4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ08nKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJGb250Li4uIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVGb250KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9yZWdyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9yZWdyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQmFja2dyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJlByaW50Li4uIik7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJFJnhpdCIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCQotCXZvaWQgbWVudU9wZW4oKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXh0U3RyaW5nOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSByZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRQYXRoKCkpOwotCQkJdHJ5IHsKLQkJCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJCWNoYXJbXSByZWFkQnVmZmVyPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKChpbnQpIGZpbGUubGVuZ3RoKCkpOwotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQl0ZXh0U3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJCWJveC5zZXRNZXNzYWdlKCJFcnJvciByZWFkaW5nIGZpbGU6XG4iICsgbmFtZSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiRmlsZSBub3QgZm91bmQ6XG4iICsgbmFtZSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9CQotCQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JfQotCi0Jdm9pZCBtZW51Rm9udCgpIHsKLQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coc2hlbGwpOwotCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCkpOwotCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCQkJdGV4dC5zZXRGb250KGZvbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51Rm9yZWdyb3VuZENvbG9yKCkgewotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQih0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKSk7Ci0JCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUJhY2tncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IodGV4dC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVQcmludCgpIHsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVByaW50ZXJEYXRhIGRhdGEgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChkYXRhLnByaW50VG9GaWxlKSB7Ci0JCQlkYXRhLmZpbGVOYW1lID0gInByaW50Lm91dCI7IC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIGFzayB0aGUgdXNlciBmb3IgYSBmaWxlbmFtZQotCQl9Ci0JCQotCQkvKiBHZXQgdGhlIHRleHQgdG8gcHJpbnQgZnJvbSB0aGUgVGV4dCB3aWRnZXQgKHlvdSBjb3VsZCBnZXQgaXQgZnJvbSBhbnl3aGVyZSwgaS5lLiB5b3VyIGphdmEgbW9kZWwpICovCi0JCXRleHRUb1ByaW50ID0gdGV4dC5nZXRUZXh0KCk7Ci0KLQkJLyogR2V0IHRoZSBmb250ICYgZm9yZWdyb3VuZCAmIGJhY2tncm91bmQgZGF0YS4gKi8KLQkJcHJpbnRlckZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJcHJpbnRlckZvcmVncm91bmQgPSB0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJcHJpbnRlckJhY2tncm91bmQgPSB0ZXh0LmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJCi0JCS8qIERvIHRoZSBwcmludGluZyBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHNvIHRoYXQgc3Bvb2xpbmcgZG9lcyBub3QgZnJlZXplIHRoZSBVSS4gKi8KLQkJcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQlUaHJlYWQgcHJpbnRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCJQcmludGluZyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcmludChwcmludGVyKTsKLQkJCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJcHJpbnRpbmdUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0Jdm9pZCBwcmludChQcmludGVyIHByaW50ZXIpIHsKLQkJaWYgKHByaW50ZXIuc3RhcnRKb2IoIlRleHQiKSkgeyAgIC8vIHRoZSBzdHJpbmcgaXMgdGhlIGpvYiBuYW1lIC0gc2hvd3MgdXAgaW4gdGhlIHByaW50ZXIncyBqb2IgbGlzdAotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCQlyaWdodE1hcmdpbiA9IGNsaWVudEFyZWEud2lkdGggLSBkcGkueCArIHRyaW0ueCArIHRyaW0ud2lkdGg7IC8vIG9uZSBpbmNoIGZyb20gcmlnaHQgc2lkZSBvZiBwYXBlcgotCQkJdG9wTWFyZ2luID0gZHBpLnkgKyB0cmltLnk7IC8vIG9uZSBpbmNoIGZyb20gdG9wIGVkZ2Ugb2YgcGFwZXIKLQkJCWJvdHRvbU1hcmdpbiA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gZHBpLnkgKyB0cmltLnkgKyB0cmltLmhlaWdodDsgLy8gb25lIGluY2ggZnJvbSBib3R0b20gZWRnZSBvZiBwYXBlcgotCQkJCi0JCQkvKiBDcmVhdGUgYSBidWZmZXIgZm9yIGNvbXB1dGluZyB0YWIgd2lkdGguICovCi0JCQlpbnQgdGFiU2l6ZSA9IDQ7IC8vIGlzIHRhYiB3aWR0aCBhIHVzZXIgc2V0dGluZyBpbiB5b3VyIFVJPwotCQkJU3RyaW5nQnVmZmVyIHRhYkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYlNpemU7IGkrKykgdGFiQnVmZmVyLmFwcGVuZCgnICcpOwotCQkJdGFicyA9IHRhYkJ1ZmZlci50b1N0cmluZygpOwotCi0JCQkvKiBDcmVhdGUgcHJpbnRlciBHQywgYW5kIGNyZWF0ZSBhbmQgc2V0IHRoZSBwcmludGVyIGZvbnQgJiBmb3JlZ3JvdW5kIGNvbG9yLiAqLwotCQkJZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCQlGb250IHByaW50ZXJGb250ID0gbmV3IEZvbnQocHJpbnRlciwgcHJpbnRlckZvbnREYXRhKTsKLQkJCUNvbG9yIHByaW50ZXJGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcHJpbnRlckZvcmVncm91bmQpOwotCQkJQ29sb3IgcHJpbnRlckJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihwcmludGVyLCBwcmludGVyQmFja2dyb3VuZCk7IAotCQkJCi0JCQlnYy5zZXRGb250KHByaW50ZXJGb250KTsKLQkJCWdjLnNldEZvcmVncm91bmQocHJpbnRlckZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IpOwotCQkJdGFiV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQodGFicykueDsKLQkJCWxpbmVIZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQkKLQkJCS8qIFByaW50IHRleHQgdG8gY3VycmVudCBnYyB1c2luZyB3b3JkIHdyYXAgKi8KLQkJCXByaW50VGV4dCgpOwotCQkJcHJpbnRlci5lbmRKb2IoKTsKLQotCQkJLyogQ2xlYW51cCBncmFwaGljcyByZXNvdXJjZXMgdXNlZCBpbiBwcmludGluZyAqLwotCQkJcHJpbnRlckZvbnQuZGlzcG9zZSgpOwotCQkJcHJpbnRlckZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlwcmludGVyQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIHByaW50VGV4dCgpIHsKLQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJd29yZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJeCA9IGxlZnRNYXJnaW47Ci0JCXkgPSB0b3BNYXJnaW47Ci0JCWluZGV4ID0gMDsKLQkJZW5kID0gdGV4dFRvUHJpbnQubGVuZ3RoKCk7Ci0JCXdoaWxlIChpbmRleCA8IGVuZCkgewotCQkJY2hhciBjID0gdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoYyAhPSAwKSB7Ci0JCQkJaWYgKGMgPT0gMHgwYSB8fCBjID09IDB4MGQpIHsKLQkJCQkJaWYgKGMgPT0gMHgwZCAmJiBpbmRleCA8IGVuZCAmJiB0ZXh0VG9QcmludC5jaGFyQXQoaW5kZXgpID09IDB4MGEpIHsKLQkJCQkJCWluZGV4Kys7IC8vIGlmIHRoaXMgaXMgY3ItbGYsIHNraXAgdGhlIGxmCi0JCQkJCX0KLQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCW5ld2xpbmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYyAhPSAnXHQnKSB7Ci0JCQkJCQl3b3JkQnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCQlpZiAoYyA9PSAnXHQnKSB7Ci0JCQkJCQkJeCArPSB0YWJXaWR0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoeSArIGxpbmVIZWlnaHQgPD0gYm90dG9tTWFyZ2luKSB7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcHJpbnRXb3JkQnVmZmVyKCkgewotCQlpZiAod29yZEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyB3b3JkID0gd29yZEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IHdvcmRXaWR0aCA9IGdjLnN0cmluZ0V4dGVudCh3b3JkKS54OwotCQkJaWYgKHggKyB3b3JkV2lkdGggPiByaWdodE1hcmdpbikgewotCQkJCS8qIHdvcmQgZG9lc24ndCBmaXQgb24gY3VycmVudCBsaW5lLCBzbyB3cmFwICovCi0JCQkJbmV3bGluZSgpOwotCQkJfQotCQkJZ2MuZHJhd1N0cmluZyh3b3JkLCB4LCB5LCBmYWxzZSk7Ci0JCQl4ICs9IHdvcmRXaWR0aDsKLQkJCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld2xpbmUoKSB7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ICs9IGxpbmVIZWlnaHQ7Ci0JCWlmICh5ICsgbGluZUhlaWdodCA+IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCQlpZiAoaW5kZXggKyAxIDwgZW5kKSB7Ci0JCQkJeSA9IHRvcE1hcmdpbjsKLQkJCQlwcmludGVyLnN0YXJ0UGFnZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4MTlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBub24tcmVjdGFuZ3VsYXIgd2luZG93Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzQgewotCi1zdGF0aWMgaW50W10gY2lyY2xlKGludCByLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKLQlpbnRbXSBwb2x5Z29uID0gbmV3IGludFs4ICogciArIDRdOwotCS8veF4yICsgeV4yID0gcl4yCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyICogciArIDE7IGkrKykgewotCQlpbnQgeCA9IGkgLSByOwotCQlpbnQgeSA9IChpbnQpTWF0aC5zcXJ0KHIqciAtIHgqeCk7Ci0JCXBvbHlnb25bMippXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDJdID0gb2Zmc2V0WCArIHg7Ci0JCXBvbHlnb25bOCpyIC0gMippIC0gMV0gPSBvZmZzZXRZIC0geTsKLQl9Ci0JcmV0dXJuIHBvbHlnb247Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gdGhhdCBsb29rcyBsaWtlIGEga2V5IGhvbGUKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCXJlZ2lvbi5hZGQoY2lyY2xlKDY3LCA2NywgNjcpKTsKLQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA2NywgNTApKTsKLQlyZWdpb24uc3VidHJhY3QobmV3IGludFtdezY3LCA1MCwgNTUsIDEwNSwgNzksIDEwNX0pOwotCS8vZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgc2hlbGwgdXNpbmcgc2V0UmVnaW9uCi0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JUmVjdGFuZ2xlIHNpemUgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBtb3ZlIHNoZWxsIGFyb3VuZAotCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCVBvaW50IG9yaWdpbjsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCW9yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9yaWdpbiA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIGUueCwgZS55KTsKLQkJCQkJCXNoZWxsLnNldExvY2F0aW9uKHAueCAtIG9yaWdpbi54LCBwLnkgLSBvcmlnaW4ueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLQkvL2FkZCBhYmlsaXR5IHRvIGNsb3NlIHNoZWxsCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7Ci0JYi5zZXRUZXh0KCJjbG9zZSIpOwotCWIucGFjaygpOwotCWIuc2V0TG9jYXRpb24oMTAsIDY4KTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGY3MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBTd2luZy9BV1QgaW4gU1dUCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNSB7Ci0KLQlzdGF0aWMgY2xhc3MgRmlsZVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewkJCi0JCUZpbGVbXSBmaWxlczsgICAgICAgIAotCQlTdHJpbmdbXSBjb2x1bW5zTmFtZSA9IHsiTmFtZSIsICJTaXplIiwgIkRhdGUgTW9kaWZpZWQifTsKLQkJCi0JCXB1YmxpYyBGaWxlVGFibGVNb2RlbCAoRmlsZVtdIGZpbGVzKSB7Ci0JCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCAoKSB7Ci0JCQlyZXR1cm4gY29sdW1uc05hbWUubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyAoaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gTG9uZy5jbGFzczsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQgKCkgewotCQkJcmV0dXJuIGZpbGVzID09IG51bGwgPyAwIDogZmlsZXMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdCAoaW50IHJvdywgaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAwKSByZXR1cm4gZmlsZXNbcm93XS5nZXROYW1lKCk7Ci0JCQlpZiAoY29sID09IDEpIHJldHVybiBuZXcgTG9uZyhmaWxlc1tyb3ddLmxlbmd0aCgpKTsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIG5ldyBEYXRlKGZpbGVzW3Jvd10ubGFzdE1vZGlmaWVkKCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSAoaW50IGNvbCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lW2NvbF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJTV1QgYW5kIFN3aW5nL0FXVCBFeGFtcGxlIik7Ci0KLQkJTGlzdGVuZXIgZXhpdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCQkJZGlhbG9nLnNldFRleHQoIlF1ZXN0aW9uIik7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoIkV4aXQ/Iik7Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpIGUuZG9pdCA9IGZhbHNlOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFNXVC5PSykgcmV0dXJuOwotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsJCi0JCUxpc3RlbmVyIGFib3V0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmluYWwgU2hlbGwgcyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlzLnNldFRleHQoIkFib3V0Iik7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJCQlzLnNldExheW91dChsYXlvdXQpOwotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHMsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJTV1QgYW5kIEFXVCBFeGFtcGxlLiIpOwotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHMsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXMucGFjaygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcy5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeCA9IHBhcmVudEJvdW5kcy54ICsgKHBhcmVudEJvdW5kcy53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJCWludCB5ID0gcGFyZW50Qm91bmRzLnkgKyAocGFyZW50Qm91bmRzLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCQlzLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCXMub3BlbigpOwotCQkJCXdoaWxlICghcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1iLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVJdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlNZW51SXRlbSBleGl0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlleGl0SXRlbS5zZXRUZXh0KCImRXhpdFx0Q3RybCtYIik7Ci0JCWV4aXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ1gnKTsKLQkJZXhpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJTWVudUl0ZW0gYWJvdXRJdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWFib3V0SXRlbS5zZXRUZXh0KCImQWJvdXRcdEN0cmwrQSIpOwotCQlhYm91dEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNPTlRST0wgKyAnQScpOwotCQlhYm91dEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0JCVJHQiBjb2xvciA9IHNoZWxsLmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJTGFiZWwgc2VwYXJhdG9yMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbG9jYXRpb25MYiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxiLnNldFRleHQoIkxvY2F0aW9uOiIpOwotCQlDb21wb3NpdGUgbG9jYXRpb25Db21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQkJVG9vbEl0ZW0gZXhpdFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJZXhpdFRvb2xJdGVtLnNldFRleHQoIiZFeGl0Iik7Ci0JCWV4aXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBleGl0TGlzdGVuZXIpOwotCQlUb29sSXRlbSBhYm91dFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJYWJvdXRUb29sSXRlbS5zZXRUZXh0KCImQWJvdXQiKTsKLQkJYWJvdXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBhYm91dExpc3RlbmVyKTsKLQkJTGFiZWwgc2VwYXJhdG9yMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFRyZWUgZmlsZVRyZWUgPSBuZXcgVHJlZShjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVNhc2ggc2FzaCA9IG5ldyBTYXNoKGNvbXAsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5FTUJFRERFRCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdGF0dXNDb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBsb2NhdGlvbkZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUobG9jYXRpb25Db21wKTsKLQkJZmluYWwgamF2YS5hd3QuVGV4dEZpZWxkIGxvY2F0aW9uVGV4dCA9IG5ldyBqYXZhLmF3dC5UZXh0RmllbGQoKTsKLQkJbG9jYXRpb25GcmFtZS5hZGQobG9jYXRpb25UZXh0KTsKLQotCQlqYXZhLmF3dC5GcmFtZSBmaWxlVGFibGVGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHRhYmxlQ29tcCk7Ci0JCWphdmEuYXd0LlBhbmVsIHBhbmVsID0gbmV3IGphdmEuYXd0LlBhbmVsKG5ldyBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQoKSk7Ci0JCWZpbGVUYWJsZUZyYW1lLmFkZChwYW5lbCk7Ci0JCWZpbmFsIEpUYWJsZSBmaWxlVGFibGUgPSBuZXcgSlRhYmxlKG5ldyBGaWxlVGFibGVNb2RlbChudWxsKSk7Ci0JCWZpbGVUYWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJZmlsZVRhYmxlLnNldFNob3dHcmlkKGZhbHNlKTsKLQkJZmlsZVRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUoZmlsZVRhYmxlKTsKLQkJcGFuZWwuYWRkKHNjcm9sbFBhbmUpOwotCi0JCWphdmEuYXd0LkZyYW1lIHN0YXR1c0ZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoc3RhdHVzQ29tcCk7Ci0JCXN0YXR1c0ZyYW1lLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKLQkJZmluYWwgamF2YS5hd3QuTGFiZWwgc3RhdHVzTGFiZWwgPSBuZXcgamF2YS5hd3QuTGFiZWwoKTsKLQkJc3RhdHVzRnJhbWUuYWRkKHN0YXR1c0xhYmVsKTsKLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiU2VsZWN0IGEgZmlsZSIpOwotCi0JCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuRFJBRykgcmV0dXJuOwotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpZmlsZVRyZWUuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCVJlY3RhbmdsZSB0cmltID0gZmlsZVRyZWUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSBlLnggLSB0cmltLndpZHRoOwotCQkJCWNvbXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUZpbGVbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0oZmlsZVRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl0cmVlSXRlbS5zZXREYXRhKGZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JCX0KLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxKSB7Ci0JCQkJCVRyZWVJdGVtIGZpcnN0SXRlbSA9IGl0ZW0uZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGZpcnN0SXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCQlmaXJzdEl0ZW0uZGlzcG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlmaW5hbCBGaWxlIHJvb3QgPSAoRmlsZSlpdGVtLmdldERhdGEoKTsKLQkJCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KHJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJZmlsZVRhYmxlLnNldE1vZGVsKG5ldyBGaWxlVGFibGVNb2RlbChyb290Lmxpc3RGaWxlcygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlsb2NhdGlvbkxiLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGxvY2F0aW9uVGV4dC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlsb2NhdGlvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLmhlaWdodEhpbnQgPSBzdGF0dXNMYWJlbC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlzdGF0dXNDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsJCQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWZpbGVUcmVlLnNldExheW91dERhdGEoZGF0YSk7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGVDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTUwYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCBmcm9tIG1lbW9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlTdHJpbmcgaHRtbCA9ICI8SFRNTD48SEVBRD48VElUTEU+SFRNTCBUZXN0PC9USVRMRT48L0hFQUQ+PEJPRFk+IjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgaHRtbCArPSAiPFA+VGhpcyBpcyBsaW5lICIraSsiPC9QPiI7Ci0JCWh0bWwgKz0gIjwvQk9EWT48L0hUTUw+IjsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjZjc0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHJlbmRlciBIVE1MIHRoYXQgaW5jbHVkZXMgcmVsYXRpdmUgbGlua3MgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JLyogUmVsYXRpdmUgbGlua3M6IHVzZSB0aGUgSFRNTCBiYXNlIHRhZyAqLwotCVN0cmluZyBodG1sID0gIjxodG1sPjxoZWFkPiIrCi0JCSI8YmFzZSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvXCIgPiIrCi0JCSI8dGl0bGU+SFRNTCBUZXN0PC90aXRsZT48L2hlYWQ+IisKLQkJIjxib2R5PjxhIGhyZWY9XCJmYXEucGhwXCI+bG9jYWwgbGluazwvYT48L2JvZHk+PC9odG1sPiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjODQyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogc2V0IGljb25zIHdpdGggZGlmZmVyZW50IHJlc29sdXRpb25zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCUltYWdlIHNtYWxsID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JCUdDIGdjID0gbmV3IEdDKHNtYWxsKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbEFyYygwLCAwLCAxNiwgMTYsIDQ1LCAyNzApOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlJbWFnZSBsYXJnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpOwotCQlnYyA9IG5ldyBHQyhsYXJnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMzIsIDMyLCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJLyogUHJvdmlkZSBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgZm9yIGljb25zIHRvIGdldAotCQkgKiBoaWdoIHF1YWxpdHkgcmVuZGVyaW5nIHdoZXJldmVyIHRoZSBPUyBuZWVkcyAKLQkJICogbGFyZ2UgaWNvbnMuIEZvciBleGFtcGxlLCB0aGUgQUxUK1RBQiB3aW5kb3cgCi0JCSAqIG9uIGNlcnRhaW4gc3lzdGVtcyB1c2VzIGEgbGFyZ2VyIGljb24uCi0JCSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU21hbGwgYW5kIExhcmdlIGljb25zIik7Ci0JCXNoZWxsLnNldEltYWdlcyhuZXcgSW1hZ2VbXSB7c21hbGwsIGxhcmdlfSk7Ci0KLQkJLyogTm8gbGFyZ2UgaWNvbjogdGhlIE9TIHdpbGwgc2NhbGUgdXAgdGhlCi0JCSAqIHNtYWxsIGljb24gd2hlbiBpdCBuZWVkcyBhIGxhcmdlIG9uZS4KLQkJICovCi0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldFRleHQoIlNtYWxsIGljb24iKTsKLQkJc2hlbGwyLnNldEltYWdlKHNtYWxsKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwyLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJc21hbGwuZGlzcG9zZSgpOwotCQlsYXJnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MWY3NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUaGlzIHNuaXBwZXQgd2FzIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXMgaW4gCi0gKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmRyYXcyZC8/Y3Zzcm9vdD1Ub29sc19Qcm9qZWN0Ci0gKiBieSBQcmF0aWsgU2hhaC4KLSAqCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHJvdGF0ZSBhbmQgZmxpcCBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzkgewkKLQotc3RhdGljIEltYWdlRGF0YSByb3RhdGUoSW1hZ2VEYXRhIHNyY0RhdGEsIGludCBkaXJlY3Rpb24pIHsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IHNyY0RhdGEuYnl0ZXNQZXJMaW5lIC8gc3JjRGF0YS53aWR0aDsKLQlpbnQgZGVzdEJ5dGVzUGVyTGluZSA9IChkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbCA6IHNyY0RhdGEuaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlWyhkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLmhlaWdodCAqIGRlc3RCeXRlc1BlckxpbmUgOiBzcmNEYXRhLndpZHRoICogZGVzdEJ5dGVzUGVyTGluZV07Ci0JaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pewotCQkJCWNhc2UgU1dULkxFRlQ6IC8vIGxlZnQgOTAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY1k7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUklHSFQ6IC8vIHJpZ2h0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQlkZXN0WSA9IHNyY1g7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS5oZWlnaHQ7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEud2lkdGg7IAotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ET1dOOiAvLyAxODAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEud2lkdGg7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEuaGVpZ2h0OyAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBzcmNEYXRhLmRlcHRoLCBzcmNEYXRhLnBhbGV0dGUsIGRlc3RCeXRlc1BlckxpbmUsIG5ld0RhdGEpOwotfQotc3RhdGljIEltYWdlRGF0YSBmbGlwKEltYWdlRGF0YSBzcmNEYXRhLCBib29sZWFuIHZlcnRpY2FsKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW3NyY0RhdGEuZGF0YS5sZW5ndGhdOwotCWZvciAoaW50IHNyY1kgPSAwOyBzcmNZIDwgc3JjRGF0YS5oZWlnaHQ7IHNyY1krKykgewotCQlmb3IgKGludCBzcmNYID0gMDsgc3JjWCA8IHNyY0RhdGEud2lkdGg7IHNyY1grKykgewotCQkJaW50IGRlc3RYID0gMCwgZGVzdFkgPSAwLCBkZXN0SW5kZXggPSAwLCBzcmNJbmRleCA9IDA7Ci0JCQlpZiAodmVydGljYWwpewotCQkJCWRlc3RYID0gc3JjWDsKLQkJCQlkZXN0WSA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3RYID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCWRlc3RZID0gc3JjWTsgCi0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YShzcmNEYXRhLndpZHRoLCBzcmNEYXRhLmhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBkZXN0Qnl0ZXNQZXJMaW5lLCBuZXdEYXRhKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGhlIHdvcmQgImhlbGxvIiBvbiBpdAotCWZpbmFsIEltYWdlIGltYWdlMCA9IG5ldyBJbWFnZShkaXNwbGF5LCA1MCwgMzApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlMC5nZXRCb3VuZHMoKSk7Ci0JZ2MuZHJhd1N0cmluZygiaGVsbG8iLAk1LCA1LCB0cnVlKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZTAuZ2V0SW1hZ2VEYXRhKCk7Ci0JLy8gcm90YXRlIGFuZCBmbGlwIHRoaXMgaW1hZ2UKLQlmaW5hbCBJbWFnZSBpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5MRUZUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UyID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuUklHSFQpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTMgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5ET1dOKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2U0ID0gbmV3IEltYWdlKGRpc3BsYXksIGZsaXAoZGF0YSwgdHJ1ZSkpOwotCWZpbmFsIEltYWdlIGltYWdlNSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIGZhbHNlKSk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkvLyBkcmF3IHRoZSByZXN1bHRzIG9uIHRoZSBzaGVsbAotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3VGV4dCgiT3JpZ2luYWwgSW1hZ2U6IiwgMTAsIDEwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMCwgMTAsIDQwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkxlZnQsIFJpZ2h0LCAxODA6IiwgMTAsIDgwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMSwgMTAsIDExMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTIsIDUwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UzLCA5MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkZsaXBwZWQgVmVydGljYWwsIEhvcml6b250YWw6IiwgMTAsIDE3MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTQsIDEwLCAyMDApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U1LCA3MCwgMjAwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlMC5kaXNwb3NlKCk7Ci0JaW1hZ2UxLmRpc3Bvc2UoKTsKLQlpbWFnZTIuZGlzcG9zZSgpOwotCWltYWdlMy5kaXNwb3NlKCk7Ci0JaW1hZ2U0LmRpc3Bvc2UoKTsKLQlpbWFnZTUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzZiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBlbnRlciwgZXhpdCBhbmQgaG92ZXIgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVOVEVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVYSVQiKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkhPVkVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2U4Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBkcm9wLWRvd24gYSBjaGV2cm9uIG1lbnUgY29udGFpbmluZyBoaWRkZW4gdG9vbCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQwIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgQ29vbEJhciBjb29sQmFyOwotCXN0YXRpYyBNZW51IGNoZXZyb25NZW51ID0gbnVsbDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQljb29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUIHwgU1dULldSQVApOwotCWludCBtaW5XaWR0aCA9IDA7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJaW50IHdpZHRoID0gMDsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQiIgKyBqKTsKLQkJd2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCS8qIGZpbmQgdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgdG9vbCAqLwotCQlpZiAod2lkdGggPiBtaW5XaWR0aCkgbWluV2lkdGggPSB3aWR0aDsKLQl9Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShtaW5XaWR0aCwgY29vbFNpemUueSk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCUNvb2xJdGVtIGl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpIGl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCQlUb29sSXRlbVtdIHRvb2xzID0gYmFyLmdldEl0ZW1zICgpOwotCQkJCQotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHRvb2xzLmxlbmd0aCkgewotCQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQkJcHQgPSBiYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJCQkKLQkJCQkJLyogRmlndXJlIG91dCB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB0b29sIGJ5IGxvb2tpbmcgYXQgdGhlCi0JCQkJCSAqIGludGVyc2VjdGlvbiBvZiB0aGUgdG9vbCBib3VuZHMgd2l0aCB0aGUgY29vbCBpdGVtIGJvdW5kcy4gKi8KLQkJCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkJICAJCQotCQkJCQkvKiBJZiB0aGUgdG9vbCBpcyBub3QgY29tcGxldGVseSB3aXRoaW4gdGhlIGNvb2wgaXRlbSBib3VuZHMsIHRoZW4gaXQKLQkJCQkJICogaXMgcGFydGlhbGx5IGhpZGRlbiwgYW5kIGFsbCByZW1haW5pbmcgdG9vbHMgYXJlIGNvbXBsZXRlbHkgaGlkZGVuLiAqLwotCQkJICAJCWlmICghaW50ZXJzZWN0aW9uLmVxdWFscyAodG9vbEJvdW5kcykpIGJyZWFrOwotCQkJICAJCWkrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogQ3JlYXRlIGEgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBjb21wbGV0ZWx5IGhpZGRlbiBidXR0b25zLiAqLwotCQkJCWlmIChjaGV2cm9uTWVudSAhPSBudWxsKSBjaGV2cm9uTWVudS5kaXNwb3NlKCk7Ci0JCQkJY2hldnJvbk1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29scy5sZW5ndGg7IGorKykgewotCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAoY2hldnJvbk1lbnUsIFNXVC5QVVNIKTsKLQkJCQkJbWVudUl0ZW0uc2V0VGV4dCAodG9vbHNbal0uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogRHJvcCBkb3duIHRoZSBtZW51IGJlbG93IHRoZSBjaGV2cm9uLCB3aXRoIHRoZSBsZWZ0IGVkZ2VzIGFsaWduZWQuICovCi0JCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCWNoZXZyb25NZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQljaGV2cm9uTWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMWU2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBhbmltYXRlZCBHSUYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDEgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBHQyBzaGVsbEdDOwotCXN0YXRpYyBDb2xvciBzaGVsbEJhY2tncm91bmQ7Ci0Jc3RhdGljIEltYWdlTG9hZGVyIGxvYWRlcjsKLQlzdGF0aWMgSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7Ci0Jc3RhdGljIFRocmVhZCBhbmltYXRlVGhyZWFkOwotCXN0YXRpYyBJbWFnZSBpbWFnZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VHSUZCYWNrZ3JvdW5kID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsR0MgPSBuZXcgR0Moc2hlbGwpOwotCQlzaGVsbEJhY2tncm91bmQgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouZ2lmIn0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQl0cnkgewotCQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCWFuaW1hdGVUaHJlYWQgPSBuZXcgVGhyZWFkKCJBbmltYXRpb24iKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLyogQ3JlYXRlIGFuIG9mZi1zY3JlZW4gaW1hZ2UgdG8gZHJhdyBvbiwgYW5kIGZpbGwgaXQgd2l0aCB0aGUgc2hlbGwgYmFja2dyb3VuZC4gKi8KLQkJCQkJCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKDAsIDAsIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCQkJCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLyogQ3JlYXRlIHRoZSBmaXJzdCBpbWFnZSBhbmQgZHJhdyBpdCBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZS4gKi8KLQkJCQkJCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsJCi0JCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJCQkJCQkvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBpbWFnZXMsIGNyZWF0aW5nIGFuZCBkcmF3aW5nIGVhY2ggb25lCi0JCQkJCQkJCSAqIG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlIGJlZm9yZSBkcmF3aW5nIGl0IG9uIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJaW50IHJlcGVhdENvdW50ID0gbG9hZGVyLnJlcGVhdENvdW50OwotCQkJCQkJCQl3aGlsZSAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EOgotCQkJCQkJCQkJCS8qIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCQkJCQlpZiAodXNlR0lGQmFja2dyb3VuZCAmJiBsb2FkZXIuYmFja2dyb3VuZFBpeGVsICE9IC0xKSB7Ci0JCQkJCQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNXVC5ETV9GSUxMX1BSRVZJT1VTOgotCQkJCQkJCQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGltYWdlIGJlZm9yZSBkcmF3aW5nLiAqLwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCQkJCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQkJCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBEcmF3IHRoZSBvZmYtc2NyZWVuIGltYWdlIHRvIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJCXNoZWxsR0MuZHJhd0ltYWdlKG9mZlNjcmVlbkltYWdlLCAwLCAwKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSAoYWRkaW5nIGNvbW1vbmx5LXVzZWQgc2xvdy1kb3duIGZ1ZGdlIGZhY3RvcnMpLiAqLwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpbnQgbXMgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCQkJCQkJCQkJaWYgKG1zIDwgMjApIG1zICs9IDMwOwotCQkJCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UsIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50IGFuZCBzdGFydCBhZ2Fpbi4gKi8KLQkJCQkJCQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSBpbWFnZURhdGFBcnJheS5sZW5ndGggLSAxKSByZXBlYXRDb3VudC0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGFuaW1hdGluZyB0aGUgR0lGIik7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlICE9IG51bGwgJiYgIW9mZlNjcmVlbkltYWdlLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2VHQyAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZUdDLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2VHQy5kaXNwb3NlKCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWFuaW1hdGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgR0lGIik7Ci0JCQl9Ci0JCX0KLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmMTRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IG1vdXNlIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsU1dULk5PTkUpOwotCWJ1dHRvbi5zZXRTaXplKDEwMCwxMDApOwotCWJ1dHRvbi5zZXRUZXh0KCJDbGljayIpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIERvd24gKGJ1dHRvbjogIiArIGUuYnV0dG9uICsgIiB4OiAiICsgZS54ICsgIiB5OiAiICsgZS55ICsgIikiKTsKLQkJfQotCX0pOwotCWZpbmFsIFBvaW50IHB0ID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIDUwLCA1MCk7Ci0JbmV3IFRocmVhZCgpewotCQlFdmVudCBldmVudDsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLQkJCWV2ZW50LnggPSBwdC54OwotCQkJZXZlbnQueSA9IHB0Lnk7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGE5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVHJheSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFuIGljb24gd2l0aCBhIHBvcHVwIG1lbnUgb24gdGhlIHN5c3RlbSB0cmF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCWZpbmFsIFRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSAoKTsKLQlpZiAodHJheSA9PSBudWxsKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRoZSBzeXN0ZW0gdHJheSBpcyBub3QgYXZhaWxhYmxlIik7Ci0JfSBlbHNlIHsKLQkJZmluYWwgVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSAodHJheSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QgVHJheUl0ZW0iKTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3ciKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5IaWRlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJoaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0IHNlbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQltaS5zZXRUZXh0ICgiSXRlbSIgKyBpKTsKLQkJCW1pLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiAiICsgZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChpID09IDApIG1lbnUuc2V0RGVmYXVsdEl0ZW0obWkpOwotCQl9Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0Jc2hlbGwuc2V0Qm91bmRzKDUwLCA1MCwgMzAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5NjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ0IHsKLQotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaW5kZXgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtLmdldFRleHQgKCkpOwotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNjUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgaW50ZXJuYXRpb25hbGl6ZWQgc3R5bGVkIHRleHQgb24gYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQkKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIk1TIE1pbmNobyIsIDIwLCBTV1QuSVRBTElDKTsKLQkJRm9udCBmb250MyA9IG5ldyBGb250KGRpc3BsYXksICJBcmFiaWMgVHJhbnNwYXJlbnQiLCAxOCwgU1dULk5PUk1BTCk7Ci0JCQotCQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JCQotCQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgeWVsbG93LCBibHVlKTsKLQkJVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGdyZWVuLCBudWxsKTsKLQkJVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGJsdWUsIGdyYXkpOwotCQkKLQkJbGF5b3V0LnNldFRleHQoIkVuZ2xpc2ggXHU2NUU1XHU2NzJDXHU4QTlFICBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2NTFcdTA2MjkiKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMCwgNik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTIsIDgsIDEwKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMTMsIDIxKTsKLQkJCQkJCi0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgMTAsIDEwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJZm9udDMuZGlzcG9zZSgpOwotCQlsYXlvdXQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjI5YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3Qga2V5IGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0U2l6ZSh0ZXh0LmNvbXB1dGVTaXplKDE1MCwgU1dULkRFRkFVTFQpKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW5ldyBUaHJlYWQoKXsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIkxvdmUgdGhlIG1ldGhvZC4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KGkpOwotCQkJCWJvb2xlYW4gc2hpZnQgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpOwotCQkJCWNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLQkJCQlpZiAoc2hpZnQpIHsKLQkJCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCQkJZXZlbnQuY2hhcmFjdGVyID0gY2g7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSBTV1QuU0hJRlQ7Ci0JCQkJCWRpc3BsYXkucG9zdChldmVudCk7CQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI5ZDViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogc3RvcCBDUiBmcm9tIGdvaW5nIHRvIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ3ICB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIFNXVC5OT05FKTsKLQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQljb21iby5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21ibyBkZWZhdWx0IHNlbGVjdGVkIChvdmVycmlkZXMgZGVmYXVsdCBidXR0b24pIik7Ci0JCX0KLQl9KTsKLQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTVjMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogY2hlY2sgaWYgdGhlIGJyb3dzZXIgaXMgYXZhaWxhYmxlIG9yIG5vdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ4IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQkvKiBUaGUgQnJvd3NlciB3aWRnZXQgdGhyb3dzIGFuIFNXVEVycm9yIGlmIGl0IGZhaWxzIHRvCi0JCQkgKiBpbnN0YW50aWF0ZSBwcm9wZXJseS4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgY2F0Y2gKLQkJCSAqIHRoaXMgU1dURXJyb3IgYW5kIGRpc2FibGUgYW55IGZlYXR1cmUgcmVxdWlyaW5nIHRoZQotCQkJICogQnJvd3NlciB3aWRnZXQuCi0JCQkgKiBQbGF0Zm9ybSByZXF1aXJlbWVudHMgZm9yIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgYXJlIGF2YWlsYWJsZQotCQkJICogZnJvbSB0aGUgU1dUIEZBUSB3ZWJzaXRlLiAKLQkJCSAqLwotCQl9Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCS8qIFRoZSBCcm93c2VyIHdpZGdldCBjYW4gYmUgdXNlZCAqLwotCQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJfQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzYzMTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBwcm9ncmVzcyBiYXIgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgewotCQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JCXRhYmxlLmdldENvbHVtbiAoMCkuc2V0VGV4dCAoIlRhc2siKTsKLQkJdGFibGUuZ2V0Q29sdW1uICgxKS5zZXRUZXh0ICgiUHJvZ3Jlc3MiKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIlRhc2sgIiArIGkpOwotCQkJaWYgKCBpICUgNSA9PSAwKSB7Ci0JCQkJUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWJhci5zZXRTZWxlY3Rpb24gKGkpOwotCQkJCVRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQkJCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkJCWVkaXRvci5zZXRFZGl0b3IgKGJhciwgaXRlbSwgMSk7Ci0JCQl9Ci0JCX0KLQkJdGFibGUuZ2V0Q29sdW1uICgwKS5wYWNrICgpOwotCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnNldFdpZHRoICgxMjgpOwotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZWRjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWlJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMCkgLSIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gakl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGlJdGVtLCAwKTsKLQkJCWpJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMSkgLSIgKyBqKTsKLQkJCWZvciAoaW50IGs9MDsgazw0OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBrSXRlbSA9IG5ldyBUcmVlSXRlbSAoakl0ZW0sIDApOwotCQkJCWtJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMikgLSIgKyBrKTsKLQkJCQlmb3IgKGludCBsPTA7IGw8NDsgbCsrKSB7Ci0JCQkJCVRyZWVJdGVtIGxJdGVtID0gbmV3IFRyZWVJdGVtIChrSXRlbSwgMCk7Ci0JCQkJCWxJdGVtLnNldFRleHQgKCJUcmVlSXRlbSAoMykgLSIgKyBsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmMTJmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2xiYXIgKHJlbGF5b3V0IHdoZW4gcmVzaXplZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTAgewotCi1zdGF0aWMgaW50IGl0ZW1Db3VudDsKLXN0YXRpYyBDb29sSXRlbSBjcmVhdGVJdGVtKENvb2xCYXIgY29vbEJhciwgaW50IGNvdW50KSB7Ci0gICAgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1Db3VudCsrICsiIik7Ci0gICAgfQotICAgIHRvb2xCYXIucGFjaygpOwotICAgIFBvaW50IHNpemUgPSB0b29sQmFyLmdldFNpemUoKTsKLSAgICBDb29sSXRlbSBpdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0gICAgUG9pbnQgcHJlZmVycmVkID0gaXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0gICAgaXRlbS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZCk7Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIENvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAzKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDIpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMyk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCA0KTsKLSAgICBpbnQgc3R5bGUgPSBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBzdHlsZSk7Ci0gICAgRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotICAgIHNoZWxsLnNldExheW91dChsYXlvdXQpOwotICAgIEZvcm1EYXRhIGNvb2xEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgY29vbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGNvb2xEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBjb29sQmFyLnNldExheW91dERhdGEoY29vbERhdGEpOwotICAgIGNvb2xCYXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgc2hlbGwubGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBGb3JtRGF0YSB0ZXh0RGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIHRleHREYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgdGV4dERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICB0ZXh0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29vbEJhcik7Ci0gICAgdGV4dERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKHRleHREYXRhKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiMmRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSB2aXJ0dWFsIHRhYmxlIGFuZCBhZGQgMTAwMCBlbnRyaWVzIHRvIGl0IGV2ZXJ5IDUwMCBtcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTEgewotCi1zdGF0aWMgaW50W10gZGF0YSA9IG5ldyBpbnRbMF07Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVklSVFVBTCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQlpdGVtLnNldFRleHQoIkl0ZW0gIitkYXRhW2luZGV4XSk7Ci0JCX0KLQl9KTsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JCQl3aGlsZSAoY291bnQrKyA8IDUwMCkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkvLyBhZGQgMTAgcmFuZG9tIG51bWJlcnMgdG8gYXJyYXkgYW5kIHNvcnQKLQkJCQlpbnQgZ3JvdyA9IDEwOwotCQkJCWludFtdIG5ld0RhdGEgPSBuZXcgaW50W2RhdGEubGVuZ3RoICsgZ3Jvd107Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCQkJaW50IGluZGV4ID0gZGF0YS5sZW5ndGg7Ci0JCQkJZGF0YSA9IG5ld0RhdGE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBncm93OyBqKyspIHsKLQkJCQkJZGF0YVtpbmRleCsrXSA9IHJhbmRvbS5uZXh0SW50KCk7Ci0JCQkJfQotCQkJCUFycmF5cy5zb3J0KGRhdGEpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQl0YWJsZS5zZXRJdGVtQ291bnQoZGF0YS5sZW5ndGgpOwotCQkJCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDUwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9Ci0JCQl9Ci0JCX0KLQl9OwotCXRocmVhZC5zdGFydCgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkgfHwgdGhyZWFkLmlzQWxpdmUoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTJkNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIGFuIGl0ZW0gaXMgYXJtZWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgTGlzdGVuZXIgYXJtTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBzaG93TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSAoTWVudSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQoaXRlbS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBMaXN0ZW5lciBoaWRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBsYWJlbC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGxhYmVsLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBGb3JtRGF0YSBsYWJlbERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLSAgICBsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBsYWJlbERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotICAgIE1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLSAgICBzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotICAgIE1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBmaWxlSXRlbS5zZXRUZXh0KCJGaWxlIik7Ci0gICAgZmlsZUl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLSAgICBlZGl0SXRlbS5zZXRUZXh0KCJFZGl0Iik7Ci0gICAgZWRpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIE1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZmlsZU1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgZmlsZUl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0gICAgU3RyaW5nW10gZmlsZVN0cmluZ3MgPSB7ICJOZXciLCAiQ2xvc2UiLCAiRXhpdCIgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGZpbGVTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIE1lbnUgZWRpdE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGhpZGVMaXN0ZW5lcik7Ci0gICAgZWRpdE1lbnUuYWRkTGlzdGVuZXIoU1dULlNob3csIHNob3dMaXN0ZW5lcik7Ci0gICAgU3RyaW5nW10gZWRpdFN0cmluZ3MgPSB7ICJDdXQiLCAiQ29weSIsICJQYXN0ZSIgfTsKLSAgICBlZGl0SXRlbS5zZXRNZW51KGVkaXRNZW51KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0oZWRpdE1lbnUsIFNXVC5QVVNIKTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KGVkaXRTdHJpbmdzW2ldKTsKLSAgICAgICAgaXRlbS5hZGRMaXN0ZW5lcihTV1QuQXJtLCBhcm1MaXN0ZW5lcik7Ci0gICAgfQotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2ODYyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHN0YXR1cyBsaW5lIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGEgVG9vbEl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUzIHsKLQkKLXN0YXRpYyBTdHJpbmcgc3RhdHVzVGV4dCA9ICIiOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotICAgIGZpbmFsIFRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIGJhci5zZXRCb3VuZHMoMTAsIDEwLCAxNTAsIDUwKTsKLSAgICBmaW5hbCBMYWJlbCBzdGF0dXNMaW5lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBzdGF0dXNMaW5lLnNldEJvdW5kcygxMCwgOTAsIDE1MCwgMzApOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDEiKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAyIik7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMyIpOwotICAgIGJhci5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIFRvb2xJdGVtIGl0ZW0gPSBiYXIuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGl0ZW0uZ2V0VGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdGF0dXNUZXh0LmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpbmUuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0pOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5N2NhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgYSBKVGFibGUgaW4gU1dUIChubyBmbGlja2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5QYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQgfCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyoKLQkJKiBTZXQgYSBXaW5kb3dzIHNwZWNpZmljIEFXVCBwcm9wZXJ0eSB0aGF0IHByZXZlbnRzIGhlYXZ5d2VpZ2h0Ci0JCSogY29tcG9uZW50cyBmcm9tIGVyYXNpbmcgdGhlaXIgYmFja2dyb3VuZC4gTm90ZSB0aGF0IHRoaXMKLQkJKiBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBhbmQgY2Fubm90IGJlIHNjb3BlZC4gSXQgbWlnaHQgbm90IGJlCi0JCSogc3VpdGFibGUgZm9yIHlvdXIgYXBwbGljYXRpb24uCi0JCSovCi0JCXRyeSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoInN1bi5hd3Qubm9lcmFzZWJhY2tncm91bmQiLCJ0cnVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGVycm9yKSB7fQotCi0JCS8qIENyZWF0ZSBhbmQgc2V0dGluZyB1cCBmcmFtZSAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCVBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSkgewotCQkJcHVibGljIHZvaWQgdXBkYXRlKGphdmEuYXd0LkdyYXBoaWNzIGcpIHsKLQkJCQkvKiBEbyBub3QgZXJhc2UgdGhlIGJhY2tncm91bmQgKi8gCi0JCQkJcGFpbnQoZyk7Ci0JCQl9Ci0JCX07Ci0JCWZyYW1lLmFkZChwYW5lbCk7Ci0JCUpSb290UGFuZSByb290ID0gbmV3IEpSb290UGFuZSgpOwotCQlwYW5lbC5hZGQocm9vdCk7Ci0JCWphdmEuYXd0LkNvbnRhaW5lciBjb250ZW50UGFuZSA9IHJvb3QuZ2V0Q29udGVudFBhbmUoKTsKLQotCQkvKiBDcmVhdGluZyBjb21wb25lbnRzICovCi0JCWludCBucm93cyA9IDEwMDAsIG5jb2x1bW5zID0gMTA7Ci0JCVZlY3RvciByb3dzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5yb3dzOyBpKyspIHsKLQkJCVZlY3RvciByb3cgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKLQkJCQlyb3cuYWRkRWxlbWVudCgiSXRlbSAiICsgaSArICItIiArIGopOwotCQkJfQotCQkJcm93cy5hZGRFbGVtZW50KHJvdyk7Ci0JCX0KLQkJVmVjdG9yIGNvbHVtbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbHVtbnM7IGkrKykgewotCQkJY29sdW1ucy5hZGRFbGVtZW50KCJDb2x1bW4gIiArIGkpOwotCQl9Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUocm93cywgY29sdW1ucyk7Ci0JCXRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9PRkYpOwotCQl0YWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRhYmxlKTsKLQkJY29udGVudFBhbmUuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWNvbnRlbnRQYW5lLmFkZChzY3JvbGxQYW5lKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjNkOGVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYW4gWCB1c2luZyBBV1QgR3JhcGhpY3MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5DYW52YXM7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRU1CRURERUQpOwotCQkKLQkJLyogRHJhdyBhbiBYIHVzaW5nIEFXVCAqLwotCQlGcmFtZSBmcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGNvbXBvc2l0ZSk7Ci0JCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnQgKEdyYXBoaWNzIGcpIHsKLQkJCQlEaW1lbnNpb24gZCA9IGdldFNpemUoKTsKLQkJCQlnLmRyYXdMaW5lKDAsIDAsIGQud2lkdGgsIGQuaGVpZ2h0KTsKLQkJCQlnLmRyYXdMaW5lKGQud2lkdGgsIDAsIDAsIGQuaGVpZ2h0KTsKLQkJCX0KLQkJfTsKLQkJZnJhbWUuYWRkKGNhbnZhcyk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTA5NDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGNvbnZlcnQgYmV0d2VlbiBTV1QgSW1hZ2UgYW5kIEFXVCBCdWZmZXJlZEltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0Lkluc2V0czsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGlyZWN0Q29sb3JNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbmRleENvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NiB7Ci0JCi1zdGF0aWMgQnVmZmVyZWRJbWFnZSBjb252ZXJ0VG9BV1QoSW1hZ2VEYXRhIGRhdGEpIHsKLQlDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSBudWxsOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBkYXRhLnBhbGV0dGU7Ci0JaWYgKHBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJY29sb3JNb2RlbCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHBhbGV0dGUucmVkTWFzaywgcGFsZXR0ZS5ncmVlbk1hc2ssIHBhbGV0dGUuYmx1ZU1hc2spOwotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCVJHQiByZ2IgPSBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQkJcGl4ZWxBcnJheVswXSA9IHJnYi5yZWQ7Ci0JCQkJcGl4ZWxBcnJheVsxXSA9IHJnYi5ncmVlbjsKLQkJCQlwaXhlbEFycmF5WzJdID0gcmdiLmJsdWU7Ci0JCQkJcmFzdGVyLnNldFBpeGVscyh4LCB5LCAxLCAxLCBwaXhlbEFycmF5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9IGVsc2UgewotCQlSR0JbXSByZ2JzID0gcGFsZXR0ZS5nZXRSR0JzKCk7Ci0JCWJ5dGVbXSByZWQgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBncmVlbiA9IG5ldyBieXRlW3JnYnMubGVuZ3RoXTsKLQkJYnl0ZVtdIGJsdWUgPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmdicy5sZW5ndGg7IGkrKykgewotCQkJUkdCIHJnYiA9IHJnYnNbaV07Ci0JCQlyZWRbaV0gPSAoYnl0ZSlyZ2IucmVkOwotCQkJZ3JlZW5baV0gPSAoYnl0ZSlyZ2IuZ3JlZW47Ci0JCQlibHVlW2ldID0gKGJ5dGUpcmdiLmJsdWU7Ci0JCX0KLQkJaWYgKGRhdGEudHJhbnNwYXJlbnRQaXhlbCAhPSAtMSkgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUsIGRhdGEudHJhbnNwYXJlbnRQaXhlbCk7Ci0JCX0gZWxzZSB7Ci0JCQljb2xvck1vZGVsID0gbmV3IEluZGV4Q29sb3JNb2RlbChkYXRhLmRlcHRoLCByZ2JzLmxlbmd0aCwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCX0JCQotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShjb2xvck1vZGVsLCBjb2xvck1vZGVsLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihkYXRhLndpZHRoLCBkYXRhLmhlaWdodCksIGZhbHNlLCBudWxsKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlpbnQgcGl4ZWwgPSBkYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJCXBpeGVsQXJyYXlbMF0gPSBwaXhlbDsKLQkJCQlyYXN0ZXIuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNvbnZlcnRUb1NXVChCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UpIHsKLQlpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBEaXJlY3RDb2xvck1vZGVsKSB7Ci0JCURpcmVjdENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChEaXJlY3RDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKGNvbG9yTW9kZWwuZ2V0UmVkTWFzaygpLCBjb2xvck1vZGVsLmdldEdyZWVuTWFzaygpLCBjb2xvck1vZGVsLmdldEJsdWVNYXNrKCkpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbM107Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKHBpeGVsQXJyYXlbMF0sIHBpeGVsQXJyYXlbMV0sIHBpeGVsQXJyYXlbMl0pKTsKLQkJCQlkYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBkYXRhOwkJCi0JfSBlbHNlIGlmIChidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKSBpbnN0YW5jZW9mIEluZGV4Q29sb3JNb2RlbCkgewotCQlJbmRleENvbG9yTW9kZWwgY29sb3JNb2RlbCA9IChJbmRleENvbG9yTW9kZWwpYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCk7Ci0JCWludCBzaXplID0gY29sb3JNb2RlbC5nZXRNYXBTaXplKCk7Ci0JCWJ5dGVbXSByZWRzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBncmVlbnMgPSBuZXcgYnl0ZVtzaXplXTsKLQkJYnl0ZVtdIGJsdWVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWNvbG9yTW9kZWwuZ2V0UmVkcyhyZWRzKTsKLQkJY29sb3JNb2RlbC5nZXRHcmVlbnMoZ3JlZW5zKTsKLQkJY29sb3JNb2RlbC5nZXRCbHVlcyhibHVlcyk7Ci0JCVJHQltdIHJnYnMgPSBuZXcgUkdCW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCXJnYnNbaV0gPSBuZXcgUkdCKHJlZHNbaV0gJiAweEZGLCBncmVlbnNbaV0gJiAweEZGLCBibHVlc1tpXSAmIDB4RkYpOwotCQl9Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0JCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShidWZmZXJlZEltYWdlLmdldFdpZHRoKCksIGJ1ZmZlcmVkSW1hZ2UuZ2V0SGVpZ2h0KCksIGNvbG9yTW9kZWwuZ2V0UGl4ZWxTaXplKCksIHBhbGV0dGUpOwotCQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBjb2xvck1vZGVsLmdldFRyYW5zcGFyZW50UGl4ZWwoKTsKLQkJV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gYnVmZmVyZWRJbWFnZS5nZXRSYXN0ZXIoKTsKLQkJaW50W10gcGl4ZWxBcnJheSA9IG5ldyBpbnRbMV07Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCQlyYXN0ZXIuZ2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheSk7Ci0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbEFycmF5WzBdKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXN0YXRpYyBJbWFnZURhdGEgY3JlYXRlU2FtcGxlSW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAwLCAxMDApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShib3VuZHMpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQlnYy5maWxsT3ZhbCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZHJhd0xpbmUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kcmF3TGluZShib3VuZHMud2lkdGgsIDAsIDAsIGJvdW5kcy5oZWlnaHQpOwotCWdjLmRpc3Bvc2UoKTsKLQlJbWFnZURhdGEgZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU1dUIEltYWdlIik7Ci0JSW1hZ2VEYXRhIGRhdGE7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBhcmdzWzBdOwotCQlkYXRhID0gbmV3IEltYWdlRGF0YShmaWxlTmFtZSk7Ci0JfSBlbHNlIHsKLQkJZGF0YSA9IGNyZWF0ZVNhbXBsZUltYWdlKGRpc3BsYXkpOwotCX0KLQlmaW5hbCBJbWFnZSBzd3RJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlmaW5hbCBCdWZmZXJlZEltYWdlIGF3dEltYWdlID0gY29udmVydFRvQVdUKGRhdGEpOwotCWZpbmFsIEltYWdlIHN3dEltYWdlMiA9IG5ldyBJbWFnZShkaXNwbGF5LCBjb252ZXJ0VG9TV1QoYXd0SW1hZ2UpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaW50IHkgPSAxMDsKLQkJCWlmIChzd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UsIDEwLCB5KTsKLQkJCQl5ICs9IHN3dEltYWdlLmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQotCQkJaWYgKHN3dEltYWdlMiAhPSBudWxsKSB7Ci0JCQkJZS5nYy5kcmF3SW1hZ2Uoc3d0SW1hZ2UyLCAxMCwgeSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlGcmFtZSBmcmFtZSA9IG5ldyBGcmFtZSgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQkJaWYgKGF3dEltYWdlICE9IG51bGwpIHsKLQkJCQlnLmRyYXdJbWFnZShhd3RJbWFnZSwgMTAgKyBpbnNldHMubGVmdCwgMTAgKyBpbnNldHMudG9wLCBudWxsKTsKLQkJCX0KLQkJfQotCX07Ci0JZnJhbWUuc2V0VGl0bGUoIkFXVCBJbWFnZSIpOwotCXNoZWxsLnNldExvY2F0aW9uKDUwLCA1MCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHN3dEltYWdlLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoYm91bmRzLndpZHRoICsgNTAsIGJvdW5kcy5oZWlnaHQgKiAyICsgMTAwKTsKLQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCVBvaW50IGxvY2F0aW9uID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQlJbnNldHMgaW5zZXRzID0gZnJhbWUuZ2V0SW5zZXRzKCk7Ci0JZnJhbWUuc2V0TG9jYXRpb24obG9jYXRpb24ueCArIHNpemUueCArIDEwLCBsb2NhdGlvbi55KTsKLQlmcmFtZS5zZXRTaXplKHNpemUueCAtIChpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCksIHNpemUueSAtIChpbnNldHMudG9wICsgaW5zZXRzLmJvdHRvbSkpOwotCWZyYW1lLnNldFZpc2libGUodHJ1ZSk7CQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYgKHN3dEltYWdlICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlpZiAoc3d0SW1hZ2UyICE9IG51bGwpIHN3dEltYWdlLmRpc3Bvc2UoKTsKLQlmcmFtZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JLyogTm90ZTogSWYgeW91IGFyZSB1c2luZyBKREsgMS4zLngsIHlvdSBuZWVkIHRvIHVzZSBTeXN0ZW0uZXhpdCgwKSBhdCB0aGUgZW5kIG9mIHlvdXIgcHJvZ3JhbSB0byBleGl0IEFXVC4KLQkgKiBUaGlzIGlzIGJlY2F1c2UgaW4gMS4zLngsIEFXVCBkb2VzIG5vdCBleGl0IHdoZW4gdGhlIGZyYW1lIGlzIGRpc3Bvc2VkLCBiZWNhdXNlIHRoZSBBV1QgdGhyZWFkIGlzIG5vdCBhIGRhZW1vbi4KLQkgKiBUaGlzIHdhcyBmaXhlZCBpbiBKREsgMS40Lnggd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIEFXVCBTaHV0ZG93biB0aHJlYWQuCi0JICovCi19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWNkZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogRW1iZWQgV29yZCBpbiBhbiBhcHBsZXQgKHdpbjMyIG9ubHkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0JCi1pbXBvcnQgamF2YS5hcHBsZXQuKjsKLQkgCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NyBleHRlbmRzIEFwcGxldCB7Ci0JCi0Jb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSBkaXNwbGF5OwotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHN3dFBhcmVudDsKLQlqYXZhLmF3dC5DYW52YXMgYXd0UGFyZW50OwotCi1wdWJsaWMgdm9pZCBpbml0ICgpIHsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCAobmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCXNldExheW91dChuZXcgamF2YS5hd3QuR3JpZExheW91dCAoMSwgMSkpOwotCQkJYXd0UGFyZW50ID0gbmV3IGphdmEuYXd0LkNhbnZhcyAoKTsKLQkJCWFkZCAoYXd0UGFyZW50KTsKLQkJCWRpc3BsYXkgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSAoKTsKLQkJCXN3dFBhcmVudCA9IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVC5uZXdfU2hlbGwgKGRpc3BsYXksIGF3dFBhcmVudCk7Ci0JCQlzd3RQYXJlbnQuc2V0TGF5b3V0IChuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0ICgpKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgZnJhbWUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZSAoc3d0UGFyZW50LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PTkUpOwotCQkJb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlIHNpdGU7Ci0JCQl0cnkgewotCQkJCXNpdGUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlIChmcmFtZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIpOwotCQkJfSBjYXRjaCAob3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICJDcmVhdGUgT2xlQ2xpZW50U2l0ZSBFcnJvciIgKyBlLnRvU3RyaW5nICgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZXRTaXplICg1MDAsIDUwMCk7Ci0JCQl2YWxpZGF0ZSAoKTsKLQkJCXNpdGUuZG9WZXJiIChvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRS5PTEVJVkVSQl9TSE9XKTsKLQkJCQotCQkJd2hpbGUgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7CQkKLQkJCX0JCi0JCX0KLQl9KTsKLQl0aHJlYWQuc3RhcnQgKCk7Ci19Ci0gcHVibGljIHZvaWQgc3RvcCAoKXsKLSAJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkICgpKXsKLSAJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlICgpIHsKLSAJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotIAkJCQlpZiAoc3d0UGFyZW50ICE9IG51bGwgJiYgIXN3dFBhcmVudC5pc0Rpc3Bvc2VkICgpKSBzd3RQYXJlbnQuZGlzcG9zZSAoKTsKLSAJCQkJc3d0UGFyZW50ID0gbnVsbDsKLSAJCQkJZGlzcGxheS5kaXNwb3NlICgpOwotIAkJCQlkaXNwbGF5ID0gbnVsbDsKLSAJCQl9Ci0gCQl9KTsKLSAJCXJlbW92ZSAoYXd0UGFyZW50KTsKLSAJCWF3dFBhcmVudCA9IG51bGw7Ci0gCX0KLSB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc5ZmRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZXRlcm1pbmUgbmF0aXZlIGRhdGEgdHlwZXMgYXZhaWxhYmxlIChtb3RpZiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5tb3RpZi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OCBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDE1OCBfaW5zdGFuY2UgPSBuZXcgU25pcHBldDE1OCgpOwotcHJpdmF0ZSBpbnRbXSBpZHM7Ci1wcml2YXRlIFN0cmluZ1tdIG5hbWVzOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIGNvbnRyb2wgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dCgiRHJhZyBkYXRhIG92ZXIgdGhpcyBzaXRlIHRvIHNlZSB0aGUgbmF0aXZlIHRyYW5zZmVyIHR5cGUuIik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9NT1ZFKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1NuaXBwZXQxNTguZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDE1OCBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLVNuaXBwZXQxNTgoKSB7Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewotCXJldHVybiAiSGVsbG8gV29ybGQiOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuYW1lczsKLX0KLXN0YXRpYyBpbnQgc2hlbGxIYW5kbGU7Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCWlmIChpZHMgPT0gbnVsbCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaW50IHdpZGdldENsYXNzID0gT1MudG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzICgpOwotCQlzaGVsbEhhbmRsZSA9IE9TLlh0QXBwQ3JlYXRlU2hlbGwgKG51bGwsIG51bGwsIHdpZGdldENsYXNzLCBkaXNwbGF5LnhEaXNwbGF5LCBudWxsLCAwKTsKLQkJT1MuWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCAoc2hlbGxIYW5kbGUsIGZhbHNlKTsKLQkJT1MuWHRSZWFsaXplV2lkZ2V0IChzaGVsbEhhbmRsZSk7Ci0JCQotCQlpZHMgPSBuZXcgaW50Wzg0MF07Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1s4NDBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJaWRzW2ldID0gaStpOwotCQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkrMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGlkczsKLX0KLXN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21JZChpbnQgaWQpIHsKLQlpbnQgeERpc3BsYXkgPSBPUy5YdERpc3BsYXkgKHNoZWxsSGFuZGxlKTsKLQlpbnQgcHRyID0gMDsKLQl0cnkgewotCQlwdHIgPSBPUy5YbUdldEF0b21OYW1lKHhEaXNwbGF5LCBpZCk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQl9Ci0JaWYgKHB0ciA9PSAwKSByZXR1cm4gImludmFsaWQgIitpZDsKLQlpbnQgbGVuZ3RoID0gT1Muc3RybGVuKHB0cik7Ci0JYnl0ZVtdIG5hbWVCdWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwotCU9TLm1lbW1vdmUobmFtZUJ1ZiwgcHRyLCBsZW5ndGgpOwotCU9TLlhGcmVlKHB0cik7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoQ29udmVydGVyLm1iY3NUb1djcyhudWxsLCBuYW1lQnVmKSkudG9Mb3dlckNhc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MzJiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IG1vZGlmeSBIVE1MIHRpdGxlIHRhZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTU5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgbmV3VGl0bGUgPSAiTmV3IFZhbHVlIGZvciBUaXRsZSI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGVFdmVudDogIitldmVudC50aXRsZSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogU2V0IEhUTUwgdGl0bGUgdGFnIHVzaW5nIEphdmFTY3JpcHQgYW5kIERPTSB3aGVuIHBhZ2UgaGFzIGJlZW4gbG9hZGVkICovCi0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoImRvY3VtZW50LnRpdGxlPSciK25ld1RpdGxlKyInIik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCS8qIExvYWQgYW4gSFRNTCBkb2N1bWVudCAqLwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZjYTMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIG9uZSByZXBlYXRpbmcgdGltZXIgKGV2ZXJ5IDUwMCBtcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBpbnQgdGltZSA9IDUwMDsKLQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlQb2ludCBwb2ludCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldEJvdW5kcyAoKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zIChwb2ludCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJJbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJPdXQiKTsKLQkJCX0KLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7CQotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1YmEyYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHF1ZXJ5IERPTSBub2RlIHZhbHVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlicm93c2VyLnNldERhdGEoInF1ZXJ5IiwgZXZlbnQudGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyogCi0JCQkJICogVXNlIEphdmFTY3JpcHQgdG8gcXVlcnkgdGhlIGRlc2lyZWQgbm9kZSBjb250ZW50IHRocm91Z2ggdGhlIERvY3VtZW50IE9iamVjdCBNb2RlbAotCQkJCSAqIAotCQkJCSAqIEFzc2lnbiByZXN1bHQgdG8gdGhlIHdpbmRvdyBwcm9wZXJ0eSBzdGF0dXMgdG8gcGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBTdGF0dXNUZXh0TGlzdGVuZXIKLQkJCQkgKiBUaGlzIHRyaWNrIGlzIHJlcXVpcmVkIHNpbmNlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IGRvZXMgbm90IHJldHVybiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgotCQkJCSAqIGRpcmVjdGx5LgotCQkJCSAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJ3aW5kb3cuc3RhdHVzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU7Iik7Ci0JCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJLyogU2NyaXB0IG1heSBmYWlsIG9yIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIGNlcnRhaW4gcGxhdGZvcm1zLiAqLwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjcmlwdCB3YXMgbm90IGV4ZWN1dGVkLiIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYnJvd3Nlci5nZXREYXRhKCJxdWVyeSIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSB2YWx1ZTogIit2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDNkODkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgRE9NIChleGVjdXRpbmcgamF2YXNjcmlwdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIGh0bWwgPSAiPGh0bWw+PHRpdGxlPlNuaXBwZXQ8L3RpdGxlPjxib2R5PjxwIGlkPSdteWlkJz5CZXN0IEZyaWVuZHM8L3A+PHAgaWQ9J215aWQyJz5DYXQgYW5kIERvZzwvcD48L2JvZHk+PC9odG1sPiI7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuTVVMVEkpOwotCQl0ZXh0LnNldFRleHQoInZhciBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUCcpOyBcclxuIisKLQkJCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkJCSJuZXdOb2RlLmFwcGVuZENoaWxkKHRleHQpO1xyXG4iKwotCQkJCSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4iKwotCQkJCSJcclxuIisKLQkJCQkiZG9jdW1lbnQuYmdDb2xvcj0neWVsbG93JzsiKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiRXhlY3V0ZSBTY3JpcHQiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUodGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMjg2YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFkZGluZyBhbiBhY2Nlc3NpYmxlIGxpc3RlbmVyIHRvIHByb3ZpZGUgc3RhdGUgaW5mb3JtYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjIgewotCi1maW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRFID0gIkNoZWNrZWRJbmRpY2VzIjsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JSW1hZ2UgY2hlY2tlZEltYWdlID0gZ2V0Q2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlJbWFnZSB1bmNoZWNrZWRJbWFnZSA9IGdldFVuY2hlY2tlZEltYWdlIChkaXNwbGF5KTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0xLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJmaXJzdCBpdGVtIiwgImEiLCAiYiJ9KTsKLQlpdGVtMS5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldEltYWdlICgyLCB1bmNoZWNrZWRJbWFnZSk7Ci0JaXRlbTEuc2V0RGF0YSAoU1RBVEUsIG51bGwpOwotCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTIuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InNlY29uZCBpdGVtIiwgImMiLCAiZCJ9KTsKLQlpdGVtMi5zZXRJbWFnZSAoMSwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0yLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsyfSk7Ci0JVGFibGVJdGVtIGl0ZW0zID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMy5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsidGhpcmQiLCAiZSIsICJmIn0pOwotCWl0ZW0zLnNldEltYWdlICgxLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldEltYWdlICgyLCBjaGVja2VkSW1hZ2UpOwotCWl0ZW0zLnNldERhdGEgKFNUQVRFLCBuZXcgaW50IFtdIHsxLCAyfSk7Ci0JY29sdW1uMS5wYWNrICgpOwotCWNvbHVtbjIucGFjayAoKTsKLQljb2x1bW4zLnBhY2sgKCk7Ci0JQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdGFibGUuZ2V0QWNjZXNzaWJsZSAoKTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldE5hbWUgKGUpOwotCQkJaWYgKGUuY2hpbGRJRCA+PSAwICYmIGUuY2hpbGRJRCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoZS5jaGlsZElEKTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldENvbHVtbkNvdW50ICgpOyBpKyspIHsKLQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChpKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlpbnQgW10gZGF0YSA9IChpbnQgW10pIGl0ZW0uZ2V0RGF0YSAoU1RBVEUpOwotCQkJCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCWlmIChkYXRhIFtqXSA9PSBpKSB7Ci0JCQkJCQkJCQljaGVja2VkID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZS5yZXN1bHQgPSBpdGVtLmdldFRleHQgKGkpICsgIiAiICsgKGNoZWNrZWQgPyAiY2hlY2tlZCIgOiAidW5jaGVja2VkIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFN0YXRlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCXN1cGVyLmdldFN0YXRlIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQkJcHQgPSBkaXNwbGF5Lm1hcCAobnVsbCwgdGFibGUsIHB0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbS5nZXRCb3VuZHMgKGRhdGEgW2ldKS5jb250YWlucyAocHQpKSB7Ci0JCQkJCQkJZS5kZXRhaWwgfD0gQUNDLlNUQVRFX0NIRUNLRUQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQl1bmNoZWNrZWRJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotc3RhdGljIEltYWdlIGdldENoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0RBUktfR1JFRU4pKTsKLQlnYy5kcmF3TGluZSAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kcmF3TGluZSAoMTYsIDAsIDAsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotc3RhdGljIEltYWdlIGdldFVuY2hlY2tlZEltYWdlIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsT3ZhbCAoMCwgMCwgMTYsIDE2KTsKLQlnYy5kaXNwb3NlICgpOwotCXJldHVybiBpbWFnZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2ZkNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNldHRpbmcgdGhlIGZvbnQgc3R5bGUsIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIFN0eWxlZFRleHQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIGJvbGQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgcmVkIGZvbnQKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUyKTsKLQkvLyBtYWtlIE5PUFFSU1RVVldYWVogaGF2ZSBhIGJsdWUgYmFja2dyb3VuZAotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMuc3RhcnQgPSAyNTsKLQlzdHlsZTMubGVuZ3RoID0gMTM7Ci0Jc3R5bGUzLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk0NWY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBPdmVycmlkZSB0aGUgdGV4dCB0aGF0IGlzIHNwb2tlbiBmb3IgYSBuYXRpdmUgQnV0dG9uLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCi0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiJlR5cGljYWwgYnV0dG9uIik7Ci0JYnV0dG9uMS5zZXRCb3VuZHMoMTAsMTAsMTgwLDMwKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCImT3ZlcmlkZGVuIGJ1dHRvbiIpOwotCWJ1dHRvbjIuc2V0Qm91bmRzKDEwLDUwLDE4MCwzMCk7Ci0JYnV0dG9uMi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJZS5yZXN1bHQgPSAiU3BlYWsgdGhpcyBpbnN0ZWFkIG9mIHRoZSBidXR0b24gdGV4dCI7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNiMThiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBDVGFiRm9sZGVyIHdpdGggbWluIGFuZCBtYXggYnV0dG9ucywgYXMgd2VsbCBhcyBjbG9zZSBidXR0b24gYW5kIAotICogaW1hZ2Ugb25seSBvbiBzZWxlY3RlZCB0YWIuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTYsIDE2KTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxSZWN0YW5nbGUoMywgMywgMTAsIDEwKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCWZvbGRlci5zZXRTaW1wbGUoZmFsc2UpOwotCWZvbGRlci5zZXRVbnNlbGVjdGVkSW1hZ2VWaXNpYmxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZENsb3NlVmlzaWJsZShmYWxzZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl0ZXh0LnNldFRleHQoIlRleHQgZm9yIGl0ZW0gIitpKyJcblxub25lLCB0d28sIHRocmVlXG5cbmFiY2RlZmdoaWprbG1ub3AiKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQlmb2xkZXIuc2V0TWluaW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5zZXRNYXhpbWl6ZVZpc2libGUodHJ1ZSk7Ci0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbWluaW1pemUoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlmb2xkZXIuc2V0TWluaW1pemVkKHRydWUpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1heGltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1heGltaXplZCh0cnVlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXN0b3JlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TWF4aW1pemVkKGZhbHNlKTsKLQkJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcyN2YwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBTY3JvbGxlZENvbXBvc2l0ZSB3aXRoIHdyYXBwaW5nIGNvbnRlbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZTEgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dPUktJTkcpOwotCUltYWdlIGltYWdlMiA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCUltYWdlIGltYWdlMyA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCi0JZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2Nyb2xsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JZm9yKGludCBpID0gMDsgaSA8PSA1MDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlpZiAoaSAlIDMgPT0gMCkgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UxKTsKLQkJaWYgKGkgJSAzID09IDEpIGxhYmVsLnNldEltYWdlKGltYWdlMik7Ci0JCWlmIChpICUgMyA9PSAyKSBsYWJlbC5zZXRJbWFnZShpbWFnZTMpOwotCX0KLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChwYXJlbnQpOwotCXNjcm9sbENvbXBvc2l0ZS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzY3JvbGxDb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByID0gc2Nyb2xsQ29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCXNjcm9sbENvbXBvc2l0ZS5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShyLndpZHRoLCBTV1QuREVGQVVMVCkpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjIxMWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSB0d28gU2Nyb2xsZWRDb21wb3NpdGVzIHRoYXQgc2Nyb2xsIGluIHRhbmRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24gKHNjMSwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIkJ1dHRvbiAxIik7Ci0JYnV0dG9uMS5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2MxLnNldENvbnRlbnQgKGJ1dHRvbjEpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MyID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNjMiwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkJ1dHRvbiAyIik7Ci0JYnV0dG9uMi5zZXRTaXplICgzMDAsIDQwMCk7Ci0Jc2MyLnNldENvbnRlbnQgKGJ1dHRvbjIpOwotCi0JZmluYWwgU2Nyb2xsQmFyIHZCYXIxID0gc2MxLmdldFZlcnRpY2FsQmFyICgpOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyMiA9IHNjMi5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjEgPSBzYzEuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhcjIgPSBzYzIuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMS5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIxLmdldE1heGltdW0oKSAtIGhCYXIxLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMS5nZXRNYXhpbXVtKCkgLSB2QmFyMS5nZXRUaHVtYigpKTsKLQkJCXNjMi5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgeCA9ICBoQmFyMi5nZXRTZWxlY3Rpb24oKSAqIChoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKSAvIE1hdGgubWF4KDEsIGhCYXIyLmdldE1heGltdW0oKSAtIGhCYXIyLmdldFRodW1iKCkpOwotCQkJaW50IHkgPSAgdkJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAodkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCB2QmFyMi5nZXRNYXhpbXVtKCkgLSB2QmFyMi5nZXRUaHVtYigpKTsKLQkJCXNjMS5zZXRPcmlnaW4gKHgsIHkpOwotCQl9Ci0JfTsKLQl2QmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQloQmFyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIxKTsKLQl2QmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQloQmFyMi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobGlzdGVuZXIyKTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDI0NWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgbGluZXMgYW5kIHBvbHlnb25zIHdpdGggZGlmZmVyZW50IGNhcCBhbmQgam9pbiBzdHlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgeCA9IDIwLCB5ID0gMjAsIHcgPSAxMjAsIGggPSA2MDsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQkJCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JCQlpbnRbXSBjYXBzID0ge1NXVC5DQVBfRkxBVCwgU1dULkNBUF9ST1VORCwgU1dULkNBUF9TUVVBUkV9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZ2Muc2V0TGluZUNhcChjYXBzW2ldKTsKLQkJCQlnYy5kcmF3TGluZSh4LCB5LCB4ICsgdywgeSk7Ci0JCQkJeSArPSAyMDsKLQkJCX0KLQkJCWludFtdIGpvaW5zID0ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2lucy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVKb2luKGpvaW5zW2ldKTsKLQkJCQlnYy5kcmF3UG9seWdvbihuZXcgaW50W10ge3gsIHksIHggKyB3LzIsIHkgKyBoLCB4ICsgdywgeX0pOwotCQkJCXkgKz0gaCArIDIwOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTMyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIHRvZ2dsZSBidXR0b24gaGF2ZSByYWRpbyBiZWhhdmlvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IHNoZWxsLmdldENoaWxkcmVuICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCQlpZiAoZS53aWRnZXQgIT0gY2hpbGQgJiYgY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24gJiYgKGNoaWxkLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCkgewotCQkJCQkoKEJ1dHRvbikgY2hpbGQpLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCSgoQnV0dG9uKSBlLndpZGdldCkuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX07Ci0JZm9yIChpbnQgaT0wOyBpPDIwOyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaWYgKGkgPT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmY4M2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2xpZGVyIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2Nyb2xsIGV2ZW50IGRldGFpbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAoc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQlzbGlkZXIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMzIpOwotCXNsaWRlci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlNXVC5OT05FIjsKLQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuRFJBRzogc3RyaW5nID0gIlNXVC5EUkFHIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuSE9NRTogc3RyaW5nID0gIlNXVC5IT01FIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRU5EOiBzdHJpbmcgPSAiU1dULkVORCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX0RPV046IHN0cmluZyA9ICJTV1QuQVJST1dfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkFSUk9XX1VQOiBzdHJpbmcgPSAiU1dULkFSUk9XX1VQIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUEFHRV9ET1dOOiBzdHJpbmcgPSAiU1dULlBBR0VfRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfVVA6IHN0cmluZyA9ICJTV1QuUEFHRV9VUCI7IGJyZWFrOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2Nyb2xsIGRldGFpbCAtPiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YjllNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgVHJlZSB3aXRoIGNvbHVtbnMKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzAgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJY29sdW1uMy5zZXRUZXh0KCJDb2x1bW4gMyIpOwotCQljb2x1bW4zLnNldFdpZHRoKDIwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAiaXRlbSAiICsgaSwgImFiYyIsICJkZWZnaGkiIH0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgInN1Yml0ZW0gIiArIGosICJqa2xtbm9wIiwgInFycyIgfSk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKLQkJCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAic3Vic3ViaXRlbSAiICsgaywgInR1diIsICJ3eHl6IiB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3YmFlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgZGF0YSB0cmFuc2ZlciB0eXBlcyB0aGF0IHN1YmNsYXNzIGVhY2gKLSAqIG90aGVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzEgewotCi0vKgotICogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGU8L2JvbGQ+IHdoZXJlCi0gKiBNeVR5cGUgaXMgZGVmaW5lIGFzOgotICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlIHsKLQlTdHJpbmcgZmlsZU5hbWU7Ci0JbG9uZyBmaWxlTGVuZ3RoOwotCWxvbmcgbGFzdE1vZGlmaWVkOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIk15dHlwZVRyYW5zZmVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlcigpOwotCi0JcHVibGljIHN0YXRpYyBUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlieXRlW10gamF2YVRvQnl0ZUFycmF5KE9iamVjdCBvYmplY3QpIHsKLQkJTXlUeXBlIGRhdGEgPSAoTXlUeXBlKSBvYmplY3Q7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQlieXRlW10gYnVmZmVyID0gZGF0YS5maWxlTmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEuZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5sYXN0TW9kaWZpZWQpOwotCQkJYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQl3cml0ZU91dC5jbG9zZSgpOwotCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCU9iamVjdCBieXRlQXJyYXlUb0phdmEoYnl0ZVtdIGJ5dGVzKSB7Ci0JCU15VHlwZSBkYXRhID0gbmV3IE15VHlwZSgpOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZU5hbWUgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCWRhdGEubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlieXRlW10gYnVmZmVyID0gamF2YVRvQnl0ZUFycmF5KG9iamVjdCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSkpIHsKLQkJCWJ5dGVbXSBidWZmZXIgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBieXRlQXJyYXlUb0phdmEoYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgTVlUWVBFTkFNRSB9OwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgTVlUWVBFSUQgfTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja015VHlwZShvYmplY3QpOwotCX0KLX0KLQotLyoKLSAqIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlMjwvYm9sZD4KLSAqIHdoZXJlIE15VHlwZTIgaXMgZGVmaW5lIGFzOgotICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlMiBleHRlbmRzIE15VHlwZSB7Ci0JU3RyaW5nIHZlcnNpb247Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyMiBleHRlbmRzIE15VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRTJOQU1FID0gIk15dHlwZTJUcmFuc2ZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRTJJRCA9IHJlZ2lzdGVyVHlwZShNWVRZUEUyTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlcjIoKTsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1ZVFlQRTJOQU1FIH07Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBNWVRZUEUySUQgfTsKLQl9Ci0KLQlieXRlW10gamF2YVRvQnl0ZUFycmF5KE9iamVjdCBvYmplY3QpIHsKLQkJTXlUeXBlMiBkYXRhID0gKE15VHlwZTIpIG9iamVjdDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBkYXRhLmZpbGVOYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmxhc3RNb2RpZmllZCk7Ci0JCQlidWZmZXIgPSBkYXRhLnZlcnNpb24uZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCWJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlPYmplY3QgYnl0ZUFycmF5VG9KYXZhKGJ5dGVbXSBieXRlcykgewotCQlNeVR5cGUyIGRhdGEgPSBuZXcgTXlUeXBlMigpOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZU5hbWUgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCWRhdGEubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJcmVhZEluLnJlYWQoYnVmZmVyKTsKLQkJCWRhdGEudmVyc2lvbiA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja015VHlwZTIob2JqZWN0KSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShvYmplY3QsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCi0JYm9vbGVhbiBjaGVja015VHlwZTIoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGUyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrTXlUeXBlMihvYmplY3QpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDEuc2V0VGV4dCgiRHJhZyBTb3VyY2UgZm9yIE15RGF0YSBhbmQgTXlEYXRhMiIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDIuc2V0VGV4dCgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YSIpOwotCWZpbmFsIExhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDMuc2V0VGV4dCgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YTIiKTsKLQotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UobGFiZWwxLCBETkQuRFJPUF9DT1BZKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyLmdldEluc3RhbmNlKCksCi0JCQlNeVRyYW5zZmVyMi5nZXRJbnN0YW5jZSgpIH0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCU15VHlwZTIgbXlUeXBlID0gbmV3IE15VHlwZTIoKTsKLQkJCW15VHlwZS5maWxlTmFtZSA9ICJDOlxcYWJjLnR4dCI7Ci0JCQlteVR5cGUuZmlsZUxlbmd0aCA9IDEwMDA7Ci0JCQlteVR5cGUubGFzdE1vZGlmaWVkID0gMTIzMTIzMTM7Ci0JCQlteVR5cGUudmVyc2lvbiA9ICJ2ZXJzaW9uIDIiOwotCQkJZXZlbnQuZGF0YSA9IG15VHlwZTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlID0gbmV3IERyb3BUYXJnZXQobGFiZWwyLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0TXlUeXBlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZS5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZSBteVR5cGUgPSAoTXlUeXBlKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTogIiArIG15VHlwZS5maWxlTmFtZTsKLQkJCQkJbGFiZWwyLnNldFRleHQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0TXlUeXBlMiA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsMywgRE5ELkRST1BfQ09QWQl8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldE15VHlwZTIuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyMi5nZXRJbnN0YW5jZSgpIH0pOwotCXRhcmdldE15VHlwZTIuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUyIG15VHlwZSA9IChNeVR5cGUyKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk15VHlwZTI6ICIgKyBteVR5cGUuZmlsZU5hbWUgKyAiOiIKLQkJCQkJCQkrIG15VHlwZS52ZXJzaW9uOwotCQkJCQlsYWJlbDMuc2V0VGV4dChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFlZmY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDRU5URVIsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTUxZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyIChwb3AtdXAgYmxvY2tlcikKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIFdpbmRvdyIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0Jc2hlbGwub3BlbigpOwotCS8qIGFueSB3ZWJzaXRlIHdpdGggcG9wdXBzICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuY25uLmNvbSIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLS8qIHJlZ2lzdGVyIFdpbmRvd0V2ZW50IGxpc3RlbmVycyAqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaXNwbGF5IGRpc3BsYXksIEJyb3dzZXIgYnJvd3NlcikgewotCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJc2hlbGwuc2V0VGV4dCgiTmV3IFdpbmRvdyIpOwotCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWluaXRpYWxpemUoZGlzcGxheSwgYnJvd3Nlcik7Ci0JCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkvKiBwb3B1cCBibG9ja2VyIC0gaWdub3JlIHdpbmRvd3Mgd2l0aCBubyBzdHlsZSAqLwotCQkJaWYgKCFldmVudC5hZGRyZXNzQmFyICYmICFldmVudC5tZW51QmFyICYmICFldmVudC5zdGF0dXNCYXIgJiYgIWV2ZW50LnRvb2xCYXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcHVwIGJsb2NrZWQuIik7Ci0JCQkJZXZlbnQuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDE0YTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTZWJhc3RpYW4gRGF2aWRzIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIElCTSBDb3Jwb3JhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogZHJhdyBhIHNxdWFyZQotICogCi0gKiBUaGlzIHNuaXBwZXQgcmVxdWlyZXMgdGhlIGV4cGVyaW1lbnRhbCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIHBsdWdpbiwgd2hpY2gKLSAqIGlzIG5vdCBpbmNsdWRlZCBpbiBzd3QgYnkgZGVmYXVsdC4gIEZvciBpbmZvcm1hdGlvbiBvbiB0aGlzIHBsdWdpbiBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L29wZW5nbC9vcGVuZ2wuaHRtbCAgCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRUZXh0KCJPcGVuR0wgaW4gU1dUIik7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIEdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSgpOwotICAgIGRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLSAgICBmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5ELCBkYXRhKTsKLSAgICBjYW52YXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgIHJlc2l6ZShjYW52YXMpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgaW5pdChjYW52YXMpOwotICAgIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKGNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLSAgICAgICAgICAgIHJlbmRlcigpOwotICAgICAgICAgICAgY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0gICAgICAgICAgICBjYW52YXMuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyg1MCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9LnJ1bigpOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXQoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICByZXNpemUoY2FudmFzKTsKLSAgICBHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0gICAgR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDAuMGYpOwotICAgIEdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLSAgICBHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLSAgICBHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotfQotCi1zdGF0aWMgdm9pZCByZW5kZXIoKSB7Ci0gICAgR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTYuMGYpOwotICAgIEdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigxLjBmLCAtMS4wZiwgMC4wZik7Ci0gICAgR0wuZ2xWZXJ0ZXgzZigtMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsRW5kKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2l6ZShHTENhbnZhcyBjYW52YXMpIHsKLSAgICBjYW52YXMuc2V0Q3VycmVudCgpOwotICAgIFJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLSAgICBpbnQgd2lkdGggPSByZWN0LndpZHRoOwotICAgIGludCBoZWlnaHQgPSBNYXRoLm1heChyZWN0LmhlaWdodCwgMSk7Ci0gICAgR0wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0gICAgR0xVLmdsdVBlcnNwZWN0aXZlKDQ1LjBmLCBhc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7Ci0gICAgR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYzk3My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBFeGNsdWRlIGEgd2lkZ2V0IGZyb20gYSBHcmlkTGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAwIik7Ci0KLQlmaW5hbCBCdXR0b24gYkhpZGRlbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliSGlkZGVuLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JYkhpZGRlbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiA0Iik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoImhpZGUiKTsKLQliLnNldFNlbGVjdGlvbih0cnVlKTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGJIaWRkZW4uZ2V0TGF5b3V0RGF0YSgpOwotCQkJZGF0YS5leGNsdWRlID0gYi5nZXRTZWxlY3Rpb24oKTsKLQkJCWJIaWRkZW4uc2V0VmlzaWJsZSghZGF0YS5leGNsdWRlKTsKLQkJCXNoZWxsLmxheW91dChmYWxzZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhZjc1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUm93TGF5b3V0IHNuaXBwZXQ6IGFsaWduIHdpZGdldHMgaW4gYSByb3cKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKTsKLQlsYXlvdXQud3JhcCA9IHRydWU7Ci0JbGF5b3V0LmZpbGwgPSBmYWxzZTsKLQlsYXlvdXQuanVzdGlmeSA9IHRydWU7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAxIik7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQotCWIuc2V0VGV4dCgiQnV0dG9uIDIiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIk5vdCBzaG93biIpOwotCWIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JUm93RGF0YSBkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIGhpZ2giKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLmhlaWdodCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCB3aWRlIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS53aWR0aCA9IDIwMDsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YThlY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJvd0xheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgY29sdW1uCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCVJvd0xheW91dCBsYXlvdXQgPSBuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gdHJ1ZTsKLQlsYXlvdXQuanVzdGlmeSA9IGZhbHNlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1NGJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogSG93IHRvIGFjY2VzcyBBYm91dCwgUHJlZmVyZW5jZXMgYW5kIFF1aXQgbWVudXMgb24gY2FyYm9uLgotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzggewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRQcmVmZXJlbmNlcyA9ICgncCcgPDwgMjQpICsgKCdyJyA8PCAxNikKLQkJCSsgKCdlJyA8PCA4KSArICdmJzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kQWJvdXQgPSAoJ2EnIDw8IDI0KSArICgnYicgPDwgMTYpCi0JCQkrICgnbycgPDwgOCkgKyAndSc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZFNlcnZpY2VzID0gKCdzJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KQotCQkJKyAoJ3InIDw8IDgpICsgJ3YnOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHsKLQlEaXNwbGF5LnNldEFwcE5hbWUoIkFwcE1lbnUiKTsgLy8gc2V0cyBuYW1lIGluIERvY2sKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWhvb2tBcHBsaWNhdGlvbk1lbnUoZGlzcGxheSwgIkFib3V0IEFwcE1lbnUiKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIFdpbmRvdyIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhvb2tBcHBsaWNhdGlvbk1lbnUoRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTdHJpbmcgYWJvdXROYW1lKSB7Ci0JLy8gQ2FsbGJhY2sgdGFyZ2V0Ci0JT2JqZWN0IHRhcmdldCA9IG5ldyBPYmplY3QoKSB7Ci0JCWludCBjb21tYW5kUHJvYyhpbnQgbmV4dEhhbmRsZXIsIGludCB0aGVFdmVudCwgaW50IHVzZXJEYXRhKSB7Ci0JCQlpZiAoT1MuR2V0RXZlbnRLaW5kKHRoZUV2ZW50KSA9PSBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCkgewotCQkJCUhJQ29tbWFuZCBjb21tYW5kID0gbmV3IEhJQ29tbWFuZCgpOwotCQkJCU9TLkdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBPUy5rRXZlbnRQYXJhbURpcmVjdE9iamVjdCwKLQkJCQkJCU9TLnR5cGVISUNvbW1hbmQsIG51bGwsIEhJQ29tbWFuZC5zaXplb2YsIG51bGwsCi0JCQkJCQljb21tYW5kKTsKLQkJCQlzd2l0Y2ggKGNvbW1hbmQuY29tbWFuZElEKSB7Ci0JCQkJY2FzZSBrSElDb21tYW5kUHJlZmVyZW5jZXM6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKCJQcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBrSElDb21tYW5kQWJvdXQ6Ci0JCQkJCXJldHVybiBoYW5kbGVDb21tYW5kKGFib3V0TmFtZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIE9TLmV2ZW50Tm90SGFuZGxlZEVycjsKLQkJfQotCi0JCWludCBoYW5kbGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQkJTWVzc2FnZUJveCBwcmVmZXJlbmNlcyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HKTsKLQkJCXByZWZlcmVuY2VzLnNldFRleHQoY29tbWFuZCk7Ci0JCQlwcmVmZXJlbmNlcy5vcGVuKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gT1Mubm9FcnI7Ci0JCX0KLQl9OwotCi0JZmluYWwgQ2FsbGJhY2sgY29tbWFuZENhbGxiYWNrID0gbmV3IENhbGxiYWNrKHRhcmdldCwgImNvbW1hbmRQcm9jIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQlpbnQgY29tbWFuZFByb2MgPSBjb21tYW5kQ2FsbGJhY2suZ2V0QWRkcmVzcygpOwotCWlmIChjb21tYW5kUHJvYyA9PSAwKSB7Ci0JCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCXJldHVybjsgLy8gZ2l2ZSB1cAotCX0KLQotCS8vIEluc3RhbGwgZXZlbnQgaGFuZGxlciBmb3IgY29tbWFuZHMKLQlpbnRbXSBtYXNrID0gbmV3IGludFtdIHsgT1Mua0V2ZW50Q2xhc3NDb21tYW5kLCBPUy5rRXZlbnRQcm9jZXNzQ29tbWFuZCB9OwotCU9TLkluc3RhbGxFdmVudEhhbmRsZXIoT1MuR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpLCBjb21tYW5kUHJvYywKLQkJCW1hc2subGVuZ3RoIC8gMiwgbWFzaywgMCwgbnVsbCk7Ci0KLQkvLyBjcmVhdGUgQWJvdXQgLi4uIG1lbnUgY29tbWFuZAotCWludFtdIG91dE1lbnUgPSBuZXcgaW50WzFdOwotCXNob3J0W10gb3V0SW5kZXggPSBuZXcgc2hvcnRbMV07Ci0JaWYgKE9TLkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCgwLCBrSElDb21tYW5kUHJlZmVyZW5jZXMsIDEsCi0JCQlvdXRNZW51LCBvdXRJbmRleCkgPT0gT1Mubm9FcnIKLQkJCSYmIG91dE1lbnVbMF0gIT0gMCkgewotCQlpbnQgbWVudSA9IG91dE1lbnVbMF07Ci0KLQkJaW50IGwgPSBhYm91dE5hbWUubGVuZ3RoKCk7Ci0JCWNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltsXTsKLQkJYWJvdXROYW1lLmdldENoYXJzKDAsIGwsIGJ1ZmZlciwgMCk7Ci0JCWludCBzdHIgPSBPUy5DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE9TLmtDRkFsbG9jYXRvckRlZmF1bHQsCi0JCQkJYnVmZmVyLCBsKTsKLQkJT1MuSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKG1lbnUsIHN0ciwgKHNob3J0KSAwLCAwLAotCQkJCWtISUNvbW1hbmRBYm91dCk7Ci0JCU9TLkNGUmVsZWFzZShzdHIpOwotCi0JCS8vIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBBYm91dCAmIFByZWZlcmVuY2VzCi0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCAwLCAoc2hvcnQpIDEsCi0JCQkJT1Mua01lbnVJdGVtQXR0clNlcGFyYXRvciwgMCk7Ci0KLQkJLy8gZW5hYmxlIHByZWYgbWVudQotCQlPUy5FbmFibGVNZW51Q29tbWFuZChtZW51LCBrSElDb21tYW5kUHJlZmVyZW5jZXMpOwotCi0JCS8vIGRpc2FibGUgc2VydmljZXMgbWVudQotCQlPUy5EaXNhYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFNlcnZpY2VzKTsKLQl9Ci0KLQkvLyBzY2hlZHVsZSBkaXNwb3NhbCBvZiBjYWxsYmFjayBvYmplY3QKLQlkaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJY29tbWFuZENhbGxiYWNrLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzgwNWY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHZlcmlmeSBpbnB1dCAoZm9ybWF0IGZvciBkYXRlKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiWVlZWS9NTS9ERCIpOzsJCi0JZmluYWwgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCXRleHQuYWRkTGlzdGVuZXIoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyKCkgewotCQlib29sZWFuIGlnbm9yZTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZSkgcmV0dXJuOwotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbYnVmZmVyLmxlbmd0aCgpXTsKLQkJCWJ1ZmZlci5nZXRDaGFycygwLCBjaGFycy5sZW5ndGgsIGNoYXJzLCAwKTsKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAvKiBbWV1ZWVkgKi8KLQkJCQkJCWNhc2UgMTogLyogWVtZXVlZICovCi0JCQkJCQljYXNlIDI6IC8qIFlZW1ldWSAqLwotCQkJCQkJY2FzZSAzOiAvKiBZWVlbWV0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ1knKTsgCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA1OiAvKiBbTV1NKi8KLQkJCQkJCWNhc2UgNjogLyogTVtNXSAqL3sKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdNJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA4OiAvKiBbRF1EICovCi0JCQkJCQljYXNlIDk6IC8qIERbRF0gKi8gewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJ0QnKTsgYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQljYXNlIDQ6IC8qIFlZWVlbL11NTSAqLwotCQkJCQkJY2FzZSA3OiAvKiBNTVsvXUREICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCcvJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkKLQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQlpZiAoc3RhcnQgPiA5KSByZXR1cm47Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDQgfHwgc3RhcnQgKyBpbmRleCA9PSA3KSB7Ci0JCQkJCWlmIChjaGFyc1tpXSA9PSAnLycpIHsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWZmZXIuaW5zZXJ0KGluZGV4KyssICcvJyk7Ci0JCQkJfQotCQkJCWlmIChjaGFyc1tpXSA8ICcwJyB8fCAnOScgPCBjaGFyc1tpXSkgcmV0dXJuOwotCQkJCWlmIChzdGFydCArIGluZGV4ID09IDUgJiYgICcxJyA8IGNoYXJzW2ldKSByZXR1cm47IC8qIFtNXU0gKi8KLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA4ICYmICAnMycgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbRF1EICovCi0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJCVN0cmluZyBuZXdUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpbnQgbGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJCVN0cmluZ0J1ZmZlciBkYXRlID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQlkYXRlLnJlcGxhY2UoZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCwgbmV3VGV4dCk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgMTkwMSk7Ci0JCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIENhbGVuZGFyLkpBTlVBUlkpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBVEUsIDEpOwotCQkJU3RyaW5nIHl5eXkgPSBkYXRlLnN1YnN0cmluZygwLCA0KTsKLQkJCWlmICh5eXl5LmluZGV4T2YoJ1knKSA9PSAtMSkgewotCQkJCWludCB5ZWFyID0gSW50ZWdlci5wYXJzZUludCh5eXl5KTsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcik7Ci0JCQl9Ci0JCQlTdHJpbmcgbW0gPSBkYXRlLnN1YnN0cmluZyg1LCA3KTsKLQkJCWlmIChtbS5pbmRleE9mKCdNJykgPT0gLTEpIHsKLQkJCQlpbnQgbW9udGggPSAgSW50ZWdlci5wYXJzZUludChtbSkgLSAxOwotCQkJCWludCBtYXhNb250aCA9IGNhbGVuZGFyLmdldEFjdHVhbE1heGltdW0oQ2FsZW5kYXIuTU9OVEgpOwotCQkJCWlmICgwID4gbW9udGggfHwgbW9udGggPiBtYXhNb250aCkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5NT05USCwgbW9udGgpOwotCQkJfQotCQkJU3RyaW5nIGRkID0gZGF0ZS5zdWJzdHJpbmcoOCwxMCk7Ci0JCQlpZiAoZGQuaW5kZXhPZignRCcpID09IC0xKSB7Ci0JCQkJaW50IGRheSA9IEludGVnZXIucGFyc2VJbnQoZGQpOwotCQkJCWludCBtYXhEYXkgPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLkRBVEUpOwotCQkJCWlmICgxID4gZGF5IHx8IGRheSA+IG1heERheSkgcmV0dXJuOwotCQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCBkYXkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSAgPT0gQ2FsZW5kYXIuRkVCUlVBUlkpIHsKLQkJCQkJY2hhciBmaXJzdENoYXIgPSBkYXRlLmNoYXJBdCg4KTsKLQkJCQkJaWYgKGZpcnN0Q2hhciAhPSAnRCcgJiYgJzInIDwgZmlyc3RDaGFyKSByZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGxlbmd0aCk7Ci0JCQlpZ25vcmUgPSB0cnVlOwotCQkJdGV4dC5pbnNlcnQobmV3VGV4dCk7Ci0JCQlpZ25vcmUgPSBmYWxzZTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGJmYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRvb2wgYmFyICh0ZXh0KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKCk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQliYXIucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3ZjMxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHNoZWxsIHRvIHNpbXVsYXRlIHRyYW5zcGFyZW5jeQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JLy9TaGVsbCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCBzdHlsZSBTV1QuTk9fVFJJTQotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0Jc2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkvL2RlZmluZSBhIHJlZ2lvbiAKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCAyMDA7IHkrPTIpIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjAwOyB4Kz0yKSB7Ci0JCQkJcGl4ZWwueCA9IHg7Ci0JCQkJcGl4ZWwueSA9IHk7Ci0JCQkJcmVnaW9uLmFkZChwaXhlbCk7Ci0JCQl9Ci0JCX0KLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxMCwgMTAsIHNpemUueC0yMCwgc2l6ZS55LTIwKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDE1ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGFuZCByZW9yZGVyIGNvbHVtbnMgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgxIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgUm93RGF0YSgtMSwgMzAwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiA0Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIgMCIsIGkrIiAxIiwgaSsiIDIiLCBpKyIgMyIsIGkrIiA0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5wYWNrKCk7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHRydWUpOwotCQkJY29sdW1uc1tpXS5hZGRMaXN0ZW5lcihTV1QuTW92ZSwgbGlzdGVuZXIpOwotCQl9Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludmVydCBjb2x1bW4gb3JkZXIiKTsKLQkJYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50W10gb3JkZXIgPSB0YWJsZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzEwZjIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlsaW5rLnNldFRleHQoIlRoaXMgYSB2ZXJ5IHNpbXBsZSA8QT5saW5rPC9BPiB3aWRnZXQuIik7Ci0JCWxpbmsuc2V0U2l6ZSgxNDAsIDQwKTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM1YTFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaW5rIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IHNlbGVjdGlvbiBldmVudHMgaW4gYSBsaW5rIHdpZGdldAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgzIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgdGV4dCA9ICJUaGUgU1dUIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIDxhPmVmZmljaWVudDwvYT4sIDxhPnBvcnRhYmxlPC9hPiA8YSBocmVmPVwibmF0aXZlXCI+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvYT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIjsKLQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlsaW5rLnNldFNpemUoNDAwLCA0MDApOwotCQlsaW5rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbjogIiArIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4OTVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTcGlubmVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3Bpbm5lciB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlzcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDUwMCk7Ci0JCXNwaW5uZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQoMTAwKTsKLQkJc3Bpbm5lci5wYWNrKCk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRkN2M3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWFrZSBhIGRyb3BwZWQgZGF0YSB0eXBlIGRlcGVuZCBvbiBhIHRhcmdldCBpdGVtIGluIHRhYmxlCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0KCJEcmFnIFNvdXJjZSIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAyID09IDApIGl0ZW0uc2V0VGV4dCgiRHJvcCBhIGZpbGUiKTsKLQkJaWYgKGkgJSAyID09IDEpIGl0ZW0uc2V0VGV4dCgiRHJvcCB0ZXh0Iik7Ci0JfQotCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0JZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoInRlbXAiKTsKLQkJCQlldmVudC5kYXRhID0gbmV3IFN0cmluZ1tdIHtmaWxlLmdldEFic29sdXRlUGF0aCgpfTsKLQkJCX0KLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9ICJvbmNlIHVwb24gYSB0aW1lIjsKLQkJCX0KLQkJfSAKLQl9KTsKLQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0YWJsZSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJRmlsZVRyYW5zZmVyIGZpbGVUcmFuc2ZlciA9IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCWludCBpdGVtSW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaWYgKGl0ZW1JbmRleCAlIDIgPT0gMCkgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAoZmlsZVRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tpbmRleF0pKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaW5kZXhdOwotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCVN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlpdGVtLnNldFRleHQoZmlsZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0ZXh0VHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDE1MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmODgwMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08SFRNTD4KLSAgPEhFQUQ+Ci0gICAgPFRJVExFPlBvc3Q8L1RJVExFPgotCTxwPlRlc3QgZm9yIFBvc3RpbmcgRGF0YSBpbiBJRTwvcD4KLQotICA8L0hFQUQ+Ci0KLSAgPEJPRFk+Ci0gICAgPEZPUk0gTUVUSE9EPSJwb3N0IgotICAgICAgIEFDVElPTj0iaHR0cDovL2hvc3QvY2dpLWJpbi9tYXNfZm9ybSI+Ci0gICAgPElOUFVUIFRZUEU9InRleHQiIE5BTUU9Im5hbWUiCi0gICAgICAgU0laRT0yMCBWQUxVRT0iVHJ5IGl0IChwb3N0KSI+Ci0gPC9GT1JNPgotIAotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTg3ZTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSZWFkaW5nIGFuZCB3cml0aW5nIHRvIGEgU0FGRUFSUkFZCi0gKiAKLSAqIFRoaXMgZXhhbXBsZSByZWFkcyBmcm9tIGEgUG9zdERhdGEgb2JqZWN0IGluIGEgQmVmb3JlTmF2aWdhdGUyIGV2ZW50IGFuZAotICogY3JlYXRlcyBhIFBvc3REYXRhIG9iamVjdCBpbiBhIGNhbGwgdG8gTmF2aWdhdGUuICh3aW4zMiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODYgewotCi1zdGF0aWMgaW50IENvZGVQYWdlID0gT1MuR2V0QUNQKCk7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKLQlCdXR0b24gZ28gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JZ28uc2V0VGV4dCgiR28iKTsKLQlPbGVGcmFtZSBvbGVGcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCW9sZUZyYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCU9sZUF1dG9tYXRpb24gYXV0b21hdGlvbjsKLQl0cnkgewotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShvbGVGcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQlhdXRvbWF0aW9uID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JZmluYWwgT2xlQXV0b21hdGlvbiBhdXRvID0gYXV0b21hdGlvbjsKLQlnby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVN0cmluZyB1cmwgPSB0ZXh0LmdldFRleHQoKTsKLQkJCWludFtdIHJnZGlzcGlkID0gYXV0by5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQkJCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsxXTsKLQkJCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOwotCQkJYXV0by5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJfQotCX0pOwotCQotCQotCS8vIFJlYWQgUG9zdERhdGEgd2hlbmV2ZXIgd2UgbmF2aWdhdGUgdG8gYSBzaXRlIHRoYXQgdXNlcyBpdAotCWludCBCZWZvcmVOYXZpZ2F0ZTIgPSAweGZhOwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoQmVmb3JlTmF2aWdhdGUyLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlWYXJpYW50IHVybCA9IGV2ZW50LmFyZ3VtZW50c1sxXTsKLQkJCVZhcmlhbnQgcG9zdERhdGEgPSBldmVudC5hcmd1bWVudHNbNF07Ci0JCQlpZiAocG9zdERhdGEgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUG9zdERhdGEgPSAiK3JlYWRTYWZlQXJyYXkocG9zdERhdGEpKyIsIFVSTCA9ICIrdXJsLmdldFN0cmluZygpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIHRoaXMgd2ViIHNpdGUgd2hpY2ggdXNlcyBwb3N0IGRhdGEgdG8gZmlsbCBpbiB0aGUgdGV4dCBmaWVsZAotCS8vIGFuZCBwdXQgdGhlIHN0cmluZyAiaGVsbG8gd29ybGQiIGludG8gdGhlIHRleHQgYm94Ci0JdGV4dC5zZXRUZXh0KCJmaWxlOi8vIitTbmlwcGV0MTg2LmNsYXNzLmdldFJlc291cmNlKCJTbmlwcGV0MTg2Lmh0bWwiKS5nZXRGaWxlKCkpOwotCWludFtdIHJnZGlzcGlkID0gYXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIiwgIlBvc3REYXRhIn0pOyAKLQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07CQotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsyXTsKLQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh0ZXh0LmdldFRleHQoKSk7Ci0Jcmd2YXJnWzFdID0gd3JpdGVTYWZlQXJyYXkoImhlbGxvIHdvcmxkIik7Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzJdOwotCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07Ci0JcmdkaXNwaWROYW1lZEFyZ3NbMV0gPSByZ2Rpc3BpZFsyXTsKLQlhdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc3RydWN0cyBhcmUgYWNjZXNzZWQgaW4gdGhlIHJlYWRTYWZlQXJyYXkgYW5kIHdyaXRlU2FmZUFycmF5Ci0vLyBmdW5jdGlvbnM6Ci0vLwotLy8gVkFSSUFOVDoKLS8vIAkJc2hvcnQgdnQKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMQotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQyCi0vLyAJCXNob3J0IHdSZXNlcnZlZDMKLS8vIAkJaW50IHBhcnJheQotLy8KLS8vIFNBRkVBUlJBWToKLS8vICAgICAgc2hvcnQgY0RpbXMgICAgICAvLyBDb3VudCBvZiBkaW1lbnNpb25zIGluIHRoaXMgYXJyYXkKLS8vICAgICAgc2hvcnQgZkZlYXR1cmVzICAvLyBGbGFncyB1c2VkIGJ5IHRoZSBTYWZlQXJyYXkKLS8vICAgICAgaW50IGNiRWxlbWVudHMgICAvLyBTaXplIG9mIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5Ci0vLyAgICAgIGludCBjTG9ja3MgICAgICAgLy8gTnVtYmVyIG9mIHRpbWVzIHRoZSBhcnJheSBoYXMgYmVlbiBsb2NrZWQgd2l0aG91dCBjb3JyZXNwb25kaW5nIHVubG9jawotLy8gICAgICBpbnQgcHZEYXRhICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGRhdGEKLS8vICAgICAgU0FGRUFSUkFZQk9VTkRbXSByZ3NhYm91bmQgLy8gT25lIGJvdW5kIGZvciBlYWNoIGRpbWVuc2lvbgotLy8KLS8vIFNBRkVBUlJBWUJPVU5EOgotLy8gICAgICBpbnQgY0VsZW1lbnRzICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRpbWVuc2lvbgotLy8gICAgICBpbnQgbExib3VuZCAgICAgIC8vIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgZGltZW5zaW9uIAotCi1zdGF0aWMgU3RyaW5nIHJlYWRTYWZlQXJyYXkoVmFyaWFudCB2YXJpYW50QnlSZWYpIHsKLQkvLyBSZWFkIGEgc2FmZWFycmF5IHRoYXQgY29udGFpbnMgZGF0YSBvZiAKLQkvLyB0eXBlIFZUX1VJMSAodW5zaWduZWQgc2hvcnRzKSB3aGljaCBjb250YWlucwotCS8vIGEgdGV4dCBzdHJlYW0uCi0gICAgaW50IHBQb3N0RGF0YSA9IHZhcmlhbnRCeVJlZi5nZXRCeVJlZigpOwotICAgIHNob3J0W10gdnRfdHlwZSA9IG5ldyBzaG9ydFsxXTsKLSAgICBPUy5Nb3ZlTWVtb3J5KHZ0X3R5cGUsIHBQb3N0RGF0YSwgMik7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHZ0X3R5cGVbMF0gPT0gKHNob3J0KShPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCkpIHsKLSAgICAgICAgaW50W10gcFZhcmlhbnQgPSBuZXcgaW50WzFdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50LCBwUG9zdERhdGEgKyA4LCA0KTsKLSAgICAgICAgdnRfdHlwZSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgT1MuTW92ZU1lbW9yeSh2dF90eXBlLCBwVmFyaWFudFswXSwgMik7Ci0gICAgICAgIGlmICh2dF90eXBlWzBdID09IChzaG9ydCkoT0xFLlZUX0FSUkFZIHwgT0xFLlZUX1VJMSkpIHsKLSAgICAgICAgICAgIGludFtdIHBTYWZlYXJyYXkgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwU2FmZWFycmF5LCBwVmFyaWFudFswXSArIDgsIDQpOwotICAgICAgICAgICAgc2hvcnRbXSBjRGltcyA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoY0RpbXMsIHBTYWZlYXJyYXlbMF0sIDIpOwotICAgICAgICAgICAgaW50W10gcHZEYXRhID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocHZEYXRhLCBwU2FmZWFycmF5WzBdICsgMTIsIDQpOwotICAgICAgICAgICAgaW50IHNhZmVhcnJheWJvdW5kT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY0RpbXNbMF07IGkrKykgewotICAgICAgICAgICAgICAgIGludFtdIGNFbGVtZW50cyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShjRWxlbWVudHMsIHBTYWZlYXJyYXlbMF0gKyAxNiArIHNhZmVhcnJheWJvdW5kT2Zmc2V0LCA0KTsKLSAgICAgICAgICAgICAgICBzYWZlYXJyYXlib3VuZE9mZnNldCArPSA4OwotICAgICAgICAgICAgICAgIGludCBjY2hXaWRlQ2hhciA9IE9TLk11bHRpQnl0ZVRvV2lkZUNoYXIgKENvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwgIHB2RGF0YVswXSwgLTEsIG51bGwsIDApOwotCQkJCWlmIChjY2hXaWRlQ2hhciA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCQljaGFyW10gbHBXaWRlQ2hhclN0ciA9IG5ldyBjaGFyIFtjY2hXaWRlQ2hhciAtIDFdOwotCQkJCU9TLk11bHRpQnl0ZVRvV2lkZUNoYXIgKENvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwgIHB2RGF0YVswXSwgLTEsIGxwV2lkZUNoYXJTdHIsIGxwV2lkZUNoYXJTdHIubGVuZ3RoKTsKLQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGxwV2lkZUNoYXJTdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBWYXJpYW50IHdyaXRlU2FmZUFycmF5IChTdHJpbmcgc3RyaW5nKSB7Ci0JLy8gQ3JlYXRlIGEgb25lIGRpbWVuc2lvbmFsIHNhZmVhcnJheSBjb250YWluaW5nIHR3byBWVF9VSTEgdmFsdWVzCi0JLy8gd2hlcmUgVlRfVUkxIGlzIGFuIHVuc2lnbmVkIGNoYXIKLQkKLQkvLyBEZWZpbmUgY0RpbXMsIGZGZWF0dXJlcyBhbmQgY2JFbGVtZW50cwotCXNob3J0IGNEaW1zID0gMTsKLQlzaG9ydCBGQURGX0ZJWEVEU0laRSA9IDB4MTA7Ci0Jc2hvcnQgRkFERl9IQVZFVkFSVFlQRSA9IDB4ODA7Ci0Jc2hvcnQgZkZlYXR1cmVzID0gKHNob3J0KShGQURGX0ZJWEVEU0laRSB8IEZBREZfSEFWRVZBUlRZUEUpOwotCWludCBjYkVsZW1lbnRzID0gMTsKLQkvLyBDcmVhdGUgYSBwb2ludGVyIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gaXQKLQlpbnQgY291bnQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQlzdHJpbmcuZ2V0Q2hhcnMoMCwgY291bnQsIGNoYXJzLCAwKTsKLQlpbnQgY2NoTXVsdGlCeXRlID0gT1MuV2lkZUNoYXJUb011bHRpQnl0ZShDb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBudWxsLCAwLCBudWxsLCBudWxsKTsKLQlpZiAoY2NoTXVsdGlCeXRlID09IDApIHJldHVybiBudWxsOwotCWludCBwdkRhdGEgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgY2NoTXVsdGlCeXRlKTsKLQlPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBjaGFycywgLTEsIHB2RGF0YSwgY2NoTXVsdGlCeXRlLCBudWxsLCBudWxsKTsKLQlpbnQgY0VsZW1lbnRzMSA9IGNjaE11bHRpQnl0ZTsKLQlpbnQgbExib3VuZDEgPSAwOwotCS8vIENyZWF0ZSBhIHNhZmVhcnJheSBpbiBtZW1vcnkKLQkvLyAxMiBieXRlcyBmb3IgY0RpbXMsIGZGZWF0dXJlcyBhbmQgY2JFbGVtZW50cyArIDQgYnl0ZXMgZm9yIHB2RGF0YSArIG51bWJlciBvZiBkaW1lbnNpb25zICogKHNpemUgb2Ygc2FmZWFycmF5Ym91bmQpCi0JaW50IHNpemVvZlNhZmVBcnJheSA9IDEyICsgNCArIDEqODsKLQlpbnQgcFNhZmVBcnJheSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBzaXplb2ZTYWZlQXJyYXkpOwotCS8vIENvcHkgdGhlIGRhdGEgaW50byB0aGUgc2FmZSBhcnJheQotCWludCBvZmZzZXQgPSAwOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IHNob3J0W10ge2NEaW1zfSwgMik7IG9mZnNldCArPSAyOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IHNob3J0W10ge2ZGZWF0dXJlc30sIDIpOyBvZmZzZXQgKz0gMjsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7Y2JFbGVtZW50c30sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7MH0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7cHZEYXRhfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtjRWxlbWVudHMxfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtsTGJvdW5kMX0sIDQpOyBvZmZzZXQgKz0gNDsKLQkvLyBDcmVhdGUgYSB2YXJpYW50IGluIG1lbW9yeSB0byBob2xkIHRoZSBzYWZlYXJyYXkKLQlpbnQgcFZhcmlhbnQgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgVmFyaWFudC5zaXplb2YpOwotCXNob3J0IHZ0ID0gKHNob3J0KShPTEUuVlRfQVJSQVkgfCBPTEUuVlRfVUkxKTsKLQlPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50LCBuZXcgc2hvcnRbXSB7dnR9LCAyKTsKLQlPUy5Nb3ZlTWVtb3J5KHBWYXJpYW50ICsgOCwgbmV3IGludFtde3BTYWZlQXJyYXl9LCA0KTsKLQkvLyBDcmVhdGUgYSBieSByZWYgdmFyaWFudAotCVZhcmlhbnQgdmFyaWFudEJ5UmVmID0gbmV3IFZhcmlhbnQocFZhcmlhbnQsIChzaG9ydCkoT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQpKTsKLQlyZXR1cm4gdmFyaWFudEJ5UmVmOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIyNzYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxIVE1MPgotICA8SEVBRD4KLSAgICA8VElUTEU+RXZhbHVhdGU8L1RJVExFPgotCTxwPlRlc3QgZm9yIElFIFNjcmlwdDwvcD4KLSAgICA8U0NSSVBUPgotICAgICAgZnVuY3Rpb24gZXZhbHVhdGUoeCkKLSAgICAgIHsKLSAgICAgICAgIGFsZXJ0KCJoZWxsbyIpCi0gICAgICAgICByZXR1cm4gZXZhbCh4KQotICAgICAgfQotICAgPC9TQ1JJUFQ+Ci0gIDwvSEVBRD4KLQotICA8Qk9EWT4KLSAgPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IwMTYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogUnVubmluZyBhIHNjcmlwdCB3aXRoaW4gSUUuICh3aW4zMiBvbmx5KQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg3IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQl0cnkgewotCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQljb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQljb250cm9sU2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQlyZXR1cm47Ci0JfQotCQotCS8vIElXZWJCcm93c2VyCi0JZmluYWwgT2xlQXV0b21hdGlvbiB3ZWJCcm93c2VyID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCi0JLy8gV2hlbiB0aGUgZG9jdW1lbnQgaXMgbG9hZGVkLCBhY2Nlc3MgdGhlIGRvY3VtZW50IG9iamVjdCBmb3IgdGhlIG5ldyBwYWdlCi0JLy8gYW5kIGV2YWx1dGUgZXhwcmVzc2lvbiB1c2luZyBTY3JpcHQuCi0JaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihEb3dubG9hZENvbXBsZXRlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQlpbnRbXSBodG1sRG9jdW1lbnRJRCA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkRvY3VtZW50In0pOyAKLQkJCWlmIChodG1sRG9jdW1lbnRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQlWYXJpYW50IHBWYXJSZXN1bHQgPSB3ZWJCcm93c2VyLmdldFByb3BlcnR5KGh0bWxEb2N1bWVudElEWzBdKTsKLQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJLy9JSFRNTERvY3VtZW50MgotCQkJT2xlQXV0b21hdGlvbiBodG1sRG9jdW1lbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlodG1sRG9jdW1lbnQgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQkJCQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkKLQkJCQlpbnRbXSBzY3JpcHRJRCA9IGh0bWxEb2N1bWVudC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiU2NyaXB0In0pOyAKLQkJCQlpZiAoc2NyaXB0SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXBWYXJSZXN1bHQgPSBodG1sRG9jdW1lbnQuZ2V0UHJvcGVydHkoc2NyaXB0SURbMF0pOwotCQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJCU9sZUF1dG9tYXRpb24gaHRtbFdpbmRvdyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9JSFRNTFdpbmRvdzIKLQkJCQkJaHRtbFdpbmRvdyA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCQkJCQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQkJaW50W10gZXZhbHVhdGVJRCA9IGh0bWxXaW5kb3cuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJldmFsdWF0ZSJ9KTsKLQkJCQkJaWYgKGV2YWx1YXRlSUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlTdHJpbmcgZXhwcmVzc2lvbiA9ICI1K01hdGguc2luKDkpIjsKLQkJCQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KGV4cHJlc3Npb24pfTsKLQkJCQkJcFZhclJlc3VsdCA9IGh0bWxXaW5kb3cuaW52b2tlKGV2YWx1YXRlSURbMF0sIHJndmFyZywgbnVsbCk7Ci0JCQkJCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gMCkgcmV0dXJuOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXhwcmVzc2lvbisiID0iK3BWYXJSZXN1bHQuZ2V0U3RyaW5nKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWh0bWxXaW5kb3cuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaHRtbERvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vIE5hdmlnYXRlIHRvIGEgd2ViIHNpdGUKLQlpbnRbXSBpZHMgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudCgiaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwiKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0Jd2ViQnJvd3Nlci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0JCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTVkODk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBTY3JvbGwgYSB3aWRnZXQgaW50byB2aWV3IG9uIGZvY3VzIGluCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliMS5zZXRUZXh0KCJ0b3AiKTsKLQliMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXNjLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEwLCB0cnVlKSk7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgMzAwOyBpKyspIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJCdXR0b24gIitpKTsKLQl9Ci0JQnV0dG9uIGIyID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIyLnNldFRleHQoImJvdHRvbSIpOwotCWIyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQkKLQlzYy5zZXRDb250ZW50KGMpOwotCXNjLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Muc2V0TWluU2l6ZShjLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUNvbnRyb2wgY2hpbGQgPSAoQ29udHJvbCllLndpZGdldDsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjaGlsZC5nZXRCb3VuZHMoKTsKLQkJCVJlY3RhbmdsZSBhcmVhID0gc2MuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgb3JpZ2luID0gc2MuZ2V0T3JpZ2luKCk7Ci0JCQlpZiAob3JpZ2luLnggPiBib3VuZHMueCkgb3JpZ2luLnggPSBNYXRoLm1heCgwLCBib3VuZHMueCk7Ci0JCQlpZiAob3JpZ2luLnkgPiBib3VuZHMueSkgb3JpZ2luLnkgPSBNYXRoLm1heCgwLCBib3VuZHMueSk7Ci0JCQlpZiAob3JpZ2luLnggKyBhcmVhLndpZHRoIDwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpIG9yaWdpbi54ID0gTWF0aC5tYXgoMCwgYm91bmRzLnggKyBib3VuZHMud2lkdGggLSBhcmVhLndpZHRoKTsKLQkJCWlmIChvcmlnaW4ueSArIGFyZWEuaGVpZ2h0IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSBvcmlnaW4ueSA9IE1hdGgubWF4KDAsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAtIGFyZWEuaGVpZ2h0KTsKLQkJCXNjLnNldE9yaWdpbihvcmlnaW4pOwotCQl9Ci0JfTsKLQlDb250cm9sW10gY29udHJvbHMgPSBjLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQljb250cm9sc1tpXS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDUwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMzBiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2gKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTdHlsZWRUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaCIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIHVuZGVybGluZWQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMSk7Ci0JLy8gbWFrZSBBQkNERUZHSElKS0xNIGhhdmUgYSBzdHJpa2UgdGhyb3VnaAotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTIuc3RhcnQgPSAxMTsKLQlzdHlsZTIubGVuZ3RoID0gMTM7Ci0Jc3R5bGUyLnN0cmlrZW91dCA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGFwcGVhciB1bmRlcmxpbmVkIGFuZCBoYXZlIGEgc3RyaWtlIHRocm91Z2gKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTMpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY5MTY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKG9ubHkgYWxsb3cgZGlnaXRzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAyMDApOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50ZXh0OwotCQkJY2hhciBbXSBjaGFycyA9IG5ldyBjaGFyIFtzdHJpbmcubGVuZ3RoICgpXTsKLQkJCXN0cmluZy5nZXRDaGFycyAoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoISgnMCcgPD0gY2hhcnMgW2ldICYmIGNoYXJzIFtpXSA8PSAnOScpKSB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ3MWM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBGbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gU3Bpbm5lcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNwaW5uZXIgd2l0aCBmbG9hdCB2YWx1ZXMiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCi0Jc3Bpbm5lci5zZXREaWdpdHMoMyk7Ci0JLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAuMDAxCi0Jc3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCS8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAyMAotCXNwaW5uZXIuc2V0TWF4aW11bSgyMDAwMCk7Ci0JLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMTAKLQlzcGlubmVyLnNldEluY3JlbWVudCgxMCk7Ci0JLy8gc2V0IHRoZSBzZWxldGlvbiB0byAzLjQ1NgotCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDM0NTYpOwotCXNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWludCBzZWxlY3Rpb24gPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJaW50IGRpZ2l0cyA9IHNwaW5uZXIuZ2V0RGlnaXRzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbiBpcyAiKyhzZWxlY3Rpb24gLyBNYXRoLnBvdygxMCwgZGlnaXRzKSkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFjMWE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIERldGVjdCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYSB0ZXh0IGNvbnRyb2wKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDMyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKGkgKyAiLVRoaXMgaXMgYSBsaW5lIG9mIHRleHQgaW4gYSB3aWRnZXQtIiArIGkgKyAiXG4iKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDApOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RJbmRleCA9IHRleHQuZ2V0VG9wSW5kZXggKCk7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQkJaWYgKGluZGV4ICE9IGxhc3RJbmRleCkgewotCQkJCWxhc3RJbmRleCA9IGluZGV4OwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNjcm9sbGVkLCB0b3BJbmRleD0iICsgaW5kZXgpOwotCQkJfQotCQl9Ci0JfTsKLQkvKiBOT1RFOiBPbmx5IGRldGVjdHMgc2Nyb2xsaW5nIGJ5IHRoZSB1c2VyICovCi0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNjcm9sbEJhciBoQmFyID0gdGV4dC5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JaWYgKGhCYXIgIT0gbnVsbCkgewotCQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCVNjcm9sbEJhciB2QmFyID0gdGV4dC5nZXRWZXJ0aWNhbEJhcigpOwotCWlmICh2QmFyICE9IG51bGwpIHsKLQkJdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlzaGVsbC5zZXRTaXplIChzaXplLiB4IC0gMzIsIHNpemUueSAvIDIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGQ2ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2hvdyBhIHNvcnQgaW5kaWNhdG9yIGluIHRoZSBjb2x1bW4gaGVhZGVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8gaW5pdGlhbGl6ZSBkYXRhIHdpdGgga2V5cyBhbmQgcmFuZG9tIHZhbHVlcwotCWludCBzaXplID0gMTAwOwotCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JZmluYWwgaW50W11bXSBkYXRhID0gbmV3IGludFtzaXplXVtdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQlkYXRhW2ldID0gbmV3IGludFtdIHtpLCByYW5kb20ubmV4dEludCgpfTsKLQl9Ci0JLy8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZSB0byBkaXNwbGF5IGRhdGEKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZJUlRVQUwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldEl0ZW1Db3VudChzaXplKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJLZXkiKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiVmFsdWUiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaW50W10gZGF0dW0gPSBkYXRhW2luZGV4XTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge0ludGVnZXIudG9TdHJpbmcoZGF0dW1bMF0pLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzFdKSB9KTsKLQkJfQotCX0pOwotCS8vIEFkZCBzb3J0IGluZGljYXRvciBhbmQgc29ydCBkYXRhIHdoZW4gY29sdW1uIHNlbGVjdGVkCi0JTGlzdGVuZXIgc29ydExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkvLyBkZXRlcm1pbmUgbmV3IHNvcnQgY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCVRhYmxlQ29sdW1uIHNvcnRDb2x1bW4gPSB0YWJsZS5nZXRTb3J0Q29sdW1uKCk7Ci0JCQlUYWJsZUNvbHVtbiBjdXJyZW50Q29sdW1uID0gKFRhYmxlQ29sdW1uKSBlLndpZGdldDsKLQkJCWludCBkaXIgPSB0YWJsZS5nZXRTb3J0RGlyZWN0aW9uKCk7Ci0JCQlpZiAoc29ydENvbHVtbiA9PSBjdXJyZW50Q29sdW1uKSB7Ci0JCQkJZGlyID0gZGlyID09IFNXVC5VUCA/IFNXVC5ET1dOIDogU1dULlVQOwotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZS5zZXRTb3J0Q29sdW1uKGN1cnJlbnRDb2x1bW4pOwotCQkJCWRpciA9IFNXVC5VUDsKLQkJCX0KLQkJCS8vIHNvcnQgdGhlIGRhdGEgYmFzZWQgb24gY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCWZpbmFsIGludCBpbmRleCA9IGN1cnJlbnRDb2x1bW4gPT0gY29sdW1uMSA/IDAgOiAxOwotCQkJZmluYWwgaW50IGRpcmVjdGlvbiA9IGRpcjsKLQkJCUFycmF5cy5zb3J0KGRhdGEsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJaW50W10gYSA9IChpbnRbXSkgYXJnMDsKLQkJCQkJaW50W10gYiA9IChpbnRbXSkgYXJnMTsKLQkJCQkJaWYgKGFbaW5kZXhdID09IGJbaW5kZXhdKSByZXR1cm4gMDsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBTV1QuVVApIHsKLQkJCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gLTEgOiAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gMSA6IC0xOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gdXBkYXRlIGRhdGEgZGlzcGxheWVkIGluIHRhYmxlCi0JCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKGRpcik7Ci0JCQl0YWJsZS5jbGVhckFsbCgpOwotCQl9Ci0JfTsKLQljb2x1bW4xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0JY29sdW1uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uMSk7Ci0JdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOwotCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0NDFjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQWxsb3cgdXNlciB0byByZW9yZGVyIGNvbHVtbnMgYW5kIHJlb3JkZXIgY29sdW1ucyBwcm9ncmFtbWF0aWNhbGx5LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQkJZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlTdHJpbmdbXSB0ZXh0ID0gbmV3IFN0cmluZ1tde2krIjowIiwgaSsiOjEiLCBpKyI6MiIsIGkrIjozIiwgaSsiOjQifTsKLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyI6MCIsIGkrIiwiK2orIjoxIiwgaSsiLCIraisiOjIiLCBpKyIsIitqKyI6MyIsIGkrIiwiK2orIjo0In07Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQl0ZXh0ID0gbmV3IFN0cmluZ1tde2krIiwiK2orIiwiK2srIjowIiwgaSsiLCIraisiLCIraysiOjEiLCBpKyIsIitqKyIsIitrKyI6MiIsIGkrIiwiK2orIiwiK2srIjozIiwgaSsiLCIraisiLCIraysiOjQifTsKLQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdmUgIitlLndpZGdldCk7Ci0JCQl9Ci0JCX07Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5zZXRXaWR0aCgxMDApOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdHJlZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0cmVlLnNldENvbHVtbk9yZGVyKG9yZGVyKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjI1M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFdyaXRlIGFuIGFuaW1hdGVkIEdJRiB0byBhIGZpbGUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NCB7Ci0JRGlzcGxheSBkaXNwbGF5OwotCUNvbG9yIHdoaXRlLCByZWQsIGdyZWVuLCBibHVlOwotCVBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0JRm9udCBmb250OwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgU25pcHBldDE5NCgpLnJ1bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlSR0Igd2hpdGVSR0IgPSBuZXcgUkdCKDB4ZmYsIDB4ZmYsIDB4ZmYpOwotCQlSR0IgcmVkUkdCID0gbmV3IFJHQigweGZmLCAwLCAwKTsKLQkJUkdCIGdyZWVuUkdCID0gbmV3IFJHQigwLCAweGZmLCAwKTsKLQkJUkdCIGJsdWVSR0IgPSBuZXcgUkdCKDAsIDAsIDB4ZmYpOwotCQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7Ci0JCQkJd2hpdGVSR0IsCS8vIDAKLQkJCQlyZWRSR0IsCQkvLyAxCi0JCQkJZ3JlZW5SR0IsCS8vIDIKLQkJCQlibHVlUkdCIH0pOwkvLyAzCi0JCXdoaXRlID0gbmV3IENvbG9yKGRpc3BsYXksIHdoaXRlUkdCKTsKLQkJcmVkID0gbmV3IENvbG9yKGRpc3BsYXksIHJlZFJHQik7Ci0JCWdyZWVuID0gbmV3IENvbG9yKGRpc3BsYXksIGdyZWVuUkdCKTsKLQkJYmx1ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCBibHVlUkdCKTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb21pYyBTYW5zIE1TIiwgMjQsIFNXVC5CT0xEKTsKLQkJCi0JCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VEYXRhWzRdOwotCQlkYXRhWzBdID0gbmV3RnJhbWUoIiIsICB3aGl0ZSwgZmFsc2UsIDAsIDAsIDEwMSwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVsxXSA9IG5ld0ZyYW1lKCJTIiwgcmVkLCAgIHRydWUsICAwLCAwLCAgMzAsIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbMl0gPSBuZXdGcmFtZSgiVyIsIGdyZWVuLCB0cnVlLCAyOCwgMCwgIDM5LCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzNdID0gbmV3RnJhbWUoIlQiLCBibHVlLCAgdHJ1ZSwgNjksIDAsICAzMiwgNTUsIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQsIDIwMCk7Ci0JCQotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBkYXRhOwotCQlsb2FkZXIuYmFja2dyb3VuZFBpeGVsID0gMDsKLQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQgPSBkYXRhWzBdLmhlaWdodDsKLQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCA9IGRhdGFbMF0ud2lkdGg7Ci0JCWxvYWRlci5yZXBlYXRDb3VudCA9IDA7IC8vIHJ1biBmb3JldmVyCi0JCWxvYWRlci5zYXZlKCJzd3QuZ2lmIiwgU1dULklNQUdFX0dJRik7Ci0KLQkJd2hpdGUuZGlzcG9zZSgpOwotCQlyZWQuZGlzcG9zZSgpOwotCQlncmVlbi5kaXNwb3NlKCk7Ci0JCWJsdWUuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JSW1hZ2VEYXRhIG5ld0ZyYW1lKFN0cmluZyBsZXR0ZXIsIENvbG9yIGNvbG9yLCBib29sZWFuIHRyYW5zcGFyZW50LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKSB7Ci0JCUltYWdlRGF0YSB0ZW1wID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAyLCBwYWxldHRlKTsgLy8gNC1jb2xvciBwYWxldHRlIGhhcyBkZXB0aCAyCi0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHRlbXApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2MuZHJhd1N0cmluZyhsZXR0ZXIsIDUsIDUpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCUltYWdlRGF0YSBmcmFtZSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpZiAodHJhbnNwYXJlbnQpIGZyYW1lLnRyYW5zcGFyZW50UGl4ZWwgPSAwOyAvLyB3aGl0ZQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZyYW1lLnggPSB4OwotCQlmcmFtZS55ID0geTsKLQkJZnJhbWUuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQkJZnJhbWUuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZjZmM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiB1c2UgTFdKR0wgdG8gZHJhdyB0byBhbiBTV1QgR0xDYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xEYXRhOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0wxMTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMQ29udGV4dDsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLmdsdS5HTFU7Ci1pbXBvcnQgb3JnLmx3amdsLkxXSkdMRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NSB7Ci0Jc3RhdGljIHZvaWQgZHJhd1RvcnVzKGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZiwgY29zVGhldGEgPSAxLjBmLCBzaW5UaGV0YSA9IDAuMGY7Ci0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMMTEuZ2xCZWdpbihHTDExLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCWZvciAoaW50IGogPSBuc2lkZXM7IGogPj0gMDsgai0tKSB7Ci0JCQkJcGhpICs9IHNpZGVEZWx0YTsKLQkJCQlmbG9hdCBjb3NQaGkgPSAoZmxvYXQpIE1hdGguY29zKHBoaSk7Ci0JCQkJZmxvYXQgc2luUGhpID0gKGZsb2F0KSBNYXRoLnNpbihwaGkpOwotCQkJCWZsb2F0IGRpc3QgPSBSICsgciAqIGNvc1BoaTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhICogY29zUGhpLCAtc2luVGhldGEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQlHTDExLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY29tcCwgU1dULk5PTkUsIGRhdGEpOwotCi0JCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCXRyeSB7Ci0JCQlHTENvbnRleHQudXNlQ29udGV4dChjYW52YXMpOwotCQl9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCi0JCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCQl9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCQkJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0JCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0JCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJfQotCQl9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA4MWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2ZXJpZnkgaW5wdXQKLSAqIEluIHRoaXMgY2FzZSBhIHBob25lIG51bWJlciBpcyB1c2VkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTYgewotCS8qCi0JICogUGhvbmUgbnVtYmVycyBmb2xsb3cgdGhlIHJ1bGUgWyhdWzEtOV1bMS05XVsxLTldWyldWzEtOV1bMS05XVsxLTldWy1dWzEtOV1bMS05XVsxLTldWzEtOV0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVggPSAiWyhdXFxkezN9WyldXFxkezN9Wy1dXFxkezR9IjsgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVtcGxhdGUgPSAiKCMjIykjIyMtIyMjIyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFRleHQgPSAiKDAwMCkwMDAtMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvdXJpZXIgTmV3IiwgMTAsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCXRleHQuc2V0Rm9udChmb250KTsKLQl0ZXh0LnNldFRleHQodGVtcGxhdGUpOwkKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJLy9jcmVhdGUgdGhlIHBhdHRlcm4gZm9yIHZlcmlmaWNhdGlvbgotCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoUkVHRVgpOwkKLQkJLy9pZ25vcmUgZXZlbnQgd2hlbiBjYXVzZWQgYnkgaW5zZXJ0aW5nIHRleHQgaW5zaWRlIGV2ZW50IGhhbmRsZXIKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJaWYgKGUuc3RhcnQgPiAxMyB8fCBlLmVuZCA+IDE0KSByZXR1cm47Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJCi0JCQkvL2hhbmRsZSBiYWNrc3BhY2UKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCS8vIHNraXAgb3ZlciBzZXBhcmF0b3JzCi0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAKLQkJCQkJCQlpZiAoZS5zdGFydCArIDEgPT0gZS5lbmQpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnKSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDg6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnLSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJy0nKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiBidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJLy8gbW92ZSBjdXJzb3IgYmFja3dhcmRzIG92ZXIgc2VwYXJhdG9ycwotCQkJCWlmIChlLnN0YXJ0ID09IDUgfHwgZS5zdGFydCA9PSA5KSBlLnN0YXJ0LS07Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZGVmYXVsdFRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gZS50ZXh0LnRvQ2hhckFycmF5KCk7Ci0JCQlpbnQgaW5kZXggPSBlLnN0YXJ0IC0gMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZS50ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpbmRleCsrOwotCQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICcoJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKScpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDg6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy0nKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4ID49IG5ld1RleHQubGVuZ3RoKCkpIHJldHVybjsKLQkJCQluZXdUZXh0LnNldENoYXJBdChpbmRleCwgY2hhcnNbaV0pOwotCQkJfQotCQkJLy8gaWYgdGV4dCBpcyBzZWxlY3RlZCwgZG8gbm90IHBhc3RlIGJleW9uZCByYW5nZSBvZiBzZWxlY3Rpb24KLQkJCWlmIChlLnN0YXJ0IDwgZS5lbmQgJiYgaW5kZXggKyAxICE9IGUuZW5kKSByZXR1cm47Ci0JCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3VGV4dCk7Ci0JCQlpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgewotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGluZGV4ICsgMSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChuZXdUZXh0LnN1YnN0cmluZyhlLnN0YXJ0LCBpbmRleCArIDEpKTsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCX0pOwotCQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjA5YmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgd3JhcHBlZCB0ZXh0IHVzaW5nIFRleHRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTcgewotCWZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ1N0cmluZyA9ICJUaGUgcHJlZmVycmVkIHNpemUgb2YgYSB3aWRnZXQgaXMgdGhlIG1pbmltdW0gc2l6ZSBuZWVkZWQgdG8gc2hvdyBpdHMgY29udGVudC4gSW4gdGhlIGNhc2Ugb2YgYSBDb21wb3NpdGUsIHRoZSBwcmVmZXJyZWQgc2l6ZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cyBjaGlsZHJlbi4gSWYgY2hpbGRyZW4gaGF2ZSBiZWVuIHBvc2l0aW9uZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCB0aGUgQ29tcG9zaXRlIGNvbXB1dGVzIGl0cyBvd24gcHJlZmVycmVkIHNpemUgYmFzZWQgb24gdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBjaGlsZHJlbi4gSWYgYSBDb21wb3NpdGUgaXMgdXNpbmcgYSBsYXlvdXQgY2xhc3MgdG8gcG9zaXRpb24gaXRzIGNoaWxkcmVuLCBpdCBhc2tzIHRoZSBMYXlvdXQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBpdHMgY2xpZW50QXJlYSwgYW5kIHRoZW4gaXQgYWRkcyBpbiB0aGUgdHJpbSB0byBkZXRlcm1pbmUgaXRzIHByZWZlcnJlZCBzaXplLiI7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KGxvbmdTdHJpbmcpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuUGFpbnQ6Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIDEwLCAxMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5SZXNpemU6Ci0JCQkJbGF5b3V0LnNldFdpZHRoKHNoZWxsLmdldFNpemUoKS54IC0gMjApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjIxZmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHBhdGggZnJvbSBzb21lIHRleHQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDk2LCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCWZpbmFsIENvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlmaW5hbCBQYXRoIHBhdGg7Ci0JdHJ5IHsKLQkJcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewkJCQotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2Muc2V0QmFja2dyb3VuZChncmVlbik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXBhdGguZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjZmODMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0ZW4gZm9yIGV2ZW50cyBpbiBFeGNlbCAod2luMzIgb25seSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTkgewotCXN0YXRpYyBTdHJpbmcgSUlEX0FwcEV2ZW50cyA9ICJ7MDAwMjQ0MTMtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSI7Ci0JLy8gRXZlbnQgSUQKLQlzdGF0aWMgaW50IE5ld1dvcmtib29rICAgICAgICAgICAgPSAweDAwMDAwNjFkOwotCXN0YXRpYyBpbnQgU2hlZXRTZWxlY3Rpb25DaGFuZ2UgICA9IDB4MDAwMDA2MTY7Ci0Jc3RhdGljIGludCBTaGVldEJlZm9yZURvdWJsZUNsaWNrID0gMHgwMDAwMDYxNzsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlUmlnaHRDbGljayAgPSAweDAwMDAwNjE4OwotCXN0YXRpYyBpbnQgU2hlZXRBY3RpdmF0ZSAgICAgICAgICA9IDB4MDAwMDA2MTk7Ci0Jc3RhdGljIGludCBTaGVldERlYWN0aXZhdGUgICAgICAgID0gMHgwMDAwMDYxYTsKLQlzdGF0aWMgaW50IFNoZWV0Q2FsY3VsYXRlICAgICAgICAgPSAweDAwMDAwNjFiOwotCXN0YXRpYyBpbnQgU2hlZXRDaGFuZ2UgICAgICAgICAgICA9IDB4MDAwMDA2MWM7Ci0Jc3RhdGljIGludCBXb3JrYm9va09wZW4gICAgICAgICAgID0gMHgwMDAwMDYxZjsKLQlzdGF0aWMgaW50IFdvcmtib29rQWN0aXZhdGUgICAgICAgPSAweDAwMDAwNjIwOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tEZWFjdGl2YXRlICAgICA9IDB4MDAwMDA2MjE7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZUNsb3NlICAgID0gMHgwMDAwMDYyMjsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlU2F2ZSAgICAgPSAweDAwMDAwNjIzOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVQcmludCAgICA9IDB4MDAwMDA2MjQ7Ci0Jc3RhdGljIGludCBXb3JrYm9va05ld1NoZWV0ICAgICAgID0gMHgwMDAwMDYyNTsKLQlzdGF0aWMgaW50IFdvcmtib29rQWRkaW5JbnN0YWxsICAgPSAweDAwMDAwNjI2OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpblVuaW5zdGFsbCA9IDB4MDAwMDA2Mjc7Ci0Jc3RhdGljIGludCBXaW5kb3dSZXNpemUgICAgICAgICAgID0gMHgwMDAwMDYxMjsKLQlzdGF0aWMgaW50IFdpbmRvd0FjdGl2YXRlICAgICAgICAgPSAweDAwMDAwNjE0OwotCXN0YXRpYyBpbnQgV2luZG93RGVhY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MTU7Ci0Jc3RhdGljIGludCBTaGVldEZvbGxvd0h5cGVybGluayAgID0gMHgwMDAwMDczZTsKLQotIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0KLQlPbGVBdXRvbWF0aW9uIGV4Y2VsU2hlZXQgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JaW50W10gZGlzcElEcyA9IGV4Y2VsU2hlZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJBcHBsaWNhdGlvbiJ9KTsKLQlWYXJpYW50IHBWYXJSZXN1bHQgPSBleGNlbFNoZWV0LmdldFByb3BlcnR5KGRpc3BJRHNbMF0pOwotCU9sZUF1dG9tYXRpb24gYXBwbGljYXRpb24gPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQlleGNlbFNoZWV0LmRpc3Bvc2UoKTsKLQkKLQlpbnQgZXZlbnRJRCA9IFNoZWV0U2VsZWN0aW9uQ2hhbmdlOwotCU9sZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoT2xlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gaGFzIGNoYW5nZWQiKTsKLQkJCS8vIHR3byBhcmd1bWVudHMgd2hpY2ggbXVzdCBiZSByZWxlYXNlZCAocm93IGFuZCBjb2x1bW4pCi0JCQlWYXJpYW50W10gYXJncyA9IGUuYXJndW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOwotCQkJCWFyZ3MgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX07Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihhcHBsaWNhdGlvbiwgSUlEX0FwcEV2ZW50cywgZXZlbnRJRCwgbGlzdGVuZXIpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlhcHBsaWNhdGlvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU1YmQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzb3J0IGEgdGFibGUgYnkgY29sdW1uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgIGNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJhIiwgIjMifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYiIsICIyIn0pOwotICAgIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImMiLCAiMSJ9KTsKLSAgICBjb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0gICAgY29sdW1uMi5zZXRXaWR0aCgxMDApOwotICAgIExpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IChUYWJsZUNvbHVtbillLndpZGdldDsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbHVtbiA9PSBjb2x1bW4xID8gMCA6IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMSA9IGl0ZW1zW2ldLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMiA9IGl0ZW1zW2pdLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGF0b3IuY29tcGFyZSh2YWx1ZTEsIHZhbHVlMikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7aXRlbXNbaV0uZ2V0VGV4dCgwKSwgaXRlbXNbaV0uZ2V0VGV4dCgxKX07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGNvbHVtbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICBjb2x1bW4yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0gICAgdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4xKTsKLSAgICB0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0gICAgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLngsIDMwMCk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjBiZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29vbEJhciBiYXIgPSBuZXcgQ29vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbSAoYmFyLCBTV1QuTk9ORSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChiYXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpdGVtLnNldFByZWZlcnJlZFNpemUgKGl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkNDNkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsbCBhIHNoYXBlIHdpdGggYSBwcmVkZWZpbmVkIHBhdHRlcm4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAwIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vZGVmaW5lIGEgcGF0dGVybiBvbiBhbiBpbWFnZQotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMDAsIDEwMDApOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKHllbGxvdyk7Ci0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDEwMDAsIDEwMDAsIHRydWUpOwotCWZvciAoaW50IGk9LTUwMDsgaTwxMDAwOyBpKz0xMCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQlnYy5kcmF3TGluZShpLCAwLCA1MDAgKyBpLCAxMDAwKTsKLQkJZ2MuZHJhd0xpbmUoNTAwICsgaSwgMCwgaSwgMTAwMCk7Ci0JfQkKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgUGF0dGVybiBwYXR0ZXJuOwotCXRyeSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkaXNwbGF5LCBpbWFnZSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQljLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIHIgPSAoKENvbXBvc2l0ZSlldmVudC53aWRnZXQpLmdldENsaWVudEFyZWEoKTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCWdjLmZpbGxPdmFsKDUsIDUsIHIud2lkdGggLSAxMCwgci5oZWlnaHQgLSAxMCk7CQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWExY2I3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenksIHBhZ2Ugc2l6ZSA2NCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAxIHsKLQotc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSA2NDsKLXN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaW50IHN0YXJ0ID0gaW5kZXggLyBQQUdFX1NJWkUgKiBQQUdFX1NJWkU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4gKHN0YXJ0ICsgUEFHRV9TSVpFLCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLQkJCQlpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoMjAwLCAyMDApKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkFkZCBJdGVtcyIpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQl0YWJsZS5zZXRJdGVtQ291bnQgKENPVU5UKTsKLQkJCWxvbmcgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQlsYWJlbC5zZXRUZXh0ICgiSXRlbXM6ICIgKyBDT1VOVCArICIsIFRpbWU6ICIgKyAodDIgLSB0MSkgKyAiIChtcykgW3BhZ2U9IiArIFBBR0VfU0laRSArICJdIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjkwNDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFZpcnR1YWwgVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHBvcHVsYXRlIHRyZWUgbGF6aWx5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJaWYgKHBhcmVudEl0ZW0gPT0gbnVsbCkgewotCQkJCXRleHQgPSAibm9kZSAiK3RyZWUuaW5kZXhPZihpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9IHBhcmVudEl0ZW0uZ2V0VGV4dCgpKyIgLSAiK3BhcmVudEl0ZW0uaW5kZXhPZihpdGVtKTsKLQkJCX0KLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWl0ZW0uc2V0SXRlbUNvdW50KDEwKTsKLQkJfQotCX0pOwotCXRyZWUuc2V0SXRlbUNvdW50KDIwKTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjZkZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyBUZXh0TGF5b3V0IGp1c3RpZnksIGFsaWdubWVudCBhbmQgaW5kZW50IAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJJbmRlbnQsIEp1c3RpZnksIEFsaWduIik7Ci0JU3RyaW5nW10gdGV4dHMgPSB7Ci0JCSJQbGFucyBkbyBub3QgbWF0ZXJpYWxpemUgb3V0IG9mIG5vd2hlcmUsIG5vciBhcmUgdGhleSBlbnRpcmVseSBzdGF0aWMuIFRvIGVuc3VyZSB0aGUgcGxhbm5pbmcgcHJvY2VzcyBpcyB0cmFuc3BhcmVudCBhbmQgb3BlbiB0byB0aGUgZW50aXJlIEVjbGlwc2UgY29tbXVuaXR5LCB3ZSAodGhlIEVjbGlwc2UgUE1DKSBwb3N0IHBsYW5zIGluIGFuIGVtYnJ5b25pYyBmb3JtIGFuZCByZXZpc2UgdGhlbSB0aHJvdWdob3V0IHRoZSByZWxlYXNlIGN5Y2xlLiIsCi0JCSJUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGxhbiBkZWFscyB3aXRoIHRoZSBpbXBvcnRhbnQgbWF0dGVycyBvZiByZWxlYXNlIGRlbGl2ZXJhYmxlcywgcmVsZWFzZSBtaWxlc3RvbmVzLCB0YXJnZXQgb3BlcmF0aW5nIGVudmlyb25tZW50cywgYW5kIHJlbGVhc2UtdG8tcmVsZWFzZSBjb21wYXRpYmlsaXR5LiBUaGVzZSBhcmUgYWxsIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgY2xlYXIgZm9yIGFueSByZWxlYXNlLCBldmVuIGlmIG5vIGZlYXR1cmVzIHdlcmUgdG8gY2hhbmdlLiIsCi0JCSJUaGUgcmVtYWluZGVyIG9mIHRoZSBwbGFuIGNvbnNpc3RzIG9mIHBsYW4gaXRlbXMgZm9yIHRoZSB2YXJpb3VzIEVjbGlwc2Ugc3VicHJvamVjdHMuIEVhY2ggcGxhbiBpdGVtIGNvdmVycyBhIGZlYXR1cmUgb3IgQVBJIHRoYXQgaXMgdG8gYmUgYWRkZWQgdG8gRWNsaXBzZSwgb3Igc29tZSBhc3BlY3Qgb2YgRWNsaXBzZSB0aGF0IGlzIHRvIGJlIGltcHJvdmVkLiBFYWNoIHBsYW4gaXRlbSBoYXMgaXRzIG93biBlbnRyeSBpbiB0aGUgRWNsaXBzZSBidWd6aWxsYSBkYXRhYmFzZSwgd2l0aCBhIHRpdGxlIGFuZCBhIGNvbmNpc2Ugc3VtbWFyeSAodXN1YWxseSBhIHNpbmdsZSBwYXJhZ3JhcGgpIHRoYXQgZXhwbGFpbnMgdGhlIHdvcmsgaXRlbSBhdCBhIHN1aXRhYmx5IGhpZ2ggZW5vdWdoIGxldmVsIHNvIHRoYXQgZXZlcnlvbmUgY2FuIHJlYWRpbHkgdW5kZXJzdGFuZCB3aGF0IHRoZSB3b3JrIGl0ZW0gaXMgd2l0aG91dCBoYXZpbmcgdG8gdW5kZXJzdGFuZCB0aGUgbml0dHktZ3JpdHR5IGRldGFpbC4iLAotCX07Ci0JaW50W10gYWxpZ25tZW50cyA9IHtTV1QuTEVGVCwgU1dULkNFTlRFUiwgU1dULlJJR0hUfTsKLQlmaW5hbCBUZXh0TGF5b3V0W10gbGF5b3V0cyA9IG5ldyBUZXh0TGF5b3V0W3RleHRzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCVRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JCWxheW91dC5zZXRUZXh0KHRleHRzW2ldKTsKLQkJbGF5b3V0LnNldEluZGVudCgzMCk7Ci0JCWxheW91dC5zZXRKdXN0aWZ5KHRydWUpOwotCQlsYXlvdXQuc2V0QWxpZ25tZW50KGFsaWdubWVudHNbaV0pOwkJCi0JCWxheW91dHNbaV0gPSBsYXlvdXQ7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWludCB3aWR0aCA9IHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBwb2ludC54OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dExheW91dCBsYXlvdXQgPSBsYXlvdXRzW2ldOwotCQkJCWxheW91dC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwotCQkJCXBvaW50LnkgKz0gbGF5b3V0LmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQkJCQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKyspIHsKLQkJbGF5b3V0c1tpXS5kaXNwb3NlKCk7CQkKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjYwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgdGhlIHJpc2UgZmllbGQgb2YgYSBUZXh0U3R5bGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0Jc2hlbGwuc2V0VGV4dCgiTW9kaWZ5IFJpc2UiKTsKLQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgMjQsIFNXVC5OT1JNQUwpOwotCUZvbnQgc21hbGxGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDgsIFNXVC5OT1JNQUwpOwotCUdDIGdjID0gbmV3IEdDKHNoZWxsKTsKLQlnYy5zZXRGb250KHNtYWxsRm9udCk7Ci0JRm9udE1ldHJpY3Mgc21hbGxNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgc21hbGxCYXNlbGluZSA9IHNtYWxsTWV0cmljcy5nZXRBc2NlbnQoKSArIHNtYWxsTWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlGb250TWV0cmljcyBtZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgYmFzZWxpbmUgPSBtZXRyaWNzLmdldEFzY2VudCgpICsgbWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0MCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dDAuc2V0VGV4dCgiU3Vic2NyaXB0U2NyaXB0U3VwZXJzY3JpcHQiKTsKLQlsYXlvdXQwLnNldEZvbnQoZm9udCk7Ci0JVGV4dFN0eWxlIHN1YnNjcmlwdDAgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN1cGVyc2NyaXB0MCA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdXBlcnNjcmlwdDAucmlzZSA9IGJhc2VsaW5lIC0gc21hbGxCYXNlbGluZTsKLQlsYXlvdXQwLnNldFN0eWxlKHN1YnNjcmlwdDAsIDAsIDgpOwotCWxheW91dDAuc2V0U3R5bGUoc3VwZXJzY3JpcHQwLCAxNSwgMjUpOwotCQkKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dDEgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQxLnNldFRleHQoIlN1YnNjcmlwdFNjcmlwdFN1cGVyc2NyaXB0Iik7Ci0JbGF5b3V0MS5zZXRGb250KGZvbnQpOwotCVRleHRTdHlsZSBzdWJzY3JpcHQxID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1YnNjcmlwdDEucmlzZSA9IC1zbWFsbEJhc2VsaW5lOwotCVRleHRTdHlsZSBzdXBlcnNjcmlwdDEgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3VwZXJzY3JpcHQxLnJpc2UgPSBiYXNlbGluZTsKLQlsYXlvdXQxLnNldFN0eWxlKHN1YnNjcmlwdDEsIDAsIDgpOwotCWxheW91dDEuc2V0U3R5bGUoc3VwZXJzY3JpcHQxLCAxNSwgMjUpOwotCQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MCA9IGxheW91dDAuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MC54ICs9IDEwOwotCQkJcmVjdDAueSArPSAxMDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDApOwotCQkJbGF5b3V0MC5kcmF3KGdjLCByZWN0MC54LCByZWN0MC55KTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55KTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLngsIHJlY3QwLnkgKyBiYXNlbGluZSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55ICsgYmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSArIHJlY3QwLmhlaWdodCk7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MSA9IGxheW91dDEuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MS54ICs9IDEwOwotCQkJcmVjdDEueSArPSAyMCArIHJlY3QwLmhlaWdodDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDEpOwkJCQotCQkJbGF5b3V0MS5kcmF3KGdjLCByZWN0MS54LCByZWN0MS55KTsKLQkJCQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgc21hbGxCYXNlbGluZSwgcmVjdDEueCArIHJlY3QxLndpZHRoLCByZWN0MS55ICsgc21hbGxCYXNlbGluZSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgYmFzZWxpbmUgKyBzbWFsbEJhc2VsaW5lLCByZWN0MS54ICsgcmVjdDEud2lkdGgsIHJlY3QxLnkgKyBiYXNlbGluZSArIHNtYWxsQmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSwgcmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSArIHJlY3QxLmhlaWdodCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dDAuZGlzcG9zZSgpOwotCWxheW91dDEuZGlzcG9zZSgpOwotCXNtYWxsRm9udC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGYxMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyB0aGUgR2x5cGhNZXRyaWNzIHRvIGVtYmVkZGVkIGltYWdlcyBpbiAKLSAqIGEgVGV4dExheW91dC4gCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDUgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQlzaGVsbC5zZXRUZXh0KCJFbWJlZGRpbmcgb2JqZWN0cyBpbiB0ZXh0Iik7Ci0JZmluYWwgSW1hZ2VbXSBpbWFnZXMgPSB7bmV3IEltYWdlKGRpc3BsYXksIDMyLCAzMiksIG5ldyBJbWFnZShkaXNwbGF5LCAyMCwgNDApLCBuZXcgSW1hZ2UoZGlzcGxheSwgNDAsIDIwKX07Ci0JaW50W10gY29sb3JzICA9IHtTV1QuQ09MT1JfQkxVRSwgU1dULkNPTE9SX01BR0VOVEEsIFNXVC5DT0xPUl9HUkVFTn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2VzW2ldKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9yc1tpXSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlc1tpXS5nZXRCb3VuZHMoKSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7Ci0JYnV0dG9uLnBhY2soKTsKLQlTdHJpbmcgdGV4dCA9ICJIZXJlIGlzIHNvbWUgdGV4dCB3aXRoIGEgYmx1ZSBpbWFnZSBcdUZGRkMsIGEgbWFnZW50YSBpbWFnZSBcdUZGRkMsIGEgZ3JlZW4gaW1hZ2UgXHVGRkZDLCBhbmQgYSBidXR0b246IFx1RkZGQy4iOwotCWZpbmFsIGludFtdIGltYWdlT2Zmc2V0cyA9IHszNiwgNTUsIDcyfTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KHRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZXNbaV0uZ2V0Qm91bmRzKCk7Ci0JCVRleHRTdHlsZSBpbWFnZVN0eWxlID0gbmV3IFRleHRTdHlsZShudWxsLCBudWxsLCBudWxsKTsKLQkJaW1hZ2VTdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhib3VuZHMuaGVpZ2h0LCAwLCBib3VuZHMud2lkdGgpOyAKLQkJbGF5b3V0LnNldFN0eWxlKGltYWdlU3R5bGUsIGltYWdlT2Zmc2V0c1tpXSwgaW1hZ2VPZmZzZXRzW2ldKTsKLQl9Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQlUZXh0U3R5bGUgYnV0dG9uU3R5bGUgPSBuZXcgVGV4dFN0eWxlKG51bGwsIG51bGwsIG51bGwpOwotCWJ1dHRvblN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGJvdW5kcy5oZWlnaHQsIDAsIGJvdW5kcy53aWR0aCk7IAotCWZpbmFsIGludCBidXR0b25PZmZzZXQgPSB0ZXh0Lmxlbmd0aCgpIC0gMjsKLQlsYXlvdXQuc2V0U3R5bGUoYnV0dG9uU3R5bGUsIGJ1dHRvbk9mZnNldCwgYnV0dG9uT2Zmc2V0KTsKLQkKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlQb2ludCBtYXJnaW4gPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAyICogbWFyZ2luLngpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIG1hcmdpbi54LCBtYXJnaW4ueSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWludCBvZmZzZXQgPSBpbWFnZU9mZnNldHNbaV07Ci0JCQkJaW50IGxpbmVJbmRleCA9IGxheW91dC5nZXRMaW5lSW5kZXgob2Zmc2V0KTsKLQkJCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJCVBvaW50IHBvaW50ID0gbGF5b3V0LmdldExvY2F0aW9uKG9mZnNldCwgZmFsc2UpOwotCQkJCUdseXBoTWV0cmljcyBnbHlwaE1ldHJpY3MgPSBsYXlvdXQuZ2V0U3R5bGUob2Zmc2V0KS5tZXRyaWNzOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZXNbaV0sIHBvaW50LnggKyBtYXJnaW4ueCwgcG9pbnQueSArIG1hcmdpbi55ICsgbGluZU1ldHJpY3MuZ2V0QXNjZW50KCkgLSBnbHlwaE1ldHJpY3MuYXNjZW50KTsKLQkJCX0KLQkJCWludCBsaW5lSW5kZXggPSBsYXlvdXQuZ2V0TGluZUluZGV4KGJ1dHRvbk9mZnNldCk7Ci0JCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJUG9pbnQgcG9pbnQgPSBsYXlvdXQuZ2V0TG9jYXRpb24oYnV0dG9uT2Zmc2V0LCBmYWxzZSk7Ci0JCQlHbHlwaE1ldHJpY3MgZ2x5cGhNZXRyaWNzID0gbGF5b3V0LmdldFN0eWxlKGJ1dHRvbk9mZnNldCkubWV0cmljczsKLQkJCWJ1dHRvbi5zZXRMb2NhdGlvbihwb2ludC54ICsgbWFyZ2luLngsIHBvaW50LnkgKyBtYXJnaW4ueSArIGxpbmVNZXRyaWNzLmdldEFzY2VudCgpIC0gZ2x5cGhNZXRyaWNzLmFzY2VudCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbGF5b3V0LmRpc3Bvc2UoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0NTNiNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQSBidXR0b24gd2l0aCB0ZXh0IGFuZCBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTA5MGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBVc2UgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgdG8gcmVmbGVjdCwgcm90YXRlIGFuZCBzaGVhciBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNyB7CQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDExMCwgNjApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJUaW1lcyIsIDMwLCBTV1QuQk9MRCk7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTEwLCA2MCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJZ2MuZHJhd1RleHQoIlNXVCIsIDEwLCAxMCwgdHJ1ZSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWF0cml4IFRyYW5mb3JtYXRpb25zIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7CQotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoIWdjLmdldEFkdmFuY2VkKCkpewotCQkJCQlnYy5kcmF3VGV4dCgiQWR2YW5jZWQgZ3JhcGhpY3Mgbm90IHN1cHBvcnRlZCIsIDMwLCAzMCwgdHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gT3JpZ2luYWwgaW1hZ2UKLQkJCQlpbnQgeCA9IDMwLCB5ID0gMzA7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsgCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJCi0JCQkJLy8gTm90ZSB0aGF0IHRoZSB0cmFuZm9ybSBpcyBhcHBsaWVkIHRvIHRoZSB3aG9sZSBHQyB0aGVyZWZvcmUKLQkJCQkvLyB0aGUgY29vcmRpbmF0ZXMgbmVlZCB0byBiZSBhZGp1c3RlZCB0b28uCi0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHkgYXhpcy4KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIDEsIDAgLDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgLTEqeC1yZWN0LndpZHRoLCB5KTsKLQkJCQkKLQkJCQl4ID0gMzA7IHkgKz0gcmVjdC5oZWlnaHQgKyAzMDsKLQkJCQkKLQkJCQkvLyBSZWZsZWN0IGFyb3VuZCB0aGUgeCBheGlzLiAKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgMCwgMCwgLTEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHggYW5kIHkgYXhlcwkKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIC0xLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIC0xKngtcmVjdC53aWR0aCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCA9IDMwOyB5ICs9IHJlY3QuaGVpZ2h0ICsgMzA7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4gdGhlIHgtZGlyZWN0aW9uCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIDAsIC0xLCAxLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDMwMCwgeSk7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4geS1kaXJlY3Rpb24KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgLTEsIDAsIDEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMTUwLCA0NzUpOwotCQkJCQotCQkJCS8vIFJvdGF0ZSBieSA0NSBkZWdyZWVzCQotCQkJCWZsb2F0IGNvczQ1ID0gKGZsb2F0KU1hdGguY29zKDQ1KTsKLQkJCQlmbG9hdCBzaW40NSA9IChmbG9hdClNYXRoLnNpbig0NSk7Ci0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKGNvczQ1LCBzaW40NSwgLXNpbjQ1LCBjb3M0NSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAzNTAsIDEwMCk7Ci0JCQkJCi0JCQkJdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDM1MCwgNTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQkKLQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4ODY1Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENoYW5nZSBodWUsIHNhdHVyYXRpb24gYW5kIGJyaWdodG5lc3Mgb2YgYSBjb2xvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwOCB7CSAKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSgweGZmLCAweGZmMDAsIDB4ZmYwMDAwKTsJCi0JCi0JLy8gSW1hZ2VEYXRhIHNob3dpbmcgdmFyaWF0aW9ucyBvZiBodWUJCi0JSW1hZ2VEYXRhIGh1ZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDM2MCwgMTAwLCAyNCwgcGFsZXR0ZSk7CQotCWZsb2F0IGh1ZSA9IDA7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBodWVEYXRhLndpZHRoOyB4KyspIHsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBodWVEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoaHVlLCAxZiwgMWYpKTsKLQkJCWh1ZURhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQl9Ci0JCWh1ZSArPSAzNjBmIC8gaHVlRGF0YS53aWR0aDsKLQl9Ci0KLQkvLyBJbWFnZURhdGEgc2hvd2luZyBzYXR1cmF0aW9uIG9uIHggYXhpcyBhbmQgYnJpZ2h0bmVzcyBvbiB5IGF4aXMKLQlJbWFnZURhdGEgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhID0gbmV3IEltYWdlRGF0YSgzNjAsIDM2MCwgMjQsIHBhbGV0dGUpOwotCWZsb2F0IHNhdHVyYXRpb24gPSAwZjsKLQlmbG9hdCBicmlnaHRuZXNzID0gMWY7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEud2lkdGg7IHgrKykgewotCQlicmlnaHRuZXNzID0gMWY7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoMzYwZiwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcykpOwkKLQkJCXNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQlicmlnaHRuZXNzIC09IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsKLQkJfQotCQlzYXR1cmF0aW9uICs9IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLndpZHRoOwotCX0KLQkJCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBodWVJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBodWVEYXRhKTsKLQlJbWFnZSBzYXR1cmF0aW9uSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJIdWUsIFNhdHVyYXRpb24sIEJyaWdodG5lc3MiKTsKLQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAxNjsKLQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7CQkKLQkKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2UoaHVlSW1hZ2UpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CQotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiSHVlIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0JbGFiZWwuc2V0VGV4dCgiQnJpZ2h0bmVzcyIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2Uoc2F0dXJhdGlvbkltYWdlKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0KCJTYXR1cmF0aW9uIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQlodWVJbWFnZS5kaXNwb3NlKCk7Ci0Jc2F0dXJhdGlvbkltYWdlLmRpc3Bvc2UoKTsJCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTI1MDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBKT0dMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLQotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTDsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTERyYXdhYmxlRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuZ2x1LkdMVTsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDkgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhHTCBnbCwgZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmLCBjb3NUaGV0YSA9IDEuMGYsIHNpblRoZXRhID0gMC4wZjsKLQkJZm9yIChpbnQgaSA9IHJpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWZsb2F0IHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOwotCQkJZmxvYXQgY29zVGhldGExID0gKGZsb2F0KSBNYXRoLmNvcyh0aGV0YTEpOwotCQkJZmxvYXQgc2luVGhldGExID0gKGZsb2F0KSBNYXRoLnNpbih0aGV0YTEpOwotCQkJZ2wuZ2xCZWdpbihHTC5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJZ2wuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJZ2wuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJZ2wuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCWdsLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCWdsLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY29tcCwgU1dULk5PTkUsIGRhdGEpOwotCi0JCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCWZpbmFsIEdMQ29udGV4dCBjb250ZXh0ID0gR0xEcmF3YWJsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmNyZWF0ZUV4dGVybmFsR0xDb250ZXh0KCk7Ci0KLQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQlmbG9hdCBmQXNwZWN0ID0gKGZsb2F0KSBib3VuZHMud2lkdGggLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQljb250ZXh0Lm1ha2VDdXJyZW50KCk7Ci0JCQkJR0wgZ2wgPSBjb250ZXh0LmdldEdMICgpOwotCQkJCWdsLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQlnbC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7Ci0JCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQlHTFUgZ2x1ID0gbmV3IEdMVSgpOwotCQkJCWdsdS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJCQlnbC5nbE1hdHJpeE1vZGUoR0wuR0xfTU9ERUxWSUVXKTsKLQkJCQlnbC5nbExvYWRJZGVudGl0eSgpOwotCQkJCWNvbnRleHQucmVsZWFzZSgpOwotCQkJfQotCQl9KTsKLQotCQljb250ZXh0Lm1ha2VDdXJyZW50KCk7Ci0JCUdMIGdsID0gY29udGV4dC5nZXRHTCAoKTsKLQkJZ2wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlnbC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCWdsLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCWdsLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlnbC5nbExpbmVXaWR0aCgyKTsKLQkJZ2wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCWNvbnRleHQucmVsZWFzZSgpOwotCi0JCXNoZWxsLnNldFRleHQoIlNXVC9KT0dMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQkJCQlHTCBnbCA9IGNvbnRleHQuZ2V0R0wgKCk7Ci0JCQkJCWdsLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlnbC5nbENsZWFyQ29sb3IoLjNmLCAuNWYsIC44ZiwgMS4wZik7Ci0JCQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCWdsLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlnbC5nbFJvdGF0ZWYoMC4xNWYgKiByb3QsIDIuMGYgKiBmcm90LCAxMC4wZiAqIGZyb3QsIDEuMGYpOwotCQkJCQlnbC5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCWdsLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0xJTkUpOwotCQkJCQlnbC5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cyhnbCwgMSwgMS45ZiArICgoZmxvYXQpIE1hdGguc2luKCgwLjAwNGYgKiBmcm90KSkpLCAxNSwgMTUpOwotCQkJCQljYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQkJCQkJY29udGV4dC5yZWxlYXNlKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiYTAwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYW52YXMgZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgdGFiIHRyYXZlcnNhbCAoYmVoYXZlIGxpa2UgYSB0YWIgZ3JvdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCb3VuZHMgKDEwLCAxMCwgMTAwLCAzMik7Ci0JYi5zZXRUZXh0ICgiQnV0dG9uIik7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbiAoYik7Ci0JZmluYWwgQ2FudmFzIGMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYy5zZXRCb3VuZHMgKDEwLCA1MCwgMTAwLCAzMik7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCS8qIERvIHRhYiBncm91cCB0cmF2ZXJzYWwgKi8KLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgkKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUOgkKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOgotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYy5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYy5zZXRCYWNrZ3JvdW5kIChibHVlKTsKLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiS0VZIik7Ci0JCQlmb3IgKGludCBpPTA7IGk8NjQ7IGkrKykgewotCQkJCUNvbG9yIGMxID0gcmVkLCBjMiA9IGJsdWU7Ci0JCQkJaWYgKGMuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLQkJCQkJYzEgPSBibHVlOyAgYzIgPSByZWQ7Ci0JCQkJfQotCQkJCWMuc2V0QmFja2dyb3VuZCAoYzEpOwotCQkJCWMudXBkYXRlICgpOwotCQkJCWMuc2V0QmFja2dyb3VuZCAoYzIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGV4dCB0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdC5zZXRCb3VuZHMgKDEwLCA4NSwgMTAwLCAzMik7Ci0KLQlUZXh0IHIgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCXIuc2V0Qm91bmRzICgxMCwgMTIwLCAxMDAsIDMyKTsKLQkKLQljLnNldEZvY3VzICgpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTZhNjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgdGV4dCBiZXR3ZWVuIHR3byBTdHlsZWRUZXh0IHdpZGdldHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTAgewotCXN0YXRpYyBTdHJpbmcgc3RyaW5nMSA9ICJBIGRyYWcgc291cmNlIGlzIHRoZSBwcm92aWRlciBvZiBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBkYXRhIHRyYW5zZmVyIGFzIHdlbGwgYXMgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3JpZ2luYXRvciBvZiB0aGUgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkcmFnIHNvdXJjZSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heSBiZSB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGxvY2F0aW9uIGluIHRoZSBzYW1lIHdpZGdldCwgdG8gYSBkaWZmZXJlbnQgd2lkZ2V0ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciB0byBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhbHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIGRyYWcgdGV4dCBmcm9tIHlvdXIgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24gYW4gZW1haWwgYXBwbGljYXRpb24sIG9yIHlvdSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIGRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0KLQlzdGF0aWMgU3RyaW5nIHN0cmluZzIgPSAiQSBkcm9wIHRhcmdldCByZWNlaXZlcyBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHJlY2VpdmVkIGJ5ICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBkcm9wIHRhcmdldCBtYXkgaGF2ZSBjb21lIGZyb20gdGhlIHNhbWUgd2lkZ2V0LCBmcm9tIGEgZGlmZmVyZW50IHdpZGdldCB3aXRoaW4gIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIGZyb20gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gYWx0b2dldGhlci4gRm9yIGV4YW1wbGUsIHlvdSAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gZHJhZyB0ZXh0IGZyb20gYW4gZW1haWwgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24geW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGNvdWxkICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgImRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWludCBzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQxID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0MS5zZXRUZXh0KHN0cmluZzEpOwotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UodGV4dDEsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbjsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0MS5nZXRTZWxlY3Rpb24oKTsKLQkJCWUuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQllLmRhdGEgPSB0ZXh0MS5nZXRUZXh0KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueS0xKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJdGV4dDEucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCwgIiIpOwotCQkJfQotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJfQotCX0pOwotCQotCWZpbmFsIFN0eWxlZFRleHQgdGV4dDIgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQyLnNldFRleHQoc3RyaW5nMik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0MiwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZS5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCXRleHQyLmluc2VydCgoU3RyaW5nKWUuZGF0YSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg1OThjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgcmlzZSBhbmQgZm9udCB3aXRoIFN0eWxlUmFuZ2UuIAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTEgewotCi0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJZb3UgY2FuIHNldCBhbnkgZm9udCB5b3Ugd2FudCBpbiBhIHJhbmdlLiBZb3UgY2FuIGFsc28gc2V0IGEgYmFzZWxpbmUgcmlzZSBhbmQgYWxsIG90aGVyIG9sZCBmZWF0dXJlcyIgKyAKLQkJIiBsaWtlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQsIGFuZCBtaXggdGhlbSBhbnkgd2F5IHlvdSB3YW50LiBUb3RhbGx5IGF3ZXNvbWUuIjsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlGb250RGF0YSBkYXRhID0gc3R5bGVkVGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCBkYXRhLmdldEhlaWdodCgpICogMiwgZGF0YS5nZXRTdHlsZSgpKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCBkYXRhLmdldEhlaWdodCgpICogNCAvIDUsIGRhdGEuZ2V0U3R5bGUoKSk7Ci0JCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVs4XTsKLQkJc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzBdLmZvbnQgPSBmb250MTsgCi0JCXN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1sxXS5yaXNlID0gZGF0YS5nZXRIZWlnaHQoKSAvIDM7IAotCQlzdHlsZXNbMl0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbMl0uYmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsgCi0JCXN0eWxlc1szXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1szXS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSk7IAotCQlzdHlsZXNbNF0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbNF0uZm9udCA9IGZvbnQyOyAKLQkJc3R5bGVzWzRdLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTs7Ci0JCXN0eWxlc1s0XS51bmRlcmxpbmUgPSB0cnVlOwotCQlzdHlsZXNbNV0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbNV0ucmlzZSA9IC1kYXRhLmdldEhlaWdodCgpIC8gMzsgCi0JCXN0eWxlc1s1XS5zdHJpa2VvdXQgPSB0cnVlOwotCQlzdHlsZXNbNV0udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzZdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzZdLmZvbnQgPSBmb250MTsgCi0JCXN0eWxlc1s2XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQkJc3R5bGVzWzZdLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkJc3R5bGVzWzddID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzddLnJpc2UgPSAgZGF0YS5nZXRIZWlnaHQoKSAvIDM7Ci0JCXN0eWxlc1s3XS51bmRlcmxpbmUgPSB0cnVlOwotCQlzdHlsZXNbN10uZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCXN0eWxlc1s3XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJc3R5bGVzWzddLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCQotCQlpbnRbXSByYW5nZXMgPSBuZXcgaW50W10gezE2LCA0LCA2MSwgMTMsIDEwNywgMTAsIDEyMiwgMTAsIDEzNCwgMywgMTQzLCA2LCAxNjAsIDcsIDE2OCwgN307Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzLCBzdHlsZXMpOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7CQkKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmVmM2I3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotLyoqCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IGVtYmVkIGltYWdlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyMTIgewotCQotCXN0YXRpYyBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJUaGlzIHNuaXBwZXQgc2hvd3MgaG93IHRvIGVtYmVkIGltYWdlcyBpbiBhIFN0eWxlZFRleHQuXG4iKwotCQkiSGVyZSBpcyBvbmU6IFx1RkZGQywgYW5kIGhlcmUgaXMgYW5vdGhlcjogXHVGRkZDLiIrCi0JCSJVc2UgdGhlIGFkZCBidXR0b24gdG8gYWRkIGFuIGltYWdlIGZyb20geW91ciBmaWxlc3lzdGVtIHRvIHRoZSBTdHlsZWRUZXh0IGF0IHRoZSBjdXJyZW50IGNhcmV0IG9mZnNldC4iOwotCXN0YXRpYyBJbWFnZVtdIGltYWdlczsKLQlzdGF0aWMgaW50W10gb2Zmc2V0czsKLQotCXN0YXRpYyB2b2lkIGFkZEltYWdlKEltYWdlIGltYWdlLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSAoKTsKLQkJc3R5bGUuc3RhcnQgPSBvZmZzZXQ7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCXN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKHJlY3QuaGVpZ2h0LCAwLCByZWN0LndpZHRoKTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJaW1hZ2VzID0gbmV3IEltYWdlW10gewotCQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTiksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKSwKLQkJfTsKLQkJb2Zmc2V0cyA9IG5ldyBpbnRbaW1hZ2VzLmxlbmd0aF07Ci0JCWludCBsYXN0T2Zmc2V0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBvZmZzZXQgPSB0ZXh0LmluZGV4T2YoIlx1RkZGQyIsIGxhc3RPZmZzZXQpOwotCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCWFkZEltYWdlKGltYWdlc1tpXSwgb2Zmc2V0KTsKLQkJCWxhc3RPZmZzZXQgPSBvZmZzZXQgKyAxOwotCQl9Ci0JCQotCQkvLyB1c2UgYSB2ZXJpZnkgbGlzdGVuZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyB1cCB0byBkYXRlCi0JCXN0eWxlZFRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotCQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQkJaW50IHJlcGxhY2VDaGFyQ291bnQgPSBlLmVuZCAtIGUuc3RhcnQ7Ci0JCQkJaW50IG5ld0NoYXJDb3VudCA9IGUudGV4dC5sZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgc3RhcnQgKyByZXBsYWNlQ2hhckNvdW50KSB7Ci0JCQkJCQkvLyB0aGlzIGltYWdlIGlzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dAotCQkJCQkJaWYgKGltYWdlc1tpXSAhPSBudWxsICYmICFpbWFnZXNbaV0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCQlpbWFnZXNbaV0gPSBudWxsOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0ID0gLTE7Ci0JCQkJCX0KLQkJCQkJaWYgKG9mZnNldCAhPSAtMSAmJiBvZmZzZXQgPj0gc3RhcnQpIG9mZnNldCArPSBuZXdDaGFyQ291bnQgLSByZXBsYWNlQ2hhckNvdW50OwotCQkJCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lcihuZXcgUGFpbnRPYmplY3RMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCQlpbnQgc3RhcnQgPSBzdHlsZS5zdGFydDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA9PSBvZmZzZXQpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCQkJaW50IHggPSBldmVudC54OwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgZXZlbnQuYXNjZW50IC0gc3R5bGUubWV0cmljcy5hc2NlbnQ7CQkJCQkJCi0JCQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQWRkIEltYWdlIik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmlsZW5hbWUpOwotCQkJCQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShvZmZzZXQsIDAsICJcdUZGRkMiKTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQl3aGlsZSAoaW5kZXggPCBvZmZzZXRzLmxlbmd0aCkgewotCQkJCQkJCWlmIChvZmZzZXRzW2luZGV4XSA9PSAtMSAmJiBpbWFnZXNbaW5kZXhdID09IG51bGwpIGJyZWFrOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPT0gb2Zmc2V0cy5sZW5ndGgpIHsKLQkJCQkJCQlpbnRbXSB0bXBPZmZzZXRzID0gbmV3IGludFtpbmRleCArIDFdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkob2Zmc2V0cywgMCwgdG1wT2Zmc2V0cywgMCwgb2Zmc2V0cy5sZW5ndGgpOwotCQkJCQkJCW9mZnNldHMgPSB0bXBPZmZzZXRzOwotCQkJCQkJCUltYWdlW10gdG1wSW1hZ2VzID0gbmV3IEltYWdlW2luZGV4ICsgMV07Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbWFnZXMsIDAsIHRtcEltYWdlcywgMCwgaW1hZ2VzLmxlbmd0aCk7Ci0JCQkJCQkJaW1hZ2VzID0gdG1wSW1hZ2VzOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0c1tpbmRleF0gPSBvZmZzZXQ7Ci0JCQkJCQlpbWFnZXNbaW5kZXhdID0gaW1hZ2U7Ci0JCQkJCQlhZGRJbWFnZShpbWFnZSwgb2Zmc2V0KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCUltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWI0MzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBTdHlsZWRUZXh0IHNuaXBwZXQ6IHVzZSBpbmRlbnQsIGFsaWdubWVudCBhbmQganVzdGlmeS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxMyB7Ci0KLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIlRoZSBmaXJzdCBwYXJhZ3JhcGggaGFzIGFuIGluZGVudGF0aW9uIG9mIGZpZnR5IHBpeGVscy4gSW5kZW50YXRpb24gaXMgdGhlIGFtb3VudCBvZiB3aGl0ZSBzcGFjZSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgbGluZSBvZiBhIHBhcmFncmFwaC4gSWYgdGhpcyBwYXJhZ3JhcGggd3JhcHMgdG8gc2V2ZXJhbCBsaW5lcyB5b3Ugc2hvdWxkIHNlZSB0aGUgaW5kZW50YXRpb24gb25seSBvbiB0aGUgZmlyc3QgbGluZS5cblxuIiArCi0JCSJUaGUgc2Vjb25kIHBhcmFncmFwaCBpcyBjZW50ZXIgYWxpZ25lZC4gQWxpZ25tZW50IG9ubHkgd29ya3Mgd2hlbiB0aGUgU3R5bGVkVGV4dCBpcyB1c2luZyB3b3JkIHdyYXAuIEFsaWdubWVudCwgYXMgd2l0aCBhbGwgb3RoZXIgbGluZSBhdHRyaWJ1dGVzLCBjYW4gYmUgc2V0IGZvciB0aGUgd2hvbGUgd2lkZ2V0IG9yIGp1c3QgZm9yIGEgc2V0IG9mIGxpbmVzLlxuXG4iICsKLQkJIlRoZSB0aGlyZCBwYXJhZ3JhcGggaXMganVzdGlmaWVkLiBMaWtlIGFsaWdubWVudCwganVzdGlmeSBvbmx5IHdvcmtzIHdoZW4gdGhlIFN0eWxlZFRleHQgaXMgdXNpbmcgd29yZCB3cmFwLiBJZiB0aGUgcGFyYWdyYXBoIHdyYXBzIHRvIHNldmVyYWwgbGluZXMsIHRoZSBqdXN0aWZpY2F0aW9uIGlzIHBlcmZvcm1lZCBvbiBhbGwgbGluZXMgYnV0IHRoZSBsYXN0IG9uZS5cblxuIiArCQkKLQkJIlRoZSBsYXN0IHBhcmFncmFwaCBpcyBqdXN0aWZpZWQgYW5kIHJpZ2h0IGFsaWduZWQuIEluIHRoaXMgY2FzZSwgdGhlIGFsaWdubWVudCBpcyBvbmx5IG5vdGljZWFibGUgaW4gdGhlIGZpbmFsIGxpbmUuIjsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlzdHlsZWRUZXh0LnNldExpbmVJbmRlbnQoMCwgMSwgNTApOwotCQlzdHlsZWRUZXh0LnNldExpbmVBbGlnbm1lbnQoMiwgMSwgU1dULkNFTlRFUik7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUp1c3RpZnkoNCwgMSwgdHJ1ZSk7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUFsaWdubWVudCg2LCAxLCBTV1QuUklHSFQpOwotCQlzdHlsZWRUZXh0LnNldExpbmVKdXN0aWZ5KDYsIDEsIHRydWUpOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjAwNDY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogc2V0IGEgYmFja2dyb3VuZCBpbWFnZSAoYSBkeW5hbWljIGdyYWRpZW50KQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTQgewotCXN0YXRpYyBJbWFnZSBvbGRJbWFnZTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kTW9kZSAoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0MSA9IG5ldyBGaWxsTGF5b3V0IChTV1QuVkVSVElDQUwpOwotCQlsYXlvdXQxLm1hcmdpbldpZHRoID0gbGF5b3V0MS5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJc2hlbGwuc2V0TGF5b3V0IChsYXlvdXQxKTsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQgKCJHcm91cCAiKTsKLQkJUm93TGF5b3V0IGxheW91dDIgPSBuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpOwotCQlsYXlvdXQyLm1hcmdpbldpZHRoID0gbGF5b3V0Mi5tYXJnaW5IZWlnaHQgPSBsYXlvdXQyLnNwYWNpbmcgPSAxMDsKLQkJZ3JvdXAuc2V0TGF5b3V0IChsYXlvdXQyKTsKLQkJZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQl9Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJCUltYWdlIG5ld0ltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBNYXRoLm1heCAoMSwgcmVjdC53aWR0aCksIDEpOwkKLQkJCQlHQyBnYyA9IG5ldyBHQyAobmV3SW1hZ2UpOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgMSwgZmFsc2UpOwotCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJc2hlbGwuc2V0QmFja2dyb3VuZEltYWdlIChuZXdJbWFnZSk7Ci0JCQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCQkJb2xkSW1hZ2UgPSBuZXdJbWFnZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3MzMxZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogdGFrZSBhIHNjcmVlbiBzaG90IHdpdGggYSBHQwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDYXB0dXJlIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQotCQkJLyogVGFrZSB0aGUgc2NyZWVuIHNob3QgKi8KLQkJCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGlzcGxheS5nZXRCb3VuZHMoKSk7Ci0JCQlnYy5jb3B5QXJlYShpbWFnZSwgMCwgMCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQkKLQkJCVNoZWxsIHBvcHVwID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQlwb3B1cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlwb3B1cC5zZXRUZXh0KCJJbWFnZSIpOwotCQkJcG9wdXAuc2V0Qm91bmRzKDUwLCA1MCwgMjAwLCAyMDApOwotCQkJcG9wdXAuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChwb3B1cCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNjLCBTV1QuTk9ORSk7Ci0JCQlzYy5zZXRDb250ZW50KGNhbnZhcyk7Ci0JCQljYW52YXMuc2V0Qm91bmRzKGRpc3BsYXkuZ2V0Qm91bmRzICgpKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOGY3YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSB0b29sIHRpcCBpbnNpZGUgYSByZWN0YW5nbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTYgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJZmluYWwgQ29sb3IgW10gY29sb3JzID0gewotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpLAotCQl9OwotCQlmaW5hbCBSZWN0YW5nbGUgW10gcmVjdHMgPSB7Ci0JCQluZXcgUmVjdGFuZ2xlICgxMCwgMTAsIDMwLCAzMCksCi0JCQluZXcgUmVjdGFuZ2xlICgyMCwgNDUsIDI1LCAzNSksCi0JCQluZXcgUmVjdGFuZ2xlICg4MCwgODAsIDEwLCAxMCksCi0JCX07Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuTW91c2VFbnRlcjoKLQkJCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQkJZm9yIChpbnQgaT0wOyBpPHJlY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKHJlY3RzIFtpXS5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIHsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSAiVG9vbFRpcCAiICsgaTsKLQkJCQkJCQkJaWYgKCEodGV4dC5lcXVhbHMgKHNoZWxsLmdldFRvb2xUaXBUZXh0ICgpKSkpIHsKLQkJCQkJCQkJCXNoZWxsLnNldFRvb2xUaXBUZXh0ICgiVG9vbFRpcCAiICsgaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNoZWxsLnNldFRvb2xUaXBUZXh0IChudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBtb3VzZUxpc3RlbmVyKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUVudGVyLCBtb3VzZUxpc3RlbmVyKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHJlY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQgKGNvbG9ycyBbaV0pOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0cyBbaV0pOwotCQkJCQlnYy5kcmF3UmVjdGFuZ2xlIChyZWN0cyBbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTExZTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFN0eWxlZFRleHQgc25pcHBldDogZW1iZWQgY29udHJvbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE3IHsKLQkKLQlzdGF0aWMgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiVGhpcyBzbmlwcGV0IHNob3dzIGhvdyB0byBlbWJlZCB3aWRnZXRzIGluIGEgU3R5bGVkVGV4dC5cbiIrCi0JCSJIZXJlIGlzIG9uZTogXHVGRkZDLCBhbmQgaGVyZSBpcyBhbm90aGVyOiBcdUZGRkMuIjsKLQlzdGF0aWMgaW50W10gb2Zmc2V0czsKLQlzdGF0aWMgQ29udHJvbFtdIGNvbnRyb2xzOwotCXN0YXRpYyBpbnQgTUFSR0lOID0gNTsKLQkKLQlzdGF0aWMgdm9pZCBhZGRDb250cm9sKENvbnRyb2wgY29udHJvbCwgaW50IG9mZnNldCkgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKCk7Ci0JCXN0eWxlLnN0YXJ0ID0gb2Zmc2V0OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQljb250cm9sLnBhY2soKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBjb250cm9sLmdldEJvdW5kcygpOwotCQlpbnQgYXNjZW50ID0gMipyZWN0LmhlaWdodC8zOwotCQlpbnQgZGVzY2VudCA9IHJlY3QuaGVpZ2h0IC0gYXNjZW50OwotCQlzdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhhc2NlbnQgKyBNQVJHSU4sIGRlc2NlbnQgKyBNQVJHSU4sIHJlY3Qud2lkdGggKyAyKk1BUkdJTik7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMzIsIFNXVC5OT1JNQUwpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0Rm9udChmb250KTsKLQkJc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQljb250cm9scyA9IG5ldyBDb250cm9sWzJdOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZWRUZXh0LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCQljb250cm9sc1swXSA9IGJ1dHRvbjsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc3R5bGVkVGV4dCwgU1dULk5PTkUpOwotCQljb21iby5hZGQoIml0ZW0gMSIpOwotCQljb21iby5hZGQoImFub3RoZXIgaXRlbSIpOwotCQljb250cm9sc1sxXSA9IGNvbWJvOwotCQlvZmZzZXRzID0gbmV3IGludFtjb250cm9scy5sZW5ndGhdOwotCQlpbnQgbGFzdE9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBvZmZzZXQgPSB0ZXh0LmluZGV4T2YoIlx1RkZGQyIsIGxhc3RPZmZzZXQpOwotCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCWFkZENvbnRyb2woY29udHJvbHNbaV0sIG9mZnNldHNbaV0pOwotCQkJbGFzdE9mZnNldCA9IG9mZnNldCArIDE7Ci0JCX0KLQkJCi0JCS8vIHVzZSBhIHZlcmlmeSBsaXN0ZW5lciB0byBrZWVwIHRoZSBvZmZzZXRzIHVwIHRvIGRhdGUKLQkJc3R5bGVkVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgVmVyaWZ5TGlzdGVuZXIoKSAgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0JCQkJaW50IHN0YXJ0ID0gZS5zdGFydDsKLQkJCQlpbnQgcmVwbGFjZUNoYXJDb3VudCA9IGUuZW5kIC0gZS5zdGFydDsKLQkJCQlpbnQgbmV3Q2hhckNvdW50ID0gZS50ZXh0Lmxlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0IDw9IG9mZnNldCAmJiBvZmZzZXQgPCBzdGFydCArIHJlcGxhY2VDaGFyQ291bnQpIHsKLQkJCQkJCS8vIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dAotCQkJCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwgJiYgIWNvbnRyb2xzW2ldLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWNvbnRyb2xzW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCQljb250cm9sc1tpXSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlvZmZzZXQgPSAtMTsKLQkJCQkJfQotCQkJCQlpZiAob2Zmc2V0ICE9IC0xICYmIG9mZnNldCA+PSBzdGFydCkgb2Zmc2V0ICs9IG5ld0NoYXJDb3VudCAtIHJlcGxhY2VDaGFyQ291bnQ7Ci0JCQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCS8vIHJlcG9zaXRpb24gd2lkZ2V0cyBvbiBwYWludCBldmVudAotCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IGV2ZW50LnN0eWxlOwotCQkJCWludCBzdGFydCA9IHN0eWxlLnN0YXJ0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0ID09IG9mZnNldCkgewotCQkJCQkJUG9pbnQgcHQgPSBjb250cm9sc1tpXS5nZXRTaXplKCk7Ci0JCQkJCQlpbnQgeCA9IGV2ZW50LnggKyBNQVJHSU47Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyBldmVudC5hc2NlbnQgLSAyKnB0LnkvMzsKLQkJCQkJCWNvbnRyb2xzW2ldLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkJCi0JCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjRhNDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBTdHlsZWRUZXh0IHNuaXBwZXQ6IHVzZSBncmFkaWVudCBiYWNrZ3JvdW5kLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE4IHsKLQotCXN0YXRpYyBTdHJpbmcgdGV4dCA9ICJQbGFucyBkbyBub3QgbWF0ZXJpYWxpemUgb3V0IG9mIG5vd2hlcmUsIG5vciBhcmUgdGhleSBlbnRpcmVseSBzdGF0aWMuIFRvIGVuc3VyZSB0aGUgcGxhbm5pbmcgcHJvY2VzcyBpcyAiICsKLQkJInRyYW5zcGFyZW50IGFuZCBvcGVuIHRvIHRoZSBlbnRpcmUgRWNsaXBzZSBjb21tdW5pdHksIHdlICh0aGUgRWNsaXBzZSBQTUMpIHBvc3QgcGxhbnMgaW4gYW4gZW1icnlvbmljICIrCi0JCSJmb3JtIGFuZCByZXZpc2UgdGhlbSB0aHJvdWdob3V0IHRoZSByZWxlYXNlIGN5Y2xlLiBcbiIrCi0JCSJUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGxhbiBkZWFscyB3aXRoIHRoZSBpbXBvcnRhbnQgbWF0dGVycyBvZiByZWxlYXNlIGRlbGl2ZXJhYmxlcywgcmVsZWFzZSBtaWxlc3RvbmVzLCB0YXJnZXQgIisKLQkJIm9wZXJhdGluZyBlbnZpcm9ubWVudHMsIGFuZCByZWxlYXNlLXRvLXJlbGVhc2UgY29tcGF0aWJpbGl0eS4gVGhlc2UgYXJlIGFsbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNsZWFyIGZvciAiKwotCQkiYW55IHJlbGVhc2UsIGV2ZW4gaWYgbm8gZmVhdHVyZXMgd2VyZSB0byBjaGFuZ2UuICBcbiI7Ci0Jc3RhdGljIEltYWdlIG9sZEltYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIFN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgMTYsIFNXVC5CT0xEKTsKLQkJc3R5bGVkVGV4dC5zZXRGb250KGZvbnQpOwotCQlzdHlsZWRUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpKTsKLQkJc3R5bGVkVGV4dC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gc3R5bGVkVGV4dC5nZXRDbGllbnRBcmVhICgpOwotCQkJCUltYWdlIG5ld0ltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxLCBNYXRoLm1heCAoMSwgcmVjdC5oZWlnaHQpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyAobmV3SW1hZ2UpOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUgKHJlY3QueCwgcmVjdC55LCAxLCByZWN0LmhlaWdodCwgdHJ1ZSk7Ci0JCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQlzdHlsZWRUZXh0LnNldEJhY2tncm91bmRJbWFnZSAobmV3SW1hZ2UpOwotCQkJCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQkJCW9sZEltYWdlID0gbmV3SW1hZ2U7Ci0JCQl9Ci0JCX0pOwkKLQkJc2hlbGwuc2V0U2l6ZSg3MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzc2MDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogUmVnaW9uIHNuaXBwZXQ6IENyZWF0ZSBub24tcmVjdGFuZ3VsYXIgc2hlbGwgZnJvbSBhbiBpbWFnZSB3aXRoIHRyYW5zcGFyZW5jeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyMTkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgICAgIGZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0gICAgICAgIFJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0gICAgICAgIGZpbmFsIEltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgaWYgKGltYWdlRGF0YS5hbHBoYURhdGEgIT0gbnVsbCkgewotICAgICAgICAJUmVjdGFuZ2xlIHBpeGVsID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxLCAxKTsKLSAgICAgICAgCWZvciAoaW50IHkgPSAwOyB5IDwgaW1hZ2VEYXRhLmhlaWdodDsgeSsrKSB7Ci0JICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZURhdGEud2lkdGg7IHgrKykgewotCSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhLmdldEFscGhhKHgsIHkpID09IDI1NSkgewotCSAgICAgICAgICAgICAgICAJcGl4ZWwueCA9IGltYWdlRGF0YS54ICsgeDsKLSAgICAJCQkJCXBpeGVsLnkgPSBpbWFnZURhdGEueSArIHk7Ci0JICAgICAgICAgICAgICAgICAgICByZWdpb24uYWRkKHBpeGVsKTsKLQkgICAgICAgICAgICAgICAgfSAKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlJbWFnZURhdGEgbWFzayA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0gICAgICAgIAlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotICAgIAkJZm9yIChpbnQgeSA9IDA7IHkgPCBtYXNrLmhlaWdodDsgeSsrKSB7Ci0gICAgCQkJZm9yIChpbnQgeCA9IDA7IHggPCBtYXNrLndpZHRoOyB4KyspIHsKLSAgICAJCQkJaWYgKG1hc2suZ2V0UGl4ZWwoeCwgeSkgIT0gMCkgewotICAgIAkJCQkJcGl4ZWwueCA9IGltYWdlRGF0YS54ICsgeDsKLSAgICAJCQkJCXBpeGVsLnkgPSBpbWFnZURhdGEueSArIHk7Ci0gICAgCQkJCQlyZWdpb24uYWRkKHBpeGVsKTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAgICAgfQotICAgICAgICBzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQotICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAJaW50IHN0YXJ0WCwgc3RhcnRZOwotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgIHsKLSAgICAgICAgICAgIAlpZiAoZS50eXBlID09IFNXVC5LZXlEb3duICYmIGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLSAgICAgICAgICAgIAkJc2hlbGwuZGlzcG9zZSgpOwotICAgICAgICAgICAgCX0KLQkJCQlpZiAoZS50eXBlID09IFNXVC5Nb3VzZURvd24gJiYgZS5idXR0b24gPT0gMSkgewotCQkJCQlzdGFydFggPSBlLng7Ci0JCQkJCXN0YXJ0WSA9IGUueTsgCi0JCQkJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULk1vdXNlTW92ZSAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCkgewotCQkJCQlQb2ludCBwID0gc2hlbGwudG9EaXNwbGF5KGUueCwgZS55KTsKLQkJCQkJcC54IC09IHN0YXJ0WDsKLQkJCQkJcC55IC09IHN0YXJ0WTsKLQkJCQkJc2hlbGwuc2V0TG9jYXRpb24ocCk7Ci0JCQkJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULlBhaW50KSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCBpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnkpOwotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGwpOwotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsKTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbCk7Ci0gICAgICAgIHNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbCk7Ci0KLSAgICAgICAgc2hlbGwuc2V0U2l6ZShpbWFnZURhdGEueCArIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLnkgKyBpbWFnZURhdGEuaGVpZ2h0KTsKLSAgICAgICAgc2hlbGwub3BlbiAoKTsKLSAgICAgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVnaW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgaW1hZ2UuZGlzcG9zZSAoKTsKLSAgICAgICAgZGlzcGxheS5kaXNwb3NlICgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWI1YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbGwgdGhlIHRleHQgaW4gdGhlIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIDApOwotCXRleHQuc2V0VGV4dCAoIkFTREYiKTsKLQl0ZXh0LnNldFNpemUgKDY0LCAzMik7Ci0JdGV4dC5zZWxlY3RBbGwgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTRiN2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBJbWFnZXMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIFRyZWVJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjAgewkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkltYWdlcyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgVHJlZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsJCQkKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0xLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgYz0xOyBjIDwgY29sdW1uQ291bnQ7IGMrKykgewotCQkJaXRlbTEuc2V0VGV4dChjLCAiaXRlbSBbIitpKyItIitjKyJdIik7Ci0JCX0KLQkJZm9yIChpbnQgaj0wOyBqPGl0ZW1Db3VudDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbShpdGVtMSwgU1dULk5PTkUpOwotCQkJaXRlbTIuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyJdIik7Ci0JCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCWl0ZW0yLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiLSIrYysiXSIpOwotCQkJfQotCQkJZm9yIChpbnQgaz0wOyBrPGl0ZW1Db3VudDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0oaXRlbTIsIFNXVC5OT05FKTsKLQkJCQlpdGVtMy5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIiAiK2srIl0iKTsKLQkJCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCQlpdGVtMy5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIiAiK2srIi0iK2MrIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlMaXN0ZW5lciBwYWludExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewkJCQotCQkJc3dpdGNoKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlldmVudC53aWR0aCArPSByZWN0LndpZHRoOwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHJlY3QuaGVpZ2h0ICsgMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaW50IHggPSBldmVudC54ICsgZXZlbnQud2lkdGg7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShpbWFnZSwgeCwgZXZlbnQueSArIG9mZnNldCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07CQkKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsJCQotCi0JZm9yKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdHJlZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwOWU1OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBTY3JvbGwgdGFibGUgd2hlbiBtb3VzZSBhdCB0b3Agb3IgYm90dG9tCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIxIHsKLQlzdGF0aWMgUnVubmFibGUgSGVhcnRiZWF0OwotCXN0YXRpYyBib29sZWFuIFRyYWNraW5nOwotCXN0YXRpYyBpbnQgU2Nyb2xsU3BlZWQgPSA0MDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4wLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIitpKTsKLQkJaXRlbS5zZXRUZXh0KDEsICJjb2x1bW4gMSAtICIraSk7Ci0JCWl0ZW0uc2V0VGV4dCgyLCAiY29sdW1uIDIgLSAiK2kpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDk7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgxLCAiY29sdW1uIDEgLSAiK2krIiAiK2opOwotCQkJc3ViSXRlbS5zZXRUZXh0KDIsICJjb2x1bW4gMiAtICIraSsiICIraik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDk7IGsrKykgewotCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2orIiAiK2spOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgxLCAiY29sdW1uIDEgLSAiK2krIiAiK2orIiAiK2spOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgyLCAiY29sdW1uIDIgLSAiK2krIiAiK2orIiAiK2spOwotCQkJfQotCQl9Ci0JfQotCWNvbHVtbjAucGFjaygpOwotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCQotCUhlYXJ0YmVhdCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKCFUcmFja2luZyB8fCB0cmVlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJUG9pbnQgY3Vyc29yID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOwotCQkJY3Vyc29yID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgY3Vyc29yKTsKLQkJCVNjcm9sbCh0cmVlLCBjdXJzb3IueCwgY3Vyc29yLnkpOwotCQkJZGlzcGxheS50aW1lckV4ZWMoU2Nyb2xsU3BlZWQsIEhlYXJ0YmVhdCk7Ci0JCX0KLQl9OwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5Nb3VzZUVudGVyOgotCQkJCVRyYWNraW5nID0gdHJ1ZTsKLQkJCQlkaXNwbGF5LnRpbWVyRXhlYygwLCBIZWFydGJlYXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJCVRyYWNraW5nID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRW50ZXIsIGxpc3RlbmVyKTsgCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1zdGF0aWMgdm9pZCBTY3JvbGwoVHJlZSB0cmVlLCBpbnQgeCwgaW50IHkpIHsKLQlUcmVlSXRlbSBpdGVtID0gdHJlZS5nZXRJdGVtKG5ldyBQb2ludCh4LCB5KSk7Ci0JaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCVJlY3RhbmdsZSBhcmVhID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0JaW50IGhlYWRlckhlaWdodCA9IHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JaW50IGl0ZW1IZWlnaHQ9IHRyZWUuZ2V0SXRlbUhlaWdodCgpOwotCVRyZWVJdGVtIG5leHRJdGVtID0gbnVsbDsKLQlpZiAoeSA8IGFyZWEueSArIGhlYWRlckhlaWdodCArIDIgKiBpdGVtSGVpZ2h0KSB7Ci0JCW5leHRJdGVtID0gUHJldmlvdXNJdGVtKHRyZWUsIGl0ZW0pOwotCX0KLQlpZiAoeSA+IGFyZWEueSArIGFyZWEuaGVpZ2h0IC0gMiAqIGl0ZW1IZWlnaHQpIHsKLQkJbmV4dEl0ZW0gPSBOZXh0SXRlbSh0cmVlLCBpdGVtKTsKLQl9Ci0JaWYgKG5leHRJdGVtICE9IG51bGwpIHRyZWUuc2hvd0l0ZW0obmV4dEl0ZW0pOwotfQotCi1zdGF0aWMgVHJlZUl0ZW0gUHJldmlvdXNJdGVtKFRyZWUgdHJlZSwgVHJlZUl0ZW0gaXRlbSkgewotCWlmIChpdGVtID09IG51bGwpIHJldHVybiBudWxsOwotCVRyZWVJdGVtIGNoaWxkSXRlbSA9IGl0ZW07Ci0JVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JaW50IGluZGV4ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5pbmRleE9mKGNoaWxkSXRlbSkgOiBwYXJlbnRJdGVtLmluZGV4T2YoY2hpbGRJdGVtKTsKLQlpZiAoaW5kZXggPT0gMCkgewotCQlyZXR1cm4gcGFyZW50SXRlbTsKLQl9IGVsc2UgewotCQlUcmVlSXRlbSBuZXh0SXRlbSA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbShpbmRleC0xKSA6IHBhcmVudEl0ZW0uZ2V0SXRlbShpbmRleC0xKTsKLQkJaW50IGNvdW50ID0gbmV4dEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCXdoaWxlIChjb3VudCA+IDAgJiYgbmV4dEl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJbmV4dEl0ZW0gPSBuZXh0SXRlbS5nZXRJdGVtKGNvdW50IC0gMSk7Ci0JCQljb3VudCA9IG5leHRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl9Ci0JCXJldHVybiBuZXh0SXRlbTsKLQl9Ci19Ci1zdGF0aWMgVHJlZUl0ZW0gTmV4dEl0ZW0oVHJlZSB0cmVlLCBUcmVlSXRlbSBpdGVtKSB7Ci0JaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JaWYgKGl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQlyZXR1cm4gaXRlbS5nZXRJdGVtKDApOwotCX0gZWxzZSB7Ci0JCVRyZWVJdGVtIGNoaWxkSXRlbSA9IGl0ZW07Ci0JCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBjaGlsZEl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQlpbnQgaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCQlpbnQgY291bnQgPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW1Db3VudCgpIDogcGFyZW50SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChpbmRleCArIDEgPCBjb3VudCkgewotCQkJCXJldHVybiBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW0oaW5kZXggKyAxKSA6IHBhcmVudEl0ZW0uZ2V0SXRlbShpbmRleCArIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGFyZW50SXRlbSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoaWxkSXRlbSA9IHBhcmVudEl0ZW07Ci0JCQkJCXBhcmVudEl0ZW0gPSBjaGlsZEl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCQlpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JCQkJCWNvdW50ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtQ291bnQoKSA6IHBhcmVudEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk5Mzg1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogU3R5bGVkVGV4dCBidWxsZXRlZCBsaXN0IGV4YW1wbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjIgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlN0eWxlZFRleHQgQnVsbGV0IEV4YW1wbGUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXRleHQuYXBwZW5kKCJIZXJlIGlzIFN0eWxlZFRleHQgd2l0aCBzb21lIGJ1bGxldGVkIGxpc3RzOlxuXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgdGV4dC5hcHBlbmQoIlJlZCBCdWxsZXQgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7Ci0JdGV4dC5hcHBlbmQoIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHRleHQuYXBwZW5kKCJOdW1iZXJlZCBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgdGV4dC5hcHBlbmQoIlN1YiBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgdGV4dC5hcHBlbmQoIk51bWJlcmVkIExpc3QgSXRlbSAiICsgKDIgKyBpKSArICJcbiIpOwotCXRleHQuYXBwZW5kKCJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB0ZXh0LmFwcGVuZCgiQ3VzdG9tIERyYXcgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7CQotCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0LnRvU3RyaW5nKCkpOwotCQkKLQlTdHlsZVJhbmdlIHN0eWxlMCA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUwLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDQwKTsKLQlzdHlsZTAuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQnVsbGV0IGJ1bGxldDAgPSBuZXcgQnVsbGV0IChzdHlsZTApOwotCVN0eWxlUmFuZ2Ugc3R5bGUxID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTEubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgNTApOwotCXN0eWxlMS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JQnVsbGV0IGJ1bGxldDEgPSBuZXcgQnVsbGV0IChTVC5CVUxMRVRfTlVNQkVSIHwgU1QuQlVMTEVUX1RFWFQsIHN0eWxlMSk7Ci0JYnVsbGV0MS50ZXh0ID0gIi4iOwotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTIubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgODApOwotCXN0eWxlMi5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCUJ1bGxldCBidWxsZXQyID0gbmV3IEJ1bGxldCAoU1QuQlVMTEVUX1RFWFQsIHN0eWxlMik7Ci0JYnVsbGV0Mi50ZXh0ID0gIlx1MjcxMyI7Ci0JU3R5bGVSYW5nZSBzdHlsZTMgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMy5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA1MCk7Ci0JQnVsbGV0IGJ1bGxldDMgPSBuZXcgQnVsbGV0IChTVC5CVUxMRVRfQ1VTVE9NLCBzdHlsZTIpOwotCi0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDIsIDQsIGJ1bGxldDApOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCg3LCAyLCBidWxsZXQxKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoOSwgNCwgYnVsbGV0Mik7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDEzLCAyLCBidWxsZXQxKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoMTYsIDQsIGJ1bGxldDMpOwotCi0Jc3R5bGVkVGV4dC5hZGRQYWludE9iamVjdExpc3RlbmVyKG5ldyBQYWludE9iamVjdExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBldmVudC5kaXNwbGF5OwotCQkJU3R5bGVSYW5nZSBzdHlsZSA9IGV2ZW50LnN0eWxlOwotCQkJRm9udCBmb250ID0gc3R5bGUuZm9udDsKLQkJCWlmIChmb250ID09IG51bGwpIGZvbnQgPSBzdHlsZWRUZXh0LmdldEZvbnQoKTsKLQkJCVRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JCQlsYXlvdXQuc2V0QXNjZW50KGV2ZW50LmFzY2VudCk7Ci0JCQlsYXlvdXQuc2V0RGVzY2VudChldmVudC5kZXNjZW50KTsKLQkJCWxheW91dC5zZXRGb250KGZvbnQpOwotCQkJbGF5b3V0LnNldFRleHQoIlx1MjAyMyAxLiIgKyBldmVudC5idWxsZXRJbmRleCArICIpIik7Ci0JCQlsYXlvdXQuZHJhdyhldmVudC5nYywgZXZlbnQueCArIDEwLCBldmVudC55KTsKLQkJCWxheW91dC5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4NDRkMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBFeHBhbmRCYXIgZXhhbXBsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5zZXRUZXh0KCJFeHBhbmRCYXIgRXhhbXBsZSIpOwotCUV4cGFuZEJhciBiYXIgPSBuZXcgRXhwYW5kQmFyIChzaGVsbCwgU1dULlZfU0NST0xMKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBTbmlwcGV0MjIzLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVjbGlwc2UucG5nIikpOyAKLQkKLQkvLyBGaXJzdCBpdGVtCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGJhciwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JbGF5b3V0Lm1hcmdpbkxlZnQgPSBsYXlvdXQubWFyZ2luVG9wID0gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJTV1QuUFVTSCIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlJBRElPIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCWJ1dHRvbi5zZXRUZXh0KCJTV1QuQ0hFQ0siKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5UT0dHTEUpOwotCWJ1dHRvbi5zZXRUZXh0KCJTV1QuVE9HR0xFIik7Ci0JRXhwYW5kSXRlbSBpdGVtMCA9IG5ldyBFeHBhbmRJdGVtIChiYXIsIFNXVC5OT05FLCAwKTsKLQlpdGVtMC5zZXRUZXh0KCJXaGF0IGlzIHlvdXIgZmF2b3JpdGUgYnV0dG9uIik7Ci0JaXRlbTAuc2V0SGVpZ2h0KGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotCWl0ZW0wLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQlpdGVtMC5zZXRJbWFnZShpbWFnZSk7Ci0JCi0JLy8gU2Vjb25kIGl0ZW0KLQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5MZWZ0ID0gbGF5b3V0Lm1hcmdpblRvcCA9IGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUikpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9FUlJPUiIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX0lORk9STUFUSU9OIik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORykpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9XQVJOSU5HIik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fUVVFU1RJT04iKTsKLQlFeHBhbmRJdGVtIGl0ZW0xID0gbmV3IEV4cGFuZEl0ZW0gKGJhciwgU1dULk5PTkUsIDEpOwotCWl0ZW0xLnNldFRleHQoIldoYXQgaXMgeW91ciBmYXZvcml0ZSBpY29uIik7Ci0JaXRlbTEuc2V0SGVpZ2h0KGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotCWl0ZW0xLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQlpdGVtMS5zZXRJbWFnZShpbWFnZSk7Ci0JCi0JLy8gVGhpcmQgaXRlbQotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGJhciwgU1dULk5PTkUpOwotCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKTsKLQlsYXlvdXQubWFyZ2luTGVmdCA9IGxheW91dC5tYXJnaW5Ub3AgPSBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU2NhbGUiKTsJCi0JbmV3IFNjYWxlIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU3Bpbm5lciIpOwkKLQluZXcgU3Bpbm5lciAoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU2xpZGVyIik7CQotCW5ldyBTbGlkZXIgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCUV4cGFuZEl0ZW0gaXRlbTIgPSBuZXcgRXhwYW5kSXRlbSAoYmFyLCBTV1QuTk9ORSwgMik7Ci0JaXRlbTIuc2V0VGV4dCgiV2hhdCBpcyB5b3VyIGZhdm9yaXRlIHJhbmdlIHdpZGdldCIpOwotCWl0ZW0yLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMi5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCWl0ZW0xLnNldEV4cGFuZGVkKHRydWUpOwotCWJhci5zZXRTcGFjaW5nKDgpOwotCXNoZWxsLnNldFNpemUoNDAwLCAzNTApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgewotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1MDg3ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogaW1wbGVtZW50IHJhZGlvIGJlaGF2aW9yIGZvciBzZXRTZWxlY3Rpb24oKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkIiICsgaSk7Ci0JCWlmIChpID09IDApIGJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIlNldCBTZWxlY3Rpb24gdG8gQjQiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IHNoZWxsLmdldENoaWxkcmVuICgpOwotCQkJQnV0dG9uIG5ld0J1dHRvbiA9IChCdXR0b24pIGNoaWxkcmVuIFs0XTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbiBbaV07Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnV0dG9uICYmIChjaGlsZC5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQkoKEJ1dHRvbikgY2hpbGQpLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWIzNzA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFRvb2x0aXAgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBiYWxsb29uIHRvb2x0aXAgZm9yIGEgdHJheSBpdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JZmluYWwgVG9vbFRpcCB0aXAgPSBuZXcgVG9vbFRpcChzaGVsbCwgU1dULkJBTExPT04gfCBTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0JdGlwLnNldE1lc3NhZ2UoIkhlcmUgaXMgYSBtZXNzYWdlIGZvciB0aGUgdXNlci4gV2hlbiB0aGUgbWVzc2FnZSBpcyB0b28gbG9uZyBpdCB3cmFwcy4gSSBzaG91bGQgc2F5IHNvbWV0aGluZyBjb29sIGJ1dCBub3RoaW5nIGNvbWVzIHRvIG15IG1pbmQuIik7Ci0JVHJheSB0cmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1UcmF5KCk7Ci0JaWYgKHRyYXkgIT0gbnVsbCkgewotCQlUcmF5SXRlbSBpdGVtID0gbmV3IFRyYXlJdGVtKHRyYXksIFNXVC5OT05FKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgU25pcHBldDIyNS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlY2xpcHNlLnBuZyIpKTsKLQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCXRpcC5zZXRUZXh0KCJOb3RpZmljYXRpb24gZnJvbSBhIHRyYXkgaXRlbSIpOwotCQlpdGVtLnNldFRvb2xUaXAodGlwKTsKLQl9IGVsc2UgewotCQl0aXAuc2V0VGV4dCgiTm90aWZpY2F0aW9uIGZyb20gYW55d2hlcmUiKTsKLQkJdGlwLnNldExvY2F0aW9uKDQwMCwgNDAwKTsKLQl9Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIlByZXNzIGZvciBiYWxsb29uIHRpcCIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQl0aXAuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCWJ1dHRvbi5wYWNrKCk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDUwLCA1MCwgMzAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhMjY2MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogRHJhdyBhIGN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiQ3VzdG9tIGdyYWRpZW50IHNlbGVjdGlvbiBmb3IgVHJlZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gMzsKLQlmb3IgKGludCBpPTA7IGk8aXRlbUNvdW50OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtMS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWZvciAoaW50IGM9MTsgYyA8IGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCWl0ZW0xLnNldFRleHQoYywgIml0ZW0gWyIraSsiLSIrYysiXSIpOwotCQl9Ci0JCWZvciAoaW50IGo9MDsgajxpdGVtQ291bnQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0oaXRlbTEsIFNXVC5OT05FKTsKLQkJCWl0ZW0yLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiXSIpOwotCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQlpdGVtMi5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIi0iK2MrIl0iKTsKLQkJCX0KLQkJCWZvciAoaW50IGs9MDsgazxpdGVtQ291bnQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0zID0gbmV3IFRyZWVJdGVtKGl0ZW0yLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbTMuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyIgIitrKyJdIik7Ci0JCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQkJaXRlbTMuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyIgIitrKyItIitjKyJdIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCQkKLQkJCWlmICgoZXZlbnQuZGV0YWlsICYgU1dULlNFTEVDVEVEKSAhPSAwKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCS8qCi0JCQkJICogSWYgeW91IHdpc2ggdG8gcGFpbnQgdGhlIHNlbGVjdGlvbiBiZXlvbmQgdGhlIGVuZCBvZgotCQkJCSAqIGxhc3QgY29sdW1uLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGNsaXBwaW5nIHJlZ2lvbi4KLQkJCQkgKi8KLQkJCQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JCQkJaWYgKGV2ZW50LmluZGV4ID09IGNvbHVtbkNvdW50IC0gMSB8fCBjb2x1bW5Db3VudCA9PSAwKSB7Ci0JCQkJCWludCB3aWR0aCA9IGFyZWEueCArIGFyZWEud2lkdGggLSBldmVudC54OwotCQkJCQlpZiAod2lkdGggPiAwKSB7Ci0JCQkJCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJCQkJZ2MuZ2V0Q2xpcHBpbmcocmVnaW9uKTsKLQkJCQkJCXJlZ2lvbi5hZGQoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgsIGV2ZW50LmhlaWdodCk7IAotCQkJCQkJZ2Muc2V0Q2xpcHBpbmcocmVnaW9uKTsKLQkJCQkJCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7Ci0JCQkJaWYgKGdjLmdldEFkdmFuY2VkKCkpIGdjLnNldEFscGhhKDEyNyk7CQkJCQkJCQkKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGV2ZW50LmdldEJvdW5kcygpOwotCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJQ29sb3IgYmFja2dyb3VuZCA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIHJlY3QueSwgNTAwLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCS8vIHJlc3RvcmUgY29sb3JzIGZvciBzdWJzZXF1ZW50IGRyYXdpbmcKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7CQkJCQkKLQkJCX0JCQkJCQkKLQkJfQotCX0pOwkJCi0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdHJlZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0JdHJlZS5zZXRTZWxlY3Rpb24odHJlZS5nZXRJdGVtKDApKTsKLQlzaGVsbC5zZXRTaXplKDUwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwkKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMWI1OGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBNdWx0aXBsZSBsaW5lcyBpbiBhIFRyZWVJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjcgewkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTXVsdGlwbGUgbGluZXMgaW4gYSBUcmVlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbTEuc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBjPTE7IGMgPCBjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQlpdGVtMS5zZXRUZXh0KGMsICJpdGVtIFsiK2krIi0iK2MrIl0iKTsKLQkJfQotCQlmb3IgKGludCBqPTA7IGo8aXRlbUNvdW50OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtKGl0ZW0xLCBTV1QuTk9ORSk7Ci0JCQlpdGVtMi5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIl0iKTsKLQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJaXRlbTIuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyItIitjKyJdIik7Ci0JCQl9Ci0JCQlmb3IgKGludCBrPTA7IGs8aXRlbUNvdW50OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtMyA9IG5ldyBUcmVlSXRlbShpdGVtMiwgU1dULk5PTkUpOwotCQkJCWl0ZW0zLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiICIraysiXSIpOwotCQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJCWl0ZW0zLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiICIraysiLSIrYysiXSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQkJCQlldmVudC53aWR0aCA9IHNpemUueDsKLQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBzaXplLnkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGl0ZW0sIGV2ZW50LmluZGV4KTsKLQkJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7CQkJCQkKLQkJCQkJaW50IG9mZnNldDIgPSBldmVudC5pbmRleCA9PSAwID8gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHNpemUueSkgLyAyKSA6IDA7Ci0JCQkJCWV2ZW50LmdjLmRyYXdUZXh0KHRleHQsIGV2ZW50LngsIGV2ZW50LnkgKyBvZmZzZXQyLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULkVyYXNlSXRlbTogewkKLQkJCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuRk9SRUdST1VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBnZXRUZXh0KFRyZWVJdGVtIGl0ZW0sIGludCBjb2x1bW4pIHsKLQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0JCQlpZiAoY29sdW1uICE9IDApIHsKLQkJCQlUcmVlSXRlbSBwYXJlbnQgPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpbnQgaW5kZXggPSBwYXJlbnQgPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihpdGVtKSA6IHBhcmVudC5pbmRleE9mKGl0ZW0pOwotCQkJCWlmICgoaW5kZXgrY29sdW1uKSAlIDMgPT0gMSl7Ci0JCQkJCXRleHQgKz0iXG5uZXcgbGluZSI7Ci0JCQkJfQotCQkJCWlmICgoaW5kZXgrY29sdW1uKSAlIDMgPT0gMikgewotCQkJCQl0ZXh0ICs9IlxubmV3IGxpbmVcbm5ldyBsaW5lIjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBwYWludExpc3RlbmVyKTsKLQotCXNoZWxsLnNldFNpemUoNjAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTI4NzEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgYmFyIGdyYXBoCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwkJCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIlNob3cgcmVzdWx0cyBhcyBhIGJhciBjaGFydCBpbiBUYWJsZSIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJCdWcgU3RhdHVzIik7Ci0JY29sdW1uMS5zZXRXaWR0aCgxMDApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlBlcmNlbnQiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JU3RyaW5nW10gbGFiZWxzID0gbmV3IFN0cmluZ1tdeyJSZXNvbHZlZCIsICJOZXciLCAiV29uJ3QgRml4IiwgIkludmFsaWQifTsKLQlmb3IgKGludCBpPTA7IGk8bGFiZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCSBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJIGl0ZW0uc2V0VGV4dChsYWJlbHNbaV0pOwotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlpbnRbXSBwZXJjZW50cyA9IG5ldyBpbnRbXSB7NTAsIDMwLCA1LCAxNX07Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaW5kZXggPT0gMSkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCQlpbnQgcGVyY2VudCA9IHBlcmNlbnRzW2luZGV4XTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCWludCB3aWR0aCA9IChjb2x1bW4yLmdldFdpZHRoKCkgLSAxKSAqIHBlcmNlbnQgLyAxMDA7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQsIHRydWUpOwkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aC0xLCBldmVudC5oZWlnaHQtMSk7Ci0JCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0Mik7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJCQlTdHJpbmcgdGV4dCA9IHBlcmNlbnQrIiUiOwotCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJaW50IG9mZnNldCA9IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMik7Ci0JCQkJZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCsyLCBldmVudC55K29mZnNldCwgdHJ1ZSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJfQotCQl9Ci0JfSk7CQkKLQkJCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzI5MGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBjdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjkgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24gZm9yIFRhYmxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiK2krIiBhIiwgIml0ZW0gIitpKyIgYiIsICJpdGVtICIraSsiIGMifSk7Ci0JfQkJCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlpZigoZXZlbnQuZGV0YWlsICYgU1dULlNFTEVDVEVEKSAhPSAwKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvKgotCQkJCSAqIElmIHlvdSB3aXNoIHRvIHBhaW50IHRoZSBzZWxlY3Rpb24gYmV5b25kIHRoZSBlbmQgb2YKLQkJCQkgKiBsYXN0IGNvbHVtbiwgeW91IG11c3QgY2hhbmdlIHRoZSBjbGlwcGluZyByZWdpb24uCi0JCQkJICovCi0JCQkJaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gY29sdW1uQ291bnQgLSAxIHx8IGNvbHVtbkNvdW50ID09IDApIHsKLQkJCQkJaW50IHdpZHRoID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIGV2ZW50Lng7Ci0JCQkJCWlmICh3aWR0aCA+IDApIHsKLQkJCQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQkJCQlnYy5nZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmFkZChldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0KTsgCi0JCQkJCQlnYy5zZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoZ2MuZ2V0QWR2YW5jZWQoKSkgZ2Muc2V0QWxwaGEoMTI3KTsJCQkJCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgcmVjdC55LCA1MDAsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJLy8gcmVzdG9yZSBjb2xvcnMgZm9yIHN1YnNlcXVlbnQgZHJhd2luZwotCQkJCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5TRUxFQ1RFRDsJCQkJCQotCQkJfQkJCQkJCQotCQl9Ci0JfSk7CQkKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKHRhYmxlLmdldEl0ZW0oMCkpOwotCXNoZWxsLnNldFNpemUoNTAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7CQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjM2OTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJhY2tlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyYWNrZXIgKGRyYWcgb24gbW91c2UgZG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVHJhY2tlciB0cmFja2VyID0gbmV3IFRyYWNrZXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0cmFja2VyLnNldFJlY3RhbmdsZXMgKG5ldyBSZWN0YW5nbGUgW10gewotCQkJCW5ldyBSZWN0YW5nbGUgKGUueCwgZS55LCAxMDAsIDEwMCksCi0JCQl9KTsKLQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDYyZGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IEltYWdlcyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgVGFibGVJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSW1hZ2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBUYWJsZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwkJCQotCWludCBjb2x1bW5Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiK2krIiBhIiwgIml0ZW0gIitpKyIgYiIsICJpdGVtICIraSsiIGMifSk7Ci0JfQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCQotCQkJc3dpdGNoKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlldmVudC53aWR0aCArPSByZWN0LndpZHRoOwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHJlY3QuaGVpZ2h0ICsgMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaW50IHggPSBldmVudC54ICsgZXZlbnQud2lkdGg7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShpbWFnZSwgeCwgZXZlbnQueSArIG9mZnNldCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07CQkKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwkJCi0KLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4MTY0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IE11bHRpcGxlIGxpbmVzIHBlciBUYWJsZUl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk11bHRpcGxlIGxpbmVzIGluIGEgVGFibGVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIitpKyIgYSIsICJpdGVtICIraSsiIGIiLCAiaXRlbSAiK2krIiBjIiwgIml0ZW0gIitpKyIgZCJ9KTsKLQl9CQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGl0ZW0sIGV2ZW50LmluZGV4KTsKLQkJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQkJCWV2ZW50LndpZHRoID0gc2l6ZS54OwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHNpemUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQyID0gZXZlbnQuaW5kZXggPT0gMCA/IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMikgOiAwOwotCQkJCQlldmVudC5nYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54LCBldmVudC55ICsgb2Zmc2V0MiwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5FcmFzZUl0ZW06IHsJCi0JCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0VGV4dChUYWJsZUl0ZW0gaXRlbSwgaW50IGNvbHVtbikgewotCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoY29sdW1uKTsKLQkJCWlmIChjb2x1bW4gIT0gMCkgewotCQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQkJaWYgKChpbmRleCtjb2x1bW4pICUgMyA9PSAxKXsKLQkJCQkJdGV4dCArPSJcbm5ldyBsaW5lIjsKLQkJCQl9Ci0JCQkJaWYgKChpbmRleCtjb2x1bW4pICUgMyA9PSAyKSB7Ci0JCQkJCXRleHQgKz0iXG5uZXcgbGluZVxubmV3IGxpbmUiOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEyY2ZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBiYXIgZ3JhcGgKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7CQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIFRyZWUiKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkJ1ZyBTdGF0dXMiKTsKLQljb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiUGVyY2VudCIpOwotCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQlTdHJpbmdbXSBzdGF0ZXMgPSBuZXcgU3RyaW5nW117IlJlc29sdmVkIiwgIk5ldyIsICJXb24ndCBGaXgiLCAiSW52YWxpZCJ9OwotCVN0cmluZ1tdIHRlYW1zID0gbmV3IFN0cmluZ1tdIHsiVUkiLCAiU1dUIiwgIk9TR0kifTsKLQlmb3IgKGludCBpPTA7IGk8dGVhbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0ZWFtc1tpXSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc3RhdGVzLmxlbmd0aDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dChzdGF0ZXNbal0pOwkKLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCWludFtdIHBlcmNlbnRzID0gbmV3IGludFtdIHs1MCwgMzAsIDUsIDE1fTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pbmRleCA9PSAxKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQlpbnQgaW5kZXggPSBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQkJaW50IHBlcmNlbnQgPSBwZXJjZW50c1tpbmRleF07Ci0JCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJCWludCB3aWR0aCA9IChjb2x1bW4yLmdldFdpZHRoKCkgLSAxKSAqIHBlcmNlbnQgLyAxMDA7Ci0JCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0LCB0cnVlKTsJCQkJCQotCQkJCQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLTEsIGV2ZW50LmhlaWdodC0xKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShyZWN0Mik7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gcGVyY2VudCsiJSI7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJCQlnYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54KzIsIGV2ZW50Lnkrb2Zmc2V0LCB0cnVlKTsKLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsJCQotCQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNDEyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsIGFuZCBwb3NpdGlvbiBpdAotICogd2l0aCB1cHBlciBsZWZ0IGNvcm5lciBhdCBjdXJzb3IgcG9zaXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMzIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCAoIlBhcmVudCBTaGVsbCIpOwotCQlzaGVsbC5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGUpIHsKLQkJCQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbiAoKTsKLQkJCQlkaWFsb2cuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCWRpYWxvZy5zZXRUZXh0ICgiRGlhbG9nIFNoZWxsIik7Ci0JCQkJZGlhbG9nLnNldFNpemUgKDEwMCwgMTAwKTsKLQkJCQlkaWFsb2cub3BlbiAoKTsgCi0JCQl9fSk7Ci0JCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2RiOTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRml4ZWQgZmlyc3QgY29sdW1uIGFuZCBob3Jpem9udGFsIHNjcm9sbCByZW1haW5pbmcgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWludCByb3dDb3VudCA9IDQwOwotCWludCBjb2x1bW5Db3VudCA9IDE1OwotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQlmaW5hbCBUYWJsZSBsZWZ0VGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCWxlZnRUYWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JbGVmdFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGUgcmlnaHRUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JcmlnaHRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCUdyaWREYXRhIHRhYmxlMkRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAyKTsKLQlyaWdodFRhYmxlLnNldExheW91dERhdGEodGFibGUyRGF0YSk7Ci0JLy8gQ3JlYXRlIGNvbHVtbnMKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKGxlZnRUYWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiTmFtZSIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTUwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHJpZ2h0VGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIlZhbHVlICIraSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCX0KLQkvLyBDcmVhdGUgcm93cwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0obGVmdFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShyaWdodFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0KGosICJJdGVtICIraSsiIHZhbHVlIEAgIitqKTsKLQkJfQotCX0KLQkvLyBNYWtlIHNlbGVjdGlvbiB0aGUgc2FtZSBpbiBib3RoIHRhYmxlcwotCWxlZnRUYWJsZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlyaWdodFRhYmxlLnNldFNlbGVjdGlvbihsZWZ0VGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkJfQotCX0pOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFNlbGVjdGlvbihyaWdodFRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCX0KLQl9KTsKLQkvLyBPbiBXaW5kb3dzLCB0aGUgc2VsZWN0aW9uIGlzIGdyYXkgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JLy8gVG8gbWFrZSBib3RoIHRhYmxlcyBhcHBlYXIgaW4gZm9jdXMsIGRyYXcgdGVoIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGhlcmUuCi0JLy8gVGhpcyBwYXJ0IG9ubHkgd29ya3Mgb24gdmVyc2lvbiAzLjIgb3IgbGF0ZXIuCi0JTGlzdGVuZXIgZXJhc2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpOwotCQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7CQkJCQkKLQkJCX0KLQkJfQotCX07Ci0JCi0JbGVmdFRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIGVyYXNlTGlzdGVuZXIpOwotCXJpZ2h0VGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgZXJhc2VMaXN0ZW5lcik7Ci0JLy8gTWFrZSB2ZXJ0aWNhbCBzY3JvbGxiYXJzIHNjcm9sbCB0b2dldGhlcgotCVNjcm9sbEJhciB2QmFyTGVmdCA9IGxlZnRUYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotCXZCYXJMZWZ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXJpZ2h0VGFibGUuc2V0VG9wSW5kZXgobGVmdFRhYmxlLmdldFRvcEluZGV4KCkpOwotCQl9Ci0JfSk7Ci0JU2Nyb2xsQmFyIHZCYXJSaWdodCA9IHJpZ2h0VGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQl2QmFyUmlnaHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJbGVmdFRhYmxlLnNldFRvcEluZGV4KHJpZ2h0VGFibGUuZ2V0VG9wSW5kZXgoKSk7Ci0JCX0KLQl9KTsKLQkvLyBIb3Jpem9udGFsIGJhciBvbiBzZWNvbmQgdGFibGUgdGFrZXMgdXAgYSBsaXR0bGUgZXh0cmEgc3BhY2UuCi0JLy8gVG8ga2VlcCB2ZXJ0aWNhbCBzY3JvbGwgYmFycyBpbiBzaW5rLCBmb3JjZSB0YWJsZTEgdG8gZW5kIGFib3ZlCi0JLy8gaG9yaXpvbnRhbCBzY3JvbGxiYXIKLQlTY3JvbGxCYXIgaEJhclJpZ2h0ID0gcmlnaHRUYWJsZS5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWREYXRhIHNwYWNlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGFjZXJEYXRhLmhlaWdodEhpbnQgPSBoQmFyUmlnaHQuZ2V0U2l6ZSgpLnk7Ci0Jc3BhY2VyLnNldFZpc2libGUoZmFsc2UpOwotCXBhcmVudC5zZXRCYWNrZ3JvdW5kKGxlZnRUYWJsZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQotCXNoZWxsLnNldFNpemUoNjAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3YTU5Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgYSBzeXN0ZW0gc2V0dGluZ3MgY2hhbmdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzUgewotCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUaGUgU1dULlNldHRpbmdzIEV2ZW50Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuV1JBUCk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JbGFiZWwuc2V0VGV4dCgiQ2hhbmdlIGEgc3lzdGVtIHNldHRpbmcgYW5kIHRoZSB0YWJsZSBiZWxvdyB3aWxsIGJlIHVwZGF0ZWQuIik7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbi5zZXRXaWR0aCgxNTApOwotCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCBjb2xvck5hbWVzW2ldKTsKLQkJaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGNvbG9yKTsKLQkJaXRlbS5zZXRUZXh0KDIsIGNvbG9yLnRvU3RyaW5nKCkpOwotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JY29sdW1uc1swXS5wYWNrKCk7Ci0JY29sdW1uc1syXS5wYWNrKCk7Ci0JZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuU2V0dGluZ3MsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShpKTsKLQkJCQlpdGVtLnNldEJhY2tncm91bmQoMSwgY29sb3IpOwotCQkJfQotCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJY29sdW1uc1swXS5wYWNrKCk7Ci0JCQljb2x1bW5zWzJdLnBhY2soKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotc3RhdGljIGludFtdIGNvbG9ySWRzID0gbmV3IGludFtdIHtTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5ELCAKLQkJU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCwgCi0JCVNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTiwKLQkJU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQsCi0JCVNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORF9HUkFESUVOVCwKLQkJU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCVNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1csCi0JCVNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCwKLQkJU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XLAotCQlTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVywKLQkJU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLH07Ci1zdGF0aWMgU3RyaW5nIFtdIGNvbG9yTmFtZXMgPSBuZXcgU3RyaW5nW10geyJTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQiLCAKLQkJIlNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCIsCi0JCSJTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04iLAotCQkiU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQiLAotCQkiU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfQk9SREVSIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0xJR0hUX1NIQURPVyIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciLH07Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjU3ZWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGRpZmZlcmVudCBmb3JlZ3JvdW5kIGNvbG9ycyBmb3IgdGV4dCBpbiBhIFRhYmxlSXRlbS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJUYWJsZTogQ2hhbmdlIHN0eWxlIG11bHRpcGxlIHRpbWVzIGluIGNlbGwiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCQkKLQl9Ci0JZmluYWwgVGV4dExheW91dCB0ZXh0TGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JdGV4dExheW91dC5zZXRUZXh0KCJTV1Q6IFN0YW5kYXJkIFdpZGdldCBUb29sa2l0Iik7Ci0JRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnQgZm9udDMgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5JVEFMSUMpOwotCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQxLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpLCBudWxsKTsKLQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250MywgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSwgbnVsbCk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTEsIDAsIDApOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgNSwgMTIpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCAxLCAxKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTIsIDE0LCAxOSk7Ci0JdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTMsIDIsIDIpOyB0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMjEsIDI3KTsKLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGV4dExheW91dC5kcmF3KGV2ZW50LmdjLCBldmVudC54LCBldmVudC55KTsKLQkJfQotCX0pOwotCWZpbmFsIFJlY3RhbmdsZSB0ZXh0TGF5b3V0Qm91bmRzID0gdGV4dExheW91dC5nZXRCb3VuZHMoKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZS53aWR0aCA9IHRleHRMYXlvdXRCb3VuZHMud2lkdGggKyAyOwotCQkJZS5oZWlnaHQgPSB0ZXh0TGF5b3V0Qm91bmRzLmhlaWdodCArIDI7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb250MS5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCWZvbnQzLmRpc3Bvc2UoKTsKLQl0ZXh0TGF5b3V0LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MjNmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBDb21wb3NpdGUgU25pcHBldDogaW5oZXJpdCBhIGJhY2tncm91bmQgY29sb3Igb3IgaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kTW9kZSgpIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCi0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKTsKLQkKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldFRleHQoIlNXVC5JTkhFUklUX05PTkUiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9OT05FKTsKLQljcmVhdGVDaGlsZHJlbihncm91cCk7Ci0JCi0JZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlncm91cC5zZXRUZXh0KCJTV1QuSU5IRVJJVF9ERUZBVUxUIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0VGV4dCgiU1dULklOSEVSSVRfRk9SQ0UiKTsKLQlncm91cC5zZXRCYWNrZ3JvdW5kTW9kZShTV1QuSU5IRVJJVF9GT1JDRSk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDEiKTsKLQlsaXN0LmFkZCgiTGlzdCBpdGVtIDIiKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJMYWJlbCIpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQlidXR0b24uc2V0VGV4dCgiUmFkaW8gQnV0dG9uIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYnV0dG9uLnNldFRleHQoIkNoZWNrIGJveCBCdXR0b24iKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQdXNoIEJ1dHRvbiIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0KCJUZXh0Iik7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNmNlMDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgcG9wdXAgbWVudSB3aXRoIGEgc3VibWVudQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb21wb3NpdGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbTEgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtMS5zZXRUZXh0ICgiUHVzaCBJdGVtIik7Ci0JTWVudUl0ZW0gaXRlbTIgPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlpdGVtMi5zZXRUZXh0ICgiQ2FzY2FkZSBJdGVtIik7Ci0JTWVudSBzdWJNZW51ID0gbmV3IE1lbnUgKG1lbnUpOwotCWl0ZW0yLnNldE1lbnUgKHN1Yk1lbnUpOwotCU1lbnVJdGVtIHN1Ykl0ZW0xID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTEuc2V0VGV4dCAoIlN1Yml0ZW0gMSIpOwotCU1lbnVJdGVtIHN1Ykl0ZW0yID0gbmV3IE1lbnVJdGVtIChzdWJNZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbTIuc2V0VGV4dCAoIlN1Yml0ZW0gMiIpOwotCWNvbXBvc2l0ZS5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWE3MzUwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgc25pcHBldDogbWFrZSB0ZXh0IHNwYW4gbXVsdGlwbGUgY29sdW1ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRhYmxlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgwLCAiaXRlbSAiK2krIiBhIik7Ci0JCWl0ZW0uc2V0VGV4dCgzLCAiaXRlbSAiK2krIiBkIik7Ci0JfQkKLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCWZpbmFsIFN0cmluZyBzdHJpbmcgPSAidGV4dCB0aGF0IHNwYW5zIHR3byBjb2x1bW5zIjsKLQlHQyBnYyA9IG5ldyBHQyh0YWJsZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IHRhYmxlLmdldENvbHVtbigxKTsKLQkJCQkJCQlvZmZzZXQgPSBjb2x1bW4xLmdldFdpZHRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQlldmVudC5nYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyAoZXZlbnQuaGVpZ2h0IC0gZXh0ZW50LnkpLzI7Ci0JCQkJCQlldmVudC5nYy5kcmF3U3RyaW5nKHN0cmluZywgZXZlbnQueCAtIG9mZnNldCwgeSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0KLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNDRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBDUiBpbiBhIHRleHQgb3IgY29tYm8gY29udHJvbCAoZGVmYXVsdCBzZWxlY3Rpb24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJBLTEiLCAiQi0xIiwgIkMtMSJ9KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQgKCJzb21lIHRleHQiKTsKLQljb21iby5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZS53aWRnZXQgKyAiIC0gRGVmYXVsdCBTZWxlY3Rpb24iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE4OGQzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgc25pcHBldDogVGV4dCB0aGF0IHNwYW5zIG11bHRpcGxlIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGV4dCBzcGFucyB0d28gY29sdW1ucyBpbiBhIFRyZWVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIitpKyIgYSIpOwotCQlpdGVtLnNldFRleHQoMywgIml0ZW0gIitpKyIgZCIpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoMCwgInN1Ykl0ZW0gIitpKyItIitqKyIgYSIpOwotCQkJc3ViSXRlbS5zZXRUZXh0KDMsICJzdWJJdGVtICIraSsiLSIraisiIGQiKTsKLQkJfQotCX0JCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgc3RyaW5nID0gInRleHQgdGhhdCBzcGFucyB0d28gY29sdW1ucyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JZmluYWwgUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaChldmVudC50eXBlKSB7CQkKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlldmVudC53aWR0aCA9IGV4dGVudC54LzI7Ci0JCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIGV4dGVudC55ICsgMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMSB8fCBldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCWlmIChldmVudC5pbmRleCA9PSAyKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCQkJb2Zmc2V0ID0gY29sdW1uMS5nZXRXaWR0aCgpOwotCQkJCQkJfQotCQkJCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgKGV2ZW50LmhlaWdodCAtIGV4dGVudC55KS8yOwotCQkJCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyhzdHJpbmcsIGV2ZW50LnggLSBvZmZzZXQsIHkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmMWU4My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRleHQgc25pcHBldDogT3ZlcnJpZGUgVGFiIGJlaGF2aW9yIHRvIHRyYXZlcnNlIG91dCBvZiBhIFRleHQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwxMCwyMDAsMjAwKTsKLQlUZXh0IHRleHQxID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQl0ZXh0MS5zZXRCb3VuZHMoMTAsMTAsMTUwLDUwKTsKLQl0ZXh0MS5zZXRUZXh0KCJUYWIgd2lsbCB0cmF2ZXJzZSBvdXQgZnJvbSBoZXJlLiIpOwotCXRleHQxLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQl0ZXh0Mi5zZXRCb3VuZHMoMTAsMTAwLDE1MCw1MCk7Ci0JdGV4dDIuc2V0VGV4dCgiQnV0IFRhYiB3aWxsIE5PVCB0cmF2ZXJzZSBvdXQgZnJvbSBoZXJlIChDdHJsK1RhYiB3aWxsKS4iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQyNzNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogQ3Vyc29yIHNuaXBwZXQ6IEhpZGUgdGhlIEN1cnNvciBvdmVyIGEgY29udHJvbC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotCWNhbnZhcy5zZXRCb3VuZHMoMTAsNTAsMTUwLDEwMCk7Ci0JY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2MuZHJhd1N0cmluZygiaGlkZSBDdXJzb3IgaGVyZSIsIDEwLCAxMCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNyZWF0ZSBhIGN1cnNvciB3aXRoIGEgdHJhbnNwYXJlbnQgaW1hZ2UKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlKTsKLQlzb3VyY2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAwOwotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDAsIDApOwotCi0Jc2hlbGwub3BlbigpOwotCWNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyNDJmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRleHQgc25pcHBldDogdHlwZSBpbiBvbmUgdGV4dCwgb3V0cHV0IHRvIGFub3RoZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0MCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZmluYWwgVGV4dCB0ZXh0MSA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dDAuYWRkVmVyaWZ5TGlzdGVuZXIgKG5ldyBWZXJpZnlMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQgKFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQl0ZXh0MS5zZXRUb3BJbmRleCAodGV4dDAuZ2V0VG9wSW5kZXggKCkpOwotCQkJdGV4dDEuc2V0U2VsZWN0aW9uIChldmVudC5zdGFydCwgZXZlbnQuZW5kKTsKLQkJCXRleHQxLmluc2VydCAoZXZlbnQudGV4dCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxN2RmZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IERyYXcgYSBib3ggYXJvdW5kIHRleHQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDQgewotCXN0YXRpYyBTdHJpbmcgU0VBUkNIX1NUUklORyA9ICJib3giOwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICAgICAgZmluYWwgQ29sb3IgUkVEID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgICAgIHNoZWxsLnNldEJvdW5kcygxMCwxMCwyNTAsMjUwKTsKLSAgICAgICAgZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OT05FKTsKLSAgICAgICAgdGV4dC5zZXRCb3VuZHMoMTAsMTAsMjAwLDIwMCk7Ci0gICAgICAgIHRleHQuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBjb250ZW50cyA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCWludCBzdHJpbmdXaWR0aCA9IGV2ZW50LmdjLnN0cmluZ0V4dGVudChTRUFSQ0hfU1RSSU5HKS54OwotCQkJCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChSRUQpOwotCQkJCWludCBpbmRleCA9IGNvbnRlbnRzLmluZGV4T2YoU0VBUkNIX1NUUklORyk7Ci0JCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCVBvaW50IHRvcExlZnQgPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoaW5kZXgpOwotCQkJCQlldmVudC5nYy5kcmF3UmVjdGFuZ2xlKHRvcExlZnQueCAtIDEsIHRvcExlZnQueSwgc3RyaW5nV2lkdGggKyAxLCBsaW5lSGVpZ2h0IC0gMSk7Ci0JCQkJCWluZGV4ID0gY29udGVudHMuaW5kZXhPZihTRUFSQ0hfU1RSSU5HLCBpbmRleCArIDEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBkZW1vbnN0cmF0ZXMgZHJhd2luZyBhIGJveFxuYXJvdW5kIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgdGhlIHdvcmRcbmJveCBpbiB0aGUgU3R5bGVkVGV4dCIpOwotICAgICAgICBzaGVsbC5vcGVuKCk7Ci0gICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjg0MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBDYW52YXMgc25pcHBldDogcGFpbnQgYSBjaXJjbGUgaW4gYSBjYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpOwotCQkJZXZlbnQuZ2MuZHJhd092YWwoMCwgMCwgcmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTg2YjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFdyaXRlIGFuIEltYWdlIHRvIGEgUE5HIGZpbGUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb21pYyBTYW5zIE1TIiwgMjQsIFNXVC5CT0xEKTsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgODcsIDQ4KTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5kcmF3U3RyaW5nKCJTIiwgMywgMCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJZ2MuZHJhd1N0cmluZygiVyIsIDI1LCAwKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCWdjLmRyYXdTdHJpbmcoIlQiLCA2MiwgMCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge2ltYWdlLmdldEltYWdlRGF0YSgpfTsKLQkJbG9hZGVyLnNhdmUoInN3dC5wbmciLCBTV1QuSU1BR0VfUE5HKTsKLQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDUwMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyBhIG11bHRpLWxpbmUgdGV4dCB0byBwcm9jZXNzIHRoZSBkZWZhdWx0IGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ3IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JU3RyaW5nIG1vZGlmaWVyID0gU1dULk1PRDEgPT0gU1dULkNUUkwgPyAiQ3RybCIgOiAiQ29tbWFuZCI7Ci0JdGV4dC5zZXRUZXh0KCJIaXQgIiArIG1vZGlmaWVyICsgIitSZXR1cm5cbnRvIHNlZVxudGhlIGRlZmF1bHQgYnV0dG9uXG5ydW4iKTsKLQl0ZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULk1PRDEpICE9IDApIGUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRUZXh0KCJPSyIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT0sgc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkwYWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGFsbG93IGVzY2FwZSB0byBjbG9zZSBhIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0OCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBIEJ1dHRvbiAodGhhdCBkb2Vzbid0IHByb2Nlc3MgRXNjYXBlKSIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNGFiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU3RhY2tMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSBTdGFja0xheW91dCB0byBzd2l0Y2ggYmV0d2VlbiBDb21wb3NpdGVzLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ5IHsKLQotCXN0YXRpYyBpbnQgcGFnZU51bSA9IC0xOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzICgxMCwgMTAsIDMwMCwgMjAwKTsKLQkvLyBjcmVhdGUgdGhlIGNvbXBvc2l0ZSB0aGF0IHRoZSBwYWdlcyB3aWxsIHNoYXJlCi0JZmluYWwgQ29tcG9zaXRlIGNvbnRlbnRQYW5lbCA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb250ZW50UGFuZWwuc2V0Qm91bmRzICgxMDAsIDEwLCAxOTAsIDkwKTsKLQlmaW5hbCBTdGFja0xheW91dCBsYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQgKCk7Ci0JY29udGVudFBhbmVsLnNldExheW91dCAobGF5b3V0KTsKLQotCS8vIGNyZWF0ZSB0aGUgZmlyc3QgcGFnZSdzIGNvbnRlbnQKLQlmaW5hbCBDb21wb3NpdGUgcGFnZTAgPSBuZXcgQ29tcG9zaXRlIChjb250ZW50UGFuZWwsIFNXVC5OT05FKTsKLQlwYWdlMC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChwYWdlMCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJMYWJlbCBvbiBwYWdlIDEiKTsKLQlsYWJlbC5wYWNrICgpOwotCi0JLy8gY3JlYXRlIHRoZSBzZWNvbmQgcGFnZSdzIGNvbnRlbnQJCi0JZmluYWwgQ29tcG9zaXRlIHBhZ2UxID0gbmV3IENvbXBvc2l0ZSAoY29udGVudFBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFnZTEuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAocGFnZTEsIFNXVC5OT05FKTsKLQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiBvbiBwYWdlIDIiKTsKLQlidXR0b24ucGFjayAoKTsKLQotCS8vIGNyZWF0ZSB0aGUgYnV0dG9uIHRoYXQgd2lsbCBzd2l0Y2ggYmV0d2VlbiB0aGUgcGFnZXMKLQlCdXR0b24gcGFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JcGFnZUJ1dHRvbi5zZXRUZXh0ICgiUHVzaCIpOwotCXBhZ2VCdXR0b24uc2V0Qm91bmRzICgxMCwgMTAsIDgwLCAyNSk7Ci0JcGFnZUJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlwYWdlTnVtID0gKytwYWdlTnVtICUgMjsKLQkJCWxheW91dC50b3BDb250cm9sID0gcGFnZU51bSA9PSAwID8gcGFnZTAgOiBwYWdlMTsKLQkJCWNvbnRlbnRQYW5lbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JjN2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IGtleSBzdGF0ZSwgY29kZSBhbmQgY2hhcmFjdGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNSB7Ci0KLXN0YXRpYyBTdHJpbmcgc3RhdGVNYXNrIChpbnQgc3RhdGVNYXNrKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHN0cmluZyArPSAiIENUUkwiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgc3RyaW5nICs9ICIgQUxUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgc3RyaW5nICs9ICIgU0hJRlQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpICE9IDApIHN0cmluZyArPSAiIENPTU1BTkQiOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgY2hhcmFjdGVyIChjaGFyIGNoYXJhY3RlcikgewotCXN3aXRjaCAoY2hhcmFjdGVyKSB7Ci0JCWNhc2UgMDogCQlyZXR1cm4gIidcXDAnIjsKLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiJ1xcYiciOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICInXFxyJyI7Ci0JCWNhc2UgU1dULkRFTDoJcmV0dXJuICJERUwiOwotCQljYXNlIFNXVC5FU0M6CXJldHVybiAiRVNDIjsKLQkJY2FzZSBTV1QuTEY6CXJldHVybiAiJ1xcbiciOwotCQljYXNlIFNXVC5UQUI6CXJldHVybiAiJ1xcdCciOwotCX0KLQlyZXR1cm4gIiciICsgY2hhcmFjdGVyICsiJyI7Ci19Ci0KLXN0YXRpYyBTdHJpbmcga2V5Q29kZSAoaW50IGtleUNvZGUpIHsKLQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCi0JCS8qIEtleWJvYXJkIGFuZCBNb3VzZSBNYXNrcyAqLwotCQljYXNlIFNXVC5BTFQ6IAkJcmV0dXJuICJBTFQiOwotCQljYXNlIFNXVC5TSElGVDogCXJldHVybiAiU0hJRlQiOwotCQljYXNlIFNXVC5DT05UUk9MOglyZXR1cm4gIkNPTlRST0wiOwotCQljYXNlIFNXVC5DT01NQU5EOglyZXR1cm4gIkNPTU1BTkQiOwotCQkJCi0JCS8qIE5vbi1OdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULkFSUk9XX1VQOgkJcmV0dXJuICJBUlJPV19VUCI7Ci0JCWNhc2UgU1dULkFSUk9XX0RPV046CXJldHVybiAiQVJST1dfRE9XTiI7Ci0JCWNhc2UgU1dULkFSUk9XX0xFRlQ6CXJldHVybiAiQVJST1dfTEVGVCI7Ci0JCWNhc2UgU1dULkFSUk9XX1JJR0hUOglyZXR1cm4gIkFSUk9XX1JJR0hUIjsKLQkJY2FzZSBTV1QuUEFHRV9VUDoJCXJldHVybiAiUEFHRV9VUCI7Ci0JCWNhc2UgU1dULlBBR0VfRE9XTjoJCXJldHVybiAiUEFHRV9ET1dOIjsKLQkJY2FzZSBTV1QuSE9NRToJCQlyZXR1cm4gIkhPTUUiOwotCQljYXNlIFNXVC5FTkQ6CQkJcmV0dXJuICJFTkQiOwotCQljYXNlIFNXVC5JTlNFUlQ6CQlyZXR1cm4gIklOU0VSVCI7Ci0KLQkJLyogVmlydHVhbCBhbmQgQXNjaWkgS2V5cyAqLwotCQljYXNlIFNXVC5CUzoJcmV0dXJuICJCUyI7Ci0JCWNhc2UgU1dULkNSOglyZXR1cm4gIkNSIjsJCQotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIkxGIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIlRBQiI7Ci0JCi0JCS8qIEZ1bmN0aW9ucyBLZXlzICovCi0JCWNhc2UgU1dULkYxOglyZXR1cm4gIkYxIjsKLQkJY2FzZSBTV1QuRjI6CXJldHVybiAiRjIiOwotCQljYXNlIFNXVC5GMzoJcmV0dXJuICJGMyI7Ci0JCWNhc2UgU1dULkY0OglyZXR1cm4gIkY0IjsKLQkJY2FzZSBTV1QuRjU6CXJldHVybiAiRjUiOwotCQljYXNlIFNXVC5GNjoJcmV0dXJuICJGNiI7Ci0JCWNhc2UgU1dULkY3OglyZXR1cm4gIkY3IjsKLQkJY2FzZSBTV1QuRjg6CXJldHVybiAiRjgiOwotCQljYXNlIFNXVC5GOToJcmV0dXJuICJGOSI7Ci0JCWNhc2UgU1dULkYxMDoJcmV0dXJuICJGMTAiOwotCQljYXNlIFNXVC5GMTE6CXJldHVybiAiRjExIjsKLQkJY2FzZSBTV1QuRjEyOglyZXR1cm4gIkYxMiI7Ci0JCWNhc2UgU1dULkYxMzoJcmV0dXJuICJGMTMiOwotCQljYXNlIFNXVC5GMTQ6CXJldHVybiAiRjE0IjsKLQkJY2FzZSBTV1QuRjE1OglyZXR1cm4gIkYxNSI7Ci0JCQotCQkvKiBOdW1lcmljIEtleXBhZCBLZXlzICovCi0JCWNhc2UgU1dULktFWVBBRF9BREQ6CQlyZXR1cm4gIktFWVBBRF9BREQiOwotCQljYXNlIFNXVC5LRVlQQURfU1VCVFJBQ1Q6CXJldHVybiAiS0VZUEFEX1NVQlRSQUNUIjsKLQkJY2FzZSBTV1QuS0VZUEFEX01VTFRJUExZOglyZXR1cm4gIktFWVBBRF9NVUxUSVBMWSI7Ci0JCWNhc2UgU1dULktFWVBBRF9ESVZJREU6CQlyZXR1cm4gIktFWVBBRF9ESVZJREUiOwotCQljYXNlIFNXVC5LRVlQQURfREVDSU1BTDoJcmV0dXJuICJLRVlQQURfREVDSU1BTCI7Ci0JCWNhc2UgU1dULktFWVBBRF9DUjoJCQlyZXR1cm4gIktFWVBBRF9DUiI7Ci0JCWNhc2UgU1dULktFWVBBRF8wOgkJCXJldHVybiAiS0VZUEFEXzAiOwotCQljYXNlIFNXVC5LRVlQQURfMToJCQlyZXR1cm4gIktFWVBBRF8xIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzI6CQkJcmV0dXJuICJLRVlQQURfMiI7Ci0JCWNhc2UgU1dULktFWVBBRF8zOgkJCXJldHVybiAiS0VZUEFEXzMiOwotCQljYXNlIFNXVC5LRVlQQURfNDoJCQlyZXR1cm4gIktFWVBBRF80IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzU6CQkJcmV0dXJuICJLRVlQQURfNSI7Ci0JCWNhc2UgU1dULktFWVBBRF82OgkJCXJldHVybiAiS0VZUEFEXzYiOwotCQljYXNlIFNXVC5LRVlQQURfNzoJCQlyZXR1cm4gIktFWVBBRF83IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzg6CQkJcmV0dXJuICJLRVlQQURfOCI7Ci0JCWNhc2UgU1dULktFWVBBRF85OgkJCXJldHVybiAiS0VZUEFEXzkiOwotCQljYXNlIFNXVC5LRVlQQURfRVFVQUw6CQlyZXR1cm4gIktFWVBBRF9FUVVBTCI7Ci0KLQkJLyogT3RoZXIga2V5cyAqLwotCQljYXNlIFNXVC5DQVBTX0xPQ0s6CQlyZXR1cm4gIkNBUFNfTE9DSyI7Ci0JCWNhc2UgU1dULk5VTV9MT0NLOgkJcmV0dXJuICJOVU1fTE9DSyI7Ci0JCWNhc2UgU1dULlNDUk9MTF9MT0NLOglyZXR1cm4gIlNDUk9MTF9MT0NLIjsKLQkJY2FzZSBTV1QuUEFVU0U6CQkJcmV0dXJuICJQQVVTRSI7Ci0JCWNhc2UgU1dULkJSRUFLOgkJCXJldHVybiAiQlJFQUsiOwotCQljYXNlIFNXVC5QUklOVF9TQ1JFRU46CXJldHVybiAiUFJJTlRfU0NSRUVOIjsKLQkJY2FzZSBTV1QuSEVMUDoJCQlyZXR1cm4gIkhFTFAiOwotCX0KLQlyZXR1cm4gY2hhcmFjdGVyICgoY2hhcikga2V5Q29kZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50eXBlID09IFNXVC5LZXlEb3duID8gIkRPV046IiA6ICJVUCAgOiI7Ci0JCQlzdHJpbmcgKz0gIiBzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spICsgc3RhdGVNYXNrIChlLnN0YXRlTWFzaykgKyAiLCI7Ci0JCQlzdHJpbmcgKz0gIiBrZXlDb2RlPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUua2V5Q29kZSkgKyAiICIgKyBrZXlDb2RlIChlLmtleUNvZGUpICsgIiwiOwotCQkJc3RyaW5nICs9ICIgY2hhcmFjdGVyPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuY2hhcmFjdGVyKSArICIgIiArIGNoYXJhY3RlciAoZS5jaGFyYWN0ZXIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHJpbmcpOwotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OTNiZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGF0ZVRpbWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBEYXRlVGltZSBjYWxlbmRhciBhbmQgYSBEYXRlVGltZSB0aW1lLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0KLQlEYXRlVGltZSBjYWxlbmRhciA9IG5ldyBEYXRlVGltZSAoc2hlbGwsIFNXVC5DQUxFTkRBUik7Ci0JY2FsZW5kYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoImNhbGVuZGFyIGRhdGUgY2hhbmdlZCIpOwotCQl9Ci0JfSk7Ci0KLQlEYXRlVGltZSB0aW1lID0gbmV3IERhdGVUaW1lIChzaGVsbCwgU1dULlRJTUUpOwotCXRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInRpbWUgY2hhbmdlZCIpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2NhMGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERhdGVUaW1lIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgRGF0ZVRpbWUgY2FsZW5kYXIsIGRhdGUsIGFuZCB0aW1lIGluIGEgZGlhbG9nLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCUJ1dHRvbiBvcGVuID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlvcGVuLnNldFRleHQgKCJPcGVuIERpYWxvZyIpOwotCW9wZW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgZmFsc2UpKTsKLQotCQkJZmluYWwgRGF0ZVRpbWUgY2FsZW5kYXIgPSBuZXcgRGF0ZVRpbWUgKGRpYWxvZywgU1dULkNBTEVOREFSIHwgU1dULkJPUkRFUik7Ci0JCQlmaW5hbCBEYXRlVGltZSBkYXRlID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5EQVRFIHwgU1dULlNIT1JUKTsKLQkJCWZpbmFsIERhdGVUaW1lIHRpbWUgPSBuZXcgRGF0ZVRpbWUgKGRpYWxvZywgU1dULlRJTUUgfCBTV1QuU0hPUlQpOwotCi0JCQluZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQkJCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dCAoIk9LIik7Ci0JCQlvay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJDYWxlbmRhciBkYXRlIHNlbGVjdGVkIChNTS9ERC9ZWVlZKSA9ICIgKyAoY2FsZW5kYXIuZ2V0TW9udGggKCkgKyAxKSArICIvIiArIGNhbGVuZGFyLmdldERheSAoKSArICIvIiArIGNhbGVuZGFyLmdldFllYXIgKCkpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEYXRlIHNlbGVjdGVkIChNTS9ZWVlZKSA9ICIgKyAoZGF0ZS5nZXRNb250aCAoKSArIDEpICsgIi8iICsgZGF0ZS5nZXRZZWFyICgpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiVGltZSBzZWxlY3RlZCAoSEg6TU0pID0gIiArIHRpbWUuZ2V0SG91cnMgKCkgKyAiOiIgKyB0aW1lLmdldE1pbnV0ZXMgKCkpOwotCQkJCQlkaWFsb2cuY2xvc2UgKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbiAob2spOwotCQkJZGlhbG9nLnBhY2sgKCk7Ci0JCQlkaWFsb2cub3BlbiAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmNjc1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluZUF0dHJpYnV0ZXMgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IDIgcG9seWxpbmVzIHdpdGggZGlmZmVyZW50IGxpbmUgYXR0cmlidXRlcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTIgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQkKLQkJCQlnYy5zZXRMaW5lQXR0cmlidXRlcyhuZXcgTGluZUF0dHJpYnV0ZXMoMTAsIFNXVC5DQVBfRkxBVCwgU1dULkpPSU5fTUlURVIsIFNXVC5MSU5FX1NPTElELCBudWxsLCAwLCAxMCkpOwotCQkJCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W117NTAsIDEwMCwgNTAsIDIwLCA2MCwgMzAsIDUwLCA0NX0pOwotCQkJCQotCQkJCWdjLnNldExpbmVBdHRyaWJ1dGVzKG5ldyBMaW5lQXR0cmlidXRlcygxLzJmLCBTV1QuQ0FQX0ZMQVQsIFNXVC5KT0lOX01JVEVSLCBTV1QuTElORV9ET1QsIG51bGwsIDAsIDEwKSk7Ci0JCQkJZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXXsxMDAsIDEwMCwgMTAwLCAyMCwgMTEwLCAzMCwgMTAwLCA0NX0pOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJlYmFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1NiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJVbmRlcmxpbmUsIFN0cmlrZSBPdXQiKTsKLQlGb250IGZvbnQgPSBzaGVsbC5nZXRGb250KCk7Ci0JU3RyaW5nIHRleHQgPSAiSGVyZSBpcyBzb21lIHRleHQgdGhhdCBpcyB1bmRlcmxpbmVkIG9yIHN0cnVjayBvdXQgb3IgYm90aC4iOwotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0LnNldFRleHQodGV4dCk7Ci0JVGV4dFN0eWxlIHN0eWxlMSA9IG5ldyBUZXh0U3R5bGUoZm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMjYsIDM1KTsKLQlUZXh0U3R5bGUgc3R5bGUyID0gbmV3IFRleHRTdHlsZShmb250LCBudWxsLCBudWxsKTsKLQlzdHlsZTIuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCA0MCwgNDkpOwotCVRleHRTdHlsZSBzdHlsZTMgPSBuZXcgVGV4dFN0eWxlKGZvbnQsIG51bGwsIG51bGwpOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCWxheW91dC5zZXRTdHlsZShzdHlsZTMsIDU0LCA1Nyk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgxMCwgMTApOwotCQkJaW50IHdpZHRoID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIHBvaW50Lng7Ci0JCQlsYXlvdXQuc2V0V2lkdGgod2lkdGgpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwkJCi0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dC5kaXNwb3NlKCk7CQkKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjcxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgdGV4dCBzZWxlY3Rpb24gd2l0aGluIGEgU3R5bGVkVGV4dCB3aWRnZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTcgewotCi0Jc3RhdGljIFN0cmluZyBzdHJpbmcxID0gIkEgZHJhZyBzb3VyY2UgaXMgdGhlIHByb3ZpZGVyIG9mIGRhdGEgaW4gYSBEcmFnIGFuZCBEcm9wIGRhdGEgdHJhbnNmZXIgYXMgd2VsbCBhcyAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcmlnaW5hdG9yIG9mIHRoZSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbi4gVGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRyYWcgc291cmNlICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5IGJlIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgbG9jYXRpb24gaW4gdGhlIHNhbWUgd2lkZ2V0LCB0byBhIGRpZmZlcmVudCB3aWRnZXQgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoaW4gdGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIHRvIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gZHJhZyB0ZXh0IGZyb20geW91ciBhcHBsaWNhdGlvbiBhbmQgZHJvcCBpdCBvbiBhbiBlbWFpbCBhcHBsaWNhdGlvbiwgb3IgeW91ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgZHJhZyBhbiBpdGVtIGluIGEgdHJlZSBhbmQgZHJvcCBpdCBiZWxvdyBhIGRpZmZlcmVudCBub2RlIGluIHRoZSBzYW1lIHRyZWUuIjsKLQotCXN0YXRpYyBTdHJpbmcgRFJBR19TVEFSVF9EQVRBID0gIkRSQUdfU1RBUlRfREFUQSI7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFNpemUoMTAwLCAzMDApOwotCWludCBzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQuc2V0VGV4dChzdHJpbmcxKTsKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRleHQsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQlzb3VyY2Uuc2V0RHJhZ1NvdXJjZUVmZmVjdChuZXcgRHJhZ1NvdXJjZUVmZmVjdCh0ZXh0KSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkJfQotCX0pOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJUG9pbnQgc2VsZWN0aW9uOwotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJZXZlbnQuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQkJdGV4dC5zZXREYXRhKERSQUdfU1RBUlRfREFUQSwgc2VsZWN0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gdGV4dC5nZXRUZXh0KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueS0xKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQlQb2ludCBuZXdTZWxlY3Rpb249IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJaW50IGRlbHRhID0gMDsKLQkJCQlpZiAobmV3U2VsZWN0aW9uLnggPCBzZWxlY3Rpb24ueCkKLQkJCQkJZGVsdGEgPSBsZW5ndGg7IAotCQkJCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCArIGRlbHRhLCBsZW5ndGgsICIiKTsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQl0ZXh0LnNldERhdGEoRFJBR19TVEFSVF9EQVRBLCBudWxsKTsKLQkJfQotCX0pOwotCQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAodGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSkgPT0gbnVsbCkKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQllbHNlIAotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpID09IG51bGwpCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZWxzZSAKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NDUk9MTCB8IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORSkgewotCQkJCVBvaW50IHNlbGVjdGlvbiA9IChQb2ludCkgdGV4dC5nZXREYXRhKERSQUdfU1RBUlRfREFUQSk7Ci0JCQkJaW50IGluc2VydFBvcyA9IHRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPD0gaW5zZXJ0UG9zICAmJiBpbnNlcnRQb3MgPD0gc2VsZWN0aW9uLnkgCi0JCQkJCQl8fCBldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfQ09QWSAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ueCA8IGluc2VydFBvcyAgJiYgaW5zZXJ0UG9zIDwgc2VsZWN0aW9uLnkpIHsKLQkJCQkJdGV4dC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsgIC8vIHByZXZlbnQgc291cmNlIGZyb20gZGVsZXRpbmcgc2VsZWN0aW9uCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCQkJdGV4dC5pbnNlcnQoc3RyaW5nKTsKLQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotCQkJCQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShpbnNlcnRQb3MsIHN0cmluZy5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjM3ZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHNlYXJjaCB0ZXh0IGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1OCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNFQVJDSCB8IFNXVC5DQU5DRUwpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmICgodGV4dC5nZXRTdHlsZSgpICYgU1dULkNBTkNFTCkgPT0gMCkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIFNuaXBwZXQyNTguY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiY2FuY2VsLmdpZiIpKTsKLQkJCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQpOwotCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXRleHQuc2V0VGV4dCgiIik7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoIGNhbmNlbGxlZCIpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0VGV4dCgiU2VhcmNoIHRleHQiKTsKLQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUuZGV0YWlsID09IFNXVC5DQU5DRUwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2ggY2FuY2VsbGVkIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2hpbmcgZm9yOiAiICsgdGV4dC5nZXRUZXh0KCkgKyAiLi4uIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTM1NGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEZXRlY3QgZHJhZyBpbiBhIGN1c3RvbSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTkgewotCi1zdGF0aWMgY2xhc3MgTXlMaXN0IGV4dGVuZHMgQ2FudmFzIHsKLQlpbnQgc2VsZWN0aW9uOwotCVN0cmluZyBbXSBpdGVtcyA9IG5ldyBTdHJpbmcgWzBdOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5TRVRfWCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlNFVF9ZID0gMjsKLQkKLXN0YXRpYyBpbnQgY2hlY2tTdHlsZSAoaW50IHN0eWxlKSB7Ci0Jc3R5bGUgJj0gfihTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXN0eWxlIHw9IFNXVC5OT19CQUNLR1JPVU5EIHwgU1dULk5PX1JFRFJBV19SRVNJWkU7Ci0JcmV0dXJuIHN0eWxlOwotfQotCi1wdWJsaWMgTXlMaXN0IChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQlzdXBlciAocGFyZW50LCBjaGVja1N0eWxlIChzdHlsZSkpOwotCXN1cGVyLnNldERyYWdEZXRlY3QgKGZhbHNlKTsKLQlhZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duIChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IG5ldyBHQyAoTXlMaXN0LnRoaXMpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGdldENsaWVudEFyZWEoKTsKLQkJCWludCBpbmRleCA9IDAsIHggPSBjbGllbnQueCArIElOU0VUX1gsIHkgPSBjbGllbnQueSArIElOU0VUX1k7Ci0JCQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkJCQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudChpdGVtcyBbaW5kZXhdKTsKLQkJCQlSZWN0YW5nbGUgaXRlbSA9IG5ldyBSZWN0YW5nbGUgKHgsIHksIHB0LngsIHB0LnkpOwotCQkJCWlmIChpdGVtLmNvbnRhaW5zIChldmVudC54LCBldmVudC55KSkgYnJlYWs7Ci0JCQkJeSArPSBwdC55OwotCQkJCWlmICghY2xpZW50LmNvbnRhaW5zICh4LCB5KSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlnYy5kaXNwb3NlICgpOwotCQkJaWYgKGluZGV4ID09IGl0ZW1zLmxlbmd0aCB8fCAhY2xpZW50LmNvbnRhaW5zICh4LCB5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IGluZGV4OwotCQkJcmVkcmF3ICgpOwotCQkJdXBkYXRlICgpOwotCQkJZHJhZ0RldGVjdCAoZXZlbnQpOwotCQl9Ci0JfSk7Ci0JYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlDb2xvciBmb3JlZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCQlDb2xvciBiYWNrZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCQlDb2xvciBzZWxlY3RGb3JlZ3JvdW5kID0gZXZlbnQuZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQpOwotCQkJQ29sb3Igc2VsZWN0QmFja2dyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kKTsKLQkJCWdjLnNldEJhY2tncm91bmQgKGJhY2tncm91bmQpOwotCQkJTXlMaXN0LnRoaXMuZHJhd0JhY2tncm91bmQgKGdjLCBldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCWludCB4ID0gSU5TRVRfWCwgeSA9IElOU0VUX1k7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudChpdGVtcyBbaV0pOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGkgPT0gc2VsZWN0aW9uID8gc2VsZWN0Rm9yZWdyb3VuZCA6IGZvcmVncm91bmQpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGkgPT0gc2VsZWN0aW9uID8gc2VsZWN0QmFja2dyb3VuZCA6IGJhY2tncm91bmQpOwotCQkJCWdjLmRyYXdTdHJpbmcgKGl0ZW1zIFtpXSwgeCwgeSk7Ci0JCQkJeSArPSBwdC55OwotCQkJfQotCQkJCi0JCX0KLQl9KTsKLX0KLQotcHVibGljIFBvaW50IGNvbXB1dGVTaXplIChpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JR0MgZ2MgPSBuZXcgR0MgKHRoaXMpOwotCWludCBpbmRleCA9IDAsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGgpIHsKLQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2luZGV4XSk7Ci0JCXdpZHRoID0gTWF0aC5tYXggKHdpZHRoLCBwdC54KTsKLQkJaGVpZ2h0ICs9IHB0Lnk7Ci0JCWluZGV4Kys7Ci0JfQotCWdjLmRpc3Bvc2UgKCk7Ci0Jd2lkdGggKz0gSU5TRVRfWCAqIDI7Ci0JaGVpZ2h0ICs9IElOU0VUX1kgKiAyOwotCVJlY3RhbmdsZSByZWN0ID0gY29tcHV0ZVRyaW0gKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCXJldHVybiBuZXcgUG9pbnQgKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLX0KLQotcHVibGljIFN0cmluZyBbXSBnZXRJdGVtcyAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIGl0ZW1zOwotfQotCi1wdWJsaWMgdm9pZCBzZXRJdGVtcyAoU3RyaW5nIFtdIGl0ZW1zKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKGl0ZW1zID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXRoaXMuaXRlbXMgPSBpdGVtczsKLQlyZWRyYXcgKCk7CQotfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JTXlMaXN0IHQxID0gbmV3IE15TGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXQxLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiU29tZSIsICJpdGVtcyIsICJpbiIsICJ0aGUiLCAibGlzdCJ9KTsKLQl0MS5hZGREcmFnRGV0ZWN0TGlzdGVuZXIgKG5ldyBEcmFnRGV0ZWN0TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRGV0ZWN0ZWQgKERyYWdEZXRlY3RFdmVudCBldmVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRHJhZyBzdGFydGVkIC4uLiIpOwotCQl9Ci0JfSk7Ci0JTXlMaXN0IHQyID0gbmV3IE15TGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXQyLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiU29tZSIsICJpdGVtcyIsICJpbiIsICJhbm90aGVyIiwgImxpc3QifSk7Ci0JdDIuYWRkRHJhZ0RldGVjdExpc3RlbmVyIChuZXcgRHJhZ0RldGVjdExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0RldGVjdGVkIChEcmFnRGV0ZWN0RXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRyYWcgc3RhcnRlZCAuLi4iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2U1ZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tYm8gZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb21ibyBib3ggKG5vbi1lZGl0YWJsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQSIsICJCIiwgIkMifSk7Ci0JY29tYm8uc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU5MzFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNb3ppbGxhIGluIGEgQnJvd3NlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJNb3ppbGxhIik7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk1PWklMTEEpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly9tb3ppbGxhLm9yZyIpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxMDhjNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIEV4Y2VsIHNoZWV0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJFeGNlbCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQluZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJFeGNlbC5TaGVldCIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA4YTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgV29yZCBkb2N1bWVudC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MiB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQlzdGF0aWMgT2xlRnJhbWUgZnJhbWU7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiV29yZCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCWZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBzaGVsbC5nZXRNZW51QmFyKCk7Ci0JCWlmIChtZW51QmFyID09IG51bGwpIHsKLQkJCW1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQl9Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCi0JCU1lbnVJdGVtIG1lbnVGaWxlT3BlbiA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZU9wZW4uc2V0VGV4dCgiT3Blbi4uLiIpOwotCQltZW51RmlsZU9wZW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmlsZU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlRXhpdCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUV4aXQuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUV4aXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBmaWxlT3BlbigpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhjbGllbnRTaXRlLmdldFNoZWxsKCksIFNXVC5PUEVOKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIiouZG9jIiB9KTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWNsaWVudFNpdGUuZGlzcG9zZSgpOwotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiLCBuZXcgRmlsZShmaWxlTmFtZSkpOwotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBiZmRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgUG93ZXJQb2ludCBzbGlkZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MyB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlBvd2VyUG9pbnQgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJY2xpZW50U2l0ZSAgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJQb3dlclBvaW50LlNsaWRlIik7Ci0JCQlhZGRGaWxlTWVudShmcmFtZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2hlbGwuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJTWVudUl0ZW0gbWVudUZpbGVDb250cm9sID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlQ29udHJvbC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNkOGJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogT3BlbiBhbiBPTEUgTWVkaWEgUGxheWVyLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY0IHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWVkaWEgUGxheWVyIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiTVBsYXllciIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxYjIwYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFdpbmRvd3MgTWVkaWEgUGxheWVyLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY1IHsKLQlzdGF0aWMgT2xlQ2xpZW50U2l0ZSBjbGllbnRTaXRlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWVkaWEgUGxheWVyIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXTVBsYXllci5PQ1giKTsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gc2hlbGwuZ2V0TWVudUJhcigpOwotCQlpZiAobWVudUJhciA9PSBudWxsKSB7Ci0JCQltZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJfQotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQotCQlNZW51SXRlbSBtZW51RmlsZU9wZW4gPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVPcGVuLnNldFRleHQoIk9wZW4uLi4iKTsKLQkJbWVudUZpbGVPcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlsZU9wZW4oKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY2xpZW50U2l0ZS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLndtdiIgfSk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7Ci0JCQlPbGVBdXRvbWF0aW9uIHBsYXllciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJaW50IHBsYXlVUkxbXSA9IHBsYXllci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJVUkwiIH0pOwotCQkJaWYgKHBsYXlVUkwgIT0gbnVsbCkgewotCQkJCVZhcmlhbnQgdGhlRmlsZSA9IG5ldyBWYXJpYW50KGZpbGVuYW1lKTsKLQkJCQlwbGF5ZXIuc2V0UHJvcGVydHkocGxheVVSTFswXSwgdGhlRmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU3YTBjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNwYW4gYW5kIGNlbnRlciBjb2x1bW5zIHdpdGggYSBHcmlkTGF5b3V0LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCQotCQlUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihzaGVsbCwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCQotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJXaWRnZXQiKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KCJTdGFuZGFyZCIpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JCVRyZWVJdGVtIGJyYW5jaCA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWJyYW5jaC5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJFZmZpY2llbnQiLCAiUG9ydGFibGUifSk7Ci0JCVRyZWVJdGVtIGxlYWYgPSBuZXcgVHJlZUl0ZW0oYnJhbmNoLCBTV1QuTk9ORSk7Ci0JCWxlYWYuc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQ3Jvc3MiLCAiUGxhdGZvcm0ifSk7Ci0JCWJyYW5jaC5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJYnJhbmNoID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJYnJhbmNoLnNldFRleHQobmV3IFN0cmluZyBbXSB7Ik5hdGl2ZSIsICJDb250cm9scyJ9KTsKLQkJbGVhZiA9IG5ldyBUcmVlSXRlbShicmFuY2gsIFNXVC5OT05FKTsKLQkJbGVhZi5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDcm9zcyIsICJQbGF0Zm9ybSJ9KTsKLQkJYnJhbmNoID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJYnJhbmNoLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkNyb3NzIiwgIlBsYXRmb3JtIn0pOwotCQljb2x1bW4xLnBhY2soKTsKLQkJY29sdW1uMi5wYWNrKCk7Ci0KLQkJaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRvb2xraXQiKTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dCgiVG90YWxseSIpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQotCQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJBd2Vzb21lIik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCi0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzMGEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5tb3ppbGxhLmludGVyZmFjZXMuKjsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBUb2dnbGUgYSBNb3ppbGxhIEJyb3dzZXIgYmV0d2VlbiBEZXNpZ24gbW9kZSBhbmQgVmlldyBtb2RlLgotICogCi0gKiBJTVBPUlRBTlQ6IEZvciB0aGlzIHNuaXBwZXQgdG8gd29yayBwcm9wZXJseSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBmb3IgcnVubmluZyBhCi0gKiBNb3ppbGxhLWJhc2VkIEJyb3dzZXIgaW5zdGFuY2UgbGlzdGVkIGluIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlbW96aWxsYQotICogbXVzdCBiZSBzYXRpc2ZpZWQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyNjcgewotCXN0YXRpYyBCcm93c2VyIGJyb3dzZXI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlzaGVsbC5zZXRUZXh0KCJVc2UgTW96aWxsYSdzIERlc2lnbiBNb2RlIik7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQotCQlmaW5hbCBCdXR0b24gb2ZmQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb2ZmQnV0dG9uLnNldFRleHQoIkRlc2lnbiBNb2RlIE9mZiIpOwotCQlvZmZCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9mZkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldERlc2lnbk1vZGUoIm9mZiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgQnV0dG9uIG9uQnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlJBRElPKTsKLQkJb25CdXR0b24uc2V0VGV4dCgiRGVzaWduIE1vZGUgT24iKTsKLQkJb25CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKSByZXR1cm47Ci0JCQkJYm9vbGVhbiBzdWNjZXNzID0gc2V0RGVzaWduTW9kZSgib24iKTsKLQkJCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQkJb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJb2ZmQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlvZmZCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZXNpZ25Nb2RlKFN0cmluZyB2YWx1ZSkgewotCQluc0lXZWJCcm93c2VyIHdlYkJyb3dzZXIgPSAobnNJV2ViQnJvd3Nlcilicm93c2VyLmdldFdlYkJyb3dzZXIoKTsKLQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZ2V0IHRoZSBuc0lXZWJCcm93c2VyIGZyb20gdGhlIEJyb3dzZXIgd2lkZ2V0Iik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbnNJRE9NV2luZG93IHdpbmRvdyA9IHdlYkJyb3dzZXIuZ2V0Q29udGVudERPTVdpbmRvdygpOwotCQluc0lET01Eb2N1bWVudCBkb2N1bWVudCA9IHdpbmRvdy5nZXREb2N1bWVudCgpOwotCQluc0lET01OU0hUTUxEb2N1bWVudCBuc0RvY3VtZW50ID0gKG5zSURPTU5TSFRNTERvY3VtZW50KWRvY3VtZW50LnF1ZXJ5SW50ZXJmYWNlKG5zSURPTU5TSFRNTERvY3VtZW50Lk5TX0lET01OU0hUTUxET0NVTUVOVF9JSUQpOwotCQluc0RvY3VtZW50LnNldERlc2lnbk1vZGUodmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNhOWMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogb3BlbiBhIHNoZWxsIG1pbmltaXplZCAoaWNvbmlmaWVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldE1pbmltaXplZCAodHJ1ZSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5MWZjYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IG9wZW4gYSBzaGVsbCBtYXhpbWl6ZWQgKGZ1bGwgc2NyZWVuKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldE1heGltaXplZCAodHJ1ZSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4YzM2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgYmFyIGFuZCBwdWxsIGRvd24gbWVudSAoYWNjZWxlcmF0b3JzLCBtbmVtb25pY3MpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0JTWVudUl0ZW0gZmlsZUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCWZpbGVJdGVtLnNldFRleHQgKCImRmlsZSIpOwotCU1lbnUgc3VibWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JZmlsZUl0ZW0uc2V0TWVudSAoc3VibWVudSk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3QgQWxsIik7Ci0JCX0KLQl9KTsKLQlpdGVtLnNldFRleHQgKCJTZWxlY3QgJkFsbFx0Q3RybCtBIik7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvciAoU1dULk1PRDEgKyAnQScpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTVmMWVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBmaW5kIGEgdGFibGUgY2VsbCBmcm9tIG1vdXNlIGRvd24gKFNXVC5GVUxMX1NFTEVDVElPTikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwKLQkJCXwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmaW5hbCBpbnQgcm93Q291bnQgPSA2NCwgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5Db3VudDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCAyMDApOwotCXRhYmxlLnNldFNpemUoc2l6ZSk7Ci0Jc2hlbGwucGFjaygpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKHB0KTsKLQkJCWlmIChpdGVtID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCQlpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLQkJCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVtICIgKyBpbmRleCArICItIiArIGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JkNzYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgdGhlIHN5c3RlbSB0ZXh0IGVkaXRvciBvbiBhdXRvZXhlYy5iYXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi50eHQiKTsKLQlpZiAocCAhPSBudWxsKSBwLmV4ZWN1dGUgKCJjOlxcYXV0b2V4ZWMuYmF0Iik7IC8vIFdpbmRvd3Mtc3BlY2lmaWMgZmlsZW5hbWUKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk4YzFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIHdoZW4gInRvcm4gb2ZmIikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVBvaW50IHBvaW50ID0gbnVsbDsKLQkJc3RhdGljIGZpbmFsIGludCBKSVRURVIgPSA4OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChwb2ludCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBkZWx0YVggPSBwb2ludC54IC0gZXZlbnQueCwgZGVsdGFZID0gcG9pbnQueSAtIGV2ZW50Lnk7Ci0JCQkJCWlmIChNYXRoLmFicyAoZGVsdGFYKSA8IEpJVFRFUiAmJiBNYXRoLmFicyAoZGVsdGFZKSA8IEpJVFRFUikgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChkaXNwbGF5LCBTV1QuTk9ORSk7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gZGlzcGxheS5tYXAgKHNoZWxsLCBudWxsLCBzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQkJCQkJcmVjdC54IC09IGRlbHRhWDsKLQkJCQkJcmVjdC55IC09IGRlbHRhWTsKLQkJCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHtyZWN0fSk7Ci0JCQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlwb2ludCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYmRhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmFtIGV4YW1wbGUgc25pcHBldDogZmluZCB0aGUgaWNvbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGVkaXRzIC5ibXAgZmlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJDYW4ndCBmaW5kIGljb24gZm9yIC5ibXAiKTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi5ibXAiKTsKLQlpZiAocCAhPSBudWxsKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gcC5nZXRJbWFnZURhdGEgKCk7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBkYXRhKTsKLQkJCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JCX0KLQl9Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYzkxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXJlY3RvcnlEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZGlyZWN0b3J5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyAoc2hlbGwpOwotCWRpYWxvZy5zZXRGaWx0ZXJQYXRoICgiYzpcXCIpOyAvL1dpbmRvd3Mgc3BlY2lmaWMKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSRVNVTFQ9IiArIGRpYWxvZy5vcGVuICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc2NWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBMYWJlbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhYmVsICh3aXRoIGFuIGltYWdlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7IAotCX0gCi0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4N2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChubyBjb2x1bW5zLCBubyBoZWFkZXJzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNzI4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGZsYXQgdG9vbCBiYXIgKGltYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCX0KLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2Y2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAoYSBzZXBhcmF0b3IpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JbmV3IExhYmVsIChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFlM2E1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGNvbHVtbnMsIGhlYWRlcnMsIGxpbmVzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlTdHJpbmdbXSB0aXRsZXMgPSB7IiAiLCAiQyIsICIhIiwgIkRlc2NyaXB0aW9uIiwgIlJlc291cmNlIiwgIkluIEZvbGRlciIsICJMb2NhdGlvbiJ9OwotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAodGl0bGVzIFtpXSk7Ci0JfQkKLQlpbnQgY291bnQgPSAxMjg7Ci0JZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKDAsICJ4Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMSwgInkiKTsKLQkJaXRlbS5zZXRUZXh0ICgyLCAiISIpOwotCQlpdGVtLnNldFRleHQgKDMsICJ0aGlzIHN0dWZmIGJlaGF2ZXMgdGhlIHdheSBJIGV4cGVjdCIpOwotCQlpdGVtLnNldFRleHQgKDQsICJhbG1vc3QgZXZlcnl3aGVyZSIpOwotCQlpdGVtLnNldFRleHQgKDUsICJzb21lLmZvbGRlciIpOwotCQlpdGVtLnNldFRleHQgKDYsICJsaW5lICIgKyBpICsgIiBpbiBub3doZXJlIik7Ci0JfQotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0JCi0JdGFibGUuc2V0U2l6ZSAodGFibGUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCAyMDApKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM0MmE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzOSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM4NDExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBlc2NhcGUgZnJvbSBjbG9zaW5nIGEgZGlhbG9nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiT3BlbiBEaWFsb2cgLi4uIik7Ci0JCWIucGFjaygpOwotCQliLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQkJCQlkaWFsb2cuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjU3NmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBwb3B1cCBtZW51IChzZXQgaW4gbXVsdGlwbGUgY29udHJvbHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMxLnNldFNpemUgKDEwMCwgMTAwKTsKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzIuc2V0Qm91bmRzICgxMDAsIDAsIDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJQb3B1cCIpOwotCWMxLnNldE1lbnUgKG1lbnUpOwotCWMyLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwZTE5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCB0aXBzIGZvciBhIHRhYiBpdGVtLCB0b29sIGl0ZW0sIGFuZCBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICJUaGlzIGlzIGEgc3RyaW5nXG53aXRoIGEgbmV3IGxpbmUuIjsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRhYkl0ZW0gaXRlbTAgPSBuZXcgVGFiSXRlbSAoZm9sZGVyLCAwKTsKLQlpdGVtMC5zZXRUb29sVGlwVGV4dCAoIlRhYkl0ZW0gdG9vbFRpcDogIiArIHN0cmluZyk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJhci5zZXRCb3VuZHMgKDAsIDIwMCwgMjAwLCA2NCk7Ci0JVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JaXRlbTEuc2V0VG9vbFRpcFRleHQgKCJUb29sSXRlbSB0b29sVGlwOiAiICsgc3RyaW5nKTsKLQlzaGVsbC5zZXRUb29sVGlwVGV4dCAoIlNoZWxsIHRvb2xUaXA6ICIgKyBzdHJpbmcpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRmNDFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBnZXQgdGhlIGJvdW5kcyBhbmQgY2xpZW50IGFyZWEgb2YgYSBkaXNwbGF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEaXNwbGF5IEJvdW5kcz0iICsgZGlzcGxheS5nZXRCb3VuZHMgKCkgKyAiIERpc3BsYXkgQ2xpZW50QXJlYT0iICsgZGlzcGxheS5nZXRDbGllbnRBcmVhICgpKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlNjM0NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYXJldCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNhcmV0ICh1c2luZyBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUNhcmV0IGNhcmV0ID0gbmV3IENhcmV0IChzaGVsbCwgU1dULk5PTkUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChibGFjayk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoMCwgMCwgMjAsIDIwKTsKLQlnYy5zZXRGb3JlZ3JvdW5kICh3aGl0ZSk7Ci0JZ2MuZHJhd0xpbmUgKDAsIDAsIDE5LCAxOSk7Ci0JZ2MuZHJhd0xpbmUgKDE5LCAwLCAwLCAxOSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQljYXJldC5zZXRMb2NhdGlvbiAoMTAsIDEwKTsKLQljYXJldC5zZXRJbWFnZSAoaW1hZ2UpOwotCWdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2MuZHJhd0ltYWdlIChpbWFnZSwgMTAsIDY0KTsKLQljYXJldC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JZ2MuZHJhd1N0cmluZyAoIlRlc3QiLCAxMiwgMTIpOwotCWNhcmV0LnNldFZpc2libGUgKHRydWUpOwotCWdjLmRpc3Bvc2UgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTY4NjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogc2V0IHRoZSBoYW5kIGN1cnNvciBpbnRvIGEgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IgKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZmluYWwgQnV0dG9uIGIgPSBuZXcgQnV0dG9uIChzaGVsbCwgMCk7Ci0JYi5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAyMDApOwotCWIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQliLnNldEN1cnNvciAoY3Vyc29yKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljdXJzb3IuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhY2VlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY2FsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNjYWxlIChtYXhpbXVtIDQwLCBwYWdlIGluY3JlbWVudCA1KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVNjYWxlIHNjYWxlID0gbmV3IFNjYWxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0Jc2NhbGUuc2V0U2l6ZSAoMjAwLCA2NCk7Ci0Jc2NhbGUuc2V0TWF4aW11bSAoNDApOwotCXNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2FjNjI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBpbnRlcmNlcHQgbW91c2UgZXZlbnRzIChkcmFnIGEgYnV0dG9uIHdpdGggdGhlIG1vdXNlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tcG9zaXRlLnNldEVuYWJsZWQgKGZhbHNlKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uIik7Ci0JY29tcG9zaXRlLnBhY2sgKCk7Ci0JY29tcG9zaXRlLnNldExvY2F0aW9uICgxMCwgMTApOwotCWZpbmFsIFBvaW50IFtdIG9mZnNldCA9IG5ldyBQb2ludCBbMV07Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Qm91bmRzICgpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIHsKLQkJCQkJCVBvaW50IHB0MSA9IGNvbXBvc2l0ZS50b0Rpc3BsYXkgKDAsIDApOwotCQkJCQkJUG9pbnQgcHQyID0gc2hlbGwudG9EaXNwbGF5IChldmVudC54LCBldmVudC55KTsgCi0JCQkJCQlvZmZzZXQgWzBdID0gbmV3IFBvaW50IChwdDIueCAtIHB0MS54LCBwdDIueSAtIHB0MS55KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChvZmZzZXQgWzBdICE9IG51bGwpIHsKLQkJCQkJCVBvaW50IHB0ID0gb2Zmc2V0IFswXTsKLQkJCQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAoZXZlbnQueCAtIHB0LngsIGV2ZW50LnkgLSBwdC55KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlvZmZzZXQgWzBdID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNTVjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgYmFyIChub3JtYWwsIGhvdCBhbmQgZGlzYWJsZWQgaW1hZ2VzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCi0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCUltYWdlIGRpc2FibGVkSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pOwotCWdjID0gbmV3IEdDIChkaXNhYmxlZEltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoZGlzYWJsZWRJbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JSW1hZ2UgaG90SW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlnYyA9IG5ldyBHQyAoaG90SW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChob3RJbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCk7Ci0JYmFyLnNldFNpemUgKDIwMCwgMzIpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJaXRlbS5zZXREaXNhYmxlZEltYWdlIChkaXNhYmxlZEltYWdlKTsKLQkJaXRlbS5zZXRIb3RJbWFnZSAoaG90SW1hZ2UpOwotCQlpZiAoaSAlIDMgPT0gMCkgaXRlbS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JfQotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzYWJsZWRJbWFnZS5kaXNwb3NlICgpOwotCWhvdEltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2JhNzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDYW52YXMgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYW4gaW1hZ2UgKGZsaWNrZXIgZnJlZSwgbm8gZG91YmxlIGJ1ZmZlcmluZykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUltYWdlIG9yaWdpbmFsSW1hZ2UgPSBudWxsOwotCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBTV1QuT1BFTik7Ci0JZGlhbG9nLnNldFRleHQgKCJPcGVuIGFuIGltYWdlIGZpbGUgb3IgY2FuY2VsIik7Ci0JU3RyaW5nIHN0cmluZyA9IGRpYWxvZy5vcGVuICgpOwotCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQlvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBzdHJpbmcpOwotCX0KLQlpZiAob3JpZ2luYWxJbWFnZSA9PSBudWxsKSB7Ci0JCWludCB3aWR0aCA9IDE1MCwgaGVpZ2h0ID0gMjAwOwotCQlvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJR0MgZ2MgPSBuZXcgR0MgKG9yaWdpbmFsSW1hZ2UpOwotCQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZ2MuZHJhd0xpbmUgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kcmF3TGluZSAoMCwgaGVpZ2h0LCB3aWR0aCwgMCk7Ci0JCWdjLmRyYXdUZXh0ICgiRGVmYXVsdCBJbWFnZSIsIDEwLCAxMCk7Ci0JCWdjLmRpc3Bvc2UgKCk7Ci0JfQotCWZpbmFsIEltYWdlIGltYWdlID0gb3JpZ2luYWxJbWFnZTsKLQlmaW5hbCBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQgKDAsIDApOwotCWZpbmFsIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQgfAotCQkJU1dULk5PX1JFRFJBV19SRVNJWkUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZpbmFsIFNjcm9sbEJhciBoQmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIgKCk7Ci0JaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgZGVzdFggPSAtaFNlbGVjdGlvbiAtIG9yaWdpbi54OwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQljYW52YXMuc2Nyb2xsIChkZXN0WCwgMCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhciA9IGNhbnZhcy5nZXRWZXJ0aWNhbEJhciAoKTsKLQl2QmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCBkZXN0WSA9IC12U2VsZWN0aW9uIC0gb3JpZ2luLnk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCWNhbnZhcy5zY3JvbGwgKDAsIGRlc3RZLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJfQotCX0pOwotCWNhbnZhcy5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWhCYXIuc2V0TWF4aW11bSAocmVjdC53aWR0aCk7Ci0JCQl2QmFyLnNldE1heGltdW0gKHJlY3QuaGVpZ2h0KTsKLQkJCWhCYXIuc2V0VGh1bWIgKE1hdGgubWluIChyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCXZCYXIuc2V0VGh1bWIgKE1hdGgubWluIChyZWN0LmhlaWdodCwgY2xpZW50LmhlaWdodCkpOwotCQkJaW50IGhQYWdlID0gcmVjdC53aWR0aCAtIGNsaWVudC53aWR0aDsKLQkJCWludCB2UGFnZSA9IHJlY3QuaGVpZ2h0IC0gY2xpZW50LmhlaWdodDsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaWYgKGhTZWxlY3Rpb24gPj0gaFBhZ2UpIHsKLQkJCQlpZiAoaFBhZ2UgPD0gMCkgaFNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJCX0KLQkJCWlmICh2U2VsZWN0aW9uID49IHZQYWdlKSB7Ci0JCQkJaWYgKHZQYWdlIDw9IDApIHZTZWxlY3Rpb24gPSAwOwotCQkJCW9yaWdpbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQljYW52YXMucmVkcmF3ICgpOwotCQl9Ci0JfSk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCBvcmlnaW4ueCwgb3JpZ2luLnkpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgY2xpZW50ID0gY2FudmFzLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgbWFyZ2luV2lkdGggPSBjbGllbnQud2lkdGggLSByZWN0LndpZHRoOwotCQkJaWYgKG1hcmdpbldpZHRoID4gMCkgewotCQkJCWdjLmZpbGxSZWN0YW5nbGUgKHJlY3Qud2lkdGgsIDAsIG1hcmdpbldpZHRoLCBjbGllbnQuaGVpZ2h0KTsKLQkJCX0KLQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQlpZiAobWFyZ2luSGVpZ2h0ID4gMCkgewotCQkJCWdjLmZpbGxSZWN0YW5nbGUgKDAsIHJlY3QuaGVpZ2h0LCBjbGllbnQud2lkdGgsIG1hcmdpbkhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDE1MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0Jb3JpZ2luYWxJbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YTEyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgYmFyICh3cmFwIG9uIHJlc2l6ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5XUkFQKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHNpemUgPSB0b29sQmFyLmNvbXB1dGVTaXplIChyZWN0LndpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCQl0b29sQmFyLnNldFNpemUgKHNpemUpOwotCQl9Ci0JfSk7Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VhOTc4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2Nyb2xsZWRDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSBjb250cm9sIGluIGEgc2Nyb2xsZWQgY29tcG9zaXRlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSAKLXsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0gICAgLy8gdGhpcyBidXR0b24gaXMgYWx3YXlzIDQwMCB4IDQwMC4gU2Nyb2xsYmFycyBhcHBlYXIgaWYgdGhlIHdpbmRvdyBpcyByZXNpemVkIHRvIGJlCi0gICAgLy8gdG9vIHNtYWxsIHRvIHNob3cgcGFydCBvZiB0aGUgYnV0dG9uCi0gICAgU2Nyb2xsZWRDb21wb3NpdGUgYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEJ1dHRvbiBiMSA9IG5ldyBCdXR0b24oYzEsIFNXVC5QVVNIKTsKLSAgICBiMS5zZXRUZXh0KCJmaXhlZCBzaXplIGJ1dHRvbiIpOwotICAgIGIxLnNldFNpemUoNDAwLCA0MDApOwotICAgIGMxLnNldENvbnRlbnQoYjEpOwotCi0gICAgLy8gdGhpcyBidXR0b24gaGFzIGEgbWluaW11bSBzaXplIG9mIDQwMCB4IDQwMC4gSWYgdGhlIHdpbmRvdyBpcyByZXNpemVkIHRvIGJlIGJpZwotICAgIC8vIGVub3VnaCB0byBzaG93IG1vcmUgdGhhbiA0MDAgeCA0MDAsIHRoZSBidXR0b24gd2lsbCBncm93IGluIHNpemUuIElmIHRoZSB3aW5kb3cKLSAgICAvLyBpcyBtYWRlIHRvbyBzbWFsbCB0byBzaG93IDQwMCB4IDQwMCwgc2Nyb2xsYmFycyB3aWxsIGFwcGVhci4KLSAgICBTY3JvbGxlZENvbXBvc2l0ZSBjMiA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgQnV0dG9uIGIyID0gbmV3IEJ1dHRvbihjMiwgU1dULlBVU0gpOwotICAgIGIyLnNldFRleHQoImV4cGFuZGluZyBidXR0b24iKTsKLSAgICBjMi5zZXRDb250ZW50KGIyKTsKLSAgICBjMi5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAgIGMyLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotICAgIGMyLnNldE1pbldpZHRoKDQwMCk7Ci0gICAgYzIuc2V0TWluSGVpZ2h0KDQwMCk7Ci0KLSAgICBzaGVsbC5zZXRTaXplKDYwMCwgMzAwKTsKLSAgICBzaGVsbC5vcGVuICgpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmQyOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIlNoZWxsIik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCk7Ci0JZGlhbG9nLnNldFRleHQgKCJEaWFsb2ciKTsKLQlkaWFsb2cuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWRpYWxvZy5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYmQ3NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIHRhYmxlIChzZXQgdGhlIHRvcCBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0VG9wSW5kZXggKDk1KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQyNDYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2VsZWN0IGFuIGluZGV4IChzZWxlY3QgYW5kIHNjcm9sbCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2VsZWN0aW9uICg5NSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjYWU0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZW1vdmUgc2VsZWN0ZWQgaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0YWJsZS5zZXRNZW51IChtZW51KTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiRGVsZXRlIFNlbGVjdGlvbiIpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJdGFibGUucmVtb3ZlICh0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGIzYTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzYXNoIChhbGxvdyBpdCB0byBiZSBtb3ZlZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVkVSVElDQUwpOwotCXNhc2guc2V0Qm91bmRzICgxMCwgMTAsIDMyLCAxMDApOwotCXNhc2guYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlzYXNoLnNldEJvdW5kcyAoZS54LCBlLnksIGUud2lkdGgsIGUuaGVpZ2h0KTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jc2FzaC5zZXRGb2N1cyAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmE4M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgYSB0ZXh0IGNvbnRyb2wgKHNob3cgYWJvdXQgMTAgY2hhcmFjdGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWludCBjb2x1bW5zID0gMTA7Ci0JR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MgKCk7Ci0JaW50IHdpZHRoID0gY29sdW1ucyAqIGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGggKCk7Ci0JaW50IGhlaWdodCA9IGZtLmdldEhlaWdodCAoKTsKLQlnYy5kaXNwb3NlICgpOwotCXRleHQuc2V0U2l6ZSAodGV4dC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZWFiYjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3Jlc3NCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgKGZyb20gYW5vdGhlciB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJZmluYWwgUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuU01PT1RIKTsKLQkJYmFyLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMzIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWZpbmFsIGludCBtYXhpbXVtID0gYmFyLmdldE1heGltdW0oKTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKGZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOyBpWzBdIDw9IG1heGltdW07IGlbMF0rKykgewotCQkJCXRyeSB7VGhyZWFkLnNsZWVwICgxMDApO30gY2F0Y2ggKFRocm93YWJsZSB0aCkge30KLQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChiYXIuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJCWJhci5zZXRTZWxlY3Rpb24oaVswXSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI5NWY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyZXNzQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyIChmcm9tIHRoZSBVSSB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyIChzaGVsbCwgU1dULlNNT09USCk7Ci0JYmFyLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMyKTsKLQlzaGVsbC5vcGVuICgpOwotCWZvciAoaW50IGk9MDsgaTw9YmFyLmdldE1heGltdW0gKCk7IGkrKykgewotCQl0cnkge1RocmVhZC5zbGVlcCAoMTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdGgpIHt9Ci0JCWJhci5zZXRTZWxlY3Rpb24gKGkpOwotCX0KLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTQ0MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgY29tYm8gYm94IGluIGEgdG9vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVG9vbEl0ZW0gc2VwID0gbmV3IFRvb2xJdGVtIChiYXIsIFNXVC5TRVBBUkFUT1IpOwotCWludCBzdGFydCA9IGJhci5nZXRJdGVtQ291bnQgKCk7Ci0JZm9yIChpbnQgaT1zdGFydDsgaTxzdGFydCs0OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChiYXIsIFNXVC5SRUFEX09OTFkpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJY29tYm8uYWRkICgiSXRlbSAiICsgaSk7Ci0JfQotCWNvbWJvLnBhY2sgKCk7Ci0Jc2VwLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCXNlcC5zZXRDb250cm9sIChjb21ibyk7Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ZGFjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0IGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSBsaXN0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIGxpc3QuYWRkICgiSXRlbSAiICsgaSk7Ci0JbGlzdC5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMjQ3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgZ3JpZCBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBmaW5hbCBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGMuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgICAgIGIuc2V0VGV4dCgiQnV0dG9uICIraSk7Ci0gICAgfQotCi0gICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgYi5zZXRUZXh0KCJhZGQgYSBuZXcgYnV0dG9uIGF0IHJvdyAyIGNvbHVtbiAxIik7Ci0gICAgZmluYWwgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOwotICAgIGIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBCdXR0b24gcyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgICAgICAgICAgcy5zZXRUZXh0KCJTcGVjaWFsICIraW5kZXhbMF0pOwotICAgICAgICAgICAgaW5kZXhbMF0rKzsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHMubW92ZUFib3ZlKGNoaWxkcmVuWzNdKTsKLSAgICAgICAgICAgIHNoZWxsLmxheW91dChuZXcgQ29udHJvbFtdIHtzfSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiY2UxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHR3byBvbmUgc2hvdCB0aW1lcnMgKDUwMDAgbXMsIDIwMDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JZGlzcGxheS50aW1lckV4ZWMgKDUwMDAsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCI1MDAwIik7Ci0JCX0KLQl9KTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoMjAwMCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIjIwMDAiKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NWU2Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWl0ZW0wLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0wLCAwKTsKLQkJCWl0ZW0xLnNldFRleHQgKCJTdWJJdGVtICIgKyBpICsgIiAiICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0xLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGogKyAiICIgKyBrKTsKLQkJCX0JCi0JCX0KLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRXhwYW5kPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Db2xsYXBzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkNvbGxhcHNlPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuZ2V0SXRlbXMgKCkgWzBdLnNldEV4cGFuZGVkICh0cnVlKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiZWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJpbnQgbW91c2Ugc3RhdGUgYW5kIGJ1dHRvbiAoZG93biwgbW92ZSwgdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlVua25vd24iOwotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246IHN0cmluZyA9ICJET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiBzdHJpbmcgPSAiTU9WRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6IHN0cmluZyA9ICJVUCI7IGJyZWFrOwotCQkJfQotCQkJc3RyaW5nICs9IjogYnV0dG9uOiAiICsgZS5idXR0b24gKyAiLCAiOwotCQkJc3RyaW5nICs9ICJzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04xIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMikgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMiI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjMpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjMiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT040KSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT040IjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9ONSkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9ONSI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cmluZyk7Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FlMWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsIChwcm9tcHQgZm9yIGEgdmFsdWUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmaW5hbCBib29sZWFuIFtdIHJlc3VsdCA9IG5ldyBib29sZWFuIFsxXTsKLQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCWRpYWxvZy5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIEJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPSyIpOwotCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCUxpc3RlbmVyIGxpc3RlbmVyID1uZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXJlc3VsdCBbMF0gPSBldmVudC53aWRnZXQgPT0gb2s7Ci0JCQlkaWFsb2cuY2xvc2UgKCk7Ci0JCX0KLQl9OwotCW9rLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JY2FuY2VsLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JZGlhbG9nLnBhY2sgKCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiUHJvbXB0IC4uLiIpOwotCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JU3lzdGVtLm91dC5wcmludGxuICgiUmVzdWx0OiAiICsgcmVzdWx0IFswXSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YThkYjEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0Qm91bmRzICgwLCAwLCAxMDAsIDEwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUYWJsZUl0ZW0gW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVGFibGVJdGVtIFtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA1NTJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2ltcGxlIGRpYWxvZyB1c2luZyBmb3JtIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5XUkFQKTsKLQlsYWJlbC5zZXRUZXh0ICgiVGhpcyBpcyBhIGxvbmcgdGV4dCBzdHJpbmcgdGhhdCB3aWxsIHdyYXAgd2hlbiB0aGUgZGlhbG9nIGlzIHJlc2l6ZWQuIik7Ci0JTGlzdCBsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlsaXN0LnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiSXRlbSAxIiwgIkl0ZW0gMiJ9KTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMS5zZXRUZXh0ICgiT0siKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JCi0JZmluYWwgaW50IGluc2V0WCA9IDQsIGluc2V0WSA9IDQ7Ci0JRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JZm9ybUxheW91dC5tYXJnaW5XaWR0aCA9IGluc2V0WDsKLQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGluc2V0WTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm1MYXlvdXQpOwotCQotCVBvaW50IHNpemUgPSBsYWJlbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlmaW5hbCBGb3JtRGF0YSBsYWJlbERhdGEgPSBuZXcgRm9ybURhdGEgKHNpemUueCwgU1dULkRFRkFVTFQpOwotCWxhYmVsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YSAobGFiZWxEYXRhKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWxhYmVsRGF0YS53aWR0aCA9IHJlY3Qud2lkdGggLSBpbnNldFggKiAyOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0JCQotCUZvcm1EYXRhIGJ1dHRvbjJEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjJEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIC1pbnNldFgpOwotCWJ1dHRvbjJEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24yLnNldExheW91dERhdGEgKGJ1dHRvbjJEYXRhKTsKLQkKLQlGb3JtRGF0YSBidXR0b24xRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24xRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoYnV0dG9uMiwgLWluc2V0WCk7Ci0JYnV0dG9uMURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjEuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMURhdGEpOwotCQotCUZvcm1EYXRhIGxpc3REYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWxpc3REYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWxpc3REYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxpc3REYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIGluc2V0WSk7Ci0JbGlzdERhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50IChidXR0b24yLCAtaW5zZXRZKTsKLQlsaXN0LnNldExheW91dERhdGEgKGxpc3REYXRhKTsKLQkKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4Zjg3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogaW1wbGVtZW50IGEgc2ltcGxlIHNjcmliYmxlIHByb2dyYW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCWludCBsYXN0WCA9IDAsIGxhc3RZID0gMDsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpID09IDApIGJyZWFrOwotCQkJCQlHQyBnYyA9IG5ldyBHQyAoc2hlbGwpOwotCQkJCQlnYy5kcmF3TGluZSAobGFzdFgsIGxhc3RZLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCWxhc3RYID0gZXZlbnQueDsKLQkJCQkJbGFzdFkgPSBldmVudC55OwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE0ZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhIGRyb3AgZG93biBtZW51IGluIGEgdG9vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5OT05FKTsKLQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JZmluYWwgVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKHJlY3QueCwgcmVjdC55ICsgcmVjdC5oZWlnaHQpOwotCQkJCXB0ID0gdG9vbEJhci50b0Rpc3BsYXkgKHB0KTsKLQkJCQltZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JbWVudS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTUyYjFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogc3RvcCBhIHJlcGVhdGluZyB0aW1lciB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiU3RvcCBUaW1lciIpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0QmFja2dyb3VuZCAocmVkKTsKLQlmaW5hbCBpbnQgdGltZSA9IDUwMDsKLQlmaW5hbCBSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlpZiAobGFiZWwuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJQ29sb3IgY29sb3IgPSBsYWJlbC5nZXRCYWNrZ3JvdW5kICgpLmVxdWFscyAocmVkKSA/IGJsdWUgOiByZWQ7Ci0JCQlsYWJlbC5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGhpcyk7Ci0JCX0KLQl9OwotCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aW1lcik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWRpc3BsYXkudGltZXJFeGVjICgtMSwgdGltZXIpOwotCQl9Ci0JfSk7Ci0JYnV0dG9uLnBhY2sgKCk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKGJ1dHRvbi5nZXRTaXplICgpKSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiZjk5OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY2VudGVyIGEgbGFiZWwgYW5kIHNpbmdsZSBsaW5lIHRleHQgdXNpbmcgYSBmb3JtIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FIHwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0VGV4dCAoIk5hbWUiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5OT05FKTsKLQotCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0Jc2hlbGwuc2V0TGF5b3V0IChsYXlvdXQpOwotCi0JR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MgKCk7Ci0JaW50IGNoYXJXaWR0aCA9IGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGggKCk7Ci0JaW50IHdpZHRoID0gdGV4dC5jb21wdXRlU2l6ZSAoY2hhcldpZHRoICogOCwgU1dULkRFRkFVTFQpLng7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhICh3aWR0aCwgU1dULkRFRkFVTFQpOwotCXRleHQuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODM2M2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChsYXp5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCkpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIkxhenkgVGFibGUiKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8MjAwMDA7IGkrKykgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQkJZmluYWwgaW50IFtdIGluZGV4ID0gbmV3IGludCBbXSB7aX07Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyAobmV3IFJ1bm5hYmxlICgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCQlpdGVtLnNldFRleHQgKCJUYWJsZSBJdGVtICIgKyBpbmRleCBbMF0pOwotCQkJCQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCXRocmVhZC5zdGFydCAoKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMyNzc5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuIGljb24gKGluIG1lbW9yeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCWdjLmZpbGxSZWN0YW5nbGUgKDUsIDUsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhICgpOwotCQotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKAotCQluZXcgUkdCIFtdIHsKLQkJCW5ldyBSR0IgKDAsIDAsIDApLAotCQkJbmV3IFJHQiAoMHhGRiwgMHhGRiwgMHhGRiksCi0JCX0pOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCWdjID0gbmV3IEdDIChtYXNrKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChibGFjayk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoMCwgMCwgMjAsIDIwKTsKLQlnYy5zZXRCYWNrZ3JvdW5kICh3aGl0ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoNSwgNSwgMTAsIDEwKTsKLQlnYy5kaXNwb3NlICgpOwotCW1hc2tEYXRhID0gbWFzay5nZXRJbWFnZURhdGEgKCk7Ci0JCi0JSW1hZ2UgaWNvbiA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VEYXRhLCBtYXNrRGF0YSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRJbWFnZSAoaWNvbik7Ci0JYnV0dG9uLnNldFNpemUgKDYwLCA2MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaWNvbi5kaXNwb3NlICgpOwotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JbWFzay5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTBkNGZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzaW1wbGUgT0svQ0FOQ0VMIGRpYWxvZyB1c2luZyBmb3JtIGxheW91dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkV4aXQgdGhlIGFwcGxpY2F0aW9uPyIpOwotCUJ1dHRvbiBva0J1dHRvbiA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCW9rQnV0dG9uLnNldFRleHQgKCImT0siKTsKLQlCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JY2FuY2VsQnV0dG9uLnNldFRleHQgKCImQ2FuY2VsIik7Ci0JCi0JRm9ybUxheW91dCBmb3JtID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JZm9ybS5tYXJnaW5XaWR0aCA9IGZvcm0ubWFyZ2luSGVpZ2h0ID0gODsKLQlkaWFsb2cuc2V0TGF5b3V0IChmb3JtKTsKLQlGb3JtRGF0YSBva0RhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jb2tEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDgpOwotCW9rQnV0dG9uLnNldExheW91dERhdGEgKG9rRGF0YSk7Ci0JRm9ybURhdGEgY2FuY2VsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQljYW5jZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKG9rQnV0dG9uLCA4KTsKLQljYW5jZWxEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAob2tCdXR0b24sIDAsIFNXVC5UT1ApOwotCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhIChjYW5jZWxEYXRhKTsKLQkKLQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbiAob2tCdXR0b24pOwotCWRpYWxvZy5wYWNrICgpOwotCWRpYWxvZy5vcGVuICgpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2Yzg5YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGaWxlRGlhbG9nIGV4YW1wbGUgc25pcHBldDogcHJvbXB0IGZvciBhIGZpbGUgbmFtZSAodG8gc2F2ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBTV1QuU0FWRSk7Ci0JZGlhbG9nLnNldEZpbHRlck5hbWVzIChuZXcgU3RyaW5nIFtdIHsiQmF0Y2ggRmlsZXMiLCAiQWxsIEZpbGVzICgqLiopIn0pOwotCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zIChuZXcgU3RyaW5nIFtdIHsiKi5iYXQiLCAiKi4qIn0pOyAvL1dpbmRvd3Mgd2lsZCBjYXJkcwotCWRpYWxvZy5zZXRGaWx0ZXJQYXRoICgiYzpcXCIpOyAvL1dpbmRvd3MgcGF0aAotCWRpYWxvZy5zZXRGaWxlTmFtZSAoImZyZWQuYmF0Iik7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiU2F2ZSB0bzogIiArIGRpYWxvZy5vcGVuICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDczLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDg1NWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGVuYWJsZSBtZW51IGl0ZW1zIGR5bmFtaWNhbGx5ICh3aGVuIG1lbnUgc2hvd24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCXRyZWUuc2V0TWVudSAobWVudSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJdHJlZUl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQltZW51SXRlbS5zZXRUZXh0ICh0cmVlSXRlbS5nZXRUZXh0ICgpKTsKLQl9Ci0JbWVudS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJTWVudUl0ZW0gW10gbWVudUl0ZW1zID0gbWVudS5nZXRJdGVtcyAoKTsKLQkJCVRyZWVJdGVtIFtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPG1lbnVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ZXh0ID0gbWVudUl0ZW1zIFtpXS5nZXRUZXh0ICgpOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4PHRyZWVJdGVtcy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRyZWVJdGVtcyBbaW5kZXhdLmdldFRleHQgKCkuZXF1YWxzICh0ZXh0KSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCW1lbnVJdGVtcyBbaV0uc2V0RW5hYmxlZCAoaW5kZXggIT0gdHJlZUl0ZW1zLmxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGJkYjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FyZXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjYXJldAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNhcmV0IGNhcmV0ID0gbmV3IENhcmV0IChzaGVsbCwgU1dULk5PTkUpOwotCWNhcmV0LnNldEJvdW5kcyAoMTAsIDEwLCAyLCAzMik7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjc5Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgdGFiIHRyYXZlcnNhbCBvcmRlciBvZiBjaGlsZHJlbgotICogSW4gdGhpcyBleGFtcGxlLCBjb21wb3NpdGUxIChpLmUuIGMxKSB0YWIgb3JkZXIgaXMgc2V0IHRvOiBCMiwgQjEsIEIzLCBhbmQKLSAqIHNoZWxsIHRhYiBvcmRlciBpcyBzZXQgdG86IGMxLCBCNywgdG9vbEJhcjEsIChjNDogbm8gZm9jdXNhYmxlIGNoaWxkcmVuKSwgYzIsIEwyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JCi0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMxLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGIxID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliMS5zZXRUZXh0ICgiQiYxIik7Ci0JQnV0dG9uIHIxID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5SQURJTyk7Ci0JcjEuc2V0VGV4dCAoIlIxIik7Ci0JQnV0dG9uIHIyID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5SQURJTyk7Ci0JcjIuc2V0VGV4dCAoIlImMiIpOwotCUJ1dHRvbiByMyA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIzLnNldFRleHQgKCJSMyIpOwotCUJ1dHRvbiBiMiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjIuc2V0VGV4dCAoIkIyIik7Ci0JTGlzdCBsMSA9IG5ldyBMaXN0IChjMSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCWwxLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiTDEifSk7Ci0JQnV0dG9uIGIzID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliMy5zZXRUZXh0ICgiQiYzIik7Ci0JQnV0dG9uIGI0ID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliNC5zZXRUZXh0ICgiQiY0Iik7Ci0JCi0JQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMyLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGI1ID0gbmV3IEJ1dHRvbiAoYzIsIFNXVC5QVVNIKTsKLQliNS5zZXRUZXh0ICgiQiY1Iik7Ci0JQnV0dG9uIGI2ID0gbmV3IEJ1dHRvbiAoYzIsIFNXVC5QVVNIKTsKLQliNi5zZXRUZXh0ICgiQiY2Iik7Ci0JCi0JTGlzdCBsMiA9IG5ldyBMaXN0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCWwyLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiTDIifSk7Ci0JCi0JVG9vbEJhciB0YjEgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JVG9vbEl0ZW0gaTEgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMS5zZXRUZXh0ICgiSTEiKTsKLQlUb29sSXRlbSBpMiA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUkFESU8pOwotCWkyLnNldFRleHQgKCJJMiIpOwotCUNvbWJvIGNvbWJvMSA9IG5ldyBDb21ibyAodGIxLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JY29tYm8xLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQzEifSk7Ci0JY29tYm8xLnNldFRleHQgKCJDMSIpOwotCWNvbWJvMS5wYWNrICgpOwotCVRvb2xJdGVtIGkzID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5TRVBBUkFUT1IpOwotCWkzLnNldFdpZHRoIChjb21ibzEuZ2V0U2l6ZSAoKS54KTsKLQlpMy5zZXRDb250cm9sIChjb21ibzEpOwotCVRvb2xJdGVtIGk0ID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5QVVNIKTsKLQlpNC5zZXRUZXh0ICgiSSY0Iik7Ci0JVG9vbEl0ZW0gaTUgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULkNIRUNLKTsKLQlpNS5zZXRUZXh0ICgiSTUiKTsKLQkKLQlCdXR0b24gYjcgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWI3LnNldFRleHQgKCJCJjciKTsKLQkKLQlDb21wb3NpdGUgYzQgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JQ29tcG9zaXRlIGM1ID0gbmV3IENvbXBvc2l0ZSAoYzQsIFNXVC5CT1JERVIpOwotCWM1LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoYzUsIFNXVC5OT05FKS5zZXRUZXh0KCJObyIpOwotCWM1LnBhY2soKTsKLQotCUNvbnRyb2wgW10gdGFiTGlzdDEgPSBuZXcgQ29udHJvbCBbXSB7YjIsIGIxLCBiM307Ci0JYzEuc2V0VGFiTGlzdCAodGFiTGlzdDEpOwotCUNvbnRyb2wgW10gdGFiTGlzdDIgPSBuZXcgQ29udHJvbCBbXSB7YzEsIGI3LCB0YjEsIGM0LCBjMiwgbDJ9OwotCXNoZWxsLnNldFRhYkxpc3QgKHRhYkxpc3QyKTsKLQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTc4M2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFiIGZvbGRlciAoc2l4IHBhZ2VzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDY7IGkrKykgewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIlRhYkl0ZW0gIiArIGkpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFiRm9sZGVyLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiUGFnZSAiICsgaSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JdGFiRm9sZGVyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1NTMyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBjb2x1bW5zIGFzIHRhYmxlIHJlc2l6ZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQlmaW5hbCBDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAwIiArIGksICJpdGVtIDEiK2l9KTsKLQl9Ci0JY29tcC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIGFyZWEgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIqdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJfQotCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCWlmIChvbGRTaXplLnggPiBhcmVhLndpZHRoKSB7Ci0JCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMgCi0JCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aC8zKTsKLQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC0gY29sdW1uMS5nZXRXaWR0aCgpKTsKLQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUgCi0JCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoLzMpOwotCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLSBjb2x1bW4xLmdldFdpZHRoKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxZGE5MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZHJhZyB0ZXh0IGJldHdlZW4gdHdvIGxhYmVscwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsMS5zZXRUZXh0ICgiVEVYVCIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXNldERyYWdEcm9wIChsYWJlbDEpOwotCXNldERyYWdEcm9wIChsYWJlbDIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RHJhZ0Ryb3AgKGZpbmFsIExhYmVsIGxhYmVsKSB7Ci0JCi0JVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCi0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAobGFiZWwsIG9wZXJhdGlvbnMpOwotCXNvdXJjZS5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRvaXQgPSAobGFiZWwuZ2V0VGV4dCAoKS5sZW5ndGggKCkgIT0gMCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9IGxhYmVsLmdldFRleHQgKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKQotCQkJCWxhYmVsLnNldFRleHQgKCIiKTsKLQkJfQotCX0pOwotCi0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsYWJlbC5zZXRUZXh0ICgoU3RyaW5nKSBldmVudC5kYXRhKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZDM1Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBteSBvd24gZGF0YSB0cmFuc2ZlciB0eXBlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc5IHsKLQotLyogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGU8L2JvbGQ+IHdoZXJlIE15VHlwZSBpcyBkZWZpbmUgYXM6ICovCi1zdGF0aWMgY2xhc3MgTXlUeXBlIHsKLQlTdHJpbmcgZmlsZU5hbWU7Ci0JbG9uZyBmaWxlTGVuZ3RoOwotCWxvbmcgbGFzdE1vZGlmaWVkOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIm5hbWVfZm9yX215X3R5cGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEVJRCA9IHJlZ2lzdGVyVHlwZSAoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgTXlUcmFuc2ZlciAoKTsKLQotcHVibGljIHN0YXRpYyBNeVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotCi1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSAodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCU15VHlwZSBbXSBteVR5cGVzID0gKE15VHlwZSBbXSkgb2JqZWN0OwotCXRyeSB7Ci0JCS8vIHdyaXRlIGRhdGEgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGFzayBzdXBlciB0byBjb252ZXJ0IHRvIHBNZWRpdW0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbSAob3V0KTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG15VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgW10gYnVmZmVyID0gbXlUeXBlcyBbaV0uZmlsZU5hbWUuZ2V0Qnl0ZXMgKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludCAoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZSAoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyAobXlUeXBlcyBbaV0uZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcgKG15VHlwZXMgW2ldLmxhc3RNb2RpZmllZCk7Ci0JCX0KLQkJYnl0ZSBbXSBidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkgKCk7Ci0JCXdyaXRlT3V0LmNsb3NlICgpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUgKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci19Ci0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhIChUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKGlzU3VwcG9ydGVkVHlwZSAodHJhbnNmZXJEYXRhKSkgewotCQlieXRlIFtdIGJ1ZmZlciA9IChieXRlIFtdKSBzdXBlci5uYXRpdmVUb0phdmEgKHRyYW5zZmVyRGF0YSk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLQkJTXlUeXBlIFtdIG15RGF0YSA9IG5ldyBNeVR5cGUgWzBdOwotCQl0cnkgewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0gKGJ1ZmZlcik7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbSAoaW4pOwotCQkJd2hpbGUgKHJlYWRJbi5hdmFpbGFibGUgKCkgPiAyMCkgewotCQkJCU15VHlwZSBkYXR1bSA9IG5ldyBNeVR5cGUgKCk7Ci0JCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCAoKTsKLQkJCQlieXRlIFtdIG5hbWUgPSBuZXcgYnl0ZSBbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQgKG5hbWUpOwotCQkJCWRhdHVtLmZpbGVOYW1lID0gbmV3IFN0cmluZyAobmFtZSk7Ci0JCQkJZGF0dW0uZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZyAoKTsKLQkJCQlkYXR1bS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcgKCk7Ci0JCQkJTXlUeXBlIFtdIG5ld015RGF0YSA9IG5ldyBNeVR5cGUgW215RGF0YS5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5IChteURhdGEsIDAsIG5ld015RGF0YSwgMCwgbXlEYXRhLmxlbmd0aCk7Ci0JCQkJbmV3TXlEYXRhIFtteURhdGEubGVuZ3RoXSA9IGRhdHVtOwotCQkJCW15RGF0YSA9IG5ld015RGF0YTsKLQkJCX0KLQkJCXJlYWRJbi5jbG9zZSAoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBteURhdGE7Ci0JfQotCi0JcmV0dXJuIG51bGw7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgW10gZ2V0VHlwZU5hbWVzICgpIHsKLQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7TVlUWVBFTkFNRX07Ci19Ci0KLXByb3RlY3RlZCBpbnQgW10gZ2V0VHlwZUlkcyAoKSB7Ci0JcmV0dXJuIG5ldyBpbnQgW10ge01ZVFlQRUlEfTsKLX0KLQotYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsIHx8IAotCQkhKG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZVtdKSB8fCAKLQkJKChNeVR5cGVbXSlvYmplY3QpLmxlbmd0aCA9PSAwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSlvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChteVR5cGVzW2ldID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpbGVOYW1lID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCXJldHVybiBjaGVja015VHlwZShvYmplY3QpOwotfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDEuc2V0VGV4dCAoIkRyYWcgU291cmNlIGZvciBNeURhdGFbXSIpOwotCWZpbmFsIExhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwyLnNldFRleHQgKCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhW10iKTsKLQotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyIChuZXcgVHJhbnNmZXIgW10ge015VHJhbnNmZXIuZ2V0SW5zdGFuY2UgKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlNeVR5cGUgbXlUeXBlMSA9IG5ldyBNeVR5cGUgKCk7Ci0JCQlteVR5cGUxLmZpbGVOYW1lID0gIkM6XFxhYmMudHh0IjsKLQkJCW15VHlwZTEuZmlsZUxlbmd0aCA9IDEwMDA7Ci0JCQlteVR5cGUxLmxhc3RNb2RpZmllZCA9IDEyMzEyMzEzOwotCQkJTXlUeXBlIG15VHlwZTIgPSBuZXcgTXlUeXBlICgpOwotCQkJbXlUeXBlMi5maWxlTmFtZSA9ICJDOlxceHl6LnR4dCI7Ci0JCQlteVR5cGUyLmZpbGVMZW5ndGggPSA1MDA7Ci0JCQlteVR5cGUyLmxhc3RNb2RpZmllZCA9IDEyMzEyMzIzOwotCQkJZXZlbnQuZGF0YSA9IG5ldyBNeVR5cGUgW10ge215VHlwZTEsIG15VHlwZTJ9OwotCQl9Ci0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCAobGFiZWwyLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyIChuZXcgVHJhbnNmZXIgW10ge015VHJhbnNmZXIuZ2V0SW5zdGFuY2UgKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUgW10gbXlUeXBlcyA9IChNeVR5cGUgW10pIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZXMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJc3RyaW5nICs9IG15VHlwZXMgW2ldLmZpbGVOYW1lICsgIiAiOwotCQkJCQl9Ci0JCQkJCWxhYmVsMi5zZXRUZXh0IChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxMmI3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJlZSAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIkxhenkgVHJlZSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JRmlsZSBbXSByb290cyA9IEZpbGUubGlzdFJvb3RzICgpOwotCWZvciAoaW50IGk9MDsgaTxyb290cy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSByb290ID0gbmV3IFRyZWVJdGVtICh0cmVlLCAwKTsKLQkJcm9vdC5zZXRUZXh0IChyb290cyBbaV0udG9TdHJpbmcgKCkpOwotCQlyb290LnNldERhdGEgKHJvb3RzIFtpXSk7Ci0JCW5ldyBUcmVlSXRlbSAocm9vdCwgMCk7Ci0JfQotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChmaW5hbCBFdmVudCBldmVudCkgewotCQkJZmluYWwgVHJlZUl0ZW0gcm9vdCA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCVRyZWVJdGVtIFtdIGl0ZW1zID0gcm9vdC5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9IDA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXMgW2ldLmdldERhdGEgKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW1zIFtpXS5kaXNwb3NlICgpOwotCQkJfQotCQkJRmlsZSBmaWxlID0gKEZpbGUpIHJvb3QuZ2V0RGF0YSAoKTsKLQkJCUZpbGUgW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcyAoKTsKLQkJCWlmIChmaWxlcyA9PSBudWxsKSByZXR1cm47Ci0JCQlmb3IgKGludCBpPSAwOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAocm9vdCwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChmaWxlcyBbaV0uZ2V0TmFtZSAoKSk7Ci0JCQkJaXRlbS5zZXREYXRhIChmaWxlcyBbaV0pOwotCQkJCWlmIChmaWxlcyBbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQluZXcgVHJlZUl0ZW0gKGl0ZW0sIDApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCVBvaW50IHNpemUgPSB0cmVlLmNvbXB1dGVTaXplICgzMDAsIFNXVC5ERUZBVUxUKTsKLQlpbnQgd2lkdGggPSBNYXRoLm1heCAoMzAwLCBzaXplLngpOwotCWludCBoZWlnaHQgPSBNYXRoLm1heCAoMzAwLCBzaXplLnkpOwotCXNoZWxsLnNldFNpemUgKHNoZWxsLmNvbXB1dGVTaXplICh3aWR0aCwgaGVpZ2h0KSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNTU4Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogbGltaXQgc2VsZWN0aW9uIHRvIGl0ZW1zIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIiArIGkpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIiArIGopOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCAyOyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIiArIGspOwotCQkJfQotCQl9Ci0JfQotCQotCXRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCVRyZWVJdGVtW10gcmV2aXNlZFNlbGVjdGlvbiA9IG5ldyBUcmVlSXRlbVswXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBzZWxlY3Rpb25baV0uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0LmluZGV4T2YoIjEiKSA+IDApIHsKLQkJCQkJVHJlZUl0ZW1bXSBuZXdTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGggKyAxXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyZXZpc2VkU2VsZWN0aW9uLCAwLCBuZXdTZWxlY3Rpb24sIDAsIHJldmlzZWRTZWxlY3Rpb24ubGVuZ3RoKTsKLQkJCQkJbmV3U2VsZWN0aW9uW3JldmlzZWRTZWxlY3Rpb24ubGVuZ3RoXSA9IHNlbGVjdGlvbltpXTsKLQkJCQkJcmV2aXNlZFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0cmVlLnNldFNlbGVjdGlvbihyZXZpc2VkU2VsZWN0aW9uKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU3ZWRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogT0xFIGFuZCBBY3RpdmVYIGV4YW1wbGUgc25pcHBldDogYnJvd3NlIHRoZSB0eXBlbGliaW5mbyBmb3IgYSBwcm9ncmFtIGlkICh3aW4zMiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgxIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkKLQlpZiAoYXJncy5sZW5ndGggPT0gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIE1haW4gPHByb2dyYW0gaWQ+Iik7Ci0JCXJldHVybjsKLQl9Ci0KLQlTdHJpbmcgcHJvZ0lEID0gYXJnc1swXTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCi0JT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQlPbGVDb250cm9sU2l0ZSBzaXRlID0gbnVsbDsKLQlPbGVBdXRvbWF0aW9uIGF1dG8gPSBudWxsOwotCXRyeSB7Ci0JCXNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCBwcm9nSUQpOwkKLQkJYXV0byA9IG5ldyBPbGVBdXRvbWF0aW9uKHNpdGUpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIHR5cGUgbGlicmFyeSBmb3IgIitwcm9nSUQpOwotCQlyZXR1cm47Ci0JfQotCQkKLQlwcmludFR5cGVJbmZvKGF1dG8pOwotCQotCWF1dG8uZGlzcG9zZSgpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQotfQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VHlwZUluZm8oT2xlQXV0b21hdGlvbiBhdXRvKSB7Ci0JVFlQRUFUVFIgdHlwZWF0dHIgPSBhdXRvLmdldFR5cGVJbmZvQXR0cmlidXRlcygpOwotCWlmICh0eXBlYXR0ciAhPSBudWxsKSB7CQkKLQkJaWYgKHR5cGVhdHRyLmNGdW5jcyA+IDApIFN5c3RlbS5vdXQucHJpbnRsbigiRnVuY3Rpb25zIDpcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVhdHRyLmNGdW5jczsgaSsrKSB7CQkJCi0JCQlPbGVGdW5jdGlvbkRlc2NyaXB0aW9uIGRhdGEgPSBhdXRvLmdldEZ1bmN0aW9uRGVzY3JpcHRpb24oaSk7Ci0JCQlTdHJpbmcgYXJnTGlzdCA9ICIiOwotCQkJaW50IGZpcnN0T3B0aW9uYWxBcmdJbmRleCA9IGRhdGEuYXJncy5sZW5ndGggLSBkYXRhLm9wdGlvbmFsQXJnQ291bnQ7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRhdGEuYXJncy5sZW5ndGg7IGorKykgewotCQkJCWFyZ0xpc3QgKz0gIlsiOwotCQkJCWlmIChqID49IGZpcnN0T3B0aW9uYWxBcmdJbmRleCkgYXJnTGlzdCArPSAib3B0aW9uYWwsICI7Ci0JCQkJYXJnTGlzdCArPSBnZXREaXJlY3Rpb24oZGF0YS5hcmdzW2pdLmZsYWdzKSsiXSAiK2dldFR5cGVOYW1lKGRhdGEuYXJnc1tqXS50eXBlKSsiICIrZGF0YS5hcmdzW2pdLm5hbWU7Ci0JCQkJaWYgKCBqIDwgZGF0YS5hcmdzLmxlbmd0aCAtIDEpIGFyZ0xpc3QgKz0gIiwgIjsKLQkJCX0JCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRJbnZva2VLaW5kKGRhdGEuaW52b2tlS2luZCkrIiAoaWQgPSAiK2RhdGEuaWQrIikgOiAiCi0JCQkJCSAgICAgICAgKyJcblx0U2lnbmF0dXJlICAgOiAiK2dldFR5cGVOYW1lKGRhdGEucmV0dXJuVHlwZSkrIiAiK2RhdGEubmFtZSsiKCIrYXJnTGlzdCsiKSIKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0RGVzY3JpcHRpb24gOiAiK2RhdGEuZG9jdW1lbnRhdGlvbgotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHRIZWxwIEZpbGUgICA6ICIrZGF0YS5oZWxwRmlsZSsiXG4iKTsKLQkJfQotCQkKLQkJaWYgKHR5cGVhdHRyLmNWYXJzID4gMCkgU3lzdGVtLm91dC5wcmludGxuKCJcblxuVmFyaWFibGVzICA6XG4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlYXR0ci5jVmFyczsgaSsrKSB7Ci0JCQlPbGVQcm9wZXJ0eURlc2NyaXB0aW9uIGRhdGEgPSBhdXRvLmdldFByb3BlcnR5RGVzY3JpcHRpb24oaSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBST1BFUlRZIChpZCA9ICIrZGF0YS5pZCsiKSA6IgotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHROYW1lIDogIitkYXRhLm5hbWUKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0VHlwZSA6ICIrZ2V0VHlwZU5hbWUoZGF0YS50eXBlKSsiXG4iKTsKLQkJfQotCX0KLX0KLXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShpbnQgdHlwZSkgewotCXN3aXRjaCAodHlwZSkgewotCQljYXNlIE9MRS5WVF9CT09MIDogcmV0dXJuICJib29sZWFuIjsKLQkJY2FzZSBPTEUuVlRfUjQgOiByZXR1cm4gImZsb2F0IjsKLQkJY2FzZSBPTEUuVlRfUjggOiByZXR1cm4gImRvdWJsZSI7Ci0JCWNhc2UgT0xFLlZUX0k0IDogcmV0dXJuICJpbnQiOwotCQljYXNlIE9MRS5WVF9ESVNQQVRDSCA6IHJldHVybiAiSURpc3BhdGNoIjsKLQkJY2FzZSBPTEUuVlRfVU5LTk9XTiA6IHJldHVybiAiSVVua25vd24iOwotCQljYXNlIE9MRS5WVF9JMiA6IHJldHVybiAic2hvcnQiOwotCQljYXNlIE9MRS5WVF9CU1RSIDogcmV0dXJuICJTdHJpbmciOwotCQljYXNlIE9MRS5WVF9WQVJJQU5UIDogcmV0dXJuICJWYXJpYW50IjsKLQkJY2FzZSBPTEUuVlRfQ1kgOiByZXR1cm4gIkN1cnJlbmN5IjsKLQkJY2FzZSBPTEUuVlRfREFURSA6IHJldHVybiAiRGF0ZSI7Ci0JCWNhc2UgT0xFLlZUX1VJMSA6IHJldHVybiAidW5zaWduZWQgY2hhciI7Ci0JCWNhc2UgT0xFLlZUX1VJNCA6IHJldHVybiAidW5zaWduZWQgaW50IjsKLQkJY2FzZSBPTEUuVlRfVVNFUkRFRklORUQgOiByZXR1cm4gIlVzZXJEZWZpbmVkIjsKLQkJY2FzZSBPTEUuVlRfSFJFU1VMVCA6IHJldHVybiAiaW50IjsKLQkJY2FzZSBPTEUuVlRfVk9JRCA6IHJldHVybiAidm9pZCI7Ci0JCQotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9CT09MIDogcmV0dXJuICJib29sZWFuICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9SNCA6IHJldHVybiAiZmxvYXQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1I4IDogcmV0dXJuICJkb3VibGUgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0k0IDogcmV0dXJuICJpbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0RJU1BBVENIIDogcmV0dXJuICJJRGlzcGF0Y2ggKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VOS05PV04gOiByZXR1cm4gIklVbmtub3duICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9JMiA6IHJldHVybiAic2hvcnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0JTVFIgOiByZXR1cm4gIlN0cmluZyAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCA6IHJldHVybiAiVmFyaWFudCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQ1kgOiByZXR1cm4gIkN1cnJlbmN5ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9EQVRFIDogcmV0dXJuICJEYXRlICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VSTEgOiByZXR1cm4gInVuc2lnbmVkIGNoYXIgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VJNCA6IHJldHVybiAidW5zaWduZWQgaW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VU0VSREVGSU5FRCA6IHJldHVybiAiVXNlckRlZmluZWQgKiI7Ci0JfQotCXJldHVybiAidW5rbm93biAiKyB0eXBlOwkKLX0KLXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXJlY3Rpb24oaW50IGRpcmVjdGlvbil7Ci0JU3RyaW5nIGRpclN0cmluZyA9ICIiOwotCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZJTikgIT0gMCkgewotCQlkaXJTdHJpbmcgKz0gImluIjsKLQkJY29tbWEgPSB0cnVlOwotCX0KLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZPVVQpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOwotCQlkaXJTdHJpbmcgKz0gIm91dCI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GTENJRCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7Ci0JCWRpclN0cmluZyArPSAibGNpZCI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GUkVUVkFMKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsgCi0JCWRpclN0cmluZyArPSAicmV0dmFsIjsKLQl9Ci0JCi0JcmV0dXJuIGRpclN0cmluZzsKLX0KLXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbnZva2VLaW5kKGludCBpbnZLaW5kKSB7Ci0Jc3dpdGNoIChpbnZLaW5kKSB7Ci0JCWNhc2UgT0xFLklOVk9LRV9GVU5DIDogcmV0dXJuICJNRVRIT0QiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlHRVQgOiByZXR1cm4gIlBST1BFUlRZIEdFVCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWVBVVCA6IHJldHVybiAiUFJPUEVSVFkgUFVUIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZUFVUUkVGIDogcmV0dXJuICJQUk9QRVJUWSBQVVQgQlkgUkVGIjsKLQl9Ci0JcmV0dXJuICJ1bmtub3duICIraW52S2luZDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDcyMzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENUYWJGb2xkZXIgZXhhbXBsZSBzbmlwcGV0OiBwcmV2ZW50IGFuIGl0ZW0gZnJvbSBjbG9zaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgyIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkNMT1NFKTsKLQkJaXRlbS5zZXRUZXh0KCJJdGVtICIraSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQkJdGV4dC5zZXRUZXh0KCJDb250ZW50IGZvciBJdGVtICIraSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQl9Ci0JCi0JZmluYWwgQ1RhYkl0ZW0gc3BlY2lhbEl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCXNwZWNpYWxJdGVtLnNldFRleHQoIkRvbid0IENsb3NlIE1lIik7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCXRleHQuc2V0VGV4dCgiVGhpcyB0YWIgY2FuIG5ldmVyIGJlIGNsb3NlZCIpOwotCXNwZWNpYWxJdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JCQotCWZvbGRlci5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50Lml0ZW0uZXF1YWxzKHNwZWNpYWxJdGVtKSkgewotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWZpbmFsIENUYWJJdGVtIG5vQ2xvc2VJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCW5vQ2xvc2VJdGVtLnNldFRleHQoIk5vIENsb3NlIEJ1dHRvbiIpOwotCVRleHQgdGV4dDIgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JdGV4dDIuc2V0VGV4dCgiVGhpcyB0YWIgZG9lcyBub3QgaGF2ZSBhIGNsb3NlIGJ1dHRvbiIpOwotCW5vQ2xvc2VJdGVtLnNldENvbnRyb2wodGV4dDIpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjhmY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGV0ZXJtaW5lIGRhdGEgdHlwZXMgYXZhaWxhYmxlICh3aW4zMiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MyBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQotcHJpdmF0ZSBzdGF0aWMgU25pcHBldDgzIF9pbnN0YW5jZSA9IG5ldyBTbmlwcGV0ODMoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0ODMuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlTdHJpbmcgb3BzID0gIiI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSBvcHMgKz0gIkNvcHk7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIG9wcyArPSAiTW92ZTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgb3BzICs9ICJMaW5rOyI7Ci0JCQljb250cm9sLnJlbW92ZUFsbCgpOwotCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCWl0ZW0xLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9ucyBhcmUgIitvcHMpOwotCQkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTElOSzsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9NT1ZFOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHJhbnNmZXJEYXRhW10gZGF0YSA9IGV2ZW50LmRhdGFUeXBlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWludCBpZCA9IGRhdGFbaV0udHlwZTsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVGcm9tSWQoaWQpOwotCQkJCVRhYmxlSXRlbSBpdGVtMiA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQkJaXRlbTIuc2V0VGV4dCgiRGF0YSB0eXBlIGlzICIraWQrIiAiK25hbWUpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgU25pcHBldDgzIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotU25pcHBldDgzKCkgewotCWlkcyA9IG5ldyBpbnRbODAwMDBdOwotCW5hbWVzID0gbmV3IFN0cmluZ1s4MDAwMF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJaWRzW2ldID0gaTsKLQkJbmFtZXNbaV0gPSBnZXROYW1lRnJvbUlkKGkpOwotCX0KLX0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotfQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSl7Ci0JcmV0dXJuICJIZWxsbyBXb3JsZCI7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCl7Ci0JcmV0dXJuIG5hbWVzOwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gaWRzOwotfQotc3RhdGljIFN0cmluZyBnZXROYW1lRnJvbUlkKGludCBpZCkgewotCVN0cmluZyBuYW1lID0gbnVsbDsKLQlpbnQgbWF4U2l6ZSA9IDEyODsKLQlUQ0hBUiBidWZmZXIgPSBuZXcgVENIQVIoMCwgbWF4U2l6ZSk7Ci0JaW50IHNpemUgPSBDT00uR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZShpZCwgYnVmZmVyLCBtYXhTaXplKTsKLQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCW5hbWUgPSBidWZmZXIudG9TdHJpbmcoMCwgc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChpZCkgewotCQkJY2FzZSBDT00uQ0ZfSERST1A6Ci0JCQkJbmFtZSA9ICJDRl9IRFJPUCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9URVhUOgotCQkJCW5hbWUgPSAiQ0ZfVEVYVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9CSVRNQVA6Ci0JCQkJbmFtZSA9ICJDRl9CSVRNQVAiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTUVUQUZJTEVQSUNUOgotCQkJCW5hbWUgPSAiQ0ZfTUVUQUZJTEVQSUNUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1NZTEs6Ci0JCQkJbmFtZSA9ICJDRl9TWUxLIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0RJRjoKLQkJCQluYW1lID0gIkNGX0RJRiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9USUZGOgotCQkJCW5hbWUgPSAiQ0ZfVElGRiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9PRU1URVhUOgotCQkJCW5hbWUgPSAiQ0ZfT0VNVEVYVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9ESUI6Ci0JCQkJbmFtZSA9ICJDRl9ESUIiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfUEFMRVRURToKLQkJCQluYW1lID0gIkNGX1BBTEVUVEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfUEVOREFUQToKLQkJCQluYW1lID0gIkNGX1BFTkRBVEEiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfUklGRjoKLQkJCQluYW1lID0gIkNGX1JJRkYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfV0FWRToKLQkJCQluYW1lID0gIkNGX1dBVkUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVU5JQ09ERVRFWFQ6Ci0JCQkJbmFtZSA9ICJDRl9VTklDT0RFVEVYVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9FTkhNRVRBRklMRToKLQkJCQluYW1lID0gIkNGX0VOSE1FVEFGSUxFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0xPQ0FMRToKLQkJCQluYW1lID0gIkNGX0xPQ0FMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9NQVg6Ci0JCQkJbmFtZSA9ICJDRl9NQVgiOwotCQkJCWJyZWFrOwotCQl9Ci0JCQotCX0KLQlyZXR1cm4gbmFtZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmYxMTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgYSBkZWZhdWx0IG9wZXJhdGlvbiAoaW4gdGhpcyBleGFtcGxlLCBDb3B5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODQgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSIpOwotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UobGFiZWwsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSAiVGV4dCBUcmFuc2ZlcnJlZCI7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRvaXQpIHsKLQkJCQlTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKLQkJCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgRE5ELkRST1BfTU9WRToKLQkJCQkJb3BlcmF0aW9uID0gIm1vdmVkIjsgYnJlYWs7Ci0JCQkJY2FzZSBETkQuRFJPUF9DT1BZOgotCQkJCQlvcGVyYXRpb24gPSAiY29waWVkIjsgYnJlYWs7Ci0JCQkJY2FzZSBETkQuRFJPUF9MSU5LOgotCQkJCQlvcGVyYXRpb24gPSAibGlua2VkIjsgYnJlYWs7Ci0JCQkJY2FzZSBETkQuRFJPUF9OT05FOgotCQkJCQlvcGVyYXRpb24gPSAiZGlzYWxsb3dlZCI7IGJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCW9wZXJhdGlvbiA9ICJ1bmtub3duIjsgYnJlYWs7Ci0JCQkJfQotCQkJCWxhYmVsLnNldFRleHQoIkRyYWcgU291cmNlIChkYXRhICIrb3BlcmF0aW9uKyIpIik7Ci0JCQl9IGVsc2UgewotCQkJCWxhYmVsLnNldFRleHQoIkRyYWcgU291cmNlIChkcmFnIGNhbmNlbGxlZCkiKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRleHQuc2V0VGV4dCgiRHJvcCBUYXJnZXQiKTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHQsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKLQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQljYXNlIERORC5EUk9QX01PVkU6Ci0JCQkJb3BlcmF0aW9uID0gIm1vdmVkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX0NPUFk6Ci0JCQkJb3BlcmF0aW9uID0gImNvcGllZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9MSU5LOgotCQkJCW9wZXJhdGlvbiA9ICJsaW5rZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfTk9ORToKLQkJCQlvcGVyYXRpb24gPSAiZGlzYWxsb3dlZCI7IGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlvcGVyYXRpb24gPSAidW5rbm93biI7IGJyZWFrOwotCQkJfQotCQkJdGV4dC5hcHBlbmQoIlxuIitvcGVyYXRpb24rKFN0cmluZylldmVudC5kYXRhKTsKLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjZDA4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQb2NrZXRQQyBleGFtcGxlIHNuaXBwZXQ6IEhlbGxvIFdvcmxkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQotCS8qIAotCSAqIENyZWF0ZSBhIFNoZWxsIHdpdGggdGhlIGRlZmF1bHQgc3R5bGUKLQkgKiBpLmUuIGZ1bGwgc2NyZWVuLCBubyBkZWNvcmF0aW9uIG9uIFBvY2tldFBDLgotCSAqLwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCi0JLyogCi0JICogU2V0IGEgdGV4dCBzbyB0aGF0IHRoZSB0b3AgbGV2ZWwgU2hlbGwKLQkgKiBhbHNvIGFwcGVhcnMgaW4gdGhlIFBvY2tldFBDIHRhc2sgbGlzdAotCSAqLwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQotCS8qCi0JICogU2V0IGEgbWVudWJhciB0byBmb2xsb3cgVUkgZ3VpZGVsaW5lcwotCSAqIG9uIFBvY2tldFBDCi0JICovCi0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5OTI0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQb2NrZXRQQyBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6ICdPaycgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuQ0xPU0UpOwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMDY4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogUG9ja2V0UEMgU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgYXV0b21hdGljYWxseSBhcyBTSVAgaXMgb24gb3Igb2ZmCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlJFU0laRSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiIpOwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0JLyogQWRkIGEgYnV0dG9uIHRvIG1ha2UgdGhlIHJlc2l6ZSBtb3JlIHZpc3VhbCAqLwotCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJNYWluIik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM2MGRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCB0aGUgdGV4dCBvZiBhIHRhYmxlIGl0ZW0gKGluIHBsYWNlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhJREVfU0VMRUNUSU9OKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIiArIGksICJlZGl0IHRoaXMgdmFsdWUifSk7Ci0JfQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCQotCWZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcih0YWJsZSk7Ci0JLy9UaGUgZWRpdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBjZWxsIGFuZCBtdXN0Ci0JLy9ub3QgYmUgYW55IHNtYWxsZXIgdGhhbiA1MCBwaXhlbHMuCi0JZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWVkaXRvci5taW5pbXVtV2lkdGggPSA1MDsKLQkvLyBlZGl0aW5nIHRoZSBzZWNvbmQgY29sdW1uCi0JZmluYWwgaW50IEVESVRBQkxFQ09MVU1OID0gMTsKLQkKLQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIGVkaXRvciBjb250cm9sCi0JCQlDb250cm9sIG9sZEVkaXRvciA9IGVkaXRvci5nZXRFZGl0b3IoKTsKLQkJCWlmIChvbGRFZGl0b3IgIT0gbnVsbCkgb2xkRWRpdG9yLmRpc3Bvc2UoKTsKLQkKLQkJCS8vIElkZW50aWZ5IHRoZSBzZWxlY3RlZCByb3cKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllLml0ZW07Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCi0JCQkvLyBUaGUgY29udHJvbCB0aGF0IHdpbGwgYmUgdGhlIGVkaXRvciBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIFRhYmxlCi0JCQlUZXh0IG5ld0VkaXRvciA9IG5ldyBUZXh0KHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQluZXdFZGl0b3Iuc2V0VGV4dChpdGVtLmdldFRleHQoRURJVEFCTEVDT0xVTU4pKTsKLQkJCW5ld0VkaXRvci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBtZSkgewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCllZGl0b3IuZ2V0RWRpdG9yKCk7Ci0JCQkJCWVkaXRvci5nZXRJdGVtKCkuc2V0VGV4dChFRElUQUJMRUNPTFVNTiwgdGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0pOwotCQkJbmV3RWRpdG9yLnNlbGVjdEFsbCgpOwotCQkJbmV3RWRpdG9yLnNldEZvY3VzKCk7Ci0JCQllZGl0b3Iuc2V0RWRpdG9yKG5ld0VkaXRvciwgaXRlbSwgRURJVEFCTEVDT0xVTU4pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzI1YmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBtZW51IHdpdGggcmFkaW8gaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODkgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUkFESU8pOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKWUud2lkZ2V0OwotCQkJCWlmIChpdGVtLmdldFNlbGVjdGlvbiAoKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKGl0ZW0gKyAiIHNlbGVjdGVkIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtICsgIiB1bnNlbGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0Jc2hlbGwuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTViZTJmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGEgY2hpbGQgY29udHJvbCBhdXRvbWF0aWNhbGx5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWNvbXBvc2l0ZS5zZXRTaXplICg3MDAsIDYwMCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JY29tcG9zaXRlLmFkZFBhaW50TGlzdGVuZXIgKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCQkJZS5nYy5maWxsT3ZhbCAoNSwgNSwgNjkwLCA1OTApOwotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIgPSBzaGVsbC5nZXRIb3Jpem9udGFsQmFyICgpOwotCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWxvY2F0aW9uLnggPSAtaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciB2QmFyID0gc2hlbGwuZ2V0VmVydGljYWxCYXIgKCk7Ci0JdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJbG9jYXRpb24ueSA9IC12QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsICBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgc2l6ZSA9IGNvbXBvc2l0ZS5nZXRTaXplICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJaEJhci5zZXRNYXhpbXVtIChzaXplLngpOwotCQkJdkJhci5zZXRNYXhpbXVtIChzaXplLnkpOwotCQkJaEJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueCwgcmVjdC53aWR0aCkpOwotCQkJdkJhci5zZXRUaHVtYiAoTWF0aC5taW4gKHNpemUueSwgcmVjdC5oZWlnaHQpKTsKLQkJCWludCBoUGFnZSA9IHNpemUueCAtIHJlY3Qud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSBzaXplLnkgLSByZWN0LmhlaWdodDsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlpZiAoaFNlbGVjdGlvbiA+PSBoUGFnZSkgewotCQkJCWlmIChoUGFnZSA8PSAwKSBoU2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi54ID0gLWhTZWxlY3Rpb247Ci0JCQl9Ci0JCQlpZiAodlNlbGVjdGlvbiA+PSB2UGFnZSkgewotCQkJCWlmICh2UGFnZSA8PSAwKSB2U2VsZWN0aW9uID0gMDsKLQkJCQlsb2NhdGlvbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYxM2NkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgbW91c2UgZG93biBpbiBhIHRyZWUgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJdHJlZUl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0gKHBvaW50KTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJNb3VzZSBkb3duOiAiICsgaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY5NTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgbGVhZiBpdGVtcyBpbiBhIHRyZWUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraisiICIrayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JVHJhbnNmZXJbXSB0eXBlcyA9IG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCi0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAodHJlZSwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQlmaW5hbCBUcmVlSXRlbVtdIGRyYWdTb3VyY2VJdGVtID0gbmV3IFRyZWVJdGVtWzFdOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uWzBdLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCQlkcmFnU291cmNlSXRlbVswXSA9IHNlbGVjdGlvblswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9OwotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gZHJhZ1NvdXJjZUl0ZW1bMF0uZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlkcmFnU291cmNlSXRlbVswXS5kaXNwb3NlKCk7Ci0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0gPSBudWxsOwotCQl9Ci0JfSk7Ci0KLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRyZWUsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQlpZiAoZXZlbnQuaXRlbSAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJaWYgKGV2ZW50Lml0ZW0gPT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCVBvaW50IHB0ID0gZGlzcGxheS5tYXAobnVsbCwgdHJlZSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW1zW2ldID09IGl0ZW0pIHsKLQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSwgaW5kZXgrMSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gaXRlbSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGluZGV4KzEpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUgKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWE3MTA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGN1cnNvciBmcm9tIGEgc291cmNlIGFuZCBhIG1hc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCi0JLy9DcmVhdGUgYSBzb3VyY2UgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBzb3VyY2VEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpICsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjA7IGorKykgewotCQkJc291cmNlRGF0YS5zZXRQaXhlbChpLCBqLCAxKTsKLQkJfQotCX0KLQkKLQkvL0NyZWF0ZSBhIG1hc2sgSW1hZ2VEYXRhIG9mIGRlcHRoIDEgKG1vbm9jaHJvbWUpCi0JcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQiBbXSB7d2hpdGUuZ2V0UkdCKCksIGJsYWNrLmdldFJHQigpLH0pOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSArKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCW1hc2tEYXRhLnNldFBpeGVsKGksIGosIDEpOwotCQl9Ci0JfQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIG1hc2tEYXRhLCAxMCwgMTApOwotCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEltYWdlIHNvdXJjZSA9IG5ldyBJbWFnZSAoZGlzcGxheSxzb3VyY2VEYXRhKTsKLQlmaW5hbCBJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JLy9EcmF3IHNvdXJjZSBhbmQgbWFzayBqdXN0IHRvIHNob3cgd2hhdCB0aGV5IGxvb2sgbGlrZQotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLmRyYXdTdHJpbmcoInNvdXJjZTogIiwgMTAsIDEwKTsKLQkJCWdjLmRyYXdJbWFnZShzb3VyY2UsIDAsIDAsIDIwLCAyMCwgNjAsIDEwLCAyMCwgMjApOwotCQkJZ2MuZHJhd1N0cmluZygibWFzazogIiwxMCwgNDApOwotCQkJZ2MuZHJhd0ltYWdlKG1hc2ssIDAsIDAsIDIwLCAyMCwgNjAsIDQwLCAyMCwgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgxNTAsIDE1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXNoZWxsLnNldEN1cnNvcihjdXJzb3IpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQlzb3VyY2UuZGlzcG9zZSgpOwotCW1hc2suZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NzI5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IG1lYXN1cmUgYSBzdHJpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlHQyBnYyA9IG5ldyBHQyAobGFiZWwpOwotCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50ICgiSGVsbG8iKTsKLQlnYy5kaXNwb3NlICgpOwotCWxhYmVsLnNldFRleHQgKCJIZWxsbyAtPiAiICsgc2l6ZSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjI2ZTIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENsaXBib2FyZCBleGFtcGxlIHNuaXBwZXQ6IGNvcHkgYW5kIHBhc3RlIGRhdGEgd2l0aCB0aGUgY2xpcGJvYXJkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ2xpcGJvYXJkIGNiID0gbmV3IENsaXBib2FyZChkaXNwbGF5KTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkKLQlCdXR0b24gY29weSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQljb3B5LnNldFRleHQoIkNvcHkiKTsKLQljb3B5LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHRleHREYXRhID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAodGV4dERhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJVGV4dFRyYW5zZmVyIHRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCWNiLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXXt0ZXh0RGF0YX0sIG5ldyBUcmFuc2Zlcltde3RleHRUcmFuc2Zlcn0pOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIHBhc3RlID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXBhc3RlLnNldFRleHQoIlBhc3RlIik7Ci0JcGFzdGUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljYi5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJdGV4dC5pbnNlcnQoZGF0YSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHBhc3RlLCAwLCBTV1QuTEVGVCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQljb3B5LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29weSwgNSk7Ci0JcGFzdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocGFzdGUsIC01KTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljYi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRjMTAxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNhcHR1cmUgYSB3aWRnZXQgaW1hZ2Ugd2l0aCBhIEdDCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSIgKyBpKTsKLQl9Ci0JCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQ2FwdHVyZSIpOwotCWJ1dHRvbi5wYWNrKCk7Ci0JYnV0dG9uLnNldExvY2F0aW9uKDEwLCAxNDApOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCB0YWJsZVNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQlHQyBnYyA9IG5ldyBHQyh0YWJsZSk7Ci0JCQlmaW5hbCBJbWFnZSBpbWFnZSA9Ci0JCQkJbmV3IEltYWdlKGRpc3BsYXksIHRhYmxlU2l6ZS54LCB0YWJsZVNpemUueSk7Ci0JCQlnYy5jb3B5QXJlYShpbWFnZSwgMCwgMCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQkKLQkJCVNoZWxsIHBvcHVwID0gbmV3IFNoZWxsKHNoZWxsKTsKLQkJCXBvcHVwLnNldFRleHQoIkltYWdlIik7Ci0JCQlwb3B1cC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMocG9wdXAsIFNXVC5OT05FKTsKLQkJCWNhbnZhcy5zZXRCb3VuZHMoMTAsIDEwLCB0YWJsZVNpemUueCsxMCwgdGFibGVTaXplLnkrMTApOwotCQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlwb3B1cC5wYWNrKCk7Ci0JCQlwb3B1cC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTI0ODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogbmF2aWdhdGUgYSB0YWJsZSBjZWxscyB3aXRoIGFycm93IGtleXMuIAotICogRWRpdCB3aGVuIHVzZXIgaGl0cyBSZXR1cm4ga2V5LiAgRXhpdCBlZGl0IG1vZGUgYnkgaGl0dGluZyBFc2NhcGUgKGNhbmNlbHMgZWRpdCkKLSAqIG9yIFJldHVybiAoYXBwbGllcyBlZGl0IHRvIHRhYmxlKS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCS8vIGNyZWF0ZSBhIGEgdGFibGUgd2l0aCAzIGNvbHVtbnMgYW5kIGZpbGwgd2l0aCBkYXRhCi0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJjZWxsICIgKyBpICsgIiAwIiwgCSJjZWxsICIgKyBpICsgIiAxIiwgImNlbGwgIiArIGkgKyAiIDIiIH0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQotCS8vIGNyZWF0ZSBhIFRhYmxlQ3Vyc29yIHRvIG5hdmlnYXRlIGFyb3VuZCB0aGUgdGFibGUKLQlmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkvLyBjcmVhdGUgYW4gZWRpdG9yIHRvIGVkaXQgdGhlIGNlbGwgd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgCi0JLy8gd2hpbGUgb3ZlciBhIGNlbGwgaW4gdGhlIHRhYmxlCi0JZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQljdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93IGluIAotCQkvLyB0aGUgdGFibGUKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGN1cnNvci5nZXRSb3coKX0pOwotCQl9Ci0JCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dCBlZGl0b3Igc28gdGhhdCAKLQkJLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgdGFicyBhd2F5Ci0JCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJCXRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCS8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCS8vIFRoaXMgYWxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIHRoZSB0YWJsZS4KLQljdXJzb3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQ1RSTAotCQkJCXx8IGUua2V5Q29kZSA9PSBTV1QuU0hJRlQKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkJCXx8IChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCWN1cnNvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0pOwotCS8vIFdoZW4gdGhlIHVzZXIgZG91YmxlIGNsaWNrcyBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQgZWRpdG9yIHNvIHRoYXQgCi0JLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JY3Vyc29yLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY3Vyc29yLCBTV1QuTk9ORSk7Ci0JCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCXRleHQuc2V0VGV4dChyb3cuZ2V0VGV4dChjb2x1bW4pKTsKLQkJCXRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciBhbmQgY29weSB0aGUgZGF0YSBvdmVyIAotCQkJCQkvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCQkJCXJvdy5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhd2F5Ci0JCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJCXRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCQotCS8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiIGtleS4KLQkvLyBUaGlzIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIHRhc2suCi0JdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNPTlRST0wgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgIT0gU1dULkNPTlRST0wKLQkJCQkmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlICE9IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCQkJcmV0dXJuOwotCi0JCQlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCVRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/IHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0JCQl0YWJsZS5zaG93SXRlbShyb3cpOwotCQkJY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkJY3Vyc29yLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljdXJzb3Iuc2V0Rm9jdXMoKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAxNzRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogZmlsbCBhIG1lbnUgZHluYW1pY2FsbHkgKHdoZW4gbWVudSBzaG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdHJlZS5zZXRNZW51IChtZW51KTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQltZW51LmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51SXRlbSBbXSBtZW51SXRlbXMgPSBtZW51LmdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPG1lbnVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCW1lbnVJdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCVRyZWVJdGVtIFtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW1zIFtpXS5nZXRUZXh0ICgpKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3OTE4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGFuZCBkaXNwb3NlIGNoaWxkcmVuIG9mIGEgY29tcG9zaXRlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk4IHsKLQotc3RhdGljIGludCBwYWdlTnVtID0gMDsKLXN0YXRpYyBDb21wb3NpdGUgcGFnZUNvbXBvc2l0ZTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIlB1c2giKTsKLQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKChwYWdlQ29tcG9zaXRlICE9IG51bGwpICYmICghcGFnZUNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJcGFnZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYWdlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJaWYgKHBhZ2VOdW0rKyAlIDIgPT0gMCkgewotCQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhZ2VDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJ0YWJsZSBpdGVtICIgKyBpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ldyBCdXR0b24ocGFnZUNvbXBvc2l0ZSwgU1dULlJBRElPKS5zZXRUZXh0KCJyYWRpbyIpOwotCQkJfQotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTNhY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhIHNoZWxsIGZyb20gY2xvc2luZyAocHJvbXB0IHRoZSB1c2VyKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaW50IHN0eWxlID0gU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTzsKLQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94IChzaGVsbCwgc3R5bGUpOwotCQkJbWVzc2FnZUJveC5zZXRUZXh0ICgiSW5mb3JtYXRpb24iKTsKLQkJCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSAoIkNsb3NlIHRoZSBzaGVsbD8iKTsKLQkJCWV2ZW50LmRvaXQgPSBtZXNzYWdlQm94Lm9wZW4gKCkgPT0gU1dULllFUzsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0TGF1bmNoZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXRMYXVuY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU2MjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXRMYXVuY2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaW1wbGUgImhhY2thYmxlIiBjb2RlIHRoYXQgcnVucyBhbGwgb2YgdGhlIFNXVCBTbmlwcGV0cywKLSAqIHR5cGljYWxseSBmb3IgdGVzdGluZy4gT25lIGV4YW1wbGUgb2YgYSB1c2VmdWwgImhhY2siIGlzCi0gKiB0byBhZGQgdGhlIGxpbmU6Ci0gKiAgICBpZiAoc291cmNlLmluZGV4T2YoIlRhYmxlIikgPT0gLTEgJiYgc291cmNlLmluZGV4T2YoIlRyZWUiKSA9PSAtMSkgY29udGludWU7Ci0gKiBhZnRlciB0aGUgbGluZToKLSAqICAgIFN0cmluZyBzb3VyY2UgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotICogaW4gb3JkZXIgdG8gcnVuIGFsbCBvZiB0aGUgVGFibGUgYW5kIFRyZWUgU25pcHBldHMuCi0gKi8KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldExhdW5jaGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlGaWxlIHNvdXJjZURpciA9IG5ldyBGaWxlKCJzcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzIik7Ci0JCWJvb2xlYW4gaGFzU291cmNlID0gc291cmNlRGlyLmV4aXN0cygpOwotCQlpbnQgY291bnQgPSAzMDA7Ci0JCWlmIChoYXNTb3VyY2UpIHsKLQkJCUZpbGUgW10gZmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgY291bnQgPSBmaWxlcy5sZW5ndGg7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpZiAoaSA9PSAxMzYgfHwgaSA9PSAxNTEgfHwgaSA9PSAxODAgfHwgaSA9PSAyMTkpIGNvbnRpbnVlOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJTbmlwcGV0IiArIGk7Ci0JCQlDbGFzcyBjbGF6eiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLiIgKyBjbGFzc05hbWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7fQotCQkJaWYgKGNsYXp6ICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIGNsYXp6LmdldE5hbWUoKSk7Ci0JCQkJaWYgKGhhc1NvdXJjZSkgewotCQkJCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VEaXIsIGNsYXNzTmFtZSArICIuamF2YSIpOwotCQkJCQl0cnkgewotCQkJCQkJRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzb3VyY2VGaWxlKTsKLQkJCQkJCWNoYXIgW10gYnVmZmVyID0gbmV3IGNoYXIgWyhpbnQpc291cmNlRmlsZS5sZW5ndGgoKV07Ci0JCQkJCQlyZWFkZXIucmVhZChidWZmZXIpOwotCQkJCQkJU3RyaW5nIHNvdXJjZSA9IFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7Ci0JCQkJCQlpbnQgc3RhcnQgPSBzb3VyY2UuaW5kZXhPZigicGFja2FnZSIpOwotCQkJCQkJc3RhcnQgPSBzb3VyY2UuaW5kZXhPZigiLyoiLCBzdGFydCk7Ci0JCQkJCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoIiogRm9yIGEgbGlzdCBvZiBhbGwiKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQtMykpOwotCQkJCQkJYm9vbGVhbiBza2lwID0gZmFsc2U7Ci0JCQkJCQlTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQkJCQkJCWlmIChzb3VyY2UuaW5kZXhPZigiUG9ja2V0UEMiKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIlBvY2tldFBDIjsKLQkJCQkJCQlza2lwID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSBpZiAoc291cmNlLmluZGV4T2YoIk9wZW5HTCIpICE9IC0xKSB7Ci0JCQkJCQkJcGxhdGZvcm0gPSAiT3BlbkdMIjsKLQkJCQkJCQlza2lwID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIFtdIHBsYXRmb3JtcyA9IHsid2luMzIiLCAibW90aWYiLCAiZ3RrIiwgInBob3RvbiIsICJjYXJib24ifTsKLQkJCQkJCQlmb3IgKGludCBwID0gMDsgcCA8IHBsYXRmb3Jtcy5sZW5ndGg7IHArKykgewotCQkJCQkJCQlpZiAoIXBsYXRmb3Jtc1twXS5lcXVhbHMocGxhdGZvcm0pICYmIHNvdXJjZS5pbmRleE9mKCIuIiArIHBsYXRmb3Jtc1twXSkgIT0gLTEpIHsKLQkJCQkJCQkJCXBsYXRmb3JtID0gcGxhdGZvcm1zW3BdOwotCQkJCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChza2lwKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIuLi5za2lwcGluZyAiICsgcGxhdGZvcm0gKyAiIGV4YW1wbGUuLi4iKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQkJCVN0cmluZyBbXSBwYXJhbSA9IG5ldyBTdHJpbmcgWzBdOwotCQkJCWlmIChpID09IDgxKSBwYXJhbSA9IG5ldyBTdHJpbmdbXSB7IlNoZWxsLkV4cGxvcmVyIn07Ci0JCQkJdHJ5IHsKLQkJCQkJbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW10ge3BhcmFtLmdldENsYXNzKCl9KTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIERpZCBub3QgZmluZCBtYWluKFN0cmluZyBbXSkiKTsKLQkJCQl9Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltZXRob2QuaW52b2tlKGNsYXp6LCBuZXcgT2JqZWN0IFtdIHtwYXJhbX0pOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRmFpbGVkIHRvIGxhdW5jaCAoaWxsZWdhbCBhY2Nlc3MpIik7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEZhaWxlZCB0byBsYXVuY2ggKGlsbGVnYWwgYXJndW1lbnQgdG8gbWFpbikiKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEV4Y2VwdGlvbiBpbiBTbmlwcGV0OiAiICsgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9jYW5jZWwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvY2FuY2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2NDc2Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9jYW5jZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9lY2xpcHNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5NzUyNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZTVkYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkpVbml0IFRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGF0YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg4Y2ZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk4NzgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxMjoxOSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQnJvd3NlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTAyNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxCcm93c2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIGFsbCBvZiB0aGUgZ3JhcGhpY3MgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEJyb3dzZXJUZXN0cyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5zdWl0ZSgpKTsJCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlLnN1aXRlKCkpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxDYXJib25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZiYmY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQ2FyYm9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbENhcmJvblRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCSJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kcyhvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BQaXhlbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfZ2V0VG9wSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2NsZWFyU2VsZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3Rfc2V0U2VsZWN0aW9uSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIpIiwKLQkiQnJvd3NlcjQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUpIiwKLQkiQnJvd3NlcjUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUpIiwKLQkvLwotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3NlbGVjdEFsbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfaW52b2tlQWN0aW9uSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkidGVzdF9wYXN0ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkKLQkvLyBUaGUgZm9sbG93aW5nIHRlc3RzIChjdXQvY29weS9wYXN0ZSkgZmFpbCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIFRoZXkgZG8gbm90IGZhaWwgbG9jYWxseS4KLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8pIiwKLX07Ci0KLXN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVUZXN0cy5sZW5ndGg7IGkrKykgewotCQlpZiAobmFtZS5lcXVhbHMoZXhjbHVkZVRlc3RzW2ldKSkgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQlpZiAoU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXhjbHVkZWQgVGVzdHM6ICIgKyBleGNsdWRlVGVzdHMubGVuZ3RoKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIGZ1bGxTdWl0ZSA9IChUZXN0U3VpdGUpQWxsVGVzdHMuc3VpdGUoKTsKLQlUZXN0U3VpdGUgZmlsdGVyZWRTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxTdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0JCVRlc3QgY2FuZGlkYXRlVGVzdCA9IGZ1bGxTdWl0ZS50ZXN0QXQoaSk7Ci0JCWlmIChjYW5kaWRhdGVUZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCQlUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKWNhbmRpZGF0ZVRlc3Q7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHN1aXRlLnRlc3RDb3VudCgpOyBqKyspIHsKLQkJCQlUZXN0IHRlc3QgPSBzdWl0ZS50ZXN0QXQoaik7Ci0JCQkJaWYgKCFpc0V4Y2x1ZGVkKHRlc3QudG9TdHJpbmcoKSkpIGZpbHRlcmVkU3VpdGUuYWRkVGVzdCh0ZXN0KTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGZpbHRlcmVkU3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEdyYXBoaWNzVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTgzNzJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3JhcGhpY3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3RpbmcgYWxsIG9mIHRoZSBncmFwaGljcyB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsR3JhcGhpY3NUZXN0cyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3Muc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5zdWl0ZSgpKTsKLQkKLQkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5zdWl0ZSgpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsR3RrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMDNmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEd0a1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxHdGtUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLS8qKgotICogVGVzdHMgbm90IHJ1biBiZWNhdXNlIHRoZXkgY29uc2lzdGVudGx5IGZhaWwKLSAqLwotc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVUZXN0cyA9IHsKLQkidGVzdF9nZXRBY3RpdmVTaGVsbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KSIsCi0JInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSkiLAotCSJ0ZXN0X3NldEFjdGl2ZShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCkiLAotCSJ0ZXN0X2dldEl0ZW1IZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X3NldFRvcEluZGV4SShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KSIsCi0JInRlc3RfZ2V0VGV4dExpbWl0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRUb3BQaXhlbChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2V0VGV4dExpbWl0SShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3Rfc2V0VG9wSW5kZXhJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9nZXRIZWFkZXJIZWlnaHQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSkiLAotCSJ0ZXN0X3NldFNlbGVjdGlvbkkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKSIsCi0JInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9nZXRSb3dDb3VudChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyKSIsCi0JInRlc3RfZ2V0SGVhZGVySGVpZ2h0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKSIsCi19OwotCi1zdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG5hbWUuZXF1YWxzKGV4Y2x1ZGVUZXN0c1tpXSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkV4Y2x1ZGVkIFRlc3RzOiAiICsgZXhjbHVkZVRlc3RzLmxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBmdWxsU3VpdGUgPSAoVGVzdFN1aXRlKUFsbFRlc3RzLnN1aXRlKCk7Ci0JVGVzdFN1aXRlIGZpbHRlcmVkU3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsU3VpdGUudGVzdENvdW50KCk7IGkrKykgewotCQlUZXN0IGNhbmRpZGF0ZVRlc3QgPSBmdWxsU3VpdGUudGVzdEF0KGkpOwotCQlpZiAoY2FuZGlkYXRlVGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSljYW5kaWRhdGVUZXN0OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWl0ZS50ZXN0Q291bnQoKTsgaisrKSB7Ci0JCQkJVGVzdCB0ZXN0ID0gc3VpdGUudGVzdEF0KGopOwotCQkJCWlmICghaXNFeGNsdWRlZCh0ZXN0LnRvU3RyaW5nKCkpKSBmaWx0ZXJlZFN1aXRlLmFkZFRlc3QodGVzdCk7CQkJCQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmaWx0ZXJlZFN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxNb3RpZlRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbE1vdGlmVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhMTk0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbE1vdGlmVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIGFsbCBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbE1vdGlmVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0vKioKLSAqIFRlc3RzIG5vdCBydW4gYmVjYXVzZSB0aGV5IGNvbnNpc3RlbnRseSBmYWlsCi0gKi8KLXN0YXRpYyBTdHJpbmdbXSBleGNsdWRlVGVzdHMgPSB7Ci0JInRlc3Rfc2xlZXAob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCSJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSkiLAotCSJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCkiLAotCSJ0ZXN0X2dldEZvbnREYXRhKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKSIsCi0JInRlc3Rfc2V0TWF4aW1pemVkWihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCkiLAotCSJ0ZXN0X2dldExpbmVJbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQpIiwKLQkidGVzdF9nZXRMaW5lUGl4ZWwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi19OwotCi1zdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG5hbWUuZXF1YWxzKGV4Y2x1ZGVUZXN0c1tpXSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkV4Y2x1ZGVkIFRlc3RzOiAiICsgZXhjbHVkZVRlc3RzLmxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBmdWxsU3VpdGUgPSAoVGVzdFN1aXRlKUFsbFRlc3RzLnN1aXRlKCk7Ci0JVGVzdFN1aXRlIGZpbHRlcmVkU3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsU3VpdGUudGVzdENvdW50KCk7IGkrKykgewotCQlUZXN0IGNhbmRpZGF0ZVRlc3QgPSBmdWxsU3VpdGUudGVzdEF0KGkpOwotCQlpZiAoY2FuZGlkYXRlVGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSljYW5kaWRhdGVUZXN0OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWl0ZS50ZXN0Q291bnQoKTsgaisrKSB7Ci0JCQkJVGVzdCB0ZXN0ID0gc3VpdGUudGVzdEF0KGopOwotCQkJCWlmICghaXNFeGNsdWRlZCh0ZXN0LnRvU3RyaW5nKCkpKSBmaWx0ZXJlZFN1aXRlLmFkZFRlc3QodGVzdCk7CQkJCQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmaWx0ZXJlZFN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjUyOGRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBBbGxUZXN0cygpOwotfQotCi1wdWJsaWMgQWxsVGVzdHMoKSB7Ci0Jc3VwZXIoKTsKLQkvKiBUaGUgbG9naWNhbCBvcmRlciB0byBydW4gdGhlIHRlc3RzIGluIGlzOgotCSAqIC0gU1dULCBTV1RFcnJvciwgU1dURXhjZXB0aW9uCi0JICogLSBEaXNwbGF5Ci0JICogLSBncmFwaGljcyBjbGFzc2VzCi0JICogLSBpdGVtcyBhbmQgQ2FyZXQsIGV0YwotCSAqIC0gd2lkZ2V0cwotCSAqIC0gZGlhbG9ncwotCSAqIC0gbGF5b3V0Ci0JICogLSBjdXN0b20gd2lkZ2V0cwotCSAqIC0gcHJpbnRpbmcgYW5kIHByb2dyYW0KLQkgKiAtIGV2ZW50cwotCSAqIC0gZHJhZyAmIGRyb3AKLQkgKiAtIGFjY2Vzc2liaWxpdHkKLQkgKiAtIE9MRQotCSAqIC0gYnJvd3NlcgotCSAqLwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3Iuc3VpdGUoKSk7Ci0KLQkvKiBOT1RFOiBJZiB0aGUgRGlzcGxheSB0ZXN0IHN1aXRlIGlzIHJ1biwgaXQgbXVzdCBiZSBydW4KLQkgKiBiZWZvcmUgYW55IG90aGVyIHRlc3RzIHRoYXQgbmVlZCBhIGRpc3BsYXkgKGkuZS4gZ3JhcGhpY3MKLQkgKiBvciB3aWRnZXQgdGVzdHMsIGV0YykuIE90aGVyd2lzZSwgYW4gSW52YWxpZFRocmVhZEFjY2VzcwotCSAqIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmb3IgZWFjaCBEaXNwbGF5IHRlc3QuCi0JICovCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnN1aXRlKCkpOwotCS8vYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LnN1aXRlKCkpOwotCS8vYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5zdWl0ZSgpKTsKLQkKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuc3VpdGUoKSk7Ci0JCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLnN1aXRlKCkpOwotCi0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3Qob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXIuVGVzdF9Ccm93c2VyU3VpdGUuc3VpdGUoKSk7Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxXaWRnZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmYwODliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsV2lkZ2V0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIHdpZGdldCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsV2lkZ2V0VGVzdHMgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5zdWl0ZSgpKTsKLQkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5zdWl0ZSgpKTsKLQkvL3N1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLnN1aXRlKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3Iuc3VpdGUoKSk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3Muc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5zdWl0ZSgpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQ29uc2lzdGVuY3lVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMxZjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQ29uc2lzdGVuY3lVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ29uc2lzdGVuY3lVdGlsaXR5IHsKLQotICAgIHN0YXRpYyBIYXNoTWFwIGV2ZW50T3JkZXJpbmcgPSBuZXcgSGFzaE1hcCgpOwotICAgIHN0YXRpYyBIYXNoTWFwIGV2ZW50VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRG91YmxlQ2xpY2siLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiwgIk1vdXNlRG93biIsICJNb3VzZURvdWJsZUNsaWNrIiwgIkRlZmF1bHRTZWxlY3Rpb24iLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkRyYWdEZXRlY3QiLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiRHJhZ0RldGVjdCIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRW50ZXJTZWxlY3Rpb24iLCAJCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJLZXlEb3duIiwgIkRlZmF1bHRTZWxlY3Rpb24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJLZXlTZWxlY3Rpb24iLCAJCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiU2VsZWN0aW9uOiIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIk1lbnVEZXRlY3QiLCAJCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTWVudURldGVjdCIsICJNb3VzZVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkJ1dHRvbk1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb21ib01vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiVmVyaWZ5IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ0NvbWJvTW91c2VTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb2RpZnkiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkV4cGFuZEJhck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiTGlzdE1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTYXNoTW91c2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOkRyYWciLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYkZvbGRlck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTW91c2VTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRvb2xCYXJNb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZU1vdXNlU2VsZWN0aW9uIiwJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlck1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJMaXN0RG91YmxlQ2xpY2siLCAJCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlRG91YmxlQ2xpY2siLCAiRGVmYXVsdFNlbGVjdGlvbiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQnV0dG9uRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJFeHBhbmRCYXJFbnRlclNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0VudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyRW50ZXJTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6UmV0dXJuIiwgIlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVEcmFnRGV0ZWN0IiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJEcmFnRGV0ZWN0IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVEcmFnRGV0ZWN0IiwgCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlTWVudURldGVjdCIsIAkJbmV3IFN0cmluZ1tdIHsiTWVudURldGVjdCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlTWVudURldGVjdCIsCW5ldyBTdHJpbmdbXSB7Ik1lbnVEZXRlY3QiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25TcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJFeHBhbmRCYXJTcGFjZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiTGlzdFNwYWNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRvb2xCYXJTcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246IiwgIlRyYXZlcnNlOk1uZW1vbmljIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlU3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlU3BhY2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiS2V5VXAifSk7IAotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvbWJvS2V5U2VsZWN0aW9uIiwgCQluZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib0tleVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIk1vZGlmeSIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyS2V5U2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJLZXlTZWxlY3Rpb24iLAkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyBEb3duIiwgIktleVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJBcnJvd1NlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246QXJyb3cgRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb29sQmFyQ2hldnJvbkRyYWdEZXRlY3QiLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJEcmFnRGV0ZWN0In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29vbEJhckNoZXZyb25NZW51RGV0ZWN0IixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkFycm93In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29vbEJhckNoZXZyb25Nb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyIsIH0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNjYWxlVHJvdWdoU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJUcm91Z2hTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOlBhZ2UgRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNjYWxlVGh1bWJTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNsaWRlclRodW1iU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpEcmFnIiwgIk1vdXNlVXAiIH0pOwotCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbENsb3NlIiwJCQkJbmV3IFN0cmluZ1tdIHsiQ2xvc2UiLCAiRGlzcG9zZSJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsRGlzcG9zZSIsCQkJbmV3IFN0cmluZ1tdIHsiRGlzcG9zZSJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsSWNvbmlmeSIsCQkJbmV3IFN0cmluZ1tdIHsiRm9jdXNPdXQiLCAiSWNvbmlmeSIsICJEZWFjdGl2YXRlIiwgIkRlaWNvbmlmeSIsICJBY3RpdmF0ZSIsICJGb2N1c0luIiwgIkFjdGl2YXRlIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxPcGVuIiwJCQkJbmV3IFN0cmluZ1tdIHsiQWN0aXZhdGUiLCAiRm9jdXNJbiIsICJTaG93In0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYkZvbGRlclBnZHduU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlRyYXZlcnNlOlBhZ2UgTmV4dCIsICJTZWxlY3Rpb246IiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFiRm9sZGVyUGd1cFNlbGVjdGlvbiIsIG5ldyBTdHJpbmdbXSB7IktleURvd24iLCAiVHJhdmVyc2U6UGFnZSBQcmV2aW91cyIsICJTZWxlY3Rpb246IiwgIktleVVwIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlclBnZHduU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6Tm9uZSIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJQZ3VwU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6Tm9uZSIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTdHlsZWRUZXh0TW9kaWZ5IiwJCW5ldyBTdHJpbmdbXSB7IlZlcmlmeSIsICJNb2RpZnkiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRleHRNb2RpZnkiLAkJCQluZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiS2V5VXAifSk7CQkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVLZXlFeHBhbmQiLCAJCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpBcnJvdyBOZXh0IiwgIktleURvd24iLCAiRXhwYW5kIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZU1vdXNlRXhwYW5kIiwgCQluZXcgU3RyaW5nW10geyJFeHBhbmQiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVLZXlFeHBhbmQiLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJFeHBhbmQiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZU1vdXNlRXhwYW5kIiwgCW5ldyBTdHJpbmdbXSB7IkV4cGFuZCIsICJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZVRhYmxlIiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJNb3VzZURvdWJsZUNsaWNrIiwgIktleURvd24iLCAiS2V5VXAiLCAiTWVudURldGVjdCIsICJEcmFnRGV0ZWN0IiwgIlRyYXZlcnNlIn0pOwotICAgICAgICAKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk5vbmUiLCBuZXcgSW50ZWdlcihTV1QuTm9uZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiS2V5RG93biIsIG5ldyBJbnRlZ2VyKFNXVC5LZXlEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5LZXlVcCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VEb3duIiwgbmV3IEludGVnZXIoU1dULk1vdXNlRG93bikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VVcCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZU1vdmUiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VNb3ZlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZUVudGVyIiwgbmV3IEludGVnZXIoU1dULk1vdXNlRW50ZXIpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRXhpdCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUV4aXQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRG91YmxlQ2xpY2siLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3VibGVDbGljaykpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiUGFpbnQiLCBuZXcgSW50ZWdlcihTV1QuUGFpbnQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdmUiLCBuZXcgSW50ZWdlcihTV1QuTW92ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiUmVzaXplIiwgbmV3IEludGVnZXIoU1dULlJlc2l6ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGlzcG9zZSIsIG5ldyBJbnRlZ2VyKFNXVC5EaXNwb3NlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuU2VsZWN0aW9uKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEZWZhdWx0U2VsZWN0aW9uIiwgbmV3IEludGVnZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkZvY3VzSW4iLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNJbikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRm9jdXNPdXQiLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNPdXQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkV4cGFuZCIsIG5ldyBJbnRlZ2VyKFNXVC5FeHBhbmQpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkNvbGxhcHNlIiwgbmV3IEludGVnZXIoU1dULkNvbGxhcHNlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJJY29uaWZ5IiwgbmV3IEludGVnZXIoU1dULkljb25pZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlaWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWljb25pZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkNsb3NlIiwgbmV3IEludGVnZXIoU1dULkNsb3NlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJTaG93IiwgbmV3IEludGVnZXIoU1dULlNob3cpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhpZGUiLCBuZXcgSW50ZWdlcihTV1QuSGlkZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW9kaWZ5IiwgbmV3IEludGVnZXIoU1dULk1vZGlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiVmVyaWZ5IiwgbmV3IEludGVnZXIoU1dULlZlcmlmeSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiQWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuQWN0aXZhdGUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRlYWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuRGVhY3RpdmF0ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGVscCIsIG5ldyBJbnRlZ2VyKFNXVC5IZWxwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEcmFnRGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULkRyYWdEZXRlY3QpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkFybSIsIG5ldyBJbnRlZ2VyKFNXVC5Bcm0pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlRyYXZlcnNlIiwgbmV3IEludGVnZXIoU1dULlRyYXZlcnNlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZUhvdmVyIiwgbmV3IEludGVnZXIoU1dULk1vdXNlSG92ZXIpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhhcmRLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULkhhcmRLZXlEb3duKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIYXJkS2V5VXAiLCBuZXcgSW50ZWdlcihTV1QuSGFyZEtleVVwKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNZW51RGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULk1lbnVEZXRlY3QpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlNldERhdGEiLCBuZXcgSW50ZWdlcihTV1QuU2V0RGF0YSkpOwotICAgIH0KLSAKLSAgICBzdGF0aWMgU3RyaW5nW10gZXZlbnROYW1lcyA9IHsKLQkJIk5vbmUiLCAJCQkiS2V5RG93biIsIAkJIktleVVwIiwgCQkJIk1vdXNlRG93biIsIAotCQkiTW91c2VVcCIsCQkJIk1vdXNlTW92ZSIsCSJNb3VzZUVudGVyIiwJCSJNb3VzZUV4aXQiLAotCQkiTW91c2VEb3VibGVDbGljayIsCSJQYWludCIsCQkiTW92ZSIsCQkJCSJSZXNpemUiLAotCQkiRGlzcG9zZSIsCQkJIlNlbGVjdGlvbiIsCSJEZWZhdWx0U2VsZWN0aW9uIiwJIkZvY3VzSW4iLAotCQkiRm9jdXNPdXQiLAkJCSJFeHBhbmQiLAkJIkNvbGxhcHNlIiwJCQkiSWNvbmlmeSIsCi0JCSJEZWljb25pZnkiLAkJIkNsb3NlIiwJCSJTaG93IiwJCQkJIkhpZGUiLAotCQkiTW9kaWZ5IiwJCQkiVmVyaWZ5IiwJCSJBY3RpdmF0ZSIsCQkJIkRlYWN0aXZhdGUiLAotCQkiSGVscCIsCQkJCSJEcmFnRGV0ZWN0IiwJIkFybSIsCQkJCSJUcmF2ZXJzZSIsCi0JCSJNb3VzZUhvdmVyIiwJCSJIYXJkS2V5RG93biIsCSJIYXJkS2V5VXAiLAkJIk1lbnVEZXRlY3QiLAotCQkiU2V0RGF0YSJ9OwotICAgIAotICAgIHN0YXRpYyBpbnRbXSBjb252ZXJ0RXZlbnROYW1lcyhTdHJpbmdbXSBvcmlnTmFtZXMpIHsKLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW29yaWdOYW1lcy5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdOYW1lcywgMCwgbmFtZXMsIDAsIG9yaWdOYW1lcy5sZW5ndGgpOwotICAgICAgICBuYW1lcyA9IHJlbW92ZUR1cGxpY2F0ZXMobmFtZXMpOwotICAgICAgICBpbnRbXSB0eXBlcyA9IG5ldyBpbnRbbmFtZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gKChJbnRlZ2VyKWV2ZW50VHlwZXMuZ2V0KG5hbWVzW2ldKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHJlbW92ZUR1cGxpY2F0ZXMoU3RyaW5nW10gbmFtZXMpIHsKLSAgICAgICAgaW50IGR1cHM9MDsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IG5hbWVzW2ldLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgIG5hbWVzW2ldID0gbmFtZXNbaV0uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqPGk7IGorKykgewotICAgICAgICAgICAgICAgIGlmKG5hbWVzW2ldLmVxdWFscyhuYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGludCBrPWkrMTsgazxuYW1lcy5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbay0xXSA9IG5hbWVzW2tdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzW25hbWVzLmxlbmd0aC0xXSA9ICJkdXBsaWNhdGUiKyBkdXBzOwotICAgICAgICAgICAgICAgICAgICBkdXBzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW25hbWVzLmxlbmd0aC1kdXBzXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgdGVtcCwgMCwgbmFtZXMubGVuZ3RoLWR1cHMpOwotICAgICAgICByZXR1cm4gdGVtcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzZWxlY3Rpb25UeXBlcyA9IHsKLSAgICAgICAgIkRyYWciLCAJCSJIb21lIiwgIAkJCSJFbmQiLCAJCQkJIkFycm93IERvd24iLCAKLSAgICAgICAgIkFycm93IFVwIiwgCSJQYWdlIERvd24iLCAJCSJQYWdlIFVwIiwgCQkJIkNoZWNrIiwgCQotICAgICAgICAiQXJyb3ciLCAgICAgCi0gICAgfTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludFtdIFtdIHNlbGVjdGlvbkNvbnZlcnNpb24gPSB7Ci0gICAgICAgIHtTV1QuRFJBRywgMH0sCi0gICAgICAgIHtTV1QuSE9NRSwgMX0sCi0gICAgICAgIHtTV1QuRU5ELCAyfSwKLSAgICAgICAge1NXVC5BUlJPV19ET1dOLCAzfSwKLSAgICAgICAge1NXVC5BUlJPV19VUCwgNH0sCi0gICAgICAgIHtTV1QuUEFHRV9ET1dOLCA1fSwKLSAgICAgICAge1NXVC5QQUdFX1VQLCA2fSwKLSAgICAgICAge1NXVC5DSEVDSywgN30sCi0gICAgICAgIHtTV1QuQVJST1csIDh9LAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZyBnZXRTZWxlY3Rpb25UeXBlKGludCB0eXBlKSB7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHNlbGVjdGlvbkNvbnZlcnNpb24ubGVuZ3RoO2krKykgewotICAgICAgICAgICAgaWYodHlwZSA9PSBzZWxlY3Rpb25Db252ZXJzaW9uW2ldWzBdKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uVHlwZXNbc2VsZWN0aW9uQ29udmVyc2lvbltpXVsxXV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nW10gdHJhdmVyc2FsVHlwZXMgPSB7Ci0gICAgCSAgICAiTm9uZSIsIAkJIkVzY2FwZSIsIAkJCSJSZXR1cm4iLCAJCQkiVGFiIFByZXZpb3VzIiwgCi0gICAgCSAgICAiVGFiIE5leHQiLCAJIkFycm93IFByZXZpb3VzIiwJIkFycm93IE5leHQiLCAJCSJNbmVtb25pYyIsIAotICAgIAkgICAgIlBhZ2UgUHJldmlvdXMiLCAiUGFnZSBOZXh0In07Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldFRyYXZlcnNhbFR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgaW50IHBvdyA9IDA7Ci0gICAgICAgIGlmKHR5cGUgIT0gMCkKLSAgICAgICAgICAgIHBvdyA9KGludCkoTWF0aC5sb2codHlwZSkvTWF0aC5sb2coMikpOwotICAgICAgICByZXR1cm4gdHJhdmVyc2FsVHlwZXNbcG93XTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hFTExfSUNPTklGWSA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBLRVlfUFJFU1MgPSAxMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9LRVlfUFJFU1MgPSAyMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0NMSUNLID0gMzA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1VTRV9ET1VCTEVDTElDSyA9IDQwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRFJBRyA9IDUwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gNjA7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIGludCBFU0NBUEVfTUVOVSA9IDE7Ci0gICAgCi0gICAgCi0gICAgLy9wb3N0cyBhIGNsaWNrIGF0IGRpc3BsYXkgbWFwcGVkIHggYW5kIHkgd2l0aCBidXR0b24gYnV0dG9uCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdENsaWNrKERpc3BsYXkgZGlzcGxheSwgaW50IHgsIGludCB5LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotICAgICAgICBldmVudC54ID0geDsKLSAgICAgICAgZXZlbnQueSA9IHk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VVcDsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBtb3VzZWRvd24gYW5kIG5vIG1vdXNldXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0vLwkgIAl0cnkgewotLy8JICAgICAgICBUaHJlYWQuc2xlZXAoMTYwMCk7CQotLy8JICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0Q2xpY2soRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdCwgaW50IGJ1dHRvbikgewotICAgICAgICByZXR1cm4gcG9zdENsaWNrKGRpc3BsYXksIHB0LngsIHB0LnksIGJ1dHRvbik7Ci0gICAgfQotICAgIAotICAgIC8vZG91YmxlY2xpY2tzIGF0IGRpc3BsYXkgbWFwcGVkIHB0IHdpdGggYnV0dG9uIGJ1dHRvbgotICAgIHN0YXRpYyBib29sZWFuIHBvc3REb3VibGVDbGljayhEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gcG9zdENsaWNrKGRpc3BsYXksIHB0LCBidXR0b24pOwotICAgICAgICByZXQgJj0gcG9zdENsaWNrKGRpc3BsYXksIHB0LCBidXR0b24pOwotLy8JICAJdHJ5IHsKLS8vCSAgICAgICAgVGhyZWFkLnNsZWVwKDE2MDApOwkKLS8vCSAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3QgYSBrZXkgcHJlc3MgCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdEtleVByZXNzKERpc3BsYXkgZGlzcGxheSwgaW50IGNoLCBpbnQga2V5Y29kZSkgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleURvd247Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5RG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLSAgICAgICAgZXZlbnQuY2hhcmFjdGVyID0gKGNoYXIpY2g7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEga2V5ZG93biBhbmQgbm8ga2V5dXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgY2gxL2tleWNvZGUxIGFuZCB0aGVuIHByZXNzaW5nIGNoMi9rZXljb2RlMgotICAgIHN0YXRpYyBib29sZWFuIHBvc3REb3VibGVLZXlQcmVzcyhEaXNwbGF5IGRpc3BsYXksIGludCBjaDEsIGludCBrZXljb2RlMSwgCi0gICAgICAgICAgICAJCQkJCQkgIGludCBjaDIsIGludCBrZXljb2RlMikgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleURvd247Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoMTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGUxOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwb3N0S2V5UHJlc3MoZGlzcGxheSwgY2gyLCBrZXljb2RlMik7Ci0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoMTsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGUxOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEga2V5ZG93biBhbmQgbm8ga2V5dXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvL3Bvc3RzIGEgZHJhZyBmcm9tIGRpc3BsYXkgbWFwcGVkIG9yaWdpbiB0byBkZXN0aW5hdGlvbgotICAgIC8vdGhlIGJ1dHRvbiB0byBkcmFnIHdpdGggaXMgc3lzdGVtIGRlcGVuZGVudAotICAgIHN0YXRpYyBib29sZWFuIHBvc3REcmFnKERpc3BsYXkgZGlzcGxheSwgUG9pbnQgb3JpZ2luLCBQb2ludCBkZXN0aW5hdGlvbikgewotICAgICAgICBpbnQgYnV0dG9uID0gZGV0ZXJtaW5lRHJhZygpOwotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLSAgICAgICAgZXZlbnQueCA9IG9yaWdpbi54OwotICAgICAgICBldmVudC55ID0gb3JpZ2luLnk7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZU1vdmUgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLSAgICAgICAgZXZlbnQueCA9IGRlc3RpbmF0aW9uLng7Ci0gICAgICAgIGV2ZW50LnkgPSBkZXN0aW5hdGlvbi55OwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VNb3ZlIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuTW91c2VVcDsKLSAgICAgICAgZXZlbnQuYnV0dG9uID0gYnV0dG9uOwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZVVwIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIC8vVE9ETzogcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIHRvIGhhdmUgYSBtb3VzZWRvd24gYW5kIG5vIG1vdXNldXAKLSAgICAgICAgICAgIC8vZm9yY2UgdGhlIGlzc3VlPwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vZGV0ZXJtaW5lcyB3aGljaCBidXR0b24gdG8gZHJhZyB3aXRoCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRldGVybWluZURyYWcoKSB7Ci0gICAgICAgIGlmKFN3dEp1bml0LmlzV2luZG93cyB8fCBTd3RKdW5pdC5pc0NhcmJvbiB8fCBTd3RKdW5pdC5pc0dUSykKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgCi0gICAgLy9wb3N0cyBhIHNlbGVjdGlvbiBpZSBjbGlja3Mgb24gcHQxLCB0aGVuIGNsaWNrIG9uIHB0MiAoZm9yIGV4YW1wbGUsIHNlbGVjdGluZwotICAgIC8vb25lIG9mIHRoZSBvcHRpb25zIGluIGEgY29tYm8gYnkgZHJvcHBpbmcgZG93biB0aGUgbGlzdCkKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0U2VsZWN0aW9uKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQxLCBQb2ludCBwdDIpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQxLCAxKTsKLSAgICAgICAgZGlzcGxheS5zeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkudXBkYXRlKCk7Ci0gICAgICAgIH19KTsKLSAgICAgICAgcmV0ICY9IHBvc3RDbGljayhkaXNwbGF5LCBwdDIsIDEpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8vaWNvbmlmaWVzIHRoZSBzaGVsbC4gcHQgaXMgYSBzeXN0ZW0gZGVwZW5kZW50IHBvaW50IG9uIHRoZSBzaGVsbC4KLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0U2hlbGxJY29uaWZ5KERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQsIGludCBidXR0b24pIHsKLSAgICAgICAgaW50IHggPSBwdC54OwotICAgICAgICBpbnQgeSA9IHB0LnkgLSAxMDsKLSAgICAgICAgaWYoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0gICAgICAgICAgICB4ICs9IC0zNTsKLSAgICAgICAgfSBlbHNlIGlmKFN3dEp1bml0LmlzTGludXgpIHsKLSAgICAgICAgCXggKz0gLTE2OwotICAgICAgICB9IGVsc2UgaWYgKFN3dEp1bml0LmlzQ2FyYm9uKSB7Ci0gICAgICAgIAl4ICs9IDMwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3N0Q2xpY2soZGlzcGxheSwgeCwgeSwgYnV0dG9uKTsgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9FbXVsYXRlZFdpZGdldHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JmMzI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvRW11bGF0ZWRXaWRnZXRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIHdpZGdldHMgdGhhdCBoYXZlIGJlZW4gZW11bGF0ZWQgb24gTW90aWYuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXVsYXRlZFdpZGdldHNUZXN0cyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwkKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5zdWl0ZSgpKTsJCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLnN1aXRlKCkpOwotCQkKLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9TdHlsZWRUZXh0Q29udGVudFNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0MjFlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N0eWxlZFRleHRDb250ZW50U3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLS8qKgotICogVXNlIHRoaXMgdGVzdCBjbGFzcyB0byB2YWxpZGF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3R5bGVkVGV4dENvbnRlbnQKLSAqIGludGVyZmFjZS4gIFRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24sIGNvcHkgdGhpcyBjbGFzcyB0byB0aGUgcGFja2FnZSB3aGVyZSAKLSAqIHlvdXIgU3R5bGVkVGV4dENvbnRlbnQgaW1wbGVtZW50YXRpb24gbGl2ZXMuICBUaGVuIHNwZWNpZnkgdGhlIGZ1bGx5IHF1YWxpZmllZAotICogbmFtZSBvZiB5b3VyIFN0eWxlZFRleHRDb250ZW50IGNsYXNzIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBtYWluIG1ldGhvZCBvZiB0aGlzIAotICogY2xhc3MuIAotICogCi0gKiBOT1RFOiAgVGhpcyB0ZXN0IGNsYXNzIGFzc3VtZXMgdGhhdCB5b3VyIFN0eWxlZFRleHRDb250ZW50IGltcGxlbWVudGF0aW9uIAotICogaGFuZGxlcyB0aGUgZm9sbG93aW5nIGRlbGltaXRlcnM6Ci0gKiAKLSAqIAkJL3IKLSAqIAkJL24KLSAqIAkJL3IvbgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1wdWJsaWMgY2xhc3MgU3R5bGVkVGV4dENvbnRlbnRTcGVjIGltcGxlbWVudHMgVGV4dENoYW5nZUxpc3RlbmVyIHsKLQlzdGF0aWMgU3RyaW5nIGNvbnRlbnRDbGFzc05hbWU7Ci0Jc3RhdGljIGludCBmYWlsQ291bnQgPSAwOwotCXN0YXRpYyBpbnQgZXJyb3JDb3VudCA9IDA7Ci0JQ2xhc3MgY29udGVudENsYXNzID0gbnVsbDsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50SW5zdGFuY2UgPSBudWxsOwotCWludCB2ZXJpZnkgPSAwOwotCU1ldGhvZCBjdXJyZW50TWV0aG9kID0gbnVsbDsKLQlib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCVN0eWxlZFRleHQgd2lkZ2V0ID0gbnVsbDsKLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0JCi1wdWJsaWMgU3R5bGVkVGV4dENvbnRlbnRTcGVjKCkgewotfQotcHVibGljIHZvaWQgYXNzZXJ0VHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBjb25kaXRpb24pIHsKLQlTeXN0ZW0ub3V0LnByaW50KCJcdCIgKyBjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIgIiArIG1lc3NhZ2UpOwotCWlmICghY29uZGl0aW9uKSAKLQkJZmFpbChtZXNzYWdlKTsKLQllbHNlIAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBwYXNzZWQiKTsKLX0KLXB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlmYWlsZWQgPSB0cnVlOwotCVN5c3RlbS5vdXQucHJpbnRsbigiIEZBSUxFRDogIiArIG1lc3NhZ2UpOwotCWZhaWxDb3VudCsrOwotfQotcHVibGljIFN0eWxlZFRleHRDb250ZW50IGdldENvbnRlbnRJbnN0YW5jZSgpIHsKLQljb250ZW50SW5zdGFuY2Uuc2V0VGV4dCgiIik7Ci0Jd2lkZ2V0LnNldENvbnRlbnQoY29udGVudEluc3RhbmNlKTsKLQlyZXR1cm4gY29udGVudEluc3RhbmNlOwotfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdFRleHQoKSB7Ci0JcmV0dXJuIAotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBzZWNvbmQgbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpZnRoIGxpbmUuXHJcbiIgKwotCQkiXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBzZWNvbmQgbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSB0aGlyZCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpZnRoIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHNlY29uZCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgdGhpcmQgbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZvdXJ0aCBsaW5lIG9uY2UgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgZmlmdGggbGluZSBvbmNlIGFnYWluLiI7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnRTcGVjIHNwZWMgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnRTcGVjKCk7Ci0JaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotCQljb250ZW50Q2xhc3NOYW1lID0gYXJnc1swXTsKLQl9IGVsc2UgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIkNvbnRlbnQgY2xhc3MgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gZXhlY3V0aW9uIGFyZ3VtZW50LiIpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0Jc3BlYy5ydW4oKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZmFpbENvdW50ICsgIiBURVNUIEZBSUxVUkVTLiIpOwotCVN5c3RlbS5vdXQucHJpbnRsbihlcnJvckNvdW50ICsgIiBVTkVYUEVDVEVEIEVSUk9SUy4iKTsKLX0KLXB1YmxpYyB2b2lkIHJ1bigpIHsKLQlpZiAoY29udGVudENsYXNzTmFtZS5lcXVhbHMoIiIpKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzcyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBleGVjdXRpb24gYXJndW1lbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY29udGVudENsYXNzID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRDbGFzcyA9IENsYXNzLmZvck5hbWUoY29udGVudENsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiQ29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lICsgIlxubm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJveC5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JdHJ5IHsKLQkJY29udGVudEluc3RhbmNlID0gKFN0eWxlZFRleHRDb250ZW50KWNvbnRlbnRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIlVuYWJsZSB0byBhY2Nlc3MgY29udGVudCBjbGFzczpcbiIgKyBjb250ZW50Q2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQlib3guc2V0TWVzc2FnZSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvbnRlbnQgY2xhc3M6XG4iICsgY29udGVudENsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQlDbGFzcyBjbGF6ejsKLQljbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLQlNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JZm9yIChpbnQgaT0wOyBpPG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJc2V0VXAoKTsKLQkJY3VycmVudE1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWZhaWxlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3RfIikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiLi4uIik7Ci0JCQkJY3VycmVudE1ldGhvZC5pbnZva2UodGhpcywgbmV3IE9iamVjdFswXSk7Ci0JCQkJaWYgKCFmYWlsZWQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQQVNTRUQuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCQl9Ci0JCQl9IAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBFUlJPUiA9PT4gIiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCWVycm9yQ291bnQrKzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBFUlJPUiA9PT4gIiArIGV4LnRvU3RyaW5nKCkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGQUlMRUQiKTsKLQkJCWVycm9yQ291bnQrKzsKLQkJfQotCQlpZiAodmVyaWZ5ICE9IDApIHsKLQkJCXZlcmlmeSA9IDA7Ci0JCQljb250ZW50SW5zdGFuY2UucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRlYXJEb3duKCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci19Ci1wdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQlzd2l0Y2ggKHZlcmlmeSkgewotCQljYXNlIDEgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDIgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAyKTsKLQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDMgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDQ6IHsKLQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNSA6IHsKLQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgNiA6IHsKLQkJCWFzc2VydFRydWUoIjo2YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgOCA6IHsKLQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgOSA6IHsKLQkJCWFzc2VydFRydWUoIjo5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTA6ewotCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTE6IHsKLQkJCWFzc2VydFRydWUoIjoxMToiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDEyOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTM6IHsKLQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNDogewotCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTU6IHsKLQkJCWFzc2VydFRydWUoIjoxNWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNjp7Ci0JCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxNzogewotCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTg6IHsKLQkJCWFzc2VydFRydWUoIjoxOGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxOGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxOTogewotCQkJYXNzZXJ0VHJ1ZSgiOjE5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjE5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMyk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDIwOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X0luc2VydCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAidGVzdFxuICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgbmV3VGV4dC5lcXVhbHMoInRlc3RcbiBUaGlzXG5pcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygidGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIFRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiKioqICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbioqKiBpcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiKioqIGlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlxyTGluZSAxXHJcbkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoOSwgMCwgIlxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozZjoiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuXHJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNnOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjozajoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNrOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiXG5UaGlzXG5pcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDAsICJcclxubmV3TGluZSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIikpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJuZXdMaW5lIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NWY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlRoaXNcbmlzXHJcbm5ld0xpbmUgYSB0ZXN0XHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pc1xyXG5uZXdMaW5lIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibmV3TGluZSBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQotCS8vIGluc2VydCBhdCBlbmQKLQljb250ZW50LnNldFRleHQoIlRoaXMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNCwgMCwgIlxuICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbiAiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiAiKSk7Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3ZToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdmOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjdnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6N2k6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JLy8gaW5zZXJ0IGF0IGJlZ2lubmluZwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIG5ld1RleHQuZXF1YWxzKCJcblRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjhjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6OGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyIpKTsKLQotCS8vIGluc2VydCB0ZXh0Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiKioqICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbioqKiBpcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6OWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6OWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiKioqIGlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6OWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICJsaW5lIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMGE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjoxMGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MTBkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg4KSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTBmOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDkpID09IDEpOwotCi0JLy8gaW5zZXJ0IGF0IGJlZ2lubmluZyAKLQljb250ZW50LnNldFRleHQoIlRoaXNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAibGluZVxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMWE6IiwgbmV3VGV4dC5lcXVhbHMoImxpbmVcblRoaXNcbiIpKTsKLQlhc3NlcnRUcnVlKCI6MTFiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJsaW5lIikpOwotCWFzc2VydFRydWUoIjoxMWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MTFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyXHJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyYToiLCBuZXdUZXh0LmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyXHJcbkxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6MTJiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMCwgIkxpbmUxYVxuTGluZTFiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYToiLCBuZXdUZXh0LmVxdWFscygiTGluZSAxXG5MaW5lMWFcbkxpbmUxYlxuTGluZSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwotCWFzc2VydFRydWUoIjoxM2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxM2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZTFhIikpOwotCWFzc2VydFRydWUoIjoxM2U6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZTFiIikpOwotCWFzc2VydFRydWUoIjoxM2Y6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjoxM2c6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDExLCAwLCAibDFhIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxNGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMVxuTGluZWwxYSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxNGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxNGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZWwxYSAyIikpOwotCWFzc2VydFRydWUoIjoxNGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMiBpcyBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BhbnMgbWFueSB3b3Jkc1xuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE5LCAwLCAidmVyeSwgdmVyeSwgIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxNWE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMVxuTGluZSAyIGlzIGEgdmVyeSwgdmVyeSwgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxNWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxNWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAyIGlzIGEgdmVyeSwgdmVyeSwgdmVyeSBsb25nIGxpbmUgdGhhdCBzcGFucyBtYW55IHdvcmRzIikpOwotCWFzc2VydFRydWUoIjoxNWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAzIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0VtcHR5KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJ0ZXN0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfTGluZV9Db252ZXJzaW9uKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxycmVwZWF0XG5lbmRcciIpOwotCWFzc2VydFRydWUoIjoxYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7CQotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDApOwotCWFzc2VydFRydWUoIjoxZjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSA1KTsJCi0JYXNzZXJ0VHJ1ZSgiOjFnOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoInJlcGVhdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMTUpOwkKLQlhc3NlcnRUcnVlKCI6MWk6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiZW5kIikpOwotCWFzc2VydFRydWUoIjoxajoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSAyMik7Ci0JYXNzZXJ0VHJ1ZSgiOjFrOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MWw6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMjYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMCk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0XHIiKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxNSkgPT0gMSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXG5cclxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsJCi0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7CQotCWFzc2VydFRydWUoIjo1ZjoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVnOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDMpOwkKLQlhc3NlcnRUcnVlKCI6NWg6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1aToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NWo6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1azoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSg0KSA9PSA2KTsKLQkKLQljb250ZW50LnNldFRleHQoInRlc3RcclxydGVzdDJcclxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoInRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwkKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygidGVzdDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZnOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDYpOwkKLQlhc3NlcnRUcnVlKCI6Nmg6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo2aToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZqOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6Nms6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMTMpOwotfQotcHVibGljIHZvaWQgdGVzdF9PZmZzZXRfVG9fTGluZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RccnJlcGVhdFxuZW5kXHIiKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDApOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMjUpID09IDMpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyNikgPT0gNCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdCIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEwKSA9PSAxKTsKLQkKLQljb250ZW50LnNldFRleHQoIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxuXHJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDMpID09IDIpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDYpID09IDQpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgzKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXHJcclxuXHJcbiIpOwotCWFzc2VydFRydWUoIjo2YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDIpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAzKTsKLQkKLQljb250ZW50LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjo3YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQkKLQljb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9MaW5lX1RvX09mZnNldCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RccnJlcGVhdFxuZW5kXHIiKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDUpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAxNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDMpID09IDIyKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gMjYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDYpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbiIpOwotCWFzc2VydFRydWUoIjozYToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cblxyXHJcbiIpOwotCWFzc2VydFRydWUoIjo0YToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDMpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gNik7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG50ZXN0XHJcbiIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjVjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0RlbGV0ZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaWEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpYSB0ZXN0IikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcblxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImxpbmUgMyIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgNSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoImlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSAzIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJsaW5lIDQiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDE2LCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0XG5saW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygibGluZSAzIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg5LCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0aToiLCBuZXdUZXh0LmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0ajoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIG5ld1RleHQuZXF1YWxzKCJpIikpOwotCWFzc2VydFRydWUoIjo0bDoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0bToiLCBuZXdUZXh0LmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0bjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5cciIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDQsIDgsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJMMVxyXG5MNFxyXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkw0IikpOwotCWFzc2VydFRydWUoIjo2ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgbmV3VGV4dC5lcXVhbHMoIkwxXHJcbkwyIikpOwotCWFzc2VydFRydWUoIjo3YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkwxIikpOwotCWFzc2VydFRydWUoIjo3ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMMiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuTDFcclxuTDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMMSIpKTsKLQlhc3NlcnRUcnVlKCI6OGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTDIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxuTGluZSAxXG5MaW5lIDJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCA3LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo5YToiLCBuZXdUZXh0LmVxdWFscygiXG5MaW5lIDJcbiIpKTsKLQlhc3NlcnRUcnVlKCI6OWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6OWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo5ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjllOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg2LCA4LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTBiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIDEiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgb25lIGlzIHNob3J0XHJcbkxpbmUgMiBpcyBhIGxvbmdlciBsaW5lXHJcbkxpbmUgM1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEyLCAxNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTFhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIG9uZSBpcyBhIGxvbmdlciBsaW5lXHJcbkxpbmUgM1xuIikpOwotCWFzc2VydFRydWUoIjoxMWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgb25lIGlzIGEgbG9uZ2VyIGxpbmUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfUmVwbGFjZSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA0LCAiYSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoxYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAyLCAid2FzIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xud2FzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjoyYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIndhcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAyLCAid2FzIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiVGhpcyB3YXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyB3YXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjozZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxNSkgPT0gMCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDcsICJMYVxuTGJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoIkxhXG5MYlxuTGluZSAyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxhIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMYiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjo0ZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDMiKSk7Ci0KLQljb250ZW50LnNldFRleHQoZ2V0VGVzdFRleHQoKSk7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWludCBzdGFydCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDYpOwotCWludCBlbmQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSgxMSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDYpLmVxdWFscygiIikpOwotCXN0YXJ0ID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoNyk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKHN0YXJ0LCBjb250ZW50LmdldENoYXJDb3VudCgpIC0gc3RhcnQsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gOCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg1KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDYpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNykuZXF1YWxzKCIiKSk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfU3BlY2lhbF9DYXNlcygpIHsKLQlTdHJpbmcgbmV3VGV4dDsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjBhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxYzoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg0LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWU6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZjoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNiwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFnOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWg6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyYToiLCBuZXdUZXh0LmVxdWFscygiXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJmOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6Mmc6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozZToiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozaToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgY29udGVudC5nZXRMaW5lKDQpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBuZXdUZXh0LmVxdWFscygiXG5cblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjo0ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiYSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5hVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6NWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoImFUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJhYmNcclxuZGVmIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIG5ld1RleHQuZXF1YWxzKCJhY1xyXG5kZWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFjIikpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJkZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIG5ld1RleHQuZXF1YWxzKCJhXHJcbmRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6NmY6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6Nmc6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYSIpKTsKLQlhc3NlcnRUcnVlKCI6Nmg6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiZGVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2aToiLCBuZXdUZXh0LmVxdWFscygiYWRlZiIpKTsKLQlhc3NlcnRUcnVlKCI6Nmo6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6Nms6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWRlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6Nmw6IiwgbmV3VGV4dC5lcXVhbHMoImFlZiIpKTsKLQlhc3NlcnRUcnVlKCI6Nm06IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6Nm46IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiYWVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2bzoiLCBuZXdUZXh0LmVxdWFscygiYWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZwOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZxOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFmIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJhYmMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIjEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIG5ld1RleHQuZXF1YWxzKCIxYmMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIjFiYyIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3ZDoiLCBuZXdUZXh0LmVxdWFscygiXG4xYmMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdlOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjdmOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6N2c6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiMWJjIikpOwotCQotCWNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJhIik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJwYWNrYWdlIHRlc3Q7XG4vKiBMaW5lIDFcbiAqIExpbmUgMlxuICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxNCwgMjMsICJcdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi8iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIG5ld1RleHQuZXF1YWxzKCJwYWNrYWdlIHRlc3Q7XG5cdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59IikpOwotCWFzc2VydFRydWUoIjo4YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDYpOwotCWFzc2VydFRydWUoIjo4YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJwYWNrYWdlIHRlc3Q7IikpOwotCWFzc2VydFRydWUoIjo4ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJcdC8qTGluZSAxIikpOwotCWFzc2VydFRydWUoIjo4ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJcdCAqIExpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6OGY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiXHQgKi8iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhnOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoInB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7IikpOwotCWFzc2VydFRydWUoIjo4aDoiLCBjb250ZW50LmdldExpbmUoNSkuZXF1YWxzKCJ9IikpOwotfQotcHVibGljIHZvaWQgdGVzdF9UZXh0X0NoYW5nZWRfRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCXZlcmlmeSA9IDE7Ci0JY29udGVudC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMjsKLQljb250ZW50LnNldFRleHQoIlxuXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMiwgImEiKTsKLQotCXZlcmlmeSA9IDM7Ci0JY29udGVudC5zZXRUZXh0KCJhIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSA0OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjQ6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gNTsKLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSA2OwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gNzsKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDg7Ci0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSA5OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAxMDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTA6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTE7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTE6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTI7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMTM7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMTQ7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAidGVzdCIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE0OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE1OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMTY7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxNjoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxNzsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjE3OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDE4OwotIAljb250ZW50LnNldFRleHQoIkwxXHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDE5OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCXZlcmlmeSA9IDIwOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjIwOiIsIHRydWUpO30KLQotCi0JdmVyaWZ5ID0gMDsKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfRGVsaW1pdGVyX1NwZWNpYWxfQ2FzZXMoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCVN0cmluZyBuZXdUZXh0OwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBuZXdUZXh0LmVxdWFscygiXG5MMVxyXG5MMiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgbmV3VGV4dC5lcXVhbHMoIkwxdGVzdFxuXG4iKSk7Ci0KLS8vCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0vLwljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7Ci0vLwluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0vLwlhc3NlcnRUcnVlKCI6MzoiLCBuZXdUZXh0LmVxdWFscygiTDFccnRlc3RcclxuIikpOwotCi0vLwljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotLy8JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpOwotLy8JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotLy8JYXNzZXJ0VHJ1ZSgiOjQ6IiwgbmV3VGV4dC5lcXVhbHMoIkx0ZXN0XG5cblxuTDJcclxuTDNcclxuTDRcclxuIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMMVxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozOiIsIG5ld1RleHQuZXF1YWxzKCJMMXRlc3RcclxyXHJcbiIpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgIHsKLQkvLyBjcmVhdGUgc2hlbGwKLQlzaGVsbCA9IG5ldyBTaGVsbCAoKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXNoZWxsLnNldFNpemUoNTAwLCAzMDApOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCS8vIGNyZWF0ZSB3aWRnZXQKLQl3aWRnZXQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQlzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0Jc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0Jd2lkZ2V0LnNldExheW91dERhdGEoc3BlYyk7Ci0Jc2hlbGwub3BlbiAoKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgIHsKLQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCAoKSkgCi0JCXNoZWxsLmRpc3Bvc2UgKCk7Ci0Jc2hlbGwgPSBudWxsOwotCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dEp1bml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDQ4NTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RKdW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLQotLyoqCi0gKiBQbGF0Zm9ybS1zcGVjaWZpYyBjb25zdGFudHMgdXNlZCBpbiBTV1QgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIFN3dEp1bml0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RGb250TmFtZTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkuc3RhcnRzV2l0aCgid2luMzIiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNDYXJib24gPSBTV1QuZ2V0UGxhdGZvcm0oKS5zdGFydHNXaXRoKCJjYXJib24iKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNNb3RpZiA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygibW90aWYiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNHVEsgPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImd0ayIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1Bob3RvbiA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygicGhvdG9uIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzTGludXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkxpbnV4Iik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQUlYID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJBSVgiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNTb2xhcmlzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJTb2xhcmlzIikgfHwgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJTdW5PUyIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0hQVVggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkhQLVVYIik7Ci0JCi0Jc3RhdGljIHsKLQkJaWYgKGlzTW90aWYpIHsKLQkJCXRlc3RGb250TmFtZSA9ICJtaXNjLWZpeGVkIjsKLQkJfQotCQllbHNlIHsKLQkJCXRlc3RGb250TmFtZSA9ICJIZWx2ZXRpY2EiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjgzMzgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci0KLXB1YmxpYyBjbGFzcyBTd3RUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIHRvIG1hcmsgdGVzdCBjYXNlcyB0aGF0Ci0JICogYXJlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSBieSBTV1QgYXQgdGhpcyB0aW1lLCBvciB0ZXN0Ci0JICogY2FzZXMgdGhhdCBtYXliZSB0aGVtc2VsdmVzIGR1YmlvdXMgKGVnLiB3aGVuIHRoZSBjb3JyZWN0Ci0JICogYmVoYXZpb3VyIG1heSBub3QgYmUgY2xlYXIpLiBNb3N0IG9mIHRoZXNlIGZsYWdnZWQgdGVzdAotCSAqIGNhc2VzIGludm9sdmUgaGFuZGxpbmcgZXJyb3IgY29uZGl0aW9ucy4KLQkgKgotCSAqIFNldHRpbmcgdGhlc2UgZmxhZ3MgdG8gdHJ1ZSB3aWxsIHJ1biB0aG9zZSB0ZXN0cy4gQXMgYXBpCi0JICogaXMgaW1wbGVtZW50ZWQgdGhpcyBnaXZlcyB1cyBhIGNvbnZlbmllbnQgd2F5IHRvIGluY2x1ZGUKLQkgKiBpdCBpbiB0aGUganVuaXQgdGVzdHMuCi0JICovCi0KLQkvLyBydW4gdGVzdCBjYXNlcyB0aGF0IG1heSB0aGVtc2VsdmVzIGJlIGR1YmlvdXMKLQkvLyB0aGVzZSBzaG91bGQgYmUgZXZlbnR1YWxseSBjaGVja2VkIHRvIHNlZSBpZiAKLQkvLyB0aGVyZSBpcyBhIHZhbGlkIGZhaWx1cmUgb3IgdGhlIHRlc3QgaXMgYm9ndXMKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZkNoZWNrQm9ndXNUZXN0Q2FzZXMgPSBmYWxzZTsKLQotCS8vIGNoZWNrIHZpc2liaWxpdHkgYXBpIChlZyBpbiBtZW51KQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmQ2hlY2tWaXNpYmlsaXR5ID0gZmFsc2U7Ci0KLQkvLyBydW4gdGVzdCBjYXNlcyB0aGF0IGNoZWNrIFNXVCBwb2xpY3kgbm90IGNvdmVyZWQgYnkgdGhlIGZsYWdzIGFib3ZlCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZDaGVja1NXVFBvbGljeSA9IGZhbHNlOwotCi0JLy8gbWFrZSBkaWFsb2cgb3BlbiBjYWxscywgb3BlcmF0b3IgbXVzdCB0aGVuIGNsb3NlIHRoZW0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZlRlc3REaWFsb2dPcGVuID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZUZXN0Q29uc2lzdGVuY3kgPSBmYWxzZTsKLQotCS8vIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB1bmltcGxlbWVudGVkIG1ldGhvZHMKLQlwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQkKLQkvLyB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgdW5pbXBsZW1lbnRlZCBBUEkgbWV0aG9kcwotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRBUEk7Ci0JCi0JLy8gdXNlZCB0byBzcGVjaWZ5IHZlcmJvc2UgbW9kZSwgaWYgdHJ1ZSB1bmltcGxlbWVudGVkIHdhcm5pbmcgbWVzc2FnZXMgd2lsbCAKLQkvLyBiZSB3cml0dGVuIHRvIFN5c3RlbS5vdXQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCQotCS8vIGFsbG93IHNwZWNpZmljIGltYWdlIGZvcm1hdHMgdG8gYmUgdGVzdGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbWFnZUZvcm1hdHMgPSBuZXcgU3RyaW5nW10geyJibXAiLCAianBnIiwgImdpZiIsICJwbmcifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdIHsiZm9sZGVyIiwgImZvbGRlck9wZW4iLCAidGFyZ2V0In07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbnZhbGlkSW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJjb3JydXB0IiwgImNvcnJ1cHRCYWRCaXREZXB0aC5wbmcifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zcGFyZW50SW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJ0cmFuc3BhcmVudC5wbmcifTsKLQkKLQkvLyBzcGVjaWZ5IHJlcGFyZW50YWJsZSBwbGF0Zm9ybXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHJlcGFyZW50YWJsZVBsYXRmb3JtcyA9IG5ldyBTdHJpbmdbXSB7IndpbjMyIiwgImd0ayIsICJjYXJib24ifTsKLQkKLXB1YmxpYyBTd3RUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkgcmV0dXJuOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlzYW1lID0gdHJ1ZTsKLQkJYm9vbGVhbltdIG1hdGNoZWQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5sZW5ndGg7IGorKykgewotCQkJCWlmICghbWF0Y2hlZFtqXSkgewotCQkJCQlpZiAoKGFjdHVhbFtpXSA9PSBudWxsICYmIGV4cGVjdGVkIFtqXSA9PSBudWxsKSB8fAotCQkJCQkgICAgKGFjdHVhbFtpXSAhPSBudWxsICYmIGFjdHVhbFtpXS5lcXVhbHMoZXhwZWN0ZWRbal0pKSkgewotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJbWF0Y2hlZFtqXSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghbWF0Y2gpIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFzYW1lKSB7Ci0JCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotCWFzc2VydFNhbWUobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShTdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSByZXR1cm47Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCXNhbWUgPSB0cnVlOwotCQlib29sZWFuW10gbWF0Y2hlZCA9IG5ldyBib29sZWFuW2V4cGVjdGVkLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFtYXRjaGVkW2pdICYmIGFjdHVhbFtpXSA9PSBleHBlY3RlZFtqXSkgewotCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCW1hdGNoZWRbal0gPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICghc2FtZSkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlhc3NlcnRTYW1lKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQlyZXR1cm47Ci0JYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZXF1YWwgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWV4cGVjdGVkW2ldLmVxdWFscyhhY3R1YWxbaV0pKSB7Ci0JCQkJZXF1YWwgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIWVxdWFsKSB7Ci0JCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGVkQ29kZSwgVGhyb3dhYmxlIGFjdHVhbFRocm93YWJsZSkgewotCWlmIChhY3R1YWxUaHJvd2FibGUgaW5zdGFuY2VvZiBTV1RFcnJvcikgewotCQlTV1RFcnJvciBlcnJvciA9IChTV1RFcnJvcikgYWN0dWFsVGhyb3dhYmxlOwotCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRDb2RlLCBlcnJvci5jb2RlKTsKLQl9IGVsc2UgaWYgKGFjdHVhbFRocm93YWJsZSBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgewotCQlTV1RFeGNlcHRpb24gZXhjZXB0aW9uID0gKFNXVEV4Y2VwdGlvbikgYWN0dWFsVGhyb3dhYmxlOwotCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRDb2RlLCBleGNlcHRpb24uY29kZSk7Ci0JfSBlbHNlIHsKLQkJdHJ5IHsKLQkJCVNXVC5lcnJvcihleHBlY3RlZENvZGUpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXhwZWN0ZWRUaHJvd2FibGUpIHsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRocm93YWJsZS5nZXRNZXNzYWdlKCksIGFjdHVhbFRocm93YWJsZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQlyZXR1cm47Ci0JYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZXF1YWwgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXhwZWN0ZWRbaV0gIT0gYWN0dWFsW2ldKSB7Ci0JCQkJZXF1YWwgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIWVxdWFsKSB7Ci0JCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotCi1zdGF0aWMgcHJpdmF0ZSB2b2lkIGZhaWxOb3RFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCWZvcm1hdHRlZCArPSAiZXhwZWN0ZWQ6PCI7Ci0JaWYoZXhwZWN0ZWQgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihleHBlY3RlZC5sZW5ndGgsIDUpOyBpKyspCi0JICAgICAgICBmb3JtYXR0ZWQgKz0gZXhwZWN0ZWRbaV0gKyIsICI7Ci0JICAgIGlmKGV4cGVjdGVkLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGV4cGVjdGVkLmxlbmd0aCA+IDUpCi0JICAgIGZvcm1hdHRlZCArPSAiLi4uIjsKLQlmb3JtYXR0ZWQgKz0gIj4gYnV0IHdhczo8IjsKLQlpZihhY3R1YWwgIT0gbnVsbCkgewotCSAgICBmb3IoaW50IGk9MDsgaTxNYXRoLm1pbihhY3R1YWwubGVuZ3RoLCA1KTsgaSsrKQotCSAgICAgICAgZm9ybWF0dGVkICs9IGFjdHVhbFtpXSArIiwgIjsKLQkgICAgaWYoYWN0dWFsLmxlbmd0aCAhPSAwKQotCSAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cmluZygwLCBmb3JtYXR0ZWQubGVuZ3RoKCktMik7Ci0JfQotCWlmKGFjdHVhbC5sZW5ndGggPiA1KQotCSAgICBmb3JtYXR0ZWQgKz0gIi4uLiI7Ci0JZmFpbChmb3JtYXR0ZWQrIj4iKTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKMk1FKCkgewotCXRyeSB7Ci0JCUNvbXBhdGliaWxpdHkubmV3RmlsZUlucHV0U3RyZWFtKCIiKTsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGlzUmVwYXJlbnRhYmxlUGxhdGZvcm0oKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJlcGFyZW50YWJsZVBsYXRmb3Jtcy5sZW5ndGg7IGkrKykgewotCQlpZiAocmVwYXJlbnRhYmxlUGxhdGZvcm1zW2ldLmVxdWFscyhwbGF0Zm9ybSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHdhcm5VbmltcGwoU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQl1bmltcGxlbWVudGVkTWV0aG9kcysrOwotfQotcHJvdGVjdGVkIHZvaWQgd2FyblVuaW1wbEFQSShTdHJpbmcgbWVzc2FnZSkgewotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVBJIG5vdCBpbXBsZW1lbnRlZCAiICsgdGhpcy5nZXRDbGFzcygpICsgIiAiICsgZ2V0TmFtZSgpKTsKLQl9Ci0JdW5pbXBsZW1lbnRlZEFQSSsrOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTU1YjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBEbyBub3RoaW5nLiBDbGFzcyBTV1QgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCS8vIFRlc3QgdGhhdCB3ZSB0aHJvdyB0aGUgZXhwZWN0ZWQga2luZHMgb2YgZXJyb3JzIGZvciB0aGUgZ2l2ZW4gZXJyb3IgdHlwZXMuCi0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgcGFzc2VkKTsKLQlwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0ZBSUxFRF9FWEVDKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfRkFJTEVEX0VYRUMiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTk9fSEFORExFUyk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfTk9fSEFORExFUyIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSB0cnVlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlKCkgewotCS8vIFRlc3QgdGhhdCB0aGUgY2F1c2luZyB0aHJvd2FibGUgaXMgZmlsbGVkIGluLgotCVRocm93YWJsZSBjYXVzZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKdXN0IGZvciB0ZXN0aW5nIik7Ci0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgY2F1c2UpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQsIGNhdXNlKTsKLQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQlwYXNzZWQgPSBleC50aHJvd2FibGUgPT0gY2F1c2U7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX05PVF9JTVBMRU1FTlRFRCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKC0xLCBjYXVzZSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBlcnJvcigtMSkiLCBwYXNzZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlTV1QuZ2V0TWVzc2FnZShudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiB3aXRoIG51bGwgYXJndW1lbnQiLCBwYXNzZWQpOwotCXRyeSB7Ci0JCVNXVC5nZXRNZXNzYWdlKCJTV1RfWWVzIik7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJZmFpbCAoImV4Y2VwdGlvbiAiICsgdCArICIgZ2VuZXJhdGVkIGZvciBTV1RfWWVzIik7Ci0JfQotCWFzc2VydFRydWUgKAotCQkiaW52YWxpZCBrZXkgZGlkIG5vdCByZXR1cm4gYXMgaXRzZWxmIiwKLQkJIl9OT1RfRk9VTkRfSU5fUFJPUEVSVElFU18iLmVxdWFscyhTV1QuZ2V0TWVzc2FnZSgiX05PVF9GT1VORF9JTl9QUk9QRVJUSUVTXyIpKSk7Ci0JCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBsYXRmb3JtKCkgewotCS8vIENhbid0IHRlc3QgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zLCBzaW5jZSB0aGlzIG1heSBjaGFuZ2UsCi0JLy8gc28ganVzdCB0ZXN0IHRvIHNlZSBpdCByZXR1cm5zIHNvbWV0aGluZy4KLQlhc3NlcnRUcnVlICgicmV0dXJuZWQgbnVsbCBwbGF0Zm9ybSBuYW1lIiwgU1dULmdldFBsYXRmb3JtKCkgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQkvLyBUZXN0IHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIGlzIHJldHVybmVkIGlzIHJlYXNvbmFibGUuCi0JaW50IHZlciA9IFNXVC5nZXRWZXJzaW9uKCk7Ci0JYXNzZXJ0VHJ1ZSAoInVucmVhc29uYWJsZSB2YWx1ZSByZXR1cm5lZCIsIHZlciA+IDAgJiYgdmVyIDwgMTAwMDAwMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQbGF0Zm9ybSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmVyc2lvbiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlIikpIHRlc3RfZXJyb3JJTGphdmFfbGFuZ19UaHJvd2FibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGxhdGZvcm0iKSkgdGVzdF9nZXRQbGF0Zm9ybSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmVyc2lvbiIpKSB0ZXN0X2dldFZlcnNpb24oKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZGE3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXJyb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pLmNvZGUgPT0gU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgCi0JCQk9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8sICJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikuZ2V0TWVzc2FnZSgpIAotCQkJLmluZGV4T2YoIkFuIGludGVyZXN0aW5nIG1lc3NhZ2UiKSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludFN0YWNrVHJhY2UoKSB7Ci0JCi0JLy8gV0FSTklORzogdGhpcyB0ZXN0IGlzIG5vdCBDTERDIHNhZmUsIGJlY2F1c2UgaXQgcmVxdWlyZXMgamF2YS5pby5QcmludFN0cmVhbQotCQotCXRyeSB7Ci0JCUNsYXNzLmZvck5hbWUoImphdmEuaW8uUHJpbnRTdHJlYW0iKTsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gaWdub3JlIHRlc3QgaWYgcnVubmluZyBvbiBDTERDCi0JCXJldHVybjsKLQl9Ci0JCi0JLy8gdGVzdCBkZWZhdWx0IFNXVEVycm9yCi0JCi0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQlTV1RFcnJvciBlcnJvciA9IG5ldyBTV1RFcnJvcigpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci0JCi0JLy8gdGVzdCBTV1RFcnJvciB3aXRoIGNvZGUKLQkKLQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JZXJyb3IgPSBuZXcgU1dURXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludFN0YWNrVHJhY2UiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVzc2FnZSIpKSB0ZXN0X2dldE1lc3NhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpKSB0ZXN0X3ByaW50U3RhY2tUcmFjZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2IxNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKS5jb2RlID09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSAKLQkJCT09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlICgKLQkJImRpZCBub3QgZmlsbCBpbiBjb2RlIHByb3Blcmx5IiwKLQkJbmV3IFNXVEV4Y2VwdGlvbigiQW4gdW5pbnRlcmVzdGluZyBtZXNzYWdlIikuY29kZSA9PSBTV1QuRVJST1JfVU5TUEVDSUZJRUQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGluY2x1ZGUgY3JlYXRpb24gc3RyaW5nIGluIHJlc3VsdCIsCi0JCW5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmdldE1lc3NhZ2UoKSAKLQkJCS5pbmRleE9mKCJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewotCQotCS8vIFdBUk5JTkc6IHRoaXMgdGVzdCBpcyBub3QgQ0xEQyBzYWZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQkKLQl0cnkgewotCQlDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLlByaW50U3RyZWFtIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSB0ZXN0IGlmIHJ1bm5pbmcgb24gQ0xEQwotCQlyZXR1cm47Ci0JfQotCQotCS8vIHRlc3QgZGVmYXVsdCBTV1RFeGNlcHRpb24KLQkKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCVNXVEV4Y2VwdGlvbiBlcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotCQotCS8vIHRlc3QgU1dURXhjZXB0aW9uIHdpdGggY29kZQotCQotCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQllcnJvciA9IG5ldyBTV1RFeGNlcHRpb24oU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCWVycm9yLnByaW50U3RhY2tUcmFjZSgpOwotCWFzc2VydFRydWUob3V0LnNpemUoKSA+IDApOwotCWFzc2VydFRydWUobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkuaW5kZXhPZigidGVzdF9wcmludFN0YWNrVHJhY2UiKSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRTdGFja1RyYWNlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludFN0YWNrVHJhY2UiKSkgdGVzdF9wcmludFN0YWNrVHJhY2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZDhmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YzM5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYWNjZXNzaWJsZSA9IHNoZWxsLmdldEFjY2Vzc2libGUoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0RGVmYXVsdEFjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRGb2N1cyhBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldFNlbGVjdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldERlc2NyaXB0aW9uKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWFjY2Vzc2libGUucmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKSB7Ci0JQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb25SYW5nZShBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDYXJldE9mZnNldChBY2Nlc3NpYmxlVGV4dEV2ZW50IGUpIHsKLQkJfQotCX07Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBhY2Nlc3NpYmxlLmdldENvbnRyb2woKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCS8vIFRlc3RlZCBpbiB0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb2N1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2FyZXRNb3ZlZEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RleHRDYXJldE1vdmVkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2VkSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0Q2hhbmdlZElJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENhcmV0TW92ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdlZElJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSIpKSB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF9zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1c0kiKSkgdGVzdF9zZXRGb2N1c0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDYXJldE1vdmVkSSIpKSB0ZXN0X3RleHRDYXJldE1vdmVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5nZWRJSUkiKSkgdGVzdF90ZXh0Q2hhbmdlZElJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQiKSkgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIEFjY2Vzc2libGUgYWNjZXNzaWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODk4ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJkY2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdkMzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVDb250cm9sRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI4OTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY0YzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotCQotCS8vIFRlc3Qgd2l0aCBzb21lIG90aGVyIG9iamVjdCBhbHNvLgotCWV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZUV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzcyMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjNjMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVmMDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBPYmplY3Qgd2lsbCB0eXBpY2FsbHkgYmUgYSB3aWRnZXQuCi0JQWNjZXNzaWJsZVRleHRFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KG5ldyBJbnRlZ2VyKDUpKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlBY2Nlc3NpYmxlVGV4dEV2ZW50IGV2ZW50ID0gbmV3IEFjY2Vzc2libGVUZXh0RXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhNDI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmMmRmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25ld19TaGVsbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfYXd0X0NhbnZhcyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25ld19GcmFtZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMiKSkgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFiM2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmRpc3Bvc2UoKTsKLQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJyb3dzZXIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlDbG9zZVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JT3BlbldpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5yZW1vdmVPcGVuV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RhdHVzVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRUaXRsZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlUaXRsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9iYWNrKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYmFjayIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiByZXR1cm5pbmcgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5iYWNrKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQl0cnkgewotCQlicm93c2VyLmV4ZWN1dGUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNjcmlwdCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvKiBSZWFsIHRlc3RpbmcgaXMgZG9uZSBpbiB0aGUgdGVzdHMgdGhhdCBydW4gdGhlIGV2ZW50IGxvb3AKLQkgKiBzaW5jZSBhIGRvY3VtZW50IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCB0byBleGVjdXRlIGEgc2NyaXB0IG9uIGl0LgotCSAqLwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcndhcmQoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9mb3J3YXJkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIuZm9yd2FyZCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotCS8qIGdvaW5nIGZvcndhcmQgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5mb3J3YXJkKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRVcmwoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9nZXRVcmwiKTsKLQlTdHJpbmcgc3RyaW5nID0gYnJvd3Nlci5nZXRVcmwoKTsKLQlhc3NlcnRUcnVlKHN0cmluZyAhPSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0JhY2tFbmFibGVkKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCQotCS8qIGJhY2sgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzQmFja0VuYWJsZWQgcHJldmlvdXNseSByZXR1cm5lZCAqLwotCWFzc2VydEVxdWFscyhicm93c2VyLmlzQmFja0VuYWJsZWQoKSwgYnJvd3Nlci5iYWNrKCkpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmJhY2soKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiBnb2luZyBiYWNrIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKTsKLQkKLQkvKiBmb3J3YXJkIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgdGhhdCBpc0ZvcndhcmRFbmFibGVkIHByZXZpb3VzbHkgcmV0dXJuZWQgKi8KLQlhc3NlcnRFcXVhbHMoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCksIGJyb3dzZXIuZm9yd2FyZCgpKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogZ29pbmcgZm9yd2FyZCAxMCB0aW1lcyBpbiBoaXN0b3J5IC0gZXhwZWN0aW5nIGZhbHNlIGlzIHJldHVybmVkICovCi0JYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmlzRm9yd2FyZEVuYWJsZWQoKTsKLQlhc3NlcnRGYWxzZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZnJlc2goKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9yZWZyZXNoIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZUNsb3NlV2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRDbG9zZVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlTG9jYXRpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZExvY2F0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkT3BlbldpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlUHJvZ3Jlc3NMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFByb2dyZXNzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkU3RhdHVzVGV4dExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVGl0bGVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFRpdGxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCWJyb3dzZXIucmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXNoZWxsLnNldFRleHQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JCi0JU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgZXhhbXBsZSAyPC9USVRMRT48L0hFQUQ+PEJPRFk+PEgxPkhUTUwgZXhhbXBsZSAyPC9IMT4iOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0JCWh0bWwgKz0iPFA+VGhhdCBpcyBhIHRlc3QgbGluZSB3aXRoIHRoZSBudW1iZXIgIitpKyI8L1A+IjsKLQl9Ci0JaHRtbCArPSAiPC9CT0RZPjwvSFRNTD4iOwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLQlydW5Mb29wVGltZXIoMTApOwotCQotCXRyeSB7Ci0JCWJyb3dzZXIuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5zZXRVcmwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVybCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkKLQkvKiBUSElTIFRFU1QgUkVRVUlSRVMgV0VCIEFDQ0VTUyEgSG93IGVsc2UgY2FuIHdlIHJlYWxseSB0ZXN0IHRoZSBodHRwOi8vIHBhcnQgb2YgYSBicm93c2VyIHdpZGdldD8gKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QiKTsKLQlydW5Mb29wVGltZXIoMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9zdG9wIik7Ci0JLyogVEhJUyBURVNUIFJFUVVJUkVTIFdFQiBBQ0NFU1MhIEhvdyBlbHNlIGNhbiB3ZSByZWFsbHkgdGVzdCB0aGUgaHR0cDovLyBwYXJ0IG9mIGEgYnJvd3NlciB3aWRnZXQ/ICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0Iik7Ci0JcnVuTG9vcFRpbWVyKDEpOwotCWJyb3dzZXIuc3RvcCgpOwotCXJ1bkxvb3BUaW1lcigxMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Ccm93c2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcndhcmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVybCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNCYWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVmcmVzaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdG9wIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKSkgdGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIiKSkgdGVzdF9hZGRUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSkgdGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9iYWNrIikpIHRlc3RfYmFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3J3YXJkIikpIHRlc3RfZm9yd2FyZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VXJsIikpIHRlc3RfZ2V0VXJsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0JhY2tFbmFibGVkIikpIHRlc3RfaXNCYWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb3J3YXJkRW5hYmxlZCIpKSB0ZXN0X2lzRm9yd2FyZEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZnJlc2giKSkgdGVzdF9yZWZyZXNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RvcCIpKSB0ZXN0X3N0b3AoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ccm93c2VyIGJyb3dzZXI7Ci0KLXZvaWQgcnVuTG9vcFRpbWVyKGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JZmluYWwgYm9vbGVhbltdIGV4aXQgPSB7ZmFsc2V9OwotCW5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7VGhyZWFkLnNsZWVwKHNlY29uZHMgKiAxMDAwKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCWV4aXRbMF0gPSB0cnVlOwotCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0uc3RhcnQoKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0Jd2hpbGUgKCFleGl0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDkzYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkNsb3NlV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2Nsb3NlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzkxOWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IExvY2F0aW9uQWRhcHRlcigpIHt9OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCUxvY2F0aW9uQWRhcHRlciBhZGFwdGVyID0gbmV3IExvY2F0aW9uQWRhcHRlcigpIHsJCi0JfTsKLQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIoYWRhcHRlcik7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCIpKSB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVjZTExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0JCQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzc3MWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5PcGVuV2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhY2U5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0FkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQluZXcgUHJvZ3Jlc3NBZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0FkYXB0ZXIoKSB7fSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViMmIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNiM2Y3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWJlMjI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlRpdGxlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlRpdGxlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQl9Ci0JfSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NkMjcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQluZXcgVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIoKSB7fTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dBZGFwdGVyKCl7fSk7Ci0Jc2hlbGwuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NDA3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjdjNWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQW5pbWF0ZWRQcm9ncmVzcwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5BbmltYXRlZFByb2dyZXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xlYXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NsZWFyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RhcnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RvcCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc3RvcCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0YXJ0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdG9wIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NsZWFyIikpIHRlc3RfY2xlYXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0YXJ0IikpIHRlc3Rfc3RhcnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0b3AiKSkgdGVzdF9zdG9wKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmZmMDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCXN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkN2Y3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQmlkaVV0aWw7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHRleHQ7Ci0JYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsJCi0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCQkJCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHJpdmF0ZSBib29sZWFuIGlzQmlkaSgpIHsKLQlyZXR1cm4gQmlkaVV0aWwuaXNCaWRpUGxhdGZvcm0oKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci1wcml2YXRlIHZvaWQgdGVzdExpc3RlbmVyKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBpbnRbXSBzZWdtZW50cywgYm9vbGVhbiBleGNlcHRpb25FeHBlY3RlZCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JQmlkaVNlZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBCaWRpU2VnbWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U2VnbWVudHMoQmlkaVNlZ21lbnRFdmVudCBldmVudCkgewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgMCwgZXZlbnQubGluZU9mZnNldCk7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCBsaW5lLCBldmVudC5saW5lVGV4dCk7Ci0JCQkKLQkJCWV2ZW50LnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7CQotCQl9Ci0JfTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlmaW5hbGx5IHsKLQkJdGV4dC5yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JaWYgKGV4Y2VwdGlvbkV4cGVjdGVkKSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgZXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCBleGNlcHRpb25UaHJvd24gPT0gZmFsc2UpOwotCX0KLQlpZiAoaXNCaWRpKCkpIHsKLQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIiBsaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwkKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgbGlzdGVuZXIgY2FsbGVkIHdoZW4gaXQgc2hvdWxkbid0IGJlIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCX0KLX0KLXByaXZhdGUgdm9pZCB0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcoZmluYWwgaW50W10gc2VnbWVudHMsIGludFtdIGJvbGRSYW5nZXMpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydEVxdWFscygiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgMCwgZXZlbnQubGluZU9mZnNldCk7Ci0JCQlhc3NlcnRFcXVhbHMoIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIGxpbmUsIGV2ZW50LmxpbmVUZXh0KTsKLQkJCQotCQkJZXZlbnQuc2VnbWVudHMgPSBzZWdtZW50czsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsJCi0JCX0KLQl9OwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCQotCXRyeSB7Ci0JCXRleHQuYWRkQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShudWxsKTsKLQkJZm9yIChpbnQgaT0wOyBpPGJvbGRSYW5nZXMubGVuZ3RoOyBpKz0yKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZShib2xkUmFuZ2VzW2ldLCBib2xkUmFuZ2VzW2krMV0sIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQkJCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZVJhbmdlKTsKLQkJfQotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlmaW5hbGx5IHsKLQkJdGV4dC5yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIGV4Y2VwdGlvblRocm93biA9PSBmYWxzZSk7Ci0JaWYgKGlzQmlkaSgpKSB7Ci0JCWFzc2VydFRydWUoIiBsaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwkKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUoIiBsaXN0ZW5lciBjYWxsZWQgd2hlbiBpdCBzaG91bGRuJ3QgYmUiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQoKSB7Ci0JaW50IGxpbmVMZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQkvLyBzaG91bGQgbm90IGNhdXNlIGFuIGV4Y2VwdGlvbgotCXRlc3RMaXN0ZW5lcigiOmE6IiwgbnVsbCwgZmFsc2UpOwotCXRlc3RMaXN0ZW5lcigiOmI6IiwgbmV3IGludFtdIHswLCBsaW5lTGVuZ3RoIC8gMiwgbGluZUxlbmd0aH0sIGZhbHNlKTsKLQl0ZXN0TGlzdGVuZXIoIjpjOiIsIG5ldyBpbnRbXSB7MCwgbGluZUxlbmd0aCAvIDJ9LCBmYWxzZSk7Ci0JCQkKLQkvLyBzaG91bGQgYWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBvbiBhIGJpZGkgcGxhdGZvcm0KLQlpZiAoaXNCaWRpKCkpIHsKLQkJdGVzdExpc3RlbmVyKCI6ZDoiLCBuZXcgaW50W10ge2xpbmVMZW5ndGggLyAyfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmU6IiwgbmV3IGludFtdIHswLCAxLCAxLCBsaW5lTGVuZ3RoIC8gMn0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpmOiIsIG5ldyBpbnRbXSB7MCwgMSwgMiwgbGluZUxlbmd0aCArIDF9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ZzoiLCBuZXcgaW50W10gezAsIDEsIGxpbmVMZW5ndGggKyAxLCBsaW5lTGVuZ3RoICsgMX0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjpoOiIsIG5ldyBpbnRbXSB7MCwgMiwgMX0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjppOiIsIG5ldyBpbnRbXSB7MCwgLTEsIDJ9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ajoiLCBuZXcgaW50W10gezAsIC0xLCAyfSwgdHJ1ZSk7Ci0JfQotCi0JLy8gdGVzdCBib2xkIHNlZ21lbnRpbmcKLQlsaW5lID0gInRoaXMgaXMgYSBsaW5lIHdpdGggNTAgY2hhcnMgLSAqKioqICoqKiogKioqKiAqKioqIjsKLQl0ZXh0LnNldFRleHQobGluZSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsNSw1LDIsMTIsMywyMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNSwyMCwyNX0sIG5ldyBpbnRbXSB7MCw1LDUsMiwxMiwzLDIwLDV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1LDUsMSw3LDMsMTAsMywxNSw1LDIwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1LDIwLDI1fSwgbmV3IGludFtdIHswLDYsNyw2LDE1LDEwfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsNSw1LDUsMTAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTV9LCBuZXcgaW50W10gezAsMTV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MCw1fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezIsM30KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezIsM30pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDJ9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHswLDJ9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MTAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTV9LCBuZXcgaW50W10gezEwLDV9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MTIsM30KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTV9LCBuZXcgaW50W10gezEyLDN9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MywyLDUsNSwxMCwzLDIxLDQsMjUsM30KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTUsMjAsMjUsMzB9LCBuZXcgaW50W10gezMsMTAsMjEsN30pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsxMCwyfQotCWxpbmUgPSAidGVzdDF0ZXN0Mi9yL24iOwotCXRleHQuc2V0VGV4dChsaW5lKTsKLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezEwLDJ9KTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50IikpIHRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM1YTMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQnVzeUluZGljYXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkZTExNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm8KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY2NvbWJvKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQljY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY2NvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY2NvbWJvLmNvcHkoKTsKLQljY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLDApKTsKLQljY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMjMxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCWNjb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2NvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyU2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhclNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZXNlbGVjdEFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWRpdGFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVkaXRhYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSGVpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3R5bGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dEhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dExpbWl0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRm9jdXNDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKSB7Ci0JY2NvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNjb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNjb21iby5jdXQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTQ1NiIpKTsKLQljY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVkcmF3IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZHJhd0lJSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3RJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0YWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RW5hYmxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGltaXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFZpc2libGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVkaXRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRMaW1pdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0ZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIEN1c3RvbSAqLwotQ0NvbWJvIGNjb21ibzsKLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBjY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY2NvbWJvLmFkZCgiaXMiKTsKLSAgICBjY29tYm8uYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgLy9vbiB0ZXh0Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg0ODMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxhYmVsID0gbmV3IENMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbGlnbm1lbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWxpZ25tZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9vbFRpcFRleHQiKSkgdGVzdF9nZXRUb29sVGlwVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIikpIHRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUNMYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcyMTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFiSGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BSaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wUmlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFiSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGFiSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFJpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFiSGVpZ2h0IikpIHRlc3RfZ2V0VGFiSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BSaWdodCIpKSB0ZXN0X2dldFRvcFJpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrSVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiSGVpZ2h0SSIpKSB0ZXN0X3NldFRhYkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBDVGFiRm9sZGVyIGN0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQljdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjdGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKGN0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJDVGFiSXRlbSAmIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJDVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQoY3RhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgQ1RhYkl0ZW0gIiArIGkgKyAiXG5cblxuIik7Ci0JCWl0ZW0uc2V0Q29udHJvbChpdGVtVGV4dCk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbVRleHQsIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCWN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGN0YWJGb2xkZXIuZ2V0SXRlbSgwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGN0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGN0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX1VQLCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUywgZXZlbnRzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5Y2RlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IikpIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3OTI4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0Jc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0MmVjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpKSB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFkNmI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi0JQ1RhYkZvbGRlciBjVGFiRm9sZGVyOwotCUNUYWJJdGVtIGNUYWJJdGVtOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljVGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQljVGFiSXRlbSA9IG5ldyBDVGFiSXRlbShjVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0Jc2V0V2lkZ2V0KGNUYWJJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc2FibGVkSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERpc2FibGVkSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb29sVGlwVGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKSkgdGVzdF9nZXREaXNhYmxlZEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2JmNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ29udHJvbEVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Db250cm9sRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RWRpdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9sYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdG9yIikpIHRlc3RfZ2V0RWRpdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTIzZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCgpIHsKLQlFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJc3dpdGNoKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5sZW5ndGggPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6M2E6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5sZW5ndGggPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjozYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NWI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQuc3RhcnQgPT0gMjEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6NmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXG5saW5lIDQiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3YToiLCBldmVudC5zdGFydCA9PSA1KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnN0YXJ0ID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6OGI6IiwgZXZlbnQubGVuZ3RoID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6OGM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubGVuZ3RoID09IDQpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTJhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEzOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2I6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5zdGFydCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5sZW5ndGggPT0gNik7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnN0YXJ0ID09IDMpOwotCQkJCQlhc3NlcnRUcnVlKCI6MThiOiIsIGV2ZW50Lmxlbmd0aCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE5OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubGVuZ3RoID09IDcpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTljOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYjoiLCBldmVudC5sZW5ndGggPT0gMTYpOwotCQkJCQlhc3NlcnRUcnVlKCI6MjFjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQlzdHlsZWRUZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXZlcmlmeSA9IDY7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQl2ZXJpZnkgPSA3OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDExOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTY7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTc7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotIAlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MjA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMjE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCIpKSB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTc2NTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lQmFja2dyb3VuZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGY5NzdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50KCkgewotCUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQkvLyBmb3JjZSBnZXQgbGluZSBiZyBjYWxsYmFjawotCXN0eWxlZFRleHQuc2VsZWN0QWxsKCk7Ci0Jc3R5bGVkVGV4dC5jb3B5KCk7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCIpKSB0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDU1OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzdmMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoKSB7Ci0JTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJYXNzZXJ0VHJ1ZSgiOjE6IiwgZXZlbnQubGluZU9mZnNldD09MCk7Ci0JCQlhc3NlcnRUcnVlKCI6MjoiLGV2ZW50LmxpbmVUZXh0LmVxdWFscygiMDEyMzQ1Njc4OSIpKTsKLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JLy8gZm9yY2UgZ2V0IGxpbmUgc3R5bGVzIGNhbGxiYWNrCi0Jc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDUpOwotCXN0eWxlZFRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQiKSkgdGVzdF9saW5lR2V0U3R5bGVMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MjAyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5Qb3B1cExpc3QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uUG9wdXBMaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1XaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbmltdW1XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVdpZHRoSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtV2lkdGgiKSkgdGVzdF9nZXRNaW5pbXVtV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1XaWR0aEkiKSkgdGVzdF9zZXRNaW5pbXVtV2lkdGhJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZDIzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU1QKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gdGVzdCB0aGlzLCBTVCBpcyBjb25zdGFudHMgY2xhc3MKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NUKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcxNTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltaXplZENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltaXplZENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZW50YXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXZWlnaHRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXZWlnaHRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2VpZ2h0cyRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXZWlnaHRzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Nhc2hGb3JtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltaXplZENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXZWlnaHRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXZWlnaHRzJEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIikpIHRlc3RfZ2V0TWF4aW1pemVkQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2VpZ2h0cyIpKSB0ZXN0X2dldFdlaWdodHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdlaWdodHMkSSIpKSB0ZXN0X3NldFdlaWdodHMkSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzY0YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWdpbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZ2luIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRWZXJ0aWNhbFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5IZWlnaHRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5IZWlnaHRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluU2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5TaXplSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5XaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pbldpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmlnaW5JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2Nyb2xsZWRDb21wb3NpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmlnaW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5IZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5XaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWdpbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzIikpIHRlc3RfZ2V0QWx3YXlzU2hvd1Njcm9sbEJhcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnQiKSkgdGVzdF9nZXRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmlnaW4iKSkgdGVzdF9nZXRPcmlnaW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1oiKSkgdGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFoiKSkgdGVzdF9zZXRFeHBhbmRIb3Jpem9udGFsWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kVmVydGljYWxaIikpIHRlc3Rfc2V0RXhwYW5kVmVydGljYWxaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluSGVpZ2h0SSIpKSB0ZXN0X3NldE1pbkhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pblNpemVJSSIpKSB0ZXN0X3NldE1pblNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluV2lkdGhJIikpIHRlc3Rfc2V0TWluV2lkdGhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5JSSIpKSB0ZXN0X3NldE9yaWdpbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjBkNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3RhY2tMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNjA0NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JZmluYWwgc3RhdGljIFJHQiBSRUQgPSBuZXcgUkdCKDI1NSwwLDApOwotCWZpbmFsIHN0YXRpYyBSR0IgQkxVRSA9IG5ldyBSR0IoMCwwLDI1NSk7Ci0JZmluYWwgc3RhdGljIFJHQiBHUkVFTiA9IG5ldyBSR0IoMCwyNTUsMCk7Ci0JSGFzaHRhYmxlIGNvbG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcml2YXRlIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQlyZXR1cm4gKENvbG9yKWNvbG9ycy5nZXQocmdiKTsKLX0KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JY29sb3JzLnB1dChSRUQsIG5ldyBDb2xvciAoZGlzcGxheSwgUkVEKSk7Ci0JY29sb3JzLnB1dChHUkVFTiwgbmV3IENvbG9yIChkaXNwbGF5LCBHUkVFTikpOwotCWNvbG9ycy5wdXQoQkxVRSwgbmV3IENvbG9yIChkaXNwbGF5LCBCTFVFKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JRW51bWVyYXRpb24gZWxlbWVudHMgPSBjb2xvcnMua2V5cygpOwotCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvciljb2xvcnMuZ2V0KGVsZW1lbnRzLm5leHRFbGVtZW50KCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5zdGFydCA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmxlbmd0aCA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmZvcmVncm91bmQgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID09IG51bGwpOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UuZm9udFN0eWxlID09IFNXVC5OT1JNQUwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2Uuc3RhcnQgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5sZW5ndGggPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmJhY2tncm91bmQgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UuZm9udFN0eWxlID09IFNXVC5OT1JNQUwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckkoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5zdGFydCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmxlbmd0aCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5mb250U3R5bGUgPT0gU1dULkJPTEQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUEgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSAoU3R5bGVSYW5nZSlzdHlsZVJhbmdlQS5jbG9uZSgpOwotCWFzc2VydFRydWUoIjpnOiIsIHN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlQikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUEgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQyA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihCTFVFKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VEID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRSA9IG5ldyBTdHlsZVJhbmdlKDUsIDExLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUYgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoUkVEKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUcgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCWFzc2VydFRydWUoIjpkOiIsIHN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlQikpOwotCWFzc2VydFRydWUoIjpkOiIsIXN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlQykpOwotCWFzc2VydFRydWUoIjpkOiIsIXN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlRCkpOwotCWFzc2VydFRydWUoIjpkOiIsIXN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlRSkpOwotCWFzc2VydFRydWUoIjpkOiIsIXN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlRikpOwotCWFzc2VydFRydWUoIjpkOiIsIXN0eWxlUmFuZ2VBLmVxdWFscyhzdHlsZVJhbmdlRykpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCUNvbG9yIHRlc3RDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKSwgMCwgMCwgMCk7Ci0JCi0JLy9yZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMDkyNAotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoKSk7Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgwLCAxLCB0ZXN0Q29sb3IsIG51bGwpKTsKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKDAsIDEsIHRlc3RDb2xvciwgdGVzdENvbG9yKSk7Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgwLCAxLCB0ZXN0Q29sb3IsIHRlc3RDb2xvciwgU1dULkJPTEQpKTsKLQl0ZXN0Q29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVW5zdHlsZWQoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKFJFRCksIG51bGwsIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUMgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUQgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUUgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgbnVsbCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc3R5bGVSYW5nZUEuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCFzdHlsZVJhbmdlQi5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIXN0eWxlUmFuZ2VDLmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwhc3R5bGVSYW5nZUQuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzdHlsZVJhbmdlRS5pc1Vuc3R5bGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IG5ldyBTdHlsZVJhbmdlKDUsIDUsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VDID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VEID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKEJMVUUpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihSRUQpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VGID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VCKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VDKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgIXN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlRCkpOwotCWFzc2VydFRydWUoIjpmOiIsICFzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUUpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCAhc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VGKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIG51bGwsIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlzdHlsZVJhbmdlLnRvU3RyaW5nKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb25lIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVW5zdHlsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb25lIikpIHRlc3RfY2xvbmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzVW5zdHlsZWQiKSkgdGVzdF9pc1Vuc3R5bGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIikpIHRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzllNmEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5CaWRpVXRpbDsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1TdHlsZWRUZXh0IHRleHQ7Ci1maW5hbCBzdGF0aWMgUkdCIFJFRCA9IG5ldyBSR0IoMjU1LDAsMCk7Ci1maW5hbCBzdGF0aWMgUkdCIEJMVUUgPSBuZXcgUkdCKDAsMCwyNTUpOwotZmluYWwgc3RhdGljIFJHQiBHUkVFTiA9IG5ldyBSR0IoMCwyNTUsMCk7Ci1maW5hbCBzdGF0aWMgUkdCIFlFTExPVyA9IG5ldyBSR0IoMjU1LDI1NSwwKTsKLWZpbmFsIHN0YXRpYyBSR0IgQ1lBTiA9IG5ldyBSR0IoMCwyNTUsMjU1KTsKLWZpbmFsIHN0YXRpYyBSR0IgUFVSUExFID0gbmV3IFJHQigyNTUsMCwyNTUpOwotZmluYWwgc3RhdGljIFN0cmluZyBQTEFURk9STV9MSU5FX0RFTElNSVRFUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLUhhc2h0YWJsZSBjb2xvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci1wcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJDYWxsZWQ7CQotcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyMkNhbGxlZDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlFbnVtZXJhdGlvbiBlbGVtZW50cyA9IGNvbG9ycy5rZXlzKCk7Ci0Jd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCUNvbG9yIGNvbG9yID0gKENvbG9yKWNvbG9ycy5nZXQoKFJHQillbGVtZW50cy5uZXh0RWxlbWVudCgpKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLQlzdXBlci50ZWFyRG93bigpOwotCQotfQotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBTdHlsZVJhbmdlW10gZGVmYXVsdFN0eWxlcygpIHsKLQlyZXR1cm4gbmV3IFN0eWxlUmFuZ2VbXSB7Ci0JCWdldFN0eWxlKDAsNDgsUkVELFlFTExPVyksIAotCQlnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJvdGVjdGVkIHZvaWQgZ2V0TGluZUJhY2tncm91bmRzKCkgewotCWZvciAoaW50IGk9MDsgaTx0ZXh0LmdldExpbmVDb3VudCgpOyBpKyspIHsKLQkJdGV4dC5nZXRMaW5lQmFja2dyb3VuZChpKTsKLQl9Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBTdHJpbmcgdGV4dFN0cmluZygpIHsKLQlyZXR1cm4gIlRoaXMgaXMgdGhlIHRleHQgY29tcG9uZW50IGluIHRlc3Rpbmdcbk5ldyBMaW5lMVxuTmV3IExpbmUyXG5OZXcgTGluZTNcbk5ldyBMaW5lNC4iOwotfQotcHJpdmF0ZSBib29sZWFuIGlzQmlkaSgpIHsKLQlyZXR1cm4gQmlkaVV0aWwuaXNCaWRpUGxhdGZvcm0oKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHB1YmxpYyBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIFN0eWxlUmFuZ2UgZ2V0U3R5bGUoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBSR0IgZmcsIFJHQiBiZykgewotCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlLnN0YXJ0ID0gc3RhcnQ7Ci0Jc3R5bGUubGVuZ3RoID0gbGVuZ3RoOwotCWlmIChmZyAhPSBudWxsKSBzdHlsZS5mb3JlZ3JvdW5kID0gZ2V0Q29sb3IoZmcpOwotCWVsc2Ugc3R5bGUuZm9yZWdyb3VuZCA9IG51bGw7Ci0JaWYgKGJnICE9IG51bGwpIHN0eWxlLmJhY2tncm91bmQgPSBnZXRDb2xvcihiZyk7Ci0JZWxzZSBzdHlsZS5iYWNrZ3JvdW5kID0gbnVsbDsKLQlyZXR1cm4gc3R5bGU7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JcmV0dXJuIChDb2xvciljb2xvcnMuZ2V0KHJnYik7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQljb2xvcnMucHV0KFJFRCwgbmV3IENvbG9yIChkaXNwbGF5LCBSRUQpKTsKLQljb2xvcnMucHV0KEJMVUUsIG5ldyBDb2xvciAoZGlzcGxheSwgQkxVRSkpOwotCWNvbG9ycy5wdXQoR1JFRU4sIG5ldyBDb2xvciAoZGlzcGxheSwgR1JFRU4pKTsKLQljb2xvcnMucHV0KFlFTExPVywgbmV3IENvbG9yIChkaXNwbGF5LCBZRUxMT1cpKTsKLQljb2xvcnMucHV0KENZQU4sIG5ldyBDb2xvciAoZGlzcGxheSwgQ1lBTikpOwotCWNvbG9ycy5wdXQoUFVSUExFLCBuZXcgQ29sb3IgKGRpc3BsYXksIFBVUlBMRSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKXsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULlJFQURfT05MWSk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LmRpc3Bvc2UoKTsKLQotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRWZXJ0aWNhbEJhcigpID09IG51bGwpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEJhcigpID09IG51bGwpOwotCXRleHQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZS5sZW5ndGgoKSwgZXZlbnQubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgIiIsIGV2ZW50LnJlcGxhY2VkVGV4dCk7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGFuIEV4dGVuZGVkTW9kaWZ5IGV2ZW50Ci0JdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5hcHBlbmQobGluZSk7CQotCWFzc2VydFRydWUoImFwcGVuZCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0Lmluc2VydChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUubGVuZ3RoKCksIGV2ZW50Lmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUuc3Vic3RyaW5nKDAsIDEpLCBldmVudC5yZXBsYWNlZFRleHQpOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUubGVuZ3RoKCksIGV2ZW50Lmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUgKyBsaW5lLnN1YnN0cmluZygxLCBsaW5lLmxlbmd0aCgpKSArIGxpbmUsIGV2ZW50LnJlcGxhY2VkVGV4dCk7Ci0JCX0KLQl9OwotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5QmluZGluZ0lJKCl7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwsIFNXVC5OVUxMKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1dULk5VTEwpOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMLCBTVC5MSU5FX1VQKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1QuTElORV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX1BBR0VfVVApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlNFTEVDVF9QQUdFX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyKSA9PSBTVC5QQUdFX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoLTEsIFNULlBBR0VfVVApOwotCXRleHQuc2V0S2V5QmluZGluZygtMSwgLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIEJpZGlTZWdtZW50TGlzdGVuZXIuIAotCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQlpZiAoaXNCaWRpKCkgfHwgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKSkgewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCX0KLQllbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHdoZW4gaXQgc2hvdWxkbid0IGJlIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgQmlkaVNlZ21lbnRMaXN0ZW5lci4gCi0JdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldEJhY2tncm91bmQoTGluZUJhY2tncm91bmRFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlMaW5lU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGEgTW9kaWZ5IGV2ZW50CQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyMkNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsaXN0ZW5lcjJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIGNhbGxlZCB1bmV4cGVjdGVkbHkiLCBsaXN0ZW5lcjJDYWxsZWQgPT0gZmFsc2UpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JbGlzdGVuZXIyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgY2FsbGVkIHVuZXhwZWN0ZWRseSIsIGxpc3RlbmVyMkNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVZlcmlmeUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIG9ubHkgdGVzdCB3aGV0aGVyIGxpc3RlbmVyIGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZC4KLQkvLyBjYW4ndCB0ZXN0IGxpc3RlbmVyIGJlY2F1c2UgVmVyaWZ5S2V5IGlzIHVzZXIgZHJpdmVuLgotCXRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JZmluYWwgU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWZpbmFsIFN0cmluZyBuZXdMaW5lID0gIk5ld0xpbmUxIjsKLQlmaW5hbCBpbnQgdGV4dExlbmd0aDsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVZlcmlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5zdGFydCA9IDI7Ci0JCQlldmVudC5lbmQgPSA1OwotCQkJZXZlbnQudGV4dCA9IG5ld0xpbmU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBzZW5kcyBhIFZlcmlmeSBldmVudAotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuaW5zZXJ0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJyZXBsYWNlVGV4dFJhbmdlIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMSwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuc3RhcnQgPSAyOwotCQkJZXZlbnQuZW5kID0gNTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0TGVuZ3RoID0gdGV4dC5nZXRDaGFyQ291bnQoKSAtIDEgKyBuZXdMaW5lLmxlbmd0aCgpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSArIG5ld0xpbmUuc3Vic3RyaW5nKDEsIG5ld0xpbmUubGVuZ3RoKCkpICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgdGV4dExlbmd0aCwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuc3RhcnQgPSAyOwotCQkJZXZlbnQuZW5kID0gNTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDIsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIG5ld0xpbmUubGVuZ3RoKCksIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCX07Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIHRleHQuZ2V0Q2hhckNvdW50KCkgLSAyLCBsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247CQotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQkKLQl0ZXh0LmFwcGVuZChsaW5lKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCB0byBlbXB0eSB0ZXh0IiwgbGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuYXBwZW5kKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJhcHBlbmQgbnVsbCBzdHJpbmciLCBleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5hcHBlbmQoIiIpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIGVtcHR5IHN0cmluZyIsIGxpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQl0ZXh0LmFwcGVuZChsaW5lKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBub24tZW1wdHkgc3RyaW5nIiwgbGluZSArIGxpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCVN0cmluZyB0ZXh0MiA9ICJsaW5lXHIiOwotCXRleHQuYXBwZW5kKHRleHQyKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBzdHJpbmcgZW5kaW5nIHdpdGggbGluZSBkZWxpbWl0ZXIiLCB0ZXh0MiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCVN0cmluZyB0ZXh0MyA9ICJsaW5lXHJcbmxpbmUzIjsKLQl0ZXh0LmFwcGVuZCh0ZXh0Myk7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgbXVsdGkgbGluZSBzdHJpbmciLCB0ZXh0MiArIHRleHQzLCB0ZXh0LmdldFRleHQoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIGluaGVyaXRlZCB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5KCkgewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY2xpcGJvYXJkVGV4dDsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCVN0cmluZyBiZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jb3B5KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjphOiIsIGJlZm9yZSA9PSBudWxsID8gY2xpcGJvYXJkVGV4dCA9PSBudWxsIDogYmVmb3JlLmVxdWFscyhjbGlwYm9hcmRUZXh0KSk7Ci0JCi0JYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY29weSgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAxKTsKLQl0ZXh0LmNvcHkoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIwIikpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIxMiIpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIlxyTGluZTFcbkxpbmUyXHJcbkxpbmUzXG5cckxpbmU0XG4iKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxyXG5MaW5lMVxyXG5MaW5lMlxyXG5MaW5lM1xyXG5cclxuTGluZTRcclxuIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5cbkxpbmU0XG4iOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQotCXRlc3RSdGZDb3B5KCk7Ci0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jdXQoKSB7Ci0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0OwotCVN0cmluZyBjb252ZXJ0ZWRUZXh0OwotCi0JU3RyaW5nIGJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCQotCWJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAxKTsKLQl0ZXh0LmN1dCgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjAiKSk7Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAyKTsJCi0JdGV4dC5jdXQoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjplOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMjMiKSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmN1dCgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxyXG5MaW5lMVxyXG5MaW5lMlxyXG5MaW5lM1xyXG5cclxuTGluZTRcclxuIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5cbkxpbmU0XG4iOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY3V0KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCi0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCaWRpQ29sb3JpbmcoKSB7Ci0JLy8vIGdldEJpZGlDb2xvcmluZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJpZGlDb2xvcmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0T2Zmc2V0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCAiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JU3RyaW5nIG5ld1RleHQgPSAiTGluZS0xXHJcbiI7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDEpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSBuZXdUZXh0Lmxlbmd0aCgpICsgMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gdGV4dC5nZXRDb250ZW50KCk7Ci0JCi0JYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOwotCWNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhjb250ZW50LCB0ZXh0LmdldENvbnRlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWRpdGFibGUoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3Jpem9udGFsSW5kZXgoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoNTAwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvcml6b250YWxQaXhlbCgpIHsJCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlCaW5kaW5nSSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1QuREVMRVRFX05FWFQpOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMLCBTVC5MSU5FX1VQKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCkgPT0gU1QuTElORV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuU0VMRUNUX1BBR0VfVVApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIpID09IFNULlNFTEVDVF9QQUdFX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyLCBTVC5QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyKSA9PSBTVC5QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEtleUJpbmRpbmcoLTEpID09IFNXVC5OVUxMKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkYyKSA9PSBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gNSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcbiIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gNik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUJhY2tncm91bmRJKCkgewotCVN0cmluZyB0ZXh0U3RyaW5nID0gIkwxXG5MMlxuTDNcbkw0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKEJMVUUpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JU3RyaW5nIGRlbGltaXRlclN0cmluZyA9ICJcclxuIjsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0xKTsKLQl0ZXh0LmFwcGVuZCgiZGRkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Mik7Ci0JdGV4dC5hcHBlbmQoImRkYXNkYXNkYXNkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Myk7Ci0KLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0xKTsKLQl0ZXh0Lmluc2VydChkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVBdE9mZnNldEkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YjoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRMaW5lQXRPZmZzZXQoMTAwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg1KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg2KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldExpbmVBdE9mZnNldCg3KSA9PSAxKTsKLQl0cnkgewotCQl0ZXh0LmdldExpbmVBdE9mZnNldCg4KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpoOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lRGVsaW1pdGVyID0gIlxuIjsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gdGV4dC5nZXRDb250ZW50KCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKGNvbnRlbnQuZ2V0TGluZURlbGltaXRlcigpLCB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKSk7Ci0KLQljb250ZW50ID0gbmV3IFN0eWxlZFRleHRDb250ZW50KCkgewotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhsaW5lRGVsaW1pdGVyLCB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUhlaWdodCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVJbmRleCAoKSB7Ci0JdGVzdF9nZXRMaW5lSW5kZXgodGV4dCk7Ci0JU3R5bGVkVGV4dCB0ZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCk7Ci0JdGVzdF9nZXRMaW5lSW5kZXgodGV4dDIpOwotCXRleHQyLmRpc3Bvc2UoKTsKLX0KLQotdm9pZCB0ZXN0X2dldExpbmVJbmRleCAoU3R5bGVkVGV4dCB0ZXh0KSB7Ci0JaW50IGxpbmVIZWlnaHQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXG5MaW5lMVxuTGluZTIiKTsKLQl0ZXh0LnNldFNpemUoNDAwLCBsaW5lSGVpZ2h0ICogMyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgzICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMyAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMTAgKiBsaW5lSGVpZ2h0KSk7Ci0JCi0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCAvIDIpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwICogbGluZUhlaWdodCkpOwotCi0KLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMTAgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0yICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwICogbGluZUhlaWdodCkpOwotCQotCi0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQl0ZXh0LnNldFNpemUoNDAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMSkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCArIGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCArIGxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDMgKiBsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgzICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgxMCAqIGxpbmVIZWlnaHQpKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKDMgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTMgKiBsaW5lSGVpZ2h0IC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTMgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0yICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoLTIgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KC1saW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwMCkpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KDEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMTAwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZVBpeGVsICgpIHsKLQl0ZXN0X2dldExpbmVQaXhlbCh0ZXh0KTsKLQlTdHlsZWRUZXh0IHRleHQyID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQKTsKLQl0ZXN0X2dldExpbmVQaXhlbCh0ZXh0Mik7Ci0JdGV4dDIuZGlzcG9zZSgpOwotfQotCi12b2lkIHRlc3RfZ2V0TGluZVBpeGVsKFN0eWxlZFRleHQgdGV4dCkgewotCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxuTGluZTFcbkxpbmUyIik7Ci0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCAqIDMpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscygyICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMikpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMykpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMTAwKSk7Ci0JCi0JdGV4dC5zZXRTaXplKDQwMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoMCkpOwotCWFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgyKSk7Ci0JYXNzZXJ0RXF1YWxzKDMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgzKSk7Ci0JYXNzZXJ0RXF1YWxzKDMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxMDApKTsKLQkKLQl0ZXh0LnNldFNpemUoNDAwLCBsaW5lSGVpZ2h0KTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoLTEwMCkpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgxKSk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDIpKTsKLQlhc3NlcnRFcXVhbHMoMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDMpKTsKLQlhc3NlcnRFcXVhbHMoMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEwMCkpOwotCi0JdGV4dC5zZXRTaXplKDQwMCwgMCk7IAotCXRleHQuc2V0VG9wUGl4ZWwoMyAqIGxpbmVIZWlnaHQpOwotCWFzc2VydEVxdWFscygtMyAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoLTMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKC0yICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscygtbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMikpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgzKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDEwMCkpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoLTEwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJKCl7Ci0JLy8gY29weSBmcm9tIFN0eWxlZFRleHQsIGhhcyB0byBtYXRjaCB2YWx1ZSB1c2VkIGJ5IFN0eWxlZFRleHQKLQlmaW5hbCBpbnQgWElOU0VUID0gaXNCaWRpKCkgPyAyIDogMDsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkuZXF1YWxzKG5ldyBQb2ludChYSU5TRVQsIDApKSk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igb2Zmc2V0ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBvZmZzZXQgYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTEiKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnggPiAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS55ID09IDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg2KS54ID4gMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNikueSA9PSAwKTsKLQkvLyB4IGxvY2F0aW9uIHdpbGwgPT0gU3R5bGVkVGV4dCB4IGluc2V0IG9uIGJpZGkgcGxhdGZvcm1zCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnggPT0gWElOU0VUICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS55ID4gMCk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDEzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBvZmZzZXQgYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueCA+IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnkgPCAwKTsKLQkvLyB4IGxvY2F0aW9uIHdpbGwgPT0gU3R5bGVkVGV4dCB4IGluc2V0IG9uIGJpZGkgcGxhdGZvcm1zCQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS54ID09IFhJTlNFVCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueSA9PSAwKTsKLQkKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkueCA8IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLnkgPCAwKTsKLQlhc3NlcnRUcnVlKCI6azoiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueCA8IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldE9mZnNldEF0TGluZUkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQlhc3NlcnRFcXVhbHMoIjphOiIsIDAsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDApKTsKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TGluZSgtMSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YjoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMaW5lKDEwMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7CQotCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgdGV4dC5nZXRPZmZzZXRBdExpbmUoMCkpOwotCWFzc2VydEVxdWFscygiOmU6IiwgNywgdGV4dC5nZXRPZmZzZXRBdExpbmUoMSkpOwotCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExpbmUoMik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsJCi0JYXNzZXJ0RXF1YWxzKCI6ZzoiLCAwLCB0ZXh0LmdldE9mZnNldEF0TGluZSgwKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JUG9pbnQgbG9jYXRpb247Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSkgPT0gMCk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgtMSwgMCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgLTEpKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUxIik7CQotCWxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsIDApKSA+IDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24ueCAtIDEsIDApKSA9PSA0KTsKLQlsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKGxvY2F0aW9uKSA9PSA3KTsKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDEwMCwgMCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgxMDAsIDUwKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgLTUpKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKSA9PSA3KTsKLQkKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6azoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KC01LCAtNSkpID09IDApOwotCWFzc2VydFRydWUoIjpsOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoLTUsIDApKSA9PSA3KTsKLQotCS8vIDFHTDRaVkUKLQlhc3NlcnRUcnVlKCI6bToiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24odGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDIpKSA9PSAyKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6bjoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24odGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDIpKSA9PSAyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0T3JpZW50YXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKXsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDIpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMikpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMykpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAzKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAxMSkpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgzLCAxMSkpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDQsIDQpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDIpKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7CQotfQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgewotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpICE9IG51bGwpOwotCXRleHQuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKSA9PSAgZ2V0Q29sb3IoWUVMTE9XKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgIT0gbnVsbCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpID09ICBnZXRDb2xvcihSRUQpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UoKSB7Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgaW52YWxpZFJhbmdlcyBbXVtdID0ge3stMSwgMH0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MTIsIDF9LCB7MTEsIDJ9LCB7MiwgLTN9LCB7NTAsIC0xfX07Ci0JaW50IHNlbGVjdGlvblJhbmdlcyBbXVtdID0ge3swLCAxfSwgezAsIDB9LCB7MiwgM30sIHsxMiwgMH0sIHsyLCAtMn0sIHs1LCAtMX19OwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gMCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHNlbGVjdGlvblJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvblJhbmdlc1tpXVsxXTsKLQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCXN0YXJ0ICs9IGxlbmd0aDsKLQkJCWxlbmd0aCAqPSAtMTsKLQkJCWFzc2VydEVxdWFscygiOmM6YToiICsgaSwgc3RhcnQsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOmE6IiArIGksIHN0YXJ0ICsgbGVuZ3RoLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwkJCQotCQl9Ci0JCWFzc2VydFRydWUoIjpjOiIgKyBpLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBsZW5ndGgpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKXsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDExKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTkpOwotCXRleHQuc2V0VGV4dCgiMDEyM1xuNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0xMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpIHsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBzZWxlY3Rpb25SYW5nZXMgW11bXSA9IHt7MCwgMX0sIHswLCAwfSwgezIsIDN9LCB7MTIsIDB9fTsKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHNlbGVjdGlvblJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvblJhbmdlc1tpXVsxXTsKLQkJdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YzoiICsgaSwgdGVzdFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIGxlbmd0aCksIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSgpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IHN0eWxlU3RhcnQgPSAwOwotCWludCBzdHlsZUxlbmd0aCA9IDU7Ci0JaW50IGk7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc3R5bGVTdGFydCwgc3R5bGVMZW5ndGgsIGdldENvbG9yKEJMVUUpLCBnZXRDb2xvcihSRUQpLCBTV1QuQk9MRCk7Ci0KLQl0cnkgewotCQl0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIm9mZnNldCBvdXQgb2YgcmFuZ2Ugbm8gdGV4dCIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LnNldFRleHQobGluZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoLTEpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgib2Zmc2V0IG91dCBvZiByYW5nZSBuZWdhdGl2ZSIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChsaW5lLmxlbmd0aCgpKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIm9mZnNldCBvdXQgb2YgcmFuZ2UgcG9zaXRpdmUiLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCXN0eWxlLmxlbmd0aCA9IDE7Ci0JZm9yIChpID0gc3R5bGVTdGFydDsgaSA8IHN0eWxlU3RhcnQgKyBzdHlsZUxlbmd0aDsgaSsrKSB7Ci0JCXN0eWxlLnN0YXJ0ID0gaTsKLQkJYXNzZXJ0RXF1YWxzKHN0eWxlLCB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKSk7Ci0JfQotCWFzc2VydEVxdWFscyhudWxsLCB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKSk7Ci0JCQkKLQkvLyB0ZXN0IG9mZnNldCBhdCBsaW5lIGRlbGltaXRlcgotCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoNSwgMiwgbnVsbCwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0Jc3R5bGUubGVuZ3RoID0gMTsKLQlhc3NlcnRFcXVhbHMoc3R5bGUsIHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDUpKTsKLQlzdHlsZS5zdGFydCA9IDY7Ci0JYXNzZXJ0RXF1YWxzKHN0eWxlLCB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg2KSk7CQotCWFzc2VydEVxdWFscyhudWxsLCB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCgxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlUmFuZ2VzKCkgewotCXRleHQuc2V0VGV4dCgicGFja2FnZSB0ZXN0O1xuLyogTGluZSAxXG4gKiBMaW5lIDJcbiAqL1xucHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHtcbn0iKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw3LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNCwyMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCw2LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0NSw1LEJMVUUsbnVsbCkpOwotIAl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTQsIDIzLCAiXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovIik7Ci0gCVN0cmluZyBuZXdUZXh0ID0gdGV4dC5nZXRUZXh0UmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgbmV3VGV4dC5lcXVhbHMoInBhY2thZ2UgdGVzdDtcblx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqL1xucHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHtcbn0iKSk7Ci0JU3R5bGVSYW5nZVtdIHN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw3LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQwLDYsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNDcsNSxCTFVFLG51bGwpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGVSYW5nZXNJSSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLS8vCTAKLS8vCSAxMjM0Ci0vLwkgNTYKLS8vCSA3OAotLy8JOQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxLDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDIsWUVMTE9XLG51bGwpKTsKLQotCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEsNCxCTFVFLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcyg3LDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygwLDEwKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSw0LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDAsNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEsMyxCTFVFLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygyLDYpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgyLDMsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNywxLFlFTExPVyxudWxsKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5XHJcbkFCQ0RFRkdISUpLTCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNSxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxLFlFTExPVyxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygxNSwxKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxNSwxLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMTUsMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygwLDIwKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsNSxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxNSwxLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoOCwyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg4LDIsUkVELG51bGwpKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJzKCkgewotCXRleHQuc2V0VGFicygxKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRhYnMoKSA9PSAxKTsKLQl0ZXh0LnNldFRhYnMoOCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lXHQxXHJcbiIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCXRleHQuc2V0VGFicyg3KTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRhYnMoKSA9PSA3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHModGVzdFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKHRlc3RUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0ICsgIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHModGVzdFRleHQgKyAiXHJcbiIpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJSSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBpbnZhbGlkUmFuZ2VzW11bXSA9IHt7LTEsIDB9LCB7MCwgLTF9LCB7LTEsIC0xfSwgezEwMCwgMX0sIHsxMDAsIC0xfSwgezIsIHRlc3RUZXh0Lmxlbmd0aCgpfSwgezUsIDJ9fTsKLQlpbnQgcmFuZ2VzW11bXSA9IHt7MCwgMX0sIHswLCAwfSwgezIsIDV9LCB7NywgMTF9fTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJdGV4dC5nZXRUZXh0KHN0YXJ0LCBlbmQpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSByYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSByYW5nZXNbaV1bMV07Ci0JCWFzc2VydEVxdWFscygiOmI6IiArIGksIHRlc3RUZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSksIHRleHQuZ2V0VGV4dChzdGFydCwgZW5kKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHQoc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoMCwwKS5lcXVhbHMoInQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0KDAsMSkuZXF1YWxzKCJ0ZSIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoMSw1KS5lcXVhbHMoImVzdGluIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRSYW5nZUlJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IGludmFsaWRSYW5nZXNbXVtdID0ge3stMSwgMH0sIHswLCAtMX0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MSwgdGVzdFRleHQubGVuZ3RoKCl9LCB7NSwgLTF9fTsKLQlpbnQgcmFuZ2VzW11bXSA9IHt7MCwgMX0sIHswLCAwfSwgezUsIDF9LCB7NywgNX0sIHsxMiwgMH19OwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXh0LmdldFRleHRSYW5nZShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gcmFuZ2VzW2ldWzBdOwotCQlpbnQgbGVuZ3RoID0gcmFuZ2VzW2ldWzFdOwotCQlhc3NlcnRFcXVhbHMoIjpiOiIgKyBpLCB0ZXN0VGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKSwgdGV4dC5nZXRUZXh0UmFuZ2Uoc3RhcnQsIGxlbmd0aCkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJdGV4dC5nZXRUZXh0UmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgwLDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDAsMSkuZXF1YWxzKCJ0IikpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgwLDIpLmVxdWFscygidGUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMSw1KS5lcXVhbHMoImVzdGluIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpIDwgMCk7Ci0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsICJMaW5lMSIpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BQaXhlbCgpIHsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUwYVxyXG4iKTsKLQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0yKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsICJMaW5lMSIpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRXb3JkV3JhcCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRXb3JkV3JhcCgpKTsKLQl0ZXh0LnNldFdvcmRXcmFwKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotfQotcHVibGljIHZvaWQgdGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZygpewotCVN0cmluZyBkZWxpbWl0ZXJTdHJpbmcgPSAiXG4iOwotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRleHQuaW5zZXJ0KCJmcmVkIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJmcmVkIikpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCXRleHQuaW5zZXJ0KCJoZWxtdXQiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoImZyaGVsbXV0ZWQiKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTEpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09Mik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlQWN0aW9uSSgpIHsKLQkvLyBpbnZva2luZyBhY3Rpb25zIG9uIGFuIGVtcHR5IHRleHQgc2hvdWxkIG5vdCBjcmFzaAotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRE9XTik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9VUCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPTFVNTl9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQUdFX0RPV04pOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfVVApOwotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9QUkVWSU9VUyk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfRU5EKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9TVEFSVCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19FTkQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XSU5ET1dfU1RBUlQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9ET1dOKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfVVApOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fUFJFVklPVVMpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9DT0xVTU5fTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfVVApOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9QQUdFX0RPV04pOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX1BSRVZJT1VTKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ1VUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DT1BZKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQVNURSk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX1BSRVZJT1VTKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVE9HR0xFX09WRVJXUklURSk7Ci0KLQkvL1NvbWUgcGxhdGZvcm1zIGNvbnNpZGVyIG51bWJlciBhIHdvcmQgc3RhcnQsIG90aGVyIGRvbid0ICAKLS8vCXRleHQuc2V0VGV4dCgiTGluZTFcclxuTGluZTIiKTsJCQotCXRleHQuc2V0VGV4dCgiTGluZUxcclxuTGluZVciKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0RPV04pOwotCWFzc2VydEVxdWFscyg3LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfVVApOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQlhc3NlcnRFcXVhbHMoNSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPTFVNTl9ORVhUKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBR0VfRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKDgsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQUdFX1VQKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfU1RBUlQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfTkVYVCk7CQotCWFzc2VydEVxdWFscyg3LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9QUkVWSU9VUyk7CQotCWFzc2VydEVxdWFscyg1LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVEVYVF9FTkQpOwkKLQlhc3NlcnRFcXVhbHModGV4dC5nZXRDaGFyQ291bnQoKSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfU1RBUlQpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19FTkQpOwkKLQlhc3NlcnRFcXVhbHMoNSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULldJTkRPV19TVEFSVCk7CQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0RPV04pOwkKLQlhc3NlcnRFcXVhbHMoIkxpbmVMXHJcbiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTFxyXG5MaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfQ09MVU1OX1BSRVZJT1VTKTsKLQlhc3NlcnRFcXVhbHMoIkwiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfQ09MVU1OX05FWFQpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfVVApOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1BBR0VfRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfUFJFVklPVVMpOwotCWFzc2VydEVxdWFscygiTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9ORVhUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfRU5EKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfU1RBUlQpOwotCWFzc2VydEVxdWFscygiTGluZUxcclxuIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dJTkRPV19TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV0lORE9XX0VORCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lTCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ1VUKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0RPV04pOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNPUFkpOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlBBU1RFKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIgKyBQTEFURk9STV9MSU5FX0RFTElNSVRFUiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX1BSRVZJT1VTKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9ORVhUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVXIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuVE9HR0xFX09WRVJXUklURSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKXsKLQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0ZXh0LmdldERpc3BsYXkoKSk7Ci0JVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nIGNvbnZlcnRlZFRleHQ7Ci0KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJ4In0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JCi0JdGV4dC5jb3B5KCk7CQotCXRleHQucGFzdGUoKTsJCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAxKTsKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY29weSgpOwkKLQl0ZXh0LnBhc3RlKCk7CQotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMik7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDEpOwotCXRleHQuY29weSgpOwkKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCXRleHQucGFzdGUoKTsJCi0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIwMDEyMzQ1Njc4OSIpKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDEsIDIpOwkKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIwMSIpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiXHJMaW5lMVxuTGluZTJcclxuTGluZTNcblxyTGluZTRcbiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXHJcbkxpbmUxXHJcbkxpbmUyXHJcbkxpbmUzXHJcblxyXG5MaW5lNFxyXG4iOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJcbkxpbmUxXG5MaW5lMlxuTGluZTNcblxuTGluZTRcbiI7Ci0JfQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiTGluZTFcclxuTGluZTIifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQl0ZXh0LnBhc3RlKCk7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJMaW5lMVxyTGluZTIifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQl0ZXh0LnBhc3RlKCk7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IkxpbmUxXG5MaW5lMiJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCXRleHQucGFzdGUoKTsKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCX0KLQllbHNlIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxuTGluZTIiOwotCX0KLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCi0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludCgpIHsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSByZXR1cm47Ci0JCi0JLyogV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gcnVuIHRoaXMgdGVzdCwgYmVjYXVzZSBpdCB3YXN0ZXMgcGFwZXIuCi0JICogQWxtb3N0IGFsbCBvZiB0aGUgcHJpbnQoKSBtZXRob2QgaXMgdGVzdGVkIGluIHByaW50KFByaW50ZXIpLCBiZWxvdy4KLQkgKi8KLS8vCXRleHQucHJpbnQoKTsKLS8vCXRleHQuc2V0VGV4dCgiTGluZTEiKTsKLS8vCXRleHQucHJpbnQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcigpIHsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSByZXR1cm47Ci0KLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucHJpbnQobnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBwcmludChudWxsKSIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQl0ZXh0LnByaW50KHByaW50ZXIpOyAvLyBkb24ndCBydW4gdGhlIHJ1bm5hYmxlLCB0byBzYXZlIHBhcGVyCi0JdGV4dC5zZXRUZXh0KCJMaW5lMSIpOwotCXRleHQucHJpbnQocHJpbnRlcik7IC8vIGRvbid0IHJ1biB0aGUgcnVubmFibGUsIHRvIHNhdmUgcGFwZXIKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRQcmludE9wdGlvbnMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhdygpIHsKLQkvLyBpbmhlcml0ZWQgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0JLy8gaW5oZXJpdGVkIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhd1JhbmdlSUlaKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0KLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIHRydWUpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgZmFsc2UpOwotCQotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgdHJ1ZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKC0xLCAyLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKC0xLCAyLCBmYWxzZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSg4LCAyLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDgsIDIsIGZhbHNlKTsJCi0JdGV4dC5yZWRyYXdSYW5nZSgxMCwgMCwgdHJ1ZSk7CQotCXRleHQucmVkcmF3UmFuZ2UoMTAsIDAsIGZhbHNlKTsJCi0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAxLCB0cnVlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgxMCwgMSwgZmFsc2UpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIKLX0KLXB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlTdHlsZVJhbmdlW10gc3R5bGVzOwotCVN0cmluZyB0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDc4LCBuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gTm8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN0eWxlcwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNDgsIDUsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIHBhcnRpYWwKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEwLCAxMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwyOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIG5ldyBTdHlsZVJhbmdlW10ge30pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIGZ1bGwKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDU4LCAxMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBlbmQgb2Ygb25lIHN0eWxlCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygzOCwgMTUsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwxNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgYmVnaW5uaW5nIG9mIG9uZSBzdHlsZQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTAsIDEwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYwLDgsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBjb21wbGV0ZSBzdHlsZQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNDgsIDIwLCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsMjAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQlTdHlsZVJhbmdlIHJhbmdlc1tdID0gbmV3IFN0eWxlUmFuZ2VbM107Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzRdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMyxSRUQsbnVsbCk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDgsNCxCTFVFLG51bGwpOwotCXJhbmdlc1szXSA9IGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg4LDQsQkxVRSwgbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDE4LCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSA2KTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1s1XS5lcXVhbHMoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDM1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyMCwxMCxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDI1LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyMCwxNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTik7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMTIsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEyLDgsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDUsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTUsUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTUsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDUsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsNyxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDcsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JLy8gRW5kL0JlZ2lubmluZyBvdmVybGFwCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygzOCwgMjUsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwyNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNjMsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg3Myw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIENvbXBsZXRlIG92ZXJsYXAKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCkpKTsKLQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDY4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1OCwgMjAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSkpOwotCi0JLy8gMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDIzLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjgsMixQVVJQTEUsUFVSUExFKSkpOwotCQotCS8vIGVuZCwgMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTMsIDEyLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCwzLENZQU4sQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMywxMixZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCS8vIGluc2VydCB3aXRoIG5vIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MXhhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0KLQkvLyBpbnNlcnQgYmVmb3JlIDEgc3R5bGUKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMyxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAzLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpKTsKLQotCS8vIGluc2VydCBhZnRlciAxIHN0eWxlCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg4LDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoOCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxeGM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhjOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoOCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQkvLyBpbnNlcnQgYmVmb3JlIDIgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDIsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygyLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMSxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKSkpOwotCi0JLy8gaW5zZXJ0IGFmdGVyIDIgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIwLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEyLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMTIsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTIsMSxQVVJQTEUsUFVSUExFKSkpOwotCi0JLy8gaW5zZXJ0IG1pZGRsZSAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTIsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNSwgMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDIsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEyLDIsUkVELFlFTExPVykpKTsKLQkKLQkvLyBpbnNlcnQgbWlkZGxlIDMgc3R5bGVzCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMyxSRUQsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg2LDMsUFVSUExFLFlFTExPVyk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoMTIsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDIsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDMsUkVELFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNCwyLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYsMyxQVVJQTEUsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMiwzLFJFRCxZRUxMT1cpKSk7CQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dC5zZXRUZXh0KCIwIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MnhiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxSRUQsUkVEKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxLDEsUkVELFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMiwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMSwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyeGM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MnhjOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMiIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxLDEsUkVELFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMiwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgyLDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMiwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwxLFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEsMSxQVVJQTEUsUFVSUExFKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyLDEsUkVELFJFRCk7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoMywxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoyeGU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyeGY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg0LDEsWUVMTE9XLFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg0LCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhnOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpewotCVN0cmluZyBkZWZhdWx0VGV4dCA9ICJsaW5lMFxuXHJsaW5lMVxuXHJsaW5lMlxuXHIiOwotCWludCBkZWZhdWx0VGV4dExlbmd0aCA9IGRlZmF1bHRUZXh0Lmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25TdGFydCA9IDc7Ci0JaW50IHNlbGVjdGlvbkxlbmd0aCA9IDc7Ci0JaW50IHJlcGxhY2VTdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgc2VsZWN0aW9uTGVuZ3RoICsgMTsKLQlpbnQgcmVwbGFjZUxlbmd0aCA9IDU7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJuZXdsaW5lMFxuXHJuZXdsaW5lMSI7Ci0JaW50IG5ld1RleHRMZW5ndGggPSBuZXdUZXh0Lmxlbmd0aCgpOwotCQkJCi0JLy8gaW5zZXJ0IHRleHQKLQkvLyB3aXRoaW4gcmFuZ2UKLQkvLyBhZnRlciBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShyZXBsYWNlU3RhcnQsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQkKLQkvLyBiZWZvcmUgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCi0KLQkvLyBpbnRlcnNlY3Rpbmcgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uU3RhcnQgKyAxLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyAxICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQkKLQkvLyBvdXQgb2YgcmFuZ2UKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSgtMSwgMCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6ZzoiLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpICsgMSwgMCwgbmV3VGV4dCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCBudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQkKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQlhc3NlcnRUcnVlKCI6aDoiLCBleGNlcHRpb25UaHJvd24pOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCQotCS8vIGFwcGVuZCB0ZXh0Ci0JLy8gYXBwZW5kIGluIGVtcHR5IHdpZGdldAotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gMCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQotCS8vIGFwcGVuZCBpbiBub24tZW1wdHkgd2lkZ2V0IChzZWxlY3Rpb24gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZXJ2ZWQpCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmw6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjptOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvLyBwbGFjZSBjYXJldCBhdCBlbmQgb2YgdGV4dAotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpuOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6bzoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSB0ZXh0LmdldENoYXJDb3VudCgpIC0gbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQotCS8vIHJlcGxhY2UgdGV4dAotCS8vIHdpdGhpbiByYW5nZQotCS8vIGFmdGVyIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHJlcGxhY2VTdGFydCwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnA6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6cToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQkKLQkvLyBiZWZvcmUgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnI6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6czoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IHNlbGVjdGlvbkxlbmd0aCk7Ci0JCi0JLy8gaW50ZXJzZWN0aW5nIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOnQ6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGggLSByZXBsYWNlTGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6dToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIDEgKyBuZXdUZXh0TGVuZ3RoICYmIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS55ID09IDApOwotCQkJCi0JLy8gb3V0IG9mIHJhbmdlCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoLTEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOnY6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSArIDEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOnc6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlhc3NlcnRUcnVlKCI6eDoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMVxyTGluZTIiOwotCQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmUsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKSB7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQodGV4dCwgU1dULk5PTkUpOwotCWZpbmFsIGludCBYSU5TRVQgPSBpc0JpZGkoKSA/IDIgOiAwOwotCQotCXRleHQuc2V0Q2FyZXQoY2FyZXQpOwotCWFzc2VydEVxdWFscyhYSU5TRVQsIHRleHQuZ2V0Q2FyZXQoKS5nZXRMb2NhdGlvbigpLngpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0KCkuZ2V0TG9jYXRpb24oKS55KTsKLQotCXRleHQuc2V0Q2FyZXQobnVsbCk7CQkKLQl0ZXh0LnNldFRleHQoIlxyTGluZTIiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JdGV4dC5zZXRDYXJldChjYXJldCk7Ci0JYXNzZXJ0VHJ1ZSh0ZXh0LmdldENhcmV0KCkuZ2V0TG9jYXRpb24oKS54ID4gMCk7Ci0JYXNzZXJ0RXF1YWxzKHRleHQuZ2V0TGluZUhlaWdodCgpLCB0ZXh0LmdldENhcmV0KCkuZ2V0TG9jYXRpb24oKS55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCaWRpQ29sb3JpbmdaKCkgewotCS8vLyBzZXRCaWRpQ29sb3JpbmcgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCaWRpQ29sb3JpbmdaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FyZXRPZmZzZXRJKCl7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KC0yKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMSk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldENhcmV0T2Zmc2V0KHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KHRleHQuZ2V0Q2hhckNvdW50KCkgKyAxKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCg1KTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gNSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoLTIpOwotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIjpsOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IG5ldyBTdHlsZWRUZXh0Q29udGVudCgpIHsKLQkJcHVibGljIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXBsYWNlVGV4dFJhbmdlKGludCBzdGFydCwgaW50IHJlcGxhY2VMZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl9Ci0JfTsKLQl0ZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIHRleHQuZ2V0Q29udGVudCgpKTsKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnNldENvbnRlbnQobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRhYmxlWigpewotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCl7Ci0JRm9udERhdGEgZm9udERhdGEgPSB0ZXh0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCWludCBsaW5lSGVpZ2h0OwotCUZvbnQgZm9udDsKLQkKLQlmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMjAsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAyNSwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gbGluZUhlaWdodCAmJiBmb250LmVxdWFscyh0ZXh0LmdldEZvbnQoKSkpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJKCl7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA+IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsJCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDIpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0KLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7CQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJKCl7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMSk7CQotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDEpOwkKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDEpOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA+IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKC0xKTsJCi0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgyNSk7CQotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMjUpOwkKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsJCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDUpOwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCl7Ci0JU3RyaW5nIHRleHRTdHJpbmc7Ci0KLQl0ZXh0U3RyaW5nID0gIkwxXG5MMlxuTDNcbkw0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsNSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowYjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDEsIiIpOwotCWFzc2VydFRydWUoIjowYzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowYzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjowYzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw2LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGQ6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBkOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMywiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBlOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBlOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowZToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKEdSRUVOKSk7Ci0KLQl0ZXh0U3RyaW5nID0gIkwxXG5MMiI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDQsIiIpOwotCWFzc2VydFRydWUoIjowYTE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBiMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwxLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGMxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCw1LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGQxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDMsIiIpOwotCWFzc2VydFRydWUoIjowZTE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGUxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gbnVsbCk7Ci0JdGV4dFN0cmluZyA9ICJMMVxuTDIiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGYxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcrIlxuIik7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNiwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBnMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMCxnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JCi0JdGV4dFN0cmluZyA9ICJOZXcgTGluZTFcbk5ldyBMaW5lMlxuTmV3IExpbmUzXG5OZXcgTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMixnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMixnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJcbiIpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCg0KSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQkKLQl0ZXh0U3RyaW5nID0gIk5ldyBMaW5lMVxuTmV3IExpbmUyXG5OZXcgTGluZTNcbk5ldyBMaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwyLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwyLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDIwLCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjozOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0KLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMTgsIiIpOwotCWFzc2VydFRydWUoIjo0OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0KLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMTgsIkwxXG5MMlxuTDNcbiIpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDIpID09IG51bGwpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gbnVsbCk7Ci0KLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsOSwiTDFcbkwyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBudWxsKTsKLQl0ZXh0U3RyaW5nID0gIkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDExLDExLCJMM1xuTDQiKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgzKSA9PSBudWxsKTsKLQkJCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCJMMVxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjc6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0T3JpZW50YXRpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmllbnRhdGlvbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludFtdIGludmFsaWQgPSB7LTEsIDEwMCwgMTJ9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkW2ldKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDExKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWQubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVBvaW50W10gaW52YWxpZFJhbmdlcyA9IHtuZXcgUG9pbnQoLTEsIDApLCBuZXcgUG9pbnQoLTEsIC0xKSwgbmV3IFBvaW50KDEwMCwgMSksIAotCQluZXcgUG9pbnQoMTAwLCAtMSksIG5ldyBQb2ludCgxMSwgMTIpLCBuZXcgUG9pbnQoMTAsIDEyKX07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKGludmFsaWRSYW5nZXNbaV0pOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkUmFuZ2VzW2ldKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKXsKLQlpbnRbXVtdIGludmFsaWRSYW5nZXMgPSB7ey0xLCAwfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsxMSwgMTJ9LCB7MTAsIDEyfSwgezIsIC0zfSwgezUwLCAtMX19OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgMCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7CQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotfQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCXRleHQuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgPT0gIGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkuZXF1YWxzKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTikpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKXsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQoZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpID09ICBnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpLmVxdWFscyh0ZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJKCl7Ci0JLy8gc2V0U2VsZWN0aW9uUmFuZ2UgYWxyZWFkeSB0ZXN0ZWQgaW4gdGVzdF9nZXRTZWxlY3Rpb25SYW5nZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCl7Ci0JU3R5bGVSYW5nZVtdIHN0eWxlczsKLQlTdHJpbmcgdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JCi0JLy8gTm8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN0eWxlcwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBwYXJ0aWFsCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjAsMjgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gZnVsbAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGVuZCBvZiBvbmUgc3R5bGUKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDE1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBiZWdpbm5pbmcgb2Ygb25lIHN0eWxlCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1MCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjAsOCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIGNvbXBsZXRlIHN0eWxlCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCwyMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBiZWZvcmUgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMTAsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTEsMTQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTUsUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDEwLEJMVUUsQ1lBTikpKTsKLQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsNCxCTFVFLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsNyxCTFVFLG51bGwpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSBBQkMgREVGIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCw0LFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNCxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNiwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDE0LFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQsQkxVRSxudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNCwxNSxSRUQsbnVsbCkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsMjAsbnVsbCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JaW50IGxlbmd0aCA9IHRleHRTdHJpbmcubGVuZ3RoKCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsbGVuZ3RoLG51bGwsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwzLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwzLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg5LDgsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsR1JFRU4sUFVSUExFKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDE3LEdSRUVOLFBVUlBMRSkpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDksUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNyw5LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywxMCxHUkVFTixQVVJQTEUpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxHUkVFTixQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMywyLEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoInJlZGdyZWVuYmx1ZXllbGxvd2N5YW5wdXJwbGUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMTQsbnVsbCxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoOCwxNCxudWxsLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgicmVkZ3JlZW5ibHVleWVsbG93Y3lhbnB1cnBsZSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw1LEdSRUVOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyOCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQotCi0vKgotCXRleHQuc2V0VGV4dCgiVGhpc1xyXG5hXHRBbm90aGVyIGxpbmUuIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw4LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2LDEsQkxVRSxudWxsKSk7Ci0JU3R5bGVkVGV4dEV2ZW50IGV2ZW50ID0gbmV3IFN0eWxlZFRleHRFdmVudCgpOwotCWV2ZW50LmRldGFpbCA9IDY7Ci0JZXZlbnQudGV4dCA9ICJhXHRBbm90aGVyIGxpbmUuIjsKLQl0ZXh0Lm5vdGlmeUxpc3RlbmVyKFNULkxpbmVHZXRTdHlsZSwgZXZlbnQpOwotCWFzc2VydFRydWUoIjo4OiIsIGV2ZW50LnN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMyw0LEJMVUUsbnVsbCkpKTsKLSovCi0KLQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCw2LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEsUkVELG51bGwpKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0JCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGJlZm9yZSBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwxMCxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDU4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTEsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDExLDE0LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMjAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0KLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDMsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMiw1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxNSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDcsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMTAsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCi0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQotCS8vIEVuZC9CZWdpbm5pbmcgb3ZlcmxhcAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MywxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNzMsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQotCS8vIENvbXBsZXRlIG92ZXJsYXAKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw3OCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDY4LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwyMCxZRUxMT1csUkVEKSkpOwotCi0KLQkvLyAxLU4gY29tcGxldGUsIGJlZ2lubmluZwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIzLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjgsMixQVVJQTEUsUFVSUExFKSkpOwotCQotCS8vIGVuZCwgMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCwzLENZQU4sQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFlFTExPVyxudWxsKSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxLFlFTExPVyxudWxsKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMSwyLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsWUVMTE9XLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDIsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwxLFlFTExPVyxudWxsKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywyLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMywyLFJFRCxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInh4eC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDEsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwzLFJFRCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4eHgvIik7CQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDIsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwxLFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEsNCxZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSw0LFlFTExPVyxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoIk5ld1xyXG4iKTsKLQlTdHlsZVJhbmdlIHN0eWxlID0gZ2V0U3R5bGUoMCw1LG51bGwsbnVsbCk7Ci0Jc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7CQotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDUsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywwLCJhIik7IC8vICJOZXdhXHJcbiIKLQkvLyBzdHlsZXMgKDAsMyxCT0xEKSwgKDQsMixCT0xEKQotCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNCk7Ci0Jc3R5bGUuc3RhcnQgPSAzOwotCXN0eWxlLmxlbmd0aCA9IDE7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsNixCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsImEiKTsgLy8gImFOZXdhXHJcbiIKLQkvLyBzdHlsZXMgKDEsNixCT0xEKQotCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoMSk7Ci0Jc3R5bGUuc3RhcnQgPSAwOwotCXN0eWxlLmxlbmd0aCA9IDE7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsNyxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDEsIiIpOyAvLyAiTmV3YVxyXG4iCi0JLy8gc3R5bGVzICgwLDYsQk9MRCkKLQlmb3IgKGludCBpPTA7IGk8NjsgaSsrKSB7Ci0JCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCk7Ci0JfQotCi0KLQl0ZXh0LnNldFRleHQoIk5ldyBMIDFcclxuTmV3IEwgMlxyXG4iKTsKLQlzdHlsZSA9IGdldFN0eWxlKDAsOSxudWxsLG51bGwpOwotCXN0eWxlLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw5LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsMCwiYSIpOwotCS8vIHN0eWxlcyAoMCw3LEJPTEQpLCAoOCwyLEJPTEQpCi0Jc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg4KTsKLQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQlzdHlsZS5zdGFydCA9IDc7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfQotCS8vIHN0eWxlcyAoMCwxMCxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsImEiKTsKLQkvLyBzdHlsZXMgKDAsNCxCT0xEKSwgKDUsNixCT0xEKQotCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNSk7Ci0JaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJc3R5bGUuc3RhcnQgPSA0OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQkvLyBzdHlsZXMgKDAsMTEsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwzLCIiKTsKLQkvLyBzdHlsZXMgKDAsOCxCT0xEKQotCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJc3R5bGUgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIHN0eWxlLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCk7Ci0JfQotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQkKLQkvLwkJCQkJIjAxMjM0NTY3ODkwMTIzIgotCXRleHRTdHJpbmcgPSAJCSIxMjM0IDEyMzQgMTIzNCI7Ci0KLQotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYsMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw0LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMyw2LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDQsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDYsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo2YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywxMCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo3YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsMTAsWUVMTE9XLFJFRCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxYjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDIsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyYjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyYjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyYjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsMixCTFVFLENZQU4pKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2LDIsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozYjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozYjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozYjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDYsMixCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoOCwxLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsNCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo1YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo1YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsNCxCTFVFLENZQU4pKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2YjoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo2YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDEwLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6N2I6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6N2I6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDEwLEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JLy8JCQkgCQkiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzIgotCVN0cmluZyB0ZXN0U3RyaW5nPQkiMTIzNCAxMjM0IDEyMzQgMTIzNCAxMjM0IjsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMiwyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEwLDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMCwyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEwLDIsWUVMTE9XLFJFRCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTIsNCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOCw0LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDgsMixZRUxMT1csUkVEKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg4LDYsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEwLDYsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDgsMTIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCQotCS8vCQkJIAkJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JLy8JU3RyaW5nIHRlc3RTdHJpbmc9CSIxMjM0IDEyMzQgMTIzNCAxMjM0IDEyMzQiOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSw3LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNyw3LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwxMCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxMDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNyw5LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg1LDksIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsMTMsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQotCi0JLy8JCQkgCQkJIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyIKLQkvLwlTdHJpbmcgdGVzdFN0cmluZz0JIjEyMzQgMTIzNCAxMjM0IDEyMzQgMTIzNCI7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSw0LEdSRUVOLFBVUlBMRSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDEyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDQsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsMTIsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsR1JFRU4sUFVSUExFKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDQsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDksMTAsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQlTdHlsZVJhbmdlIHN0eWxlMSA9IGdldFN0eWxlKDAsMCxudWxsLG51bGwpOwotCi0KLQlTdHlsZVJhbmdlIHN0eWxlMiA9IGdldFN0eWxlKDAsMCxSRUQsWUVMTE9XKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMS5lcXVhbHMoc3R5bGUyKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMS5zaW1pbGFyVG8oc3R5bGUyKSk7Ci0KLQotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTIuZXF1YWxzKHN0eWxlMSkpOwotCi0KLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUyLnNpbWlsYXJUbyhzdHlsZTEpKTsKLQotCi0KLQlzdHlsZTEgPSBnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpOwotCXN0eWxlMiA9IGdldFN0eWxlKDExLDUsUkVELFlFTExPVyk7Ci0KLQotCWFzc2VydFRydWUoIjoyOiIsICFzdHlsZTEuZXF1YWxzKHN0eWxlMikpOwotCi0KLQlhc3NlcnRUcnVlKCI6MjoiLCAhc3R5bGUyLmVxdWFscyhzdHlsZTEpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZTEuc2ltaWxhclRvKHN0eWxlMikpOwotCi0KLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZTIuc2ltaWxhclRvKHN0eWxlMSkpOwotCi0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3R5bGVSYW5nZVtdIHJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlW10gewotCQluZXcgU3R5bGVSYW5nZSgwLCAxLCBnZXRDb2xvcihSRUQpLCBudWxsKSwgCi0JCW5ldyBTdHlsZVJhbmdlKDIsIDEsIGdldENvbG9yKFJFRCksIG51bGwpfTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCXRyeSB7Ci0JCXRleHQuc2V0U3R5bGVSYW5nZXMobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKHJhbmdlcyk7Ci0JU3R5bGVSYW5nZVtdIGN1cnJlbnRSYW5nZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJhbmdlcy5sZW5ndGgsIGN1cnJlbnRSYW5nZXMubGVuZ3RoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlc1tpXSwgY3VycmVudFJhbmdlc1tpXSk7Ci0JfQotCXRleHQuc2V0U3R5bGVSYW5nZXMobmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U3R5bGVSYW5nZXMoKS5sZW5ndGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRhYnNJKCl7Ci0JdGV4dC5zZXRUYWJzKDEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGFicygpID09IDEpOwotCQotCXRleHQuc2V0VGFicyg4KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQl0ZXh0LnNldFRleHQoIkxpbmVcdDFcclxuIik7Ci0JdGV4dC5zZXRUYWJzKDcpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGFicygpID09IDcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQl0cnkgewotCQl0ZXh0LnNldFRleHQobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0JCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMaW1pdEkoKXsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLQotCXRleHQuc2V0VGV4dExpbWl0KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IC0xKTsKLQotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dExpbWl0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcEluZGV4SSgpewotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcEluZGV4KDIpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAyKTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFBpeGVsSSgpewotCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCi0JdGV4dC5zZXRUb3BQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKC0yKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDEpOwotCXRleHQuc2V0VG9wUGl4ZWwoMiAqIGxpbmVIZWlnaHQpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAyICogbGluZUhlaWdodCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BQaXhlbCgzICogbGluZUhlaWdodCk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDIgKiBsaW5lSGVpZ2h0KTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRUb3BQaXhlbCgyICogbGluZUhlaWdodCk7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRXb3JkV3JhcFooKXsKLQlTdHJpbmcgdGVzdFN0cmluZyA9ICJMaW5lMVxuTGluZTIiOwotCQotCXRleHQuc2V0V29yZFdyYXAodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRXb3JkV3JhcCgpKTsKLQl0ZXh0LnNldFdvcmRXcmFwKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0V29yZFdyYXAoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRXb3JkV3JhcCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFdvcmRXcmFwKCkpOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIHRlc3RTdHJpbmcsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIjpmOiIsIDIsIHRleHQuZ2V0TGluZUNvdW50KCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDUsIDIpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmlkaUNvbG9yaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldE9mZnNldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhckNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVkaXRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3Jpem9udGFsSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvcml6b250YWxQaXhlbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0S2V5QmluZGluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVCYWNrZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lRGVsaW1pdGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVQaXhlbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZVJhbmdlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZXNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFicyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRSYW5nZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdvcmRXcmFwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlQWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhd0lJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdSYW5nZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJpZGlDb2xvcmluZ1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvcml6b250YWxJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvcml6b250YWxQaXhlbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEtleUJpbmRpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRhYnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEluZGV4SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wUGl4ZWxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXb3JkV3JhcFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIikpIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIikpIHRlc3RfYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKSkgdGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKSkgdGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJpZGlDb2xvcmluZyIpKSB0ZXN0X2dldEJpZGlDb2xvcmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRPZmZzZXQiKSkgdGVzdF9nZXRDYXJldE9mZnNldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhckNvdW50IikpIHRlc3RfZ2V0Q2hhckNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIikpIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4IikpIHRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwiKSkgdGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEtleUJpbmRpbmdJIikpIHRlc3RfZ2V0S2V5QmluZGluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKSkgdGVzdF9nZXRMaW5lQXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQmFja2dyb3VuZEkiKSkgdGVzdF9nZXRMaW5lQmFja2dyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVIZWlnaHQiKSkgdGVzdF9nZXRMaW5lSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSW5kZXgiKSkgdGVzdF9nZXRMaW5lSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVQaXhlbCIpKSB0ZXN0X2dldExpbmVQaXhlbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkiKSkgdGVzdF9nZXRMb2NhdGlvbkF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSIpKSB0ZXN0X2dldE9mZnNldEF0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0T2Zmc2V0QXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpKSB0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25SYW5nZSIpKSB0ZXN0X2dldFNlbGVjdGlvblJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25UZXh0IikpIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldFN0eWxlUmFuZ2VBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzIikpIHRlc3RfZ2V0U3R5bGVSYW5nZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKSkgdGVzdF9nZXRTdHlsZVJhbmdlc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJzIikpIHRlc3RfZ2V0VGFicygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJSSIpKSB0ZXN0X2dldFRleHRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BQaXhlbCIpKSB0ZXN0X2dldFRvcFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXb3JkV3JhcCIpKSB0ZXN0X2dldFdvcmRXcmFwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VBY3Rpb25JIikpIHRlc3RfaW52b2tlQWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnQiKSkgdGVzdF9wcmludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKSkgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zIikpIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd1JhbmdlSUlaIikpIHRlc3RfcmVkcmF3UmFuZ2VJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVwbGFjZVN0eWxlUmFuZ2VzSUkkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmlkaUNvbG9yaW5nWiIpKSB0ZXN0X3NldEJpZGlDb2xvcmluZ1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IikpIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0T2Zmc2V0SSIpKSB0ZXN0X3NldENhcmV0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIikpIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdGFibGVaIikpIHRlc3Rfc2V0RWRpdGFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSIpKSB0ZXN0X3NldEhvcml6b250YWxJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvcml6b250YWxQaXhlbEkiKSkgdGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRLZXlCaW5kaW5nSUkiKSkgdGVzdF9zZXRLZXlCaW5kaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0TGluZUJhY2tncm91bmRJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpKSB0ZXN0X3NldE9yaWVudGF0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25SYW5nZUlJIikpIHRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zZXRTdHlsZVJhbmdlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYnNJIikpIHRlc3Rfc2V0VGFic0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUGl4ZWxJIikpIHRlc3Rfc2V0VG9wUGl4ZWxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXb3JkV3JhcFoiKSkgdGVzdF9zZXRXb3JkV3JhcFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotLyoqCi0gKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxOTk4NQotICovCi1wcm90ZWN0ZWQgdm9pZCB0ZXN0UnRmQ29weSgpIHsKLQlTdHJpbmcgbGluZXMgPSAiTGluZTBcbkxpbmUxXG5MaW5lMlxuTGluZTNcbkxpbmU0XG5MaW5lNSI7Ci0JZmluYWwgaW50W10gbGluZXNDYWxsZWQgPSBuZXcgaW50W10gezB9OwotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IChTdHlsZWRUZXh0KSBldmVudC53aWRnZXQ7Ci0JCQlpbnQgbGluZUluZGV4ID0gc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoZXZlbnQubGluZU9mZnNldCk7Ci0JCQlpbnQgbGluZVN0YXJ0ID0gZXZlbnQubGluZU9mZnNldDsKLQkJCWludCBsaW5lRW5kID0gbGluZVN0YXJ0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCk7Ci0JCQlTdHlsZVJhbmdlIGdvb2RSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDAsIDEsIHJlZCwgcmVkKTsKLQkJCQotCQkJZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JCQlzd2l0Y2ggKGxpbmVJbmRleCAlIDYpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IGdvb2RSYW5nZTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQgLSAxLCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZVN0YXJ0LCAxLCByZWQsIHJlZCk7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIDEsIHJlZCwgcmVkKTsKLQkJCQkJZXZlbnQuc3R5bGVzWzFdID0gbmV3IFN0eWxlUmFuZ2UobGluZUVuZCAvIDIsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQotCX07Ci0JdGV4dC5zZXRUZXh0KGxpbmVzKTsJCi0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgibm90IGFsbCBsaW5lcyB0ZXN0ZWQgZm9yIFJURiBjb3B5IiwgbGluZXNDYWxsZWRbMF0gPT0gdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JCi0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVJURlRyYW5zZmVyIHJ0ZlRyYW5mZXIgPSBSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHJ0ZlRyYW5mZXIpOwotCWFzc2VydFRydWUoIlJURiBjb3B5IGZhaWxlZCIsIGNsaXBib2FyZFRleHQubGVuZ3RoKCkgPiAwKTsKLQotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JdGV4dC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCdhJywgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAxMCwgNTAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4OGU5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQmlkaVV0aWw7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dENvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlpbnQgWElOU0VUID0gMDsKLQotCWNsYXNzIENvbnRlbnRJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIFN0eWxlZFRleHRDb250ZW50IHsKLQkJU3RyaW5nIHRleHRDb250ZW50ID0gIiI7Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKXsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gImdldExpbmUiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICJnZXRMaW5lRGVsaW1pdGVyIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiB0ZXh0Q29udGVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJdGV4dENvbnRlbnQgPSB0ZXh0OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJCXRleHRDb250ZW50ID0gdGV4dDsKLQkJfQotCX0KLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gbmV3IENvbnRlbnRJbXBsZW1lbnRhdGlvbigpOwotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcml2YXRlIGJvb2xlYW4gaXNCaWRpKCkgewotCXJldHVybiBCaWRpVXRpbC5pc0JpZGlQbGF0Zm9ybSgpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JaWYgKGlzQmlkaSgpKSBYSU5TRVQgPSAyOwotCWVsc2UgWElOU0VUID0gMDsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXN0eWxlZFRleHQuc2V0Q29udGVudChjb250ZW50KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCS8vIGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCwgbm90IGNhbGxlZCBieSBTdHlsZWRUZXh0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlZFRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpIHsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZWRUZXh0LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQ291bnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc3R5bGVkVGV4dC5nZXRMaW5lQ291bnQoKSA9PSAxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlZFRleHQuZ2V0TGluZURlbGltaXRlcigpLmVxdWFscygiZ2V0TGluZURlbGltaXRlciIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSSgpIHsKLQkvLyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgZ2V0TGluZSB0byBiZSBjYWxsZWQKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZWRUZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCkuZXF1YWxzKG5ldyBQb2ludChYSU5TRVQsMCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCkgewotCS8vIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBnZXRPZmZzZXRBdExpbmUgdG8gYmUgY2FsbGVkCi0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLmVxdWFscyhuZXcgUG9pbnQoWElOU0VULDApKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dFJhbmdlSUkoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmc6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0UmFuZ2UoMCwwKS5lcXVhbHMoIiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JLy8gZG9lcyBub3QgbWFrZSBzZW5zZSB0byB0ZXN0LCBub3QgY2FsbGVkIGJ5IFN0eWxlZFRleHQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJ0ZXN0MSIpOwotCWFzc2VydFRydWUoIjpoOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygidGVzdDEiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLDAsInRlc3QyIik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0MiIpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRSYW5nZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9hZGRUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUF0T2Zmc2V0SSIpKSB0ZXN0X2dldExpbmVBdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVDb3VudCIpKSB0ZXN0X2dldExpbmVDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZURlbGltaXRlciIpKSB0ZXN0X2dldExpbmVEZWxpbWl0ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVJIikpIHRlc3RfZ2V0TGluZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKSkgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0UmFuZ2VJSSIpKSB0ZXN0X2dldFRleHRSYW5nZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODU3OTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvdygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Um93IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb3ciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSb3ciKSkgdGVzdF9nZXRSb3coKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDcyZmVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29sdW1uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbiIpKSB0ZXN0X2dldENvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbkkiKSkgdGVzdF9zZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhMDc5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCBzdHlsZSA9IFNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZXNlbGVjdEFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gZ2V0U2VsZWN0aW9uKCkgaXMgZnVydGhlciB0ZXN0ZWQgaW4gdGVzdF9zZWxlY3RBbGwgYW5kIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogQWZ0ZXIgYWRkaW5nIGl0ZW1zLCBidXQgYmVmb3JlIHNlbGVjdGluZyBhbnkiLCAwLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JLy8gZ2V0U2VsZWN0aW9uQ291bnQoKSBpcyBmdXJ0aGVyIHRlc3RlZCBpbiB0ZXN0X3NlbGVjdEFsbCBhbmQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUYWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JLyogT3ZlcnJpZGluZyB0ZXN0X2dldENoaWxkcmVuIGZyb20gVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUKLQkgKiB0byBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZSBjaGlsZCBvZiBhIFRhYmxlVHJlZSBpcyBhbHdheXMgYSBUYWJsZS4KLQkgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JLyogRlVUVVJFOiBTaG91bGQgYWxzbyBhZGQgc3ViLW5vZGVzLCBhbmQgdGVzdCBib3RoIHNpbmdsZSBhbmQgbXVsdGkgd2l0aCB0aG9zZS4KLQkgKiBpLmUuIHN1Yml0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0oaXRlbXNbaV0sIFNXVC5OT05FKTsgKi8KLQotCXNlbGVjdEFsbF9oZWxwZXIoIkVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIGl0ZW1zKTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQlzZWxlY3RBbGxfaGVscGVyKCJFbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0KLQlpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgU1dULk5PTkUpOwotCX0KLQlzZWxlY3RBbGxfaGVscGVyKCJzZWxlY3RBbGwoKSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCS8qIEZVVFVSRTogU2hvdWxkIGFsc28gYWRkIHN1Yi1ub2RlcywgYW5kIHRlc3QgYm90aCBzaW5nbGUgYW5kIG11bHRpIHdpdGggdGhvc2UuCi0JICogaS5lLiBzdWJpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW1zW2ldLCBTV1QuTk9ORSk7ICovCi0KLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiBlbXB0eSB0YWJsZSB0cmVlIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk1VTFRJOiBObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3RpbmcgbnVsbCBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW0gIiArIGksIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19KTsKLQl9Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IGl0ZW1zIiwgaXRlbXMsIGl0ZW1zKTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgdGFibGVUcmVlLmdldEl0ZW1zKCkpOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzJdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbM10sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzVdLCBpdGVtc1s3XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gdHdpY2UiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzRdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbNF19KTsKLQotCQotCS8qIE5vdyBydW4gdGhlIHNhbWUgdGVzdHMgb24gYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZS4gKi8KLQlzaW5nbGVTZWxlY3QoKTsKLQkKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgbm8gaXRlbXMgaW4gZW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gZW1wdHkgdGFibGUgdHJlZSIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQl9Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXRyeSB7Ci0JCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oKFRhYmxlVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIlNJTkdMRTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtICIgKyBpLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSk7Ci0JfQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtcyIsIGl0ZW1zLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgdGFibGVUcmVlLmdldEl0ZW1zKCkiLCB0YWJsZVRyZWUuZ2V0SXRlbXMoKSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzZdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1syXSwgaXRlbXNbM119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyB1bm9yZGVyZWQgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMl0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s3XSwgaXRlbXNbNV0sIGl0ZW1zWzJdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSB0d2ljZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIG11bHRpcGxlIHRpbWVzIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBtdWx0aXBsZSBpdGVtcyBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd1NlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJsZSIpKSB0ZXN0X2dldFRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIikpIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByaXZhdGUgVGFibGVUcmVlIHRhYmxlVHJlZTsKLXByaXZhdGUgaW50IHN0eWxlOwotCi0vKgotICogU2V0cyBhIHNpbmdsZS1zZWxlY3QgVGFibGVUcmVlIGFzIHRoZSB0ZXN0IHdpZGdldC4KLSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdC4KLSAqLwotcHJpdmF0ZSB2b2lkIHNpbmdsZVNlbGVjdCgpIHsKLQl0YWJsZVRyZWUuZGlzcG9zZSgpOwotCXRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIHN0eWxlID0gU1dULlNJTkdMRSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLS8qCi0gKiBVc2VkIGluIHRlc3Rfc2VsZWN0QWxsLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2VsZWN0QWxsX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGV4cGVjdGVkU2VsZWN0aW9uKSB7Ci0JdGFibGVUcmVlLnNlbGVjdEFsbCgpOwotCW1lc3NhZ2UgPSAoc3R5bGUgPT0gU1dULk1VTFRJID8gIk1VTFRJIiA6ICJTSU5HTEUiKSArICI6ICIgKyBtZXNzYWdlOwotCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbi5sZW5ndGgsIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRTYW1lKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi0vKgotICogVXNlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLgotICogTm90ZTogVGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGF0IHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0LgotICovCi1wcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uX2hlbHBlcihTdHJpbmcgbWVzc2FnZSwgVGFibGVUcmVlSXRlbVtdIGl0ZW1zVG9TZWxlY3QsIFRhYmxlVHJlZUl0ZW1bXSBleHBlY3RlZFNlbGVjdGlvbikgewotCXRhYmxlVHJlZS5zZXRTZWxlY3Rpb24oaXRlbXNUb1NlbGVjdCk7Ci0JbWVzc2FnZSA9IChzdHlsZSA9PSBTV1QuTVVMVEkgPyAiTVVMVEkiIDogIlNJTkdMRSIpICsgIjogIiArIG1lc3NhZ2U7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLmxlbmd0aCwgdGFibGVUcmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24sIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFibGVUcmVlKFZlY3RvciBldmVudHMsIGJvb2xlYW4gdHJhdmVyc2UpIHsKLSAgICBTdHJpbmcgdGVzdCA9IGdldFRlc3ROYW1lKCk7Ci0gICAgdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZVRyZWUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNzApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCB0ZXN0LCBldmVudHMpOwotCX0KLQlmb3IgKGludCBub2RlID0gMDsgbm9kZSA8IDQ7IG5vZGUrKykgewotCQlUYWJsZVRyZWVJdGVtIGl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChjb2wsICJUVEl0ZW0iICsgbm9kZSArIGNvbCk7Ci0JCX0KLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCVRhYmxlVHJlZUl0ZW0gc3ViaXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgMzsgY29sKyspIHsKLQkJCXN1Yml0ZW0uc2V0VGV4dChjb2wsICJUVFN1YiIgKyBub2RlICsgY29sKTsKLQkJfQotCQlob29rRXhwZWN0ZWRFdmVudHMoc3ViaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQl9Ci0JU3RyaW5nW10gdHlwZXMgPSAoU3RyaW5nW10pQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50T3JkZXJpbmcuZ2V0KCJUYWJsZVRyZWVUYWJsZSIpOwotCWlmKCF0cmF2ZXJzZSkgewotCSAgICBTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGggLTFdOwotCSAgICBTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCB0ZW1wLCAwLCB0eXBlcy5sZW5ndGgtMSk7Ci0JICAgIHR5cGVzID0gdGVtcDsKLQl9Ci0JaG9va0V4cGVjdGVkRXZlbnRzKHRhYmxlVHJlZS5nZXRUYWJsZSgpLCB0eXBlcywgZXZlbnRzKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMzAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTEsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgdGFibGVUcmVlLnNldFNlbGVjdGlvbihuZXcgVGFibGVUcmVlSXRlbVtdIHsgdGFibGVUcmVlLmdldEl0ZW1zKClbMF19KTsKLSAgICBpbnQgY29kZT1TV1QuQVJST1dfUklHSFQ7Ci0gICAgaWYoU3d0SnVuaXQuaXNHVEspCi0gICAgICAgIGNvZGUgPSBTV1QuS0VZUEFEX0FERDsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIGNvZGUsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZVRyZWUuZ2V0SXRlbUhlaWdodCgpKjIsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIGZhbHNlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAzMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjdlY2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlRWRpdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb2x1bW5JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uIikpIHRlc3RfZ2V0Q29sdW1uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtIikpIHRlc3RfZ2V0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29sdW1uSSIpKSB0ZXN0X3NldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKSkgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmM3ZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotCVRhYmxlVHJlZSB0YWJsZVRyZWU7Ci0JVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtOwotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCAwKTsKLQl0YWJsZVRyZWVJdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCAwKTsKLQlzZXRXaWRnZXQodGFibGVUcmVlSXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJhY2tncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHNJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hlY2tlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV4cGFuZGVkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFeHBhbmRlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvcmVncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmF5ZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEdyYXllZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENoZWNrZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFeHBhbmRlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRHcmF5ZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRHcmF5ZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoZWNrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4cGFuZGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEdyYXllZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzSSIpKSB0ZXN0X2dldEJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoZWNrZWQiKSkgdGVzdF9nZXRDaGVja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUkiKSkgdGVzdF9nZXRJbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRJIikpIHRlc3RfZ2V0VGV4dEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZGIwMGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JaW50IHZlcmlmeSA9IC0xOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gc3R5bGVkVGV4dC5nZXRDb250ZW50KCk7Ci0JVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQkJc3dpdGNoICh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG50ZXN0aW5nIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDMgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjozOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiXHJMaW5lIDFcclxuTGluZSAyIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA2IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA3IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlRoaXNcblxyIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA4IDogewotCQkJCQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxuTDFcclxuTDIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDkgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDF0ZXN0IikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMDp7Ci0JCQkJCWFzc2VydFRydWUoIjoxMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDExOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMToiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEyOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTM6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDFcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNDogewotCQkJCQlhc3NlcnRUcnVlKCI6MTQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTU6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3RcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNjp7Ci0JCQkJCWFzc2VydFRydWUoIjoxNjoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE3OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNzoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE4OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxODoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxXHJcbnRlc3RcclxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTk6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMXRlc3RcclxyXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2luZyhUZXh0Q2hhbmdpbmdFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCi0JYm9vbGVhbiBleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQl2ZXJpZnkgPSAxOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcblxuIik7Ci0JdmVyaWZ5ID0gMjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMiwgImEiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJhIik7Ci0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSA0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkxpbmUgMVxyXG5MaW5lIDIiKTsKLQl2ZXJpZnkgPSA1OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JdmVyaWZ5ID0gNjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCXZlcmlmeSA9IDc7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJcbkwxXHJcbkwyXHJcbiIpOwotCXZlcmlmeSA9IDg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSA5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdCIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDEwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICIiKTt9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTE7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgIiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTE6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxMjsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDEzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAidGVzdCIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE1OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNjsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxyXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxNzsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAidGVzdFxuXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE3OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0gCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDE4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAyMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoyMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjozYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA1IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjo2YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDcgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo3YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6N2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA4IDogewotCQkJCQlhc3NlcnRUcnVlKCI6OGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjo5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MTJiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTM6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDMpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyMDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsJCi0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnNldFRleHQoInRlc3RpbmciKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIlxuXG4iKTsKLQotCXZlcmlmeSA9IDQ7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gNjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQotCXZlcmlmeSA9IDc7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdCIpOwotCi0JdmVyaWZ5ID0gMTA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxMjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAxNDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQotCXZlcmlmeSA9IDE2OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAxNzsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTg7Ci0gCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG50ZXN0XHJcbiIpOwotCi0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0JdmVyaWZ5ID0gMjA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoyMDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBzdHlsZWRUZXh0LmdldENvbnRlbnQoKTsKLQlUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dFNldChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKHZlcmlmeSkgewotCQkJCWNhc2UgMSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJ0ZXN0aW5nIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDMgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjozOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMzsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQkKLQl2ZXJpZnkgPSA0OwotCXRyeSB7c3R5bGVkVGV4dC5zZXRUZXh0KG51bGwpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjQ6IiwgdHJ1ZSk7fQkKLQljb250ZW50LnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKSkgdGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50IikpIHRlc3RfdGV4dENoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50IikpIHRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTViMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlZEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlhMzRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdpbmdFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdpbmdFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTA3Njc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVHJlZUVkaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmZWEyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCkgewotCVZlcmlmeUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmICh2ZXJpZnkgIT0gMSkge2V2ZW50LmRvaXQgPSBmYWxzZTt9Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCXZlcmlmeSA9IDE7Ci0JRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0KLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiIik7Ci0JZSA9IG5ldyBFdmVudCgpOwotCWUuY2hhcmFjdGVyID0gJ2EnOwotCXN0eWxlZFRleHQubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlEb3duLCBlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQlzdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IikpIHRlc3RfdmVyaWZ5S2V5TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ0ZTExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZpZXdGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wQ2VudGVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BDZW50ZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BMZWZ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BMZWZ0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUmlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcFJpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvcmRlclZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wQ2VudGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BMZWZ0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BSaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcENlbnRlclNlcGFyYXRlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wTGVmdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wQ2VudGVyIikpIHRlc3RfZ2V0VG9wQ2VudGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BMZWZ0IikpIHRlc3RfZ2V0VG9wTGVmdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUmlnaHQiKSkgdGVzdF9nZXRUb3BSaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0WiIpKSB0ZXN0X2xheW91dFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIikpIHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKSkgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVoiKSkgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRhMjM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKSkgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE1MDg0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZVR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdmFpbGFibGVUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0Rpc3Bvc2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcyIpKSB0ZXN0X2dldEF2YWlsYWJsZVR5cGVOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMiKSkgdGVzdF9nZXRBdmFpbGFibGVUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkwNWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5ECi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RORCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lcnJvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUkiKSkgdGVzdF9lcnJvcklJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDZiYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpKSB0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zZmVyIikpIHRlc3RfZ2V0VHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDBlODUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTIzNzhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2U1Y2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyYjZlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpKSB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zZmVyIikpIHRlc3RfZ2V0VHJhbnNmZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIikpIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA5NmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTliM2E5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTA3NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkODJjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluc3RhbmNlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluc3RhbmNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluc3RhbmNlIikpIHRlc3RfZ2V0SW5zdGFuY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjY0ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlJURlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5zdGFuY2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfUlRGVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnN0YW5jZSIpKSB0ZXN0X2dldEluc3RhbmNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGFiYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnN0YW5jZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5zdGFuY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5zdGFuY2UiKSkgdGVzdF9nZXRJbnN0YW5jZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNDBmMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMiKSkgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDcxYmVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzNlNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkFybUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgQXJtRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGJlZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1MaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldEFybWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQiKSkgdGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMzAyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzk5MDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgQ29udHJvbEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTQ1ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKSkgdGVzdF9jb250cm9sTW92ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDIwNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgRGlzcG9zZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OGQ4YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50IikpIHRlc3Rfd2lkZ2V0RGlzcG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmJhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDI2NjA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEZvY3VzRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZiZTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0dhaW5lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IikpIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNzc4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBIZWxwRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzOTE4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCIpKSB0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhM2Q2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMGYwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBLZXlFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmM2I1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpKSB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY4NzdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKSkgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmMxZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTWVudUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDJiZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhOTMyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBNb2RpZnlFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNWQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50IikpIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFlOTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YwMzU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IE1vdXNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkzYTE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0NzU5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VNb3ZlTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM0ZjNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTQ5ZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VFeGl0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjZTk4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBQYWludEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxM2FkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFpbnRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCIpKSB0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NzQwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY2Yzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFNlbGVjdGlvbkV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U0NGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MyZWMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5OTk1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBTaGVsbEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5MzhiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxBY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbENsb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMWExNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFRyYXZlcnNlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVkMWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlUcmF2ZXJzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50IikpIHRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTczODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkMWMxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFRyZWVFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk5MzcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyZWVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpKSB0ZXN0X3RyZWVFeHBhbmRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJlY2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UeXBlZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3Qgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWV2ZW50LndpZGdldCA9IHNoZWxsOwotCVR5cGVkRXZlbnQgdHlwZWRFdmVudCA9IG5ld1R5cGVkRXZlbnQoZXZlbnQpOwotCWFzc2VydE5vdE51bGwodHlwZWRFdmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlldmVudC53aWRnZXQgPSBzaGVsbDsKLQlUeXBlZEV2ZW50IHR5cGVkRXZlbnQgPSBuZXdUeXBlZEV2ZW50KGV2ZW50KTsKLQlhc3NlcnROb3ROdWxsKHR5cGVkRXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZSh0eXBlZEV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBUeXBlZEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzcyNDZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVmVyaWZ5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzUzMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdmVyaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCIpKSB0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThjYTY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgQ29sb3IoRGV2aWNlIGRldmljZSwgaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTUKLQotCS8vIHZhbGlkIGNvbG9yIChibGFjaykKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHdoaXRlKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tIGdyZXkpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjAsIDIwLCAyMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMDIsIDI1NSwgMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljb2xvciA9IG5ldyBDb2xvcihudWxsLCAwLCAwLCAwKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiIDwgMAotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIC0xMCwgLTEwLCAtMTApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEwMDAsIDIwMDAsIDMwMDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGJsdWUgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMCwgMTAsIDI1Nik7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQkvLyBUZXN0IG5ldyBDb2xvcihEZXZpY2UgZGV2aWNlLCBSR0IgcmdiKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NTsgb3IgcmdiIGlzIG51bGwKLQkKLQkvLyB2YWxpZCBjb2xvciAoYmxhY2spCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAwLCAwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yICh3aGl0ZSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSBncmV5KQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAsIDEwLCAxMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAocmFuZG9tKQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAyLCAyNTUsIDApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gZGV2aWNlID09IG51bGwgKHZhbGlkKQotCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIG5ldyBSR0IoMCwgMCwgMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPCAwCi0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigtMTAsIC0xMCwgLTEwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMDAwLCAyMDAwLCAzMDAwKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBibHVlID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxMCwgMTAsIDI1NikpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiID09IG51bGwKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBudWxsKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pc0Rpc3Bvc2VkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMSwgMiwgMyk7Ci0JQ29sb3Igc2FtZUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEsIDIsIDMpOwotCUNvbG9yIHNhbWVDb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigxLCAyLCAzKSk7Ci0JQ29sb3Igb3RoZXJDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCA1LCA2LCA3KTsKLQl0cnkgewotCQkvLyBUZXN0IENvbG9yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSIsICFjb2xvci5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBDb2xvci5lcXVhbHMoQ29sb3IpCi0JCWFzc2VydFRydWUoIiFjb2xvci5lcXVhbHMoKENvbG9yKW51bGwpIiwgIWNvbG9yLmVxdWFscygoQ29sb3IpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoY29sb3IpIiwgY29sb3IuZXF1YWxzKGNvbG9yKSk7Ci0JCWFzc2VydFRydWUoImNvbG9yLmVxdWFscyhzYW1lQ29sb3IpIiwgY29sb3IuZXF1YWxzKHNhbWVDb2xvcikpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikiLCBjb2xvci5lcXVhbHMoc2FtZUNvbG9yMikpOwotCQlhc3NlcnRUcnVlKCIhY29sb3IuZXF1YWxzKG90aGVyQ29sb3IpIiwgIWNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IuZGlzcG9zZSgpOwotCQlzYW1lQ29sb3IyLmRpc3Bvc2UoKTsKLQkJb3RoZXJDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJsdWUoKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRCbHVlKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0Qmx1ZSgpIiwgY29sb3IuZ2V0Qmx1ZSgpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JlZW4oKSB7Ci0JLy8gVGVzdCBDb2xvci5nZXRHcmVlbigpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMjU1LCAwKTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldEdyZWVuKCkiLCBjb2xvci5nZXRHcmVlbigpLCAyNTUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWFzc2VydE5vdE51bGwoY29sb3IuZ2V0UkdCKCkpOwotCWFzc2VydEVxdWFscyhuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBjb2xvci5nZXRSR0IoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVkKCkgewotCS8vIFRlc3QgQ29sb3IuZ2V0UmVkKCkKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscygiY29sb3IuZ2V0UmVkKCkiLCBjb2xvci5nZXRSZWQoKSwgMjU1KTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEyLCAzNCwgNTYpOwotCUNvbG9yIG90aGVyQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTIsIDM0LCA1Nik7Ci0JaWYgKGNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSkgewotCQlhc3NlcnRFcXVhbHMoIkhhc2ggY29kZXMgb2YgZXF1YWwgb2JqZWN0cyBzaG91bGQgYmUgZXF1YWwiLCBjb2xvci5oYXNoQ29kZSgpLCBvdGhlckNvbG9yLmhhc2hDb2RlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgQ29sb3IuaXNEaXNwb3NlZCgpIGZhbHNlCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMzQsIDY3LCA5OCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiQ29sb3Igc2hvdWxkIG5vdCBiZSBkaXNwb3NlZCIsICFjb2xvci5pc0Rpc3Bvc2VkKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFRlc3QgQ29sb3IuaXNEaXNwb3NlZCgpIHRydWUKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlhc3NlcnRUcnVlKCJDb2xvciBzaG91bGQgYmUgZGlzcG9zZWQiLCBjb2xvci5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAyNTUpOwotCXRyeSB7Ci0JCWFzc2VydE5vdE51bGwoY29sb3IudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoY29sb3IudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCQlhc3NlcnRFcXVhbHMoIkNvbG9yIHswLCAwLCAyNTV9IiwgY29sb3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIHBsYXRmb3JtIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qmx1ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JlZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qmx1ZSIpKSB0ZXN0X2dldEJsdWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyZWVuIikpIHRlc3RfZ2V0R3JlZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQiIpKSB0ZXN0X2dldFJHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVkIikpIHRlc3RfZ2V0UmVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YWVmYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBUZXN0IG5ldyBDdXJzb3IoRGV2aWNlIGRldmljZSwgaW50IHN0eWxlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGFuIHVua25vd24gc3R5bGUgaXMgc3BlY2lmaWVkCi0KLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0FSUk9XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQVBQU1RBUlRJTkcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEVMUCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFQUxMKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVORVNXKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOUyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTldTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU4pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVMpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRUUpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVcpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5FKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVTRSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFU1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1VQQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSUJFQU0pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfTk8pOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljdXJzb3IgPSBuZXcgQ3Vyc29yKG51bGwsIFNXVC5DVVJTT1JfQVJST1cpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpCi0JdHJ5IHsKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCAxMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA+IFNXVC5DVVJTT1JfSEFORCAoMjEpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBzdHlsZSA8IDAKLQl0cnkgewotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIC0xMDApOwotCQljdXJzb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHlsZSA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCkgewotCS8vIFRlc3QgbmV3IEN1cnNvcihEZXZpY2UgZGV2aWNlLCBJbWFnZURhdGEgc291cmNlLCBJbWFnZURhdGEgbWFzaywgaW50IGhvdHNwb3RYLCBpbnQgaG90c3BvdFkpCi0JaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQlJbWFnZURhdGEgc291cmNlID0gbG9hZGVyLmxvYWQoc3RyZWFtKVswXTsKLQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQlpZiAobWFzayAhPSBudWxsICYmIChzb3VyY2UuZGVwdGggPT0gMSkpIHsKLQkJCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZSwgbWFzaywgMCwgMCk7Ci0JCQljdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY29udGludWU7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaXNEaXNwb3NlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8qIE5vdGU6IFR3byBjdXJzb3JzIGFyZSBvbmx5IGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhlaXIgaGFuZGxlcyBhcmUgZXF1YWwuCi0JICogU28gc2luY2UgV2luZG93cyByZXVzZXMgY3Vyc29yIGhhbmRsZXMsIGFuZCBvdGhlciBwbGF0Zm9ybXMgZG8gbm90LAotCSAqIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCB3aGV0aGVyIGN1cnNvci5lcXVhbHMoc2FtZUN1cnNvcikuCi0JICovCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQlDdXJzb3Igb3RoZXJDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCXRyeSB7Ci0JCS8vIFRlc3QgQ3Vyc29yLmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhY3Vyc29yLmVxdWFscygoT2JqZWN0KW51bGwpKTsKLQotCQkvLyBUZXN0IEN1cnNvci5lcXVhbHMoQ3Vyc29yKQotCQlhc3NlcnRUcnVlKCIhY3Vyc29yLmVxdWFscygoQ3Vyc29yKW51bGwpIiwgIWN1cnNvci5lcXVhbHMoKEN1cnNvciludWxsKSk7Ci0JCWFzc2VydFRydWUoImN1cnNvci5lcXVhbHMoY3Vyc29yKSIsIGN1cnNvci5lcXVhbHMoY3Vyc29yKSk7Ci0JCWFzc2VydFRydWUoIiFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSIsICFjdXJzb3IuZXF1YWxzKG90aGVyQ3Vyc29yKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJb3RoZXJDdXJzb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFzaENvZGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgQ3Vyc29yLmlzRGlzcG9zZWQoKSBmYWxzZQotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhY3Vyc29yLmlzRGlzcG9zZWQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gVGVzdCBDdXJzb3IuaXNEaXNwb3NlZCgpIHRydWUKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiQ3Vyc29yIHNob3VsZCBiZSBkaXNwb3NlZCIsIGN1cnNvci5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCWFzc2VydE5vdE51bGwoY3Vyc29yLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoY3Vyc29yLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcxZDgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpZW50QXJlYSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERQSSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RFBJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVwdGgoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlcHRoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGV2aWNlRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGV2aWNlRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3lzdGVtQ29sb3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtRm9udCgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3lzdGVtRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdhcm5pbmdzKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXYXJuaW5ncyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0Rpc3Bvc2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2FybmluZ3NaKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXYXJuaW5nc1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RFBJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXB0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2FybmluZ3MiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXYXJuaW5nc1oiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERQSSIpKSB0ZXN0X2dldERQSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVwdGgiKSkgdGVzdF9nZXREZXB0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGV2aWNlRGF0YSIpKSB0ZXN0X2dldERldmljZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaIikpIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpKSB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtRm9udCIpKSB0ZXN0X2dldFN5c3RlbUZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdhcm5pbmdzIikpIHRlc3RfZ2V0V2FybmluZ3MoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2FybmluZ3NaIikpIHRlc3Rfc2V0V2FybmluZ3NaKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA4NDZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2VEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRGV2aWNlRGF0YSBkYXRhID0gbmV3IERldmljZURhdGEoKTsKLQlkYXRhLmRlYnVnID0gdHJ1ZTsKLQlkYXRhLnRyYWNraW5nID0gdHJ1ZTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTlmZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EcmF3YWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Mzg2MDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1EaXNwbGF5IGRpc3BsYXk7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0JCi0JLy8gbnVsbCAgZGV2aWNlIGFyZ3VtZW50Ci0JCi0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBuZXcgRm9udERhdGFbMV07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KG51bGwsZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gbnVsbCBkYXRhIGFyZ3VtZW50Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gbnVsbDsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCS8vIHplcm8gbGVuZ3RoIGRhdGEgYXJyYXkKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSBuZXcgRm9udERhdGFbMF07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gbnVsbCBkYXRhIGVsZW1lbnQKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSB7Ci0JCQludWxsLAotCQkJbmV3IEZvbnREYXRhKCkKLQkJfTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoIm51bGwgZGF0YSBlbGVtZW50IDAiLGV4Y2VwdGlvblRocm93bik7Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQlGb250RGF0YVtdIGRhdGEgPSB7Ci0JCQluZXcgRm9udERhdGEoKSwKLQkJCW51bGwKLQkJfTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9IAotCWFzc2VydFRydWUoIm51bGwgZGF0YSBlbGVtZW50IDEiLGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCB0aGF0IEZvbnREYXRhIGlzIHNldCBjb3JyZWN0bHkKLQkKLQlGb250RGF0YSBkYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSxkYXRhKTsKLQlGb250RGF0YVtdIHJldHVybmVkRGF0YSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQlhc3NlcnRFcXVhbHMoZGF0YSxyZXR1cm5lZERhdGFbMF0pOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCS8vIFRlc3QgbmV3IEZvbnQoRGV2aWNlIGRldmljZSwgRm9udERhdGEgZmQpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZCBhcmd1bWVudCBpcyBudWxsCi0JLy8gU1dURXJyb3I6IEVSUk9SX05PX0hBTkRMRVMsIGlmIGEgZm9udCBjb3VsZCBub3QgYmUgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBmb250IGRhdGEKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCBubyBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoIiIsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggdW5rbm93biBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKCJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggMCBoZWlnaHQgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAwLCBTV1QuTk9STUFMKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgYm9sZCAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgZm9udERhdGEgPT0gbnVsbAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAoRm9udERhdGEpbnVsbCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmb250RGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKG51bGwsIDEwLCBTV1QuTk9STUFMKSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udChEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbmFtZSwgaW50IGhlaWdodCwgaW50IHN0eWxlKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBhcmd1bWVudCBpcyBudWxsIG9yIHRoZSBoZWlnaHQgaXMgbmVnYXRpdmUKLQkvLyBTV1RFcnJvcjogRVJST1JfTk9fSEFORExFUywgaWYgYSBmb250IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50cwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIG5vIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICIiLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBmb250IHdpdGggdW5rbm93biBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIG5vcm1hbCAxMDAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuSVRBTElDKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQobnVsbCwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbnVsbCwgMTAsIFNXVC5OT1JNQUwpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBoZWlnaHQgPCAwCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEZhbHNlKGZvbnQuaXNEaXNwb3NlZCgpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKGZvbnQuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvLyBGb250cyBhcmUgb25seSBlcXVhbCBpZiB0aGVpciBoYW5kbGVzIGFyZSB0aGUgc2FtZSAoPyEpCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udCBvdGhlckZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQkvLyBUZXN0IEZvbnQuZXF1YWxzKE9iamVjdCkKLQkJYXNzZXJ0VHJ1ZSgiIWZvbnQuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhZm9udC5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBGb250LmVxdWFscyhGb250KQotCQlhc3NlcnRUcnVlKCIhZm9udC5lcXVhbHMoKEZvbnQpbnVsbCkiLCAhZm9udC5lcXVhbHMoKEZvbnQpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJmb250LmVxdWFscyhmb250KSIsIGZvbnQuZXF1YWxzKGZvbnQpKTsKLQkJYXNzZXJ0VHJ1ZSgiIWZvbnQuZXF1YWxzKG90aGVyRm9udCkiLCAhZm9udC5lcXVhbHMob3RoZXJGb250KSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCW90aGVyRm9udC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnREYXRhKCkgewotCS8vIFRlc3QgRm9udC5nZXRGb250RGF0YSgpCi0JLy8gdmFsaWQgbm9ybWFsIDEwLXBvaW50IGZvbnQKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlhc3NlcnRUcnVlKCJObyBmb250IGRhdGEiLCBmb250RGF0YSAhPSBudWxsICYmIGZvbnREYXRhLmxlbmd0aCA+IDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDEwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5OT1JNQUwsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgMjAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuQk9MRCk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAyMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuQk9MRCwgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgaXRhbGljIDMwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAzMCwgU1dULklUQUxJQyk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDMwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5JVEFMSUMsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDQwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCA0MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQl0cnkgewotCQlGb250RGF0YSBmb250RGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgZm9udERhdGFbMF0uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IGhlaWdodCIsIDQwLCBmb250RGF0YVswXS5nZXRIZWlnaHQoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBzdHlsZSIsIFNXVC5CT0xEIHwgU1dULklUQUxJQywgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gdmFsaWQgMTAtcG9pbnQgZm9udCB3aXRoIHVua25vd24gbmFtZQotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgbmFtZSIsICJiYWQtZm9udCIsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAxMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuTk9STUFMLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQuaGFzaENvZGUoKSxmb250Lmhhc2hDb2RlKCkpOwotCUZvbnQgYm9sZEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0RmFsc2UoZm9udC5oYXNoQ29kZSgpID09IGJvbGRGb250Lmhhc2hDb2RlKCkpOwotCWJvbGRGb250LmRpc3Bvc2UoKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIFRlc3QgRm9udC5pc0Rpc3Bvc2VkKCkgZmFsc2UKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJGb250IHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhZm9udC5pc0Rpc3Bvc2VkKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFRlc3QgRm9udC5pc0Rpc3Bvc2VkKCkgdHJ1ZQotCQlmb250LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiRm9udCBzaG91bGQgYmUgZGlzcG9zZWQiLCBmb250LmlzRGlzcG9zZWQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydE5vdE51bGwoZm9udC50b1N0cmluZygpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlhc3NlcnROb3ROdWxsKGZvbnQudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udERhdGEiKSkgdGVzdF9nZXRGb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyNjNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKCkKLQluZXcgRm9udERhdGEoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKFN0cmluZyBzdHJpbmcpCi0JRm9udERhdGEgZmQgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udERhdGEgcmVjb25zdHJ1Y3RlZEZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZkLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscyhmZCwgcmVjb25zdHJ1Y3RlZEZvbnREYXRhKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JLy8gVGVzdCBuZXcgRm9udERhdGEoU3RyaW5nIG5hbWUsIGludCBoZWlnaHQsIGludCBzdHlsZSkKLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCBubyBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQluZXcgRm9udERhdGEoIiIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIHVua25vd24gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JbmV3IEZvbnREYXRhKCJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAwLCBTV1QuTk9STUFMKTsKLQotCS8vIHZhbGlkIGZvbnQgZGF0YSB3aXRoIDEwMDAgaGVpZ2h0IChwcmV0dHkgYmlnLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQkKLQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250IGRhdGEKLQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQgZGF0YQotCW5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0KLQkvLyB2YWxpZCBpdGFsaWMgMTAtcG9pbnQgZm9udCBkYXRhCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwotCi0JLy8gdmFsaWQgYm9sZCBpdGFsaWMgMTAtcG9pbnQgZm9udCBkYXRhCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQluZXcgRm9udERhdGEobnVsbCwgMTAsIFNXVC5OT1JNQUwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGhlaWdodCA8IDAKLQl0cnkgewotCQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAtMTAsIFNXVC5OT1JNQUwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRm9udERhdGEgZmQxID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIGZkMiA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZmQxLGZkMSk7Ci0JYXNzZXJ0RXF1YWxzKGZkMSxmZDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQkvLyBGb250LmdldEhlaWdodCgpIHRlc3RlZCBpbiB0ZXN0X3NldEhlaWdodEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbGUoKSB7Ci0JLy8gRm9udERhdGEuZ2V0TG9jYWxlKCkgdGVzdGVkIGluIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCS8vIEZvbnQuZ2V0TmFtZSgpIHRlc3RlZCBpbiB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIEZvbnQuZ2V0U3R5bGUoKSB0ZXN0ZWQgaW4gdGVzdF9zZXRTdHlsZUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlGb250RGF0YSBmZDEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JRm9udERhdGEgZmQyID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscyhmZDEsZmQyKTsKLQlhc3NlcnRFcXVhbHMoZmQxLmhhc2hDb2RlKCksZmQyLmhhc2hDb2RlKCkpOwotCUZvbnREYXRhIGZkMyA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7Ci0JYXNzZXJ0RmFsc2UoZmQxLmhhc2hDb2RlKCkgPT0gZmQzLmhhc2hDb2RlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlaWdodEkoKSB7Ci0JLy8gVGVzdCBGb250LnNldEhlaWdodChpbnQgIGhlaWdodCkKLQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhIGZvciB2YXJpb3VzIGhlaWdodHMKLQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgYm9sZCBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotCi0JLy8gdmFsaWQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQyk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsJCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJZm9udERhdGEuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgZm9udERhdGEuZ2V0SGVpZ2h0KCksIGhlaWdodCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuRU5HTElTSDsKLQlmZC5zZXRMb2NhbGUobG9jYWxlLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscyhMb2NhbGUuRU5HTElTSC50b1N0cmluZygpLGZkLmdldExvY2FsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gVGVzdCBGb250LnNldE5hbWUoU3RyaW5nIG5hbWUpCi0JLy8gdmFsaWQgbmFtZQotCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQotCS8vIHZhbGlkIG5hbWUgKHVua25vd24gbmFtZSwgYnV0IHZhbGlkKQotCWZvbnREYXRhLnNldE5hbWUoImJhZC1mb250Iik7Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgZm9udERhdGEuZ2V0TmFtZSgpLCAiYmFkLWZvbnQiKTsKLQotCS8vIHZhbGlkIG5hbWUgKGVtcHR5IHN0cmluZywgYnV0IHZhbGlkKQotCS8vIG9ubHkgb24gd2luZG93cyBzaW5jZSBtb3RpZiBzdXBwb3J0cyBzZXBhcmF0ZSBmb250IGZvdW5kcmllcwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJZm9udERhdGEuc2V0TmFtZSgiIik7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgIiIpOwotCX0KLQotCS8vIHZhbGlkIG5hbWUKLQlmb250RGF0YS5zZXROYW1lKFN3dEp1bml0LnRlc3RGb250TmFtZSk7CQotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lKTsKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBuYW1lID09IG51bGwKLQl0cnkgewotCQlmb250RGF0YS5zZXROYW1lKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdHlsZUkoKSB7Ci0JLy8gVGVzdCBGb250LnNldFN0eWxlKGludCAgc3R5bGUpCi0JZm9yIChpbnQgaGVpZ2h0ID0gMDsgaGVpZ2h0IDwgMTAwMDsgaGVpZ2h0KyspIHsKLQkJLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YQotCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGhlaWdodCwgU1dULk5PUk1BTCk7CQotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0KLQkJLy8gdmFsaWQgYm9sZCBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQpOwotCi0JCS8vIHZhbGlkIGl0YWxpYyBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULklUQUxJQyk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc3R5bGUiLCBmb250RGF0YS5nZXRTdHlsZSgpLCBTV1QuSVRBTElDKTsKLQkJCi0JCS8vIHZhbGlkIGJvbGQgaXRhbGljIGZvbnQgZGF0YQotCQlmb250RGF0YS5zZXRTdHlsZShTV1QuSVRBTElDIHwgU1dULkJPTEQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQotCQkvLyB2YWxpZCBub3JtYWwgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5OT1JNQUwpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULk5PUk1BTCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvbnREYXRhIGRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2FsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWlnaHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYWxlIikpIHRlc3RfZ2V0TG9jYWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXROYW1lIikpIHRlc3RfZ2V0TmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVpZ2h0SSIpKSB0ZXN0X3NldEhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3R5bGVJIikpIHRlc3Rfc2V0U3R5bGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX0xPR0ZPTlRJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTYwNjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlnYyA9IG5ldyBHQyhzaGVsbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWdjLmRpc3Bvc2UoKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRm9udE1ldHJpY3MgZm0xID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlGb250TWV0cmljcyBmbTIgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWFzc2VydFRydWUoZm0xLmVxdWFscyhmbTIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBc2NlbnQoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZtLmdldEFzY2VudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEF2ZXJhZ2VDaGFyV2lkdGgoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWZtLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXNjZW50KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXREZXNjZW50KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVpZ2h0KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRIZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMZWFkaW5nKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRMZWFkaW5nKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udE1ldHJpY3MgZm0xID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlGb250TWV0cmljcyBmbTIgPSBnYy5nZXRGb250TWV0cmljcygpOwotCWlmIChmbTEuZXF1YWxzKGZtMikpIHsKLQkJYXNzZXJ0RXF1YWxzKGZtMS5oYXNoQ29kZSgpLCBmbTIuaGFzaENvZGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQygpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXNjZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXNjZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExlYWRpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXNjZW50IikpIHRlc3RfZ2V0QXNjZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoIikpIHRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVzY2VudCIpKSB0ZXN0X2dldERlc2NlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGVhZGluZyIpKSB0ZXN0X2dldExlYWRpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQyIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfVEVYVE1FVFJJQygpOwotfQotCi0vKiBjdXN0b20gKi8KLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JR0MgZ2M7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjE4N2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQyBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygwLDMwLDI0MCwyOTApOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDIwMCwgMjAwKTsKLQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWdjLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUoKSB7Ci0JdHJ5IHsKLQkJR0MgZ2MgPSBuZXcgR0MobnVsbCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJR0MgZ2MxID0gbmV3IEdDKGltYWdlKTsKLQkJR0MgZ2MyID0gbmV3IEdDKGltYWdlKTsKLQkJZ2MxLmRpc3Bvc2UoKTsKLQkJZ2MyLmRpc3Bvc2UoKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIGltYWdlIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHsKLQkJLy8gTm8gcHJpbnRlciBpbnN0YWxsZWQuIFNraXAgdGVzdC4KLQkJcmV0dXJuOwotCX0KLQlDbGFzcyBwcmludGVyQ2xhc3MgPSBudWxsOwotCXRyeSB7Ci0JCXByaW50ZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIFByaW50ZXIgY2xhc3Mgbm90IHByZXNlbnQgKGVTV1QpLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JdHJ5IHsKLQkJLy8gRGlyZWN0IGluc3RhbnRpYXRpb24gcmVzdWx0cyBpbiBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGR1cmluZyBjbGFzcyAKLQkJLy8gbG9hZGluZy9pbml0aWFsaXphdGlvbi4gQ2FzdGluZyBzZWVtcyB0byBiZSBvay4KLQkJT2JqZWN0IHByaW50ZXIgPSBwcmludGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJR0MgZ2MxID0gbmV3IEdDKChQcmludGVyKSBwcmludGVyKTsKLQkJR0MgZ2MyID0gbmV3IEdDKChQcmludGVyKSBwcmludGVyKTsKLQkJZ2MxLmRpc3Bvc2UoKTsKLQkJZ2MyLmRpc3Bvc2UoKTsKLQkJKChQcmludGVyKSBwcmludGVyKS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIHByaW50ZXIiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJKCkgewotCXRyeSB7Ci0JCUdDIGdjID0gbmV3IEdDKG51bGwsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkcmF3YWJsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCQlHQyBnYzEgPSBuZXcgR0MoaW1hZ2UsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQkJR0MgZ2MyID0gbmV3IEdDKGltYWdlLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCWNhbnZhcy5kaXNwb3NlKCk7Ci0KLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8vIE5vIHByaW50ZXIgaW5zdGFsbGVkLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JQ2xhc3MgcHJpbnRlckNsYXNzID0gbnVsbDsKLQl0cnkgewotCQlwcmludGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlciIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBQcmludGVyIGNsYXNzIG5vdCBwcmVzZW50IChlU1dUKS4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCS8vIERpcmVjdCBpbnN0YW50aWF0aW9uIHJlc3VsdHMgaW4gYSBOb0NsYXNzRGVmRm91bmRFcnJvciBkdXJpbmcgY2xhc3MgCi0JCS8vIGxvYWRpbmcvaW5pdGlhbGl6YXRpb24uIENhc3Rpbmcgc2VlbXMgdG8gYmUgb2suCi0JCU9iamVjdCBwcmludGVyID0gcHJpbnRlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCUdDIGdjMSA9IG5ldyBHQygoUHJpbnRlcilwcmludGVyLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCUdDIGdjMiA9IG5ldyBHQygoUHJpbnRlcilwcmludGVyLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCSgoUHJpbnRlcikgcHJpbnRlcikuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weUFyZWFJSUlJSUkoKSB7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCVJHQiB3aGl0ZVJHQiA9IGdldFJlYWxSR0Iod2hpdGUpOwotCVJHQiBibHVlUkdCID0gZ2V0UmVhbFJHQihibHVlKTsKLQlpbnQgd2lkdGggPSAyMDsKLQlpbnQgaGVpZ2h0ID0gMjA7Ci0JaW50IGRlc3RYID0gMTA7Ci0JaW50IGRlc3RZID0gNTA7Ci0KLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGJsdWUpOwotCWdjLmZpbGxSZWN0YW5nbGUoNSwgMCwgNiwgMSk7Ci0JZ2MuY29weUFyZWEoMCwgMCwgd2lkdGgsIGhlaWdodCwgZGVzdFgsIGRlc3RZKTsKLQotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7IAotCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDQsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgNSwgZGVzdFkpOwotIAlhc3NlcnRFcXVhbHMoIjpiOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7CQotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgMTAsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7CQotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKGRlc3RYICsgMTEsIGRlc3RZKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCkgewotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlSR0Igd2hpdGVSR0IgPSBnZXRSZWFsUkdCKHdoaXRlKTsKLQlSR0IgYmx1ZVJHQiA9IGdldFJlYWxSR0IoYmx1ZSk7Ci0JCi0JZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChibHVlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDUsIDAsIDYsIDEpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEyLCAxMik7Ci0JZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7IAotCWludCBwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCg0LCAwKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHdoaXRlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDUsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgxMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgxMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQlnYy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0FyY0lJSUlJSSgpIHsKLQlnYy5kcmF3QXJjKDEwLCAyMCwgNTAsIDI1LCA5MCwgOTApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3Rm9jdXNJSUlJKCkgewotCWdjLmRyYXdGb2N1cygxLCAxLCA1MCwgMjUpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKSB7Ci0JQ29sb3IgYzEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQlDb2xvciBjMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQlDb2xvciBjMyA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZURhdGEgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtjMS5nZXRSR0IoKSwgYzIuZ2V0UkdCKCksIGMzLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKDMwLDMwLCA4LCBwYWxldHRlRGF0YSk7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlpZiAoeCA+IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgaWYgKHggPCB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMyLmdldFJHQigpKSk7Ci0JCQllbHNlIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzMuZ2V0UkdCKCkpKTsKLQkJfQotCX0KLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzEuZ2V0UkdCKCkpOwotCUltYWdlIGltYWdlVHJhbnNwYXJlbnQgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBkYXRhLmhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQlkYXRhLnNldEFscGhhKHgsIHksIDEyNyk7Ci0JCX0KLQl9CQkKLQlJbWFnZSBpbWFnZUFscGhhID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCQkJCQkJCQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMTAwLCAxMDApOwotCWdjLmRyYXdJbWFnZShpbWFnZVRyYW5zcGFyZW50LCAxMzAsIDEwMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlQWxwaGEsIDE2MCwgMTAwKTsKLQl0cnkgewotCQlnYy5kcmF3SW1hZ2UobnVsbCwgMTAwLCAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2VUcmFuc3BhcmVudC5kaXNwb3NlKCk7Ci0JaW1hZ2VBbHBoYS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJKCkgewotCUNvbG9yIGMxID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JQ29sb3IgYzIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JQ29sb3IgYzMgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDApOwotCQotCVBhbGV0dGVEYXRhIHBhbGV0dGVEYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7YzEuZ2V0UkdCKCksIGMyLmdldFJHQigpLCBjMy5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YSgzMCwzMCwgOCwgcGFsZXR0ZURhdGEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJaWYgKHggPiB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKSk7Ci0JCQllbHNlIGlmICh4IDwgeSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMi5nZXRSR0IoKSkpOwotCQkJZWxzZSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMzLmdldFJHQigpKSk7Ci0JCX0KLQl9Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKTsKLQlJbWFnZSBpbWFnZVRyYW5zcGFyZW50ID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJZGF0YS5zZXRBbHBoYSh4LCB5LCAxMjcpOwotCQl9Ci0JfQkJCi0JSW1hZ2UgaW1hZ2VBbHBoYSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJCQkJCQkKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCA1MCwgNjApOwotCWdjLmRyYXdJbWFnZShpbWFnZVRyYW5zcGFyZW50LCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgMTAsIDEwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VBbHBoYSwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDIwLCAxNSk7Ci0JdHJ5IHsKLQkJZ2MuZHJhd0ltYWdlKG51bGwsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCA1MCwgNjApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlpbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2VBbHBoYS5kaXNwb3NlKCk7Ci0JaW1hZ2VUcmFuc3BhcmVudC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0xpbmVJSUlJKCkgewotCWdjLmRyYXdMaW5lKDAsMCwwLDIwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3T3ZhbElJSUkoKSB7Ci0JZ2MuZHJhd092YWwoMTAsIDAsIDIwLCAzMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2ludElJKCkgewotCWdjLmRyYXdQb2ludCgxMCwgMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2x5Z29uJEkoKSB7Ci0JZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHswLDAsIDUsMTAsIDAsMjB9KTsJCQkJCi0JZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHswLDB9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1BvbHlsaW5lJEkoKSB7Ci0JZ2MuZHJhd1BvbHlsaW5lKG5ldyBpbnRbXSB7MCwwLCA1LDEwLCAwLDIwfSk7CQkJCQotCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W10gezAsMH0pOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSgpIHsKLQlnYy5kcmF3UmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JZ2MuZHJhd1JlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApKTsJCQkJCi0JZ2MuZHJhd1JlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJKCkgewotCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCAzLCAzKTsJCQkJCi0JZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKDAsIDAsIDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWigpIHsKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSwgdHJ1ZSk7CQkJCQotCWdjLmRyYXdTdHJpbmcoInRlc3QiLCA1LCA1LCBmYWxzZSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSgpIHsKLQlnYy5kcmF3VGV4dCgidGVzdCIsIDUsIDUpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkoKSB7CQkJCi0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIDApOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX01ORU1PTklDKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgMCk7Ci0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIFNXVC5EUkFXX0RFTElNSVRFUik7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19NTkVNT05JQyk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19UQUIpOwkJCQkKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCAwKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiXHRcclxuYSZiYyYiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLQlnYy5kcmF3VGV4dCgiXHIiLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCJcbiIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoIiYiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoIlx0IiwgNSwgNSwgU1dULkRSQVdfVEFCKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaKCkgewotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCB0cnVlKTsJCQkJCi0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIGZhbHNlKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIHRydWUpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlhc3NlcnRUcnVlKGdjLmVxdWFscyhnYykpOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JR0MgdGVzdEdDID0gbmV3IEdDKGNhbnZhcyk7Ci0JYXNzZXJ0RmFsc2UodGVzdEdDLmVxdWFscyhnYykpOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbEFyY0lJSUlJSSgpIHsKLQlnYy5maWxsQXJjKDEwLCAyMCwgNTAsIDI1LCA5MCwgOTApOwkJCQkKLQlnYy5maWxsQXJjKDEwLCAyMCwgNTAsIDI1LCAtMTAsIC0xMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaKCkgewotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCB0cnVlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDAsIDAsIHRydWUpOwkJCQkKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgZmFsc2UpOwkJCQkKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsT3ZhbElJSUkoKSB7Ci0JZ2MuZmlsbE92YWwoMTAsIDAsIDIwLCAzMCk7CQkJCQotCWdjLmZpbGxPdmFsKC0xLCAtMSwgLTEsIC0xKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFBvbHlnb24kSSgpIHsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gezAsMCwgNSwxMCwgMCwyMH0pOwkJCQkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gezAsMH0pOwkJCQkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50W10gey0xLCAtMX0pOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUmVjdGFuZ2xlSUlJSSgpIHsKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCkpOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKG5ldyBSZWN0YW5nbGUoLTEsIC0xLCAtMSwgLTEpKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWdjLmZpbGxSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCk7CQkJCQotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMCwgMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSgpIHsKLQlnYy5maWxsUm91bmRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgMywgMyk7CQkJCQotCWdjLmZpbGxSb3VuZFJlY3RhbmdsZSgwLCAwLCAwLCAwLCAwLCAwKTsJCQkJCi0JZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIC0xMCwgLTEwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWR2YW5jZVdpZHRoQygpIHsKLQlpbnQgdyA9IGdjLmdldEFkdmFuY2VXaWR0aCgnYScpOwotCWFzc2VydFRydWUodyA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEJhY2tncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhcldpZHRoQygpIHsKLQlpbnQgdyA9IGdjLmdldENoYXJXaWR0aCgnYScpOwotCWFzc2VydFRydWUodyA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaXBwaW5nKCkgewotCS8vIHRlc3RlZCBpbiBzZXRDbGlwcGluZyBtZXRob2RzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEZvbnQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udE1ldHJpY3MoKSB7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCWFzc2VydFRydWUoZm0uZ2V0SGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiBzZXRGb3JlZ3JvdW5kIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVTdHlsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TGluZVN0eWxlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVXaWR0aCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TGluZVdpZHRoIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JR0MgdGVzdEdDID0gbmV3IEdDKGNhbnZhcywgU1dULkxFRlRfVE9fUklHSFQpOwotCWludCBzdHlsZSA9IHRlc3RHQy5nZXRTdHlsZSgpOwotCWFzc2VydFRydWUoKHN0eWxlICYgU1dULkxFRlRfVE9fUklHSFQpICE9IDApOwotCXRlc3RHQy5kaXNwb3NlKCk7Ci0JdGVzdEdDID0gbmV3IEdDKGNhbnZhcyk7Ci0Jc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5SSUdIVF9UT19MRUZUKTsKLQlzdHlsZSA9IHRlc3RHQy5nZXRTdHlsZSgpOwotCWFzc2VydFRydWUoKHN0eWxlICYgIFNXVC5SSUdIVF9UT19MRUZUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFhPUk1vZGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldFhPUk1vZGUgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JYXNzZXJ0VHJ1ZShnYy5oYXNoQ29kZSgpID09IGdjLmhhc2hDb2RlKCkpOwotCUdDIGdjMiA9IG5ldyBHQyhzaGVsbCk7Ci0JYXNzZXJ0RmFsc2UoZ2MuaGFzaENvZGUoKSA9PSBnYzIuaGFzaENvZGUoKSk7Ci0JZ2MyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0NsaXBwZWQoKSB7Ci0JYXNzZXJ0RmFsc2UoZ2MuaXNDbGlwcGVkKCkpOwotCWdjLnNldENsaXBwaW5nKDUsMTAsMTUsMjApOwotCWFzc2VydFRydWUoZ2MuaXNDbGlwcGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JYXNzZXJ0RmFsc2UoZ2MuaXNEaXNwb3NlZCgpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShnYy5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHNoZWxsLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGdjLmdldEJhY2tncm91bmQoKSk7Ci0JdHJ5IHsgCi0JCWdjLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgY29sb3IiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhnYy5nZXRCYWNrZ3JvdW5kKCksZ2MuZ2V0QmFja2dyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2xpcHBpbmdJSUlJKCkgewotCS8vIGludGVybWl0dGVudGx5IGZhaWxzIG9uIFhQIGZvciByZWFzb25zIHVua25vd24sIGNvbW1lbnQgb3V0IHRoZSB0ZXN0IGNhc2UKLQkvLyB1bnRpbCB0aGUgcHJvYmxlbSBpcyBmaWd1cmVkIG91dAotLy8JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotLy8Jc2hlbGwuc2V0U2l6ZSgxMTAsMTEwKTsKLS8vCWNhbnZhcy5zZXRTaXplKDEwMCwxMDApOwotLy8Jc2hlbGwub3BlbigpOwotLy8JR0MgdGVzdEdjID0gbmV3IEdDKGNhbnZhcyk7Ci0vLwl0ZXN0R2Muc2V0Q2xpcHBpbmcoMCw1LDEwLDIwKTsKLS8vCVJlY3RhbmdsZSByZWN0ID0gdGVzdEdjLmdldENsaXBwaW5nKCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueCA9PSAwKTsKLS8vCWFzc2VydFRydWUocmVjdC55ID09IDUpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LndpZHRoID09IDEwKTsKLS8vCWFzc2VydFRydWUocmVjdC5oZWlnaHQgPT0gMjApOwotLy8JdGVzdEdjLmRpc3Bvc2UoKTsKLS8vCWNhbnZhcy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQkvLyBpbnRlcm1pdHRlbnRseSBmYWlscyBvbiBYUCBmb3IgcmVhc29ucyB1bmtub3duLCBjb21tZW50IG91dCB0aGUgdGVzdCBjYXNlCi0JLy8gdW50aWwgdGhlIHByb2JsZW0gaXMgZmlndXJlZCBvdXQKLS8vCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLS8vCXNoZWxsLnNldFNpemUoMTEwLDExMCk7Ci0vLwljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLS8vCXNoZWxsLm9wZW4oKTsKLS8vCUdDIHRlc3RHYyA9IG5ldyBHQyhjYW52YXMpOwotLy8JdGVzdEdjLnNldENsaXBwaW5nKG5ldyBSZWN0YW5nbGUoMCw1LDEwLDIwKSk7Ci0vLwlSZWN0YW5nbGUgcmVjdCA9IHRlc3RHYy5nZXRDbGlwcGluZygpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnggPT0gMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueSA9PSA1KTsKLS8vCWFzc2VydFRydWUocmVjdC53aWR0aCA9PSAxMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QuaGVpZ2h0ID09IDIwKTsKLS8vCXRlc3RHYy5kaXNwb3NlKCk7Ci0vLwljYW52YXMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCWdjLnNldEZvbnQoc2hlbGwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUZvbnQoKSk7Ci0JRm9udCBmb250ID0gZ2MuZ2V0Rm9udCgpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHMoc2hlbGwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUZvbnQoKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHNoZWxsLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGdjLmdldEZvcmVncm91bmQoKSk7Ci0JdHJ5IHsgCi0JCWdjLnNldEZvcmVncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgY29sb3IiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhnYy5nZXRGb3JlZ3JvdW5kKCksZ2MuZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZVN0eWxlSSgpIHsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfU09MSUQpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RBU0gpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfRE9UKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIRE9UKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVERPVCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIRE9URE9UKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lV2lkdGhJKCkgewotCWdjLnNldExpbmVXaWR0aCgxMCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lV2lkdGgoKSA9PSAxMCk7Ci0JZ2Muc2V0TGluZVdpZHRoKDApOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVdpZHRoKCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0WE9STW9kZVooKSB7Ci0JZ2Muc2V0WE9STW9kZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGdjLmdldFhPUk1vZGUoKSk7Ci0JZ2Muc2V0WE9STW9kZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UoZ2MuZ2V0WE9STW9kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlQb2ludCBwdCA9IGdjLnN0cmluZ0V4dGVudCgiYWJjIik7Ci0JYXNzZXJ0VHJ1ZShwdC54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShwdC55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVBvaW50IHB0ID0gZ2MudGV4dEV4dGVudCgiYWJjIik7Ci0JYXNzZXJ0VHJ1ZShwdC54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShwdC55ID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQlQb2ludCBwdCA9IGdjLnRleHRFeHRlbnQoImFiYyIsIDApOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVN0cmluZyBzID0gZ2MudG9TdHJpbmcoKTsKLQlhc3NlcnROb3ROdWxsKHMpOwotCWFzc2VydFRydWUocy5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHlBcmVhSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0FyY0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ZvY3VzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdMaW5lSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd092YWxJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UG9pbnRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvbHlnb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvbHlsaW5lJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbEFyY0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxPdmFsSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFBvbHlnb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFJlY3RhbmdsZUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmlsbFJvdW5kUmVjdGFuZ2xlSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBZHZhbmNlV2lkdGhDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyV2lkdGhDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGlwcGluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udE1ldHJpY3MiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0WE9STW9kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzQ2xpcHBlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVTdHlsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFhPUk1vZGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weUFyZWFJSUlJSUkiKSkgdGVzdF9jb3B5QXJlYUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKSkgdGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdBcmNJSUlJSUkiKSkgdGVzdF9kcmF3QXJjSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3Rm9jdXNJSUlJIikpIHRlc3RfZHJhd0ZvY3VzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIikpIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkiKSkgdGVzdF9kcmF3SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUlJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdMaW5lSUlJSSIpKSB0ZXN0X2RyYXdMaW5lSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd092YWxJSUlJIikpIHRlc3RfZHJhd092YWxJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UG9pbnRJSSIpKSB0ZXN0X2RyYXdQb2ludElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3UG9seWdvbiRJIikpIHRlc3RfZHJhd1BvbHlnb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvbHlsaW5lJEkiKSkgdGVzdF9kcmF3UG9seWxpbmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JlY3RhbmdsZUlJSUkiKSkgdGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkiKSkgdGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWiIpKSB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJIikpIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWiIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxBcmNJSUlJSUkiKSkgdGVzdF9maWxsQXJjSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWiIpKSB0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsT3ZhbElJSUkiKSkgdGVzdF9maWxsT3ZhbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxQb2x5Z29uJEkiKSkgdGVzdF9maWxsUG9seWdvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUmVjdGFuZ2xlSUlJSSIpKSB0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSIpKSB0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWR2YW5jZVdpZHRoQyIpKSB0ZXN0X2dldEFkdmFuY2VXaWR0aEMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGFyV2lkdGhDIikpIHRlc3RfZ2V0Q2hhcldpZHRoQygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpcHBpbmciKSkgdGVzdF9nZXRDbGlwcGluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250TWV0cmljcyIpKSB0ZXN0X2dldEZvbnRNZXRyaWNzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZVN0eWxlIikpIHRlc3RfZ2V0TGluZVN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lV2lkdGgiKSkgdGVzdF9nZXRMaW5lV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFhPUk1vZGUiKSkgdGVzdF9nZXRYT1JNb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0NsaXBwZWQiKSkgdGVzdF9pc0NsaXBwZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0lJSUkiKSkgdGVzdF9zZXRDbGlwcGluZ0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVTdHlsZUkiKSkgdGVzdF9zZXRMaW5lU3R5bGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lV2lkdGhJIikpIHRlc3Rfc2V0TGluZVdpZHRoSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0WE9STW9kZVoiKSkgdGVzdF9zZXRYT1JNb2RlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zdHJpbmdFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0RXh0ZW50TGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3Rfd2luMzJfbmV3SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci1TaGVsbCBzaGVsbDsKLUltYWdlIGltYWdlOwotR0MgZ2M7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBhY3R1YWwgUkdCIHZhbHVlIHVzZWQgZm9yIHJlbmRlcmluZyBmb3IgdGhlIGdpdmVuIENvbG9yLgotICogVGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIENvbG9yJ3MgUkdCIHZhbHVlIG9uIGxvd2VyLWNvbG9yIGRpc3BsYXlzIAotICogKDE2YnBwIG9yIGxlc3MpLgotICovCi1SR0IgZ2V0UmVhbFJHQihDb2xvciBjb2xvcikgewotCUltYWdlIGNvbG9ySW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlHQyBpbWFnZUdjID0gbmV3IEdDKGNvbG9ySW1hZ2UpOwotCUltYWdlRGF0YSBpbWFnZURhdGE7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQlpbnQgcGl4ZWw7Ci0JCi0JaW1hZ2VHYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWltYWdlR2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlRGF0YSA9IGNvbG9ySW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOwotCWltYWdlR2MuZGlzcG9zZSgpOwotCWNvbG9ySW1hZ2UuZGlzcG9zZSgpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCXJldHVybiBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1MmM4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQ0RhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQ0RhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwODM0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKSB7Ci0JSW1hZ2UgaW1hZ2U7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgLTEsIDEwKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAwLCAxMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIC0yMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPD0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlJbWFnZSBpbWFnZTsKLQlSZWN0YW5nbGUgYm91bmRzID0gbnVsbDsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAxMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAxMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA9PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPT0gMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAtMSk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAwKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA9PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0ID09IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JLy8gdmFsaWQgaW1hZ2VzCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgtMSwgLTEwLCAxMCwgMTApOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlID0gbmV3IEltYWdlKG51bGwsIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpIHsKLQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0vLwlQbGF0Zm9ybS1zcGVjaWZpYyB0ZXN0LiAgCi0vLwlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKSk7Ci0vLwl0cnkgewotLy8JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotLy8JCWltYWdlLmRpc3Bvc2UoKTsKLS8vCQlmYWlsKCJVbnN1cHBvcnRlZCBjb2xvciBkZXB0aCIpOwotLy8JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vCX0KLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBkYXRhKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKDB4MzAsIDB4MEMsIDB4MDMpKTsKLQkvLyBzZXQgcmVkIHBpeGVsIGF0IHg9OSwgeT05Ci0JZGF0YS5zZXRQaXhlbCg5LCA5LCAweDMwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlJbWFnZSBnY0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoZ2NJbWFnZSk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgZ2NJbWFnZURhdGEgPSBnY0ltYWdlLmdldEltYWdlRGF0YSgpOwotCWludCByZWRQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDksIDkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgZ2V0UmVhbFJHQihkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKSwgZ2NJbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IocmVkUGl4ZWwpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZ2NJbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKCkgewotCUltYWdlRGF0YSBkYXRhID0gbnVsbDsKLQlJbWFnZURhdGEgZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSwgZGF0YTEpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2UgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2UgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBudWxsOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgbWFzayA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIG1hc2sgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIHdpZHRoICE9IEltYWdlRGF0YSBtYXNrIHdpZHRoIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSB3aWR0aCAhPSBJbWFnZURhdGEgbWFzayB3aWR0aCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIGhlaWdodCAhPSBJbWFnZURhdGEgbWFzayBoZWlnaHQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlIGhlaWdodCAhPSBJbWFnZURhdGEgbWFzayBoZWlnaHQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSwgZGF0YTEpOyAvLyBJbWFnZSBub3cgYWNjZXB0cyBtYXNrcyB3aGVyZSBkZXB0aCAhPSAxCi0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEoMHgzMCwgMHgwQywgMHgwMykpOwotCS8vIHNldCBvcGFxdWUgcmVkIHBpeGVsIGF0IHg9OSwgeT05Ci0JZGF0YS5zZXRQaXhlbCg5LCA5LCAweDMwKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWRhdGExLnNldFBpeGVsKDksIDksIDEpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQlJbWFnZSBnY0ltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgZ2MgPSBuZXcgR0MoZ2NJbWFnZSk7Ci0JQ29sb3IgYmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7IAotCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgZ2NJbWFnZURhdGEgPSBnY0ltYWdlLmdldEltYWdlRGF0YSgpOwotCWludCByZWRQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDksIDkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgZ2V0UmVhbFJHQihkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKSwgZ2NJbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IocmVkUGl4ZWwpKTsKLQlpbnQgYmx1ZVBpeGVsID0gZ2NJbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBnZXRSZWFsUkdCKGJhY2tncm91bmRDb2xvciksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGJsdWVQaXhlbCkpOwotCWdjLmRpc3Bvc2UoKTsKLQlnY0ltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW1wdHkudHh0Iik7Ci0JCXRyeSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBzdHJlYW0pOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgZSk7Ci0JCX0KLQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1swXTsKLQkJRGlzcGxheVtdIGRpc3BsYXlzID0ge2Rpc3BsYXksIG51bGx9OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGRpc3BsYXlzLmxlbmd0aDsgaisrKSB7Ci0vLwkJCURpc3BsYXkgdGVtcERpc3BsYXkgPSBkaXNwbGF5c1tqXTsKLQkJCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8gQnVnIDcwMTY3IC0gSW1hZ2UoRGV2aWNlLCBJbnB1dFN0cmVhbSkgdGhyb3dzIGluY29ycmVjdCBleGNlcHRpb24gZm9yIGJhZCBQTkcKLS8vIHJlbW92ZSBjb21tZW50IHdoZW4gYnVnIGlzIGZpeGVkLgotLy8JCQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgSW5wdXRTdHJlYW0iLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMV0pOwotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBJbnB1dFN0cmVhbSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJfQkJCi0KLQkJLy8gY3JlYXRlIHZhbGlkIGltYWdlcwotCQlmb3IgKGludCBqID0gMDsgaiA8IGRpc3BsYXlzLmxlbmd0aDsgaisrKSB7Ci0JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlpbnQgbnVtRmlsZU5hbWVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaz0wOyBrPG51bUZpbGVOYW1lczsgaysrKSB7Ci0JCQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1trXTsJCQotCQkJCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQkJCWltYWdlID0gbmV3IEltYWdlKHRlbXBEaXNwbGF5LCBzdHJlYW0pOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmlsZU5hbWUpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZpbGUgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZmlsZSBuYW1lID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9ICJub25leGlzdGVudC50eHQiOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igbm9uLWV4aXN0ZW50IGZpbGUgbmFtZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5vbi1leGlzdGVudCBmaWxlIG5hbWUiLCBTV1QuRVJST1JfSU8sIGUpOwotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGUgbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCWlmICghaXNKMk1FKCkpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoImVtcHR5LnR4dCIpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBmaWxlIG5hbWUiKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCwgZSk7Ci0JCX0KLQkKLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1swXTsKLQkJRGlzcGxheVtdIGRpc3BsYXlzID0ge2Rpc3BsYXksIG51bGx9OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGRpc3BsYXlzLmxlbmd0aDsgaisrKSB7Ci0vLwkJCURpc3BsYXkgdGVtcERpc3BsYXkgPSBkaXNwbGF5c1tqXTsKLQkJCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBmaWxlIG5hbWUiKTsKLQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCQkJCSBCdWcgNzAxNjcgLSBJbWFnZShEZXZpY2UsIElucHV0U3RyZWFtKSB0aHJvd3MgaW5jb3JyZWN0IGV4Y2VwdGlvbiBmb3IgYmFkIFBORwotLy8JCQkJCSByZW1vdmUgY29tbWVudCB3aGVuIGJ1ZyBpcyBmaXhlZC4KLS8vCQkJCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzFdKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFLCBlKTsKLQkJfQkJCi0JCi0JCS8vIGNyZWF0ZSB2YWxpZCBpbWFnZXMKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotLy8JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlpbnQgbnVtRmlsZU5hbWVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaz0wOyBrPG51bUZpbGVOYW1lczsgaysrKSB7Ci0JCQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1trXTsKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJCVN0cmluZyBwYXRoTmFtZSA9IGdldFBhdGgoZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gaXNEaXNwb3NlZCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUltYWdlIGltYWdlID0gbnVsbDsKLQlJbWFnZSBpbWFnZTEgPSBudWxsOwotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJaW1hZ2UxID0gaW1hZ2U7Ci0JCi0JCWFzc2VydEZhbHNlKCI6YToiLCBpbWFnZS5lcXVhbHMobnVsbCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiwgaW1hZ2UuZXF1YWxzKGltYWdlMSkpOwotCQkKLQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCWltYWdlMSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlhc3NlcnRGYWxzZSgiOmM6IiwgaW1hZ2UuZXF1YWxzKGltYWdlMSkpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UxLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlpbWFnZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfQotCS8vIHJlbWFpbmRlciB0ZXN0ZWQgaW4gc2V0QmFja2dyb3VuZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAsIDIwKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlpbWFnZS5nZXRCb3VuZHMoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIsIFNXVC5FUlJPUl9HUkFQSElDX0RJU1BPU0VELCBlKTsKLQl9Ci0JCQotCS8vIGNyZWF0ZXMgYml0bWFwIGltYWdlCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlSZWN0YW5nbGUgYm91bmRzMSA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGJvdW5kcywgYm91bmRzMSk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWJvdW5kczEgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBib3VuZHMsIGJvdW5kczEpOwotCi0JLy8gY3JlYXRlIGljb24gaW1hZ2UKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQlib3VuZHMxID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmM6IiwgYm91bmRzLCBib3VuZHMxKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZURhdGEoKSB7CQotCWdldEltYWdlRGF0YTEoKTsKLQlnZXRJbWFnZURhdGEyKDI0LCBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4ZmYwMCwgMHhmZikpOwkJCi0JZ2V0SW1hZ2VEYXRhMigzMiwgbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UxID0gbnVsbDsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCWltYWdlMSA9IGltYWdlOwotCQotCQlhc3NlcnRFcXVhbHMoIjphOiIsIGltYWdlMS5oYXNoQ29kZSgpLCBpbWFnZS5oYXNoQ29kZSgpKTsKLQkJCi0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJYm9vbGVhbiBlcXVhbHMgPSAoaW1hZ2UxLmhhc2hDb2RlKCkgPT0gaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCWFzc2VydEZhbHNlKCI6YjoiLCBlcXVhbHMpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UxLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2U8L2NvZGU+Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBqYXZhZG9jIHN0YXRlczoKLQkvLyA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0JLy8gQVBJIGZvciA8Y29kZT5JbWFnZTwvY29kZT4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JYXNzZXJ0RmFsc2UoIjphOiIsIGltYWdlLmlzRGlzcG9zZWQoKSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoIjpiOiIsIGltYWdlLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQotCXRyeSB7Ci0JCWltYWdlLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgY29sb3IiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBjb2xvciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDI1NSk7Ci0JdHJ5IHsKLQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLQkKLQkvLyB0aGlzIGltYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc3BhcmVudCBwaXhlbCBieSBkZWZhdWx0IHNvIHNldEJhY2tncm91bmQgaGFzIG5vIGVmZmVjdAotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWNvbG9yID0gaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCWFzc2VydE51bGwoImJhY2tncm91bmQgY29sb3Igc2hvdWxkIGJlIG51bGwgZm9yIG5vbi10cmFuc3BhcmVudCBpbWFnZSIsIGNvbG9yKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdHJhbnNwYXJlbmN5IGFuZCB0aGVuIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfSkpOwotCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsgLy8gdHJhbnNwYXJlbnQgcGl4ZWwgaXMgY3VycmVudGx5IGJsYWNrCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JY29sb3IgPSBpbWFnZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JYXNzZXJ0RXF1YWxzKCJiYWNrZ3JvdW5kIGNvbG9yIHNob3VsZCBoYXZlIGJlZW4gc2V0IHRvIGdyZWVuIiwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pLCBjb2xvcik7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChpbWFnZS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZShpbWFnZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2lvX0lucHV0U3RyZWFtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZURhdGEiKSkgdGVzdF9nZXRJbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKTsKLX0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotCi0vKiogVGVzdCBpbXBsZW1lbnRhdGlvbiAqKi8KLQotdm9pZCBnZXRJbWFnZURhdGExKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQlJbWFnZURhdGEgZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGExKTsKLQkJSW1hZ2VEYXRhIGRhdGEyID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbWFnZSB3aWR0aCBzaG91bGQgYmUgdGhlIHNhbWUiLCBkYXRhMS53aWR0aCwgZGF0YTIud2lkdGgpOwotCQlhc3NlcnRFcXVhbHMoIkltYWdlIGhlaWdodCBzaG91bGQgYmUgdGhlIHNhbWUiLCBkYXRhMS5oZWlnaHQsIGRhdGEyLmhlaWdodCk7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY29udGludWU7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBWZXJpZnkgSW1hZ2UuZ2V0SW1hZ2VEYXRhIHJldHVybnMgcGl4ZWxzIHdpdGggdGhlIHNhbWUgUkdCIHZhbHVlIGFzIHRoZQotICogc291cmNlIGltYWdlLiBUaGlzIHRlc3Qgb25seSBtYWtlcyBzZW5zZSB3aXRoIGRlcHRoIG9mIDI0IGFuZCAzMiBiaXRzLgotICovCi12b2lkIGdldEltYWdlRGF0YTIoaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0JaW50IHdpZHRoID0gMTA7Ci0JaW50IGhlaWdodCA9IDEwOwotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDApOwotCVJHQiBjb2xvclJHQiA9IGNvbG9yLmdldFJHQigpOwotCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JCQotCUltYWdlRGF0YSBuZXdEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgbmV3UGFsZXR0ZSA9IG5ld0RhdGEucGFsZXR0ZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewotCQkJaW50IHBpeGVsID0gbmV3RGF0YS5nZXRQaXhlbChpLCBqKTsKLQkJCVJHQiByZ2IgPSBuZXdQYWxldHRlLmdldFJHQihwaXhlbCk7Ci0JCQlhc3NlcnRUcnVlKCJyZ2IuZXF1YWxzKGNvbG9yUkdCKSIsIHJnYi5lcXVhbHMoY29sb3JSR0IpKTsKLQkJfQotCX0KLQljb2xvci5kaXNwb3NlKCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLVN0cmluZyBnZXRQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCVN0cmluZyB1cmxQYXRoOwotCQotCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCX0KLQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoZmlsZU5hbWUpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCWZhaWwoIlVSTCA9PSBudWxsIGZvciBmaWxlICIgKyBmaWxlTmFtZSk7Ci0JCX0KLQkJdXJsUGF0aCA9IHVybC5nZXRGaWxlKCk7Ci0JfSBlbHNlIHsKLQkJdXJsUGF0aCA9IHBsdWdpblBhdGggKyAiL2RhdGEvIiArIGZpbGVOYW1lOwotCX0KLQkKLQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CQotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MgJiYgdXJsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgPT0gMCkgdXJsUGF0aCA9IHVybFBhdGguc3Vic3RyaW5nKDEpOwotCXVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2VBbGwoIiUyMCIsICIgIik7CQotCQotCWlmICh2ZXJib3NlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2ZWQgZmlsZSBuYW1lIGZvciAiICsgZmlsZU5hbWUgKyAiID0gIiArIHVybFBhdGgpOwotCX0KLQlyZXR1cm4gdXJsUGF0aDsKLX0KLVJHQiBnZXRSZWFsUkdCKENvbG9yIGNvbG9yKSB7Ci0JSW1hZ2UgY29sb3JJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGltYWdlR2MgPSBuZXcgR0MoY29sb3JJbWFnZSk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YTsKLQlQYWxldHRlRGF0YSBwYWxldHRlOwotCWludCBwaXhlbDsKLQkKLQlpbWFnZUdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCWltYWdlR2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDEwLCAxMCk7Ci0JaW1hZ2VEYXRhID0gY29sb3JJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlwYWxldHRlID0gaW1hZ2VEYXRhLnBhbGV0dGU7Ci0JaW1hZ2VHYy5kaXNwb3NlKCk7Ci0JY29sb3JJbWFnZS5kaXNwb3NlKCk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCk7Ci0JcmV0dXJuIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJmODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSgpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgLTEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbnVsbCwgMCwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMywgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdW5zdXBwb3J0ZWQgZGVwdGgiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpbnRbXSB2YWxpZERlcHRocyA9IHsxLCAyLCA0LCA4LCAxNiwgMjQsIDMyfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkRGVwdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgdmFsaWREZXB0aHNbaV0sIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKC0xLCAxLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgLTEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbnVsbCwgMCwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhbGV0dGVEYXRhID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbmV3IGJ5dGVbXSB7fSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVuc3VwcG9ydGVkIGRlcHRoIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50W10gdmFsaWREZXB0aHMgPSB7MSwgMiwgNCwgOCwgMTYsIDI0LCAzMn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERlcHRocy5sZW5ndGg7IGkrKykgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIHZhbGlkRGVwdGhzW2ldLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCX0KLQkKLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBkYXRhIGlzIG51bGwKLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgNCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgZGF0YSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCS8vIGRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiBpZiBzY2FubGluZVBhZCA9PSAwCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDAsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzY2FubGluZVBhZCA9PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQluZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbnB1dFN0cmVhbSA9PSBudWxsIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQl9Ci0JCi0JCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCW5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YShmaWxlbmFtZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZpbGVuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGVuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvbmUoKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdICsgIi4iICsgU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzWzBdKTsKLQkJSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQlJbWFnZURhdGEgZGF0YTIgPSAoSW1hZ2VEYXRhKSBkYXRhMS5jbG9uZSgpOwotCQkvLyBpbWFnZURhdGEgZG9lcyBub3QgaW1wbGVtZW50IGFuIGVxdWFscyhPYmplY3QpIG1ldGhvZAotCQlhc3NlcnRFcXVhbHMoIjphOiIsIGRhdGExLmFscGhhLCBkYXRhMi5hbHBoYSk7Ci0JCWFzc2VydEVxdWFscygiOmI6IiwgZGF0YTEuYWxwaGFEYXRhLCBkYXRhMi5hbHBoYURhdGEpOwotCQlhc3NlcnRFcXVhbHMoIjpjOiIsIGRhdGExLmJ5dGVzUGVyTGluZSwgZGF0YTIuYnl0ZXNQZXJMaW5lKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCBkYXRhMS5kYXRhLCBkYXRhMi5kYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCBkYXRhMS5kZWxheVRpbWUsIGRhdGEyLmRlbGF5VGltZSk7Ci0JCWFzc2VydEVxdWFscygiOmY6IiwgZGF0YTEuZGVwdGgsIGRhdGEyLmRlcHRoKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCBkYXRhMS5kaXNwb3NhbE1ldGhvZCwgZGF0YTIuZGlzcG9zYWxNZXRob2QpOwotCQlhc3NlcnRFcXVhbHMoIjpoOiIsIGRhdGExLmhlaWdodCwgZGF0YTIuaGVpZ2h0KTsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCBkYXRhMS5tYXNrRGF0YSwgZGF0YTIubWFza0RhdGEpOwotCQlhc3NlcnRFcXVhbHMoIjpqOiIsIGRhdGExLm1hc2tQYWQsIGRhdGEyLm1hc2tQYWQpOwotCQlhc3NlcnRFcXVhbHMoIjprOiIsIGRhdGExLnBhbGV0dGUsIGRhdGEyLnBhbGV0dGUpOwotCQlhc3NlcnRFcXVhbHMoIjpsOiIsIGRhdGExLnNjYW5saW5lUGFkLCBkYXRhMi5zY2FubGluZVBhZCk7Ci0JCWFzc2VydEVxdWFscygiOm06IiwgZGF0YTEudHJhbnNwYXJlbnRQaXhlbCwgZGF0YTIudHJhbnNwYXJlbnRQaXhlbCk7Ci0JCWFzc2VydEVxdWFscygiOm46IiwgZGF0YTEudHlwZSwgZGF0YTIudHlwZSk7Ci0JCWFzc2VydEVxdWFscygiOm86IiwgZGF0YTEud2lkdGgsIGRhdGEyLndpZHRoKTsKLQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCBkYXRhMS54LCBkYXRhMi54KTsKLQkJYXNzZXJ0RXF1YWxzKCI6cToiLCBkYXRhMS55LCBkYXRhMi55KTsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxwaGFJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCAyNTUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRBbHBoYSgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldEFscGhhKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYSgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKElNQUdFX0RJTUVOU0lPTiwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKDAsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoMCwgSU1BR0VfRElNRU5TSU9OKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbHBoYXNJSUkkQkkoKSB7Ci0JYnl0ZSB2YWx1ZTsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgR0VUX1dJRFRIID0gMTA7Ci0JZmluYWwgaW50IE9GRlNFVCA9IDEwOwotCWJ5dGVbXSBhbHBoYURhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQkKLQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLmxlbmd0aDsgaSArKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAoYnl0ZSkgMjU1LCBhbHBoYURhdGFbaV0pOwotCQl9Ci0JfQotCi0JdmFsdWUgPSAoYnl0ZSkgMHhBQTsKLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXSB7dmFsdWUsIChieXRlKSAodmFsdWUrMSksIChieXRlKSAodmFsdWUrMiksIChieXRlKSAodmFsdWUrMyksIChieXRlKSAodmFsdWUrNCl9OwotCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgKGJ5dGUpIHZhbHVlc1tpLU9GRlNFVF0sIGFscGhhRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjplOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgqR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIChieXRlW10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoLTEsIDEsIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoSU1BR0VfRElNRU5TSU9OLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIC0xLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIElNQUdFX0RJTUVOU0lPTiwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCAtMSwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbElJKCkgewotCWludCB2YWx1ZTsKLQkKLQlhc3NlcnRFcXVhbHMoIjphOiIsIDAsIGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKSk7Ci0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRQaXhlbCgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbCgtMSwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKElNQUdFX0RJTUVOU0lPTiwgMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKDAsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgSU1BR0VfRElNRU5TSU9OKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQlpbnQgd2lkdGggPSAzOwotCWludCBoZWlnaHQgPSAzOwotCWludCBkZXB0aCA9IDQ7Ci0JYnl0ZSBwaXhlbFZhbHVlID0gMTsKLQlieXRlW10gZGF0YSA9IHsoYnl0ZSkgKChwaXhlbFZhbHVlIDw8IDQpICsgcGl4ZWxWYWx1ZSksIChieXRlKSAocGl4ZWxWYWx1ZSA8PCA0KSwgKGJ5dGUpICgocGl4ZWxWYWx1ZSA8PCA0KSArIHBpeGVsVmFsdWUpLCAoYnl0ZSkgKHBpeGVsVmFsdWUgPDwgNCksIChieXRlKSAoKHBpeGVsVmFsdWUgPDwgNCkgKyBwaXhlbFZhbHVlKSwgKGJ5dGUpIChwaXhlbFZhbHVlIDw8IDQpfTsgCi0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAyNTUpLCBuZXcgUkdCKDExMSwgMTExLCAxMTEpfSksIDEsIGRhdGEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJhZCBwaXhlbCBkYXRhIiwgcGl4ZWxWYWx1ZSwgcGl4ZWwpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBpeGVsc0lJSSRCSSgpIHsKLQlmaW5hbCBpbnQgU0laRSA9IDIwOyAKLQlmaW5hbCBpbnQgR0VUX1dJRFRIID0gMTA7Ci0JZmluYWwgaW50IE9GRlNFVCA9IDEwOwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgxLCAweDEsIDB4MSwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpnOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjppOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6bToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHhGLCAoYnl0ZSkweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpvOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKC0xLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAtMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsJCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBkZXB0aCIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiLCBTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbHNJSUkkSUkoKSB7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlpbnRbXSBwaXhlbERhdGEgPSBuZXcgaW50W1NJWkVdOwotCi0JLy8gdGVzdCAxIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjphOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JaW50W10gdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgxLCAweDEsIDB4MSwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDIsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjppOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4NCwgMHhGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjprOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpsOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOm06IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHhGLCAweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpvOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpwOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDE2IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDE2LCBuZXcgUGFsZXR0ZURhdGEoMHhGODAwLCAweDdFMCwgMHgxRikpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOnE6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHgyLCAweEYsIDB4RkYsIDB4RkZBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOnI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6czoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6dDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyNCwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjp1OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4RkYsIDB4RkZBQSwgMHhGRjAwQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp2OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOnc6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOng6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMzIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjp5OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4RkYsIDB4RkZBQSwgMHhGRjAwQUEwMH07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOno6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YWE6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmFiOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCpHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgKGludFtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKC0xLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAtMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0JzKCkgewotCWFzc2VydE51bGwoIjphOiIsIGltYWdlRGF0YS5nZXRSR0JzKCkpOwotCVJHQltdIHJnYnMgPSBuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX07Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKHJnYnMpKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHJnYnMsIGltYWdlRGF0YS5nZXRSR0JzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2soKSB7Ci0vLwlCdWcgNzE0NzIgLSB0cmFuc3BhcmVuY3kgbWFzayBzaG91bGQgYmUgbnVsbAkKLS8vCWFzc2VydE51bGwoIjphOiIsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCkpOwotCi0JSW5wdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHRyYW5zcGFyZW50SW1hZ2VGaWxlbmFtZXNbMF0pOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlhc3NlcnROb3ROdWxsKCI6YjoiLCBtYXNrRGF0YSk7Ci0KLS8vCUJ1ZyA3MTQ3MiAtIHRyYW5zcGFyZW5jeSBtYXNrIHNob3VsZCBiZSBudWxsCQotLyoJaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShpbWFnZUZpbGVuYW1lc1swXSArICcuJyArIGltYWdlRm9ybWF0c1tpbWFnZUZvcm1hdHMubGVuZ3RoLTFdKSk7Ci0JaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JbWFza0RhdGEgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWFzc2VydE51bGwoIjpjOiIsIG1hc2tEYXRhKTsKLSovCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUoKSB7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBTV1QuVFJBTlNQQVJFTkNZX05PTkUsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkpOwotCi0JSW5wdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHRyYW5zcGFyZW50SW1hZ2VGaWxlbmFtZXNbMF0pOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JYXNzZXJ0RmFsc2UoIjpiOiIsIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSA9PSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpKTsKLQkKLQlzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VGaWxlbmFtZXNbMF0gKyAnLicgKyBpbWFnZUZvcm1hdHNbaW1hZ2VGb3JtYXRzLmxlbmd0aC0xXSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3SUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQkkkQiRCSUlJSUlJSSgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBBUEkKLQkvLyBqYXZhZG9jIHN0YXRlczoKLQkvLyA8Yj5JTVBPUlRBTlQ6PC9iPiBUaGlzIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcGFydCBvZiB0aGUgcHVibGljCi0JLy8gQVBJIGZvciA8Y29kZT5JbWFnZURhdGE8L2NvZGU+LiBJdCBpcyBtYXJrZWQgcHVibGljIG9ubHkgc28gdGhhdCBpdAotCS8vIGNhbiBiZSBzaGFyZWQgd2l0aGluIHRoZSBwYWNrYWdlcyBwcm92aWRlZCBieSBTV1QuIEl0IGlzIHN1YmplY3QKLQkvLyB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZyb20KLQkvLyBhcHBsaWNhdGlvbiBjb2RlLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NjYWxlZFRvSUkoKSB7Ci0JZmluYWwgaW50IGltYWdlRGltZW5zaW9uID0gODsKLQlSR0JbXSByZ2JzID0gbmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVsoaW1hZ2VEaW1lbnNpb24qaW1hZ2VEaW1lbnNpb24pIC8gOF07Ci0JCi0JcGl4ZWxEYXRhWzBdID0gMHg0RjsKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGltYWdlRGltZW5zaW9uLCBpbWFnZURpbWVuc2lvbiwgMSwgbmV3IFBhbGV0dGVEYXRhKHJnYnMpLCAxLCBwaXhlbERhdGEpOwotCi0JSW1hZ2VEYXRhIHNjYWxlZEltYWdlRGF0YSA9IGltYWdlRGF0YS5zY2FsZWRUbygtaW1hZ2VEaW1lbnNpb24sIC1pbWFnZURpbWVuc2lvbik7Ci0JYnl0ZVtdIHNjYWxlZFBpeGVsRGF0YSA9IG5ldyBieXRlW2ltYWdlRGltZW5zaW9uXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIGltYWdlRGltZW5zaW9uIC0gMSwgc2NhbGVkUGl4ZWxEYXRhLmxlbmd0aCwgc2NhbGVkUGl4ZWxEYXRhLCAwKTsJCi0JYnl0ZVtdIGV4cGVjdGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbXSB7MHgxLCAweDEsIDB4MSwgMHgxLCAwLCAwLCAweDEsIDB9OwotCWFzc2VydEVxdWFscygiOmE6IiwgZXhwZWN0ZWRQaXhlbERhdGEsIHNjYWxlZFBpeGVsRGF0YSk7Ci0KLQlzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oaW1hZ2VEaW1lbnNpb24gKiAxMCwgaW1hZ2VEaW1lbnNpb24pOwotCXNjYWxlZFBpeGVsRGF0YSA9IG5ldyBieXRlW2ltYWdlRGltZW5zaW9uICogMTBdOwotCXNjYWxlZEltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMCwgc2NhbGVkUGl4ZWxEYXRhLmxlbmd0aCwgc2NhbGVkUGl4ZWxEYXRhLCAwKTsJCi0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBzY2FsZWRQaXhlbERhdGFbMF0pOwotCWFzc2VydEVxdWFscygiOmM6IiwgMCwgc2NhbGVkUGl4ZWxEYXRhWzFdKTsKLQotCXNjYWxlZEltYWdlRGF0YSA9IGltYWdlRGF0YS5zY2FsZWRUbyhpbWFnZURpbWVuc2lvbiwgaW1hZ2VEaW1lbnNpb24gKiAxMCk7Ci0Jc2NhbGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbaW1hZ2VEaW1lbnNpb25dOwotCXNjYWxlZEltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMCwgc2NhbGVkUGl4ZWxEYXRhLmxlbmd0aCwgc2NhbGVkUGl4ZWxEYXRhLCAwKTsJCi0JZXhwZWN0ZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtdIHswLCAweDEsIDAsIDAsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCBleHBlY3RlZFBpeGVsRGF0YSwgc2NhbGVkUGl4ZWxEYXRhKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbHBoYUlJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRBbHBoYSgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldEFscGhhKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYSgtMSwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYShJTUFHRV9ESU1FTlNJT04sIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgLTEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgSU1BR0VfRElNRU5TSU9OLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxwaGFzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IE9GRlNFVCA9IDE7Ci0JYnl0ZVtdIGFscGhhRGF0YSA9IG5ldyBieXRlW1NJWkVdOwotCQotCXZhbHVlID0gKGJ5dGUpIDB4QUE7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW10ge3ZhbHVlLCAoYnl0ZSkgKHZhbHVlKzEpLCAoYnl0ZSkgKHZhbHVlKzIpLCAoYnl0ZSkgKHZhbHVlKzMpLCAoYnl0ZSkgKHZhbHVlKzQpfTsKLQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0QWxwaGFzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmE6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgYWxwaGFEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIElNQUdFX0RJTUVOU0lPTipJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIC0xLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBpeGVsSUlJKCkgewotCWludCB2YWx1ZTsKLQkKLQl2YWx1ZSA9IDB4QUE7Ci0JaW1hZ2VEYXRhLnNldFBpeGVsKDAsIDAsIHZhbHVlKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHZhbHVlLCBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCkpOwotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVsKC0xLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVsKElNQUdFX0RJTUVOU0lPTiwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbCgwLCAtMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbCgwLCBJTUFHRV9ESU1FTlNJT04sIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbHNJSUkkQkkoKSB7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IE9GRlNFVCA9IDE7Ci0JYnl0ZVtdIHBpeGVsRGF0YSA9IG5ldyBieXRlW1NJWkVdOwotCi0JLy8gdGVzdCAxIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4NCwgMHhGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmU6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweEYsIChieXRlKTB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OKklNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKC0xLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAtMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsJCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBkZXB0aCIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiLCBTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbHNJSUkkSUkoKSB7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IE9GRlNFVCA9IDE7Ci0JaW50W10gcGl4ZWxEYXRhID0gbmV3IGludFtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW50W10gdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgxLCAweDEsIDB4MSwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmE6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgNCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjplOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgOCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4RiwgMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpnOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMTYgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMTYsIG5ldyBQYWxldHRlRGF0YSgweEY4MDAsIDB4N0UwLCAweDFGKSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4MiwgMHhGLCAweEZGLCAweEZGQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6aToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpqOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDI0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDI0LCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAsIDB4RkYwMCwgMHhGRikpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOms6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAzMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAzMiwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwMDAsIDB4RkYwMCwgMHhGRikpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBMDB9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpuOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTipJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgKGludFtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBpeGVscyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKC0xLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKElNQUdFX0RJTUVOU0lPTiwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAtMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCBJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgLTEsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9uZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxwaGFJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxwaGFzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbHNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBpeGVsc0lJSSRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3SUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQkkkQiRCSUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2NhbGVkVG9JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxwaGFJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFscGhhc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGl4ZWxJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGl4ZWxzSUlJJElJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCIikpIHRlc3RfQ29uc3RydWN0b3JJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2lvX0lucHV0U3RyZWFtIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb25lIikpIHRlc3RfY2xvbmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFscGhhSUkiKSkgdGVzdF9nZXRBbHBoYUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHBoYXNJSUkkQkkiKSkgdGVzdF9nZXRBbHBoYXNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBpeGVsSUkiKSkgdGVzdF9nZXRQaXhlbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbHNJSUkkQkkiKSkgdGVzdF9nZXRQaXhlbHNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBpeGVsc0lJSSRJSSIpKSB0ZXN0X2dldFBpeGVsc0lJSSRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCcyIpKSB0ZXN0X2dldFJHQnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2siKSkgdGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc3BhcmVuY3lUeXBlIikpIHRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3SUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQkkkQiRCSUlJSUlJSSIpKSB0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NjYWxlZFRvSUkiKSkgdGVzdF9zY2FsZWRUb0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbHBoYUlJSSIpKSB0ZXN0X3NldEFscGhhSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbHBoYXNJSUkkQkkiKSkgdGVzdF9zZXRBbHBoYXNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBpeGVsSUlJIikpIHRlc3Rfc2V0UGl4ZWxJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBpeGVsc0lJSSRCSSIpKSB0ZXN0X3NldFBpeGVsc0lJSSRCSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGl4ZWxzSUlJJElJIikpIHRlc3Rfc2V0UGl4ZWxzSUlJJElJKCk7Ci19Ci0vKiBjdXN0b20gKi8KLUltYWdlRGF0YSBpbWFnZURhdGE7Ci1maW5hbCBpbnQgSU1BR0VfRElNRU5TSU9OID0gMTA7Ci0KLXZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBieXRlIGV4cGVjdGVkW10sIGJ5dGUgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGV4cGVjdGVkW2ldICE9IGFjdHVhbFtpXSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJCWZvcm1hdHRlZD0gbWVzc2FnZSsiICI7Ci0JCWZhaWwoZm9ybWF0dGVkKyJleHBlY3RlZDo8IitleHBlY3RlZCsiPiBidXQgd2FzOjwiK2FjdHVhbCsiPiIpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTc0OGNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQluZXcgSW1hZ2VMb2FkZXIoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCUltYWdlTG9hZGVyTGlzdGVuZXIgbG9hZGVyTGlzdGVuZXIgPSBuZXcgSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaW1hZ2VEYXRhTG9hZGVkKEltYWdlTG9hZGVyRXZlbnQgZSkgewotCQkJbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEZhbHNlKCI6YToiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKGxvYWRlckxpc3RlbmVyKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotCi0JbG9hZGVyTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJpbnRlcmxhY2VkX3RhcmdldC5wbmciKTsJCi0JbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWFzc2VydFRydWUoIjpjOiIsIGxvYWRlckxpc3RlbmVyQ2FsbGVkKTsKLQotCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0Jc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgidGFyZ2V0LnBuZyIpOwkKLQlsb2FkZXIubG9hZChzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RmFsc2UoIjpkOiIsIGxvYWRlckxpc3RlbmVyQ2FsbGVkKTsKLQotCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbG9hZGVyLm5vdGlmeUxpc3RlbmVycyhuZXcgSW1hZ2VMb2FkZXJFdmVudChsb2FkZXIsIGxvYWRlci5kYXRhWzBdLCAwLCB0cnVlKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgbG9hZGVyTGlzdGVuZXJDYWxsZWQpOwotCi0JbG9hZGVyLnJlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXIobG9hZGVyTGlzdGVuZXIpOwotCWFzc2VydEZhbHNlKCI6ZjoiLCBsb2FkZXIuaGFzTGlzdGVuZXJzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc0xpc3RlbmVycygpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvYWQgaW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbXB0eS50eHQiKTsKLQkJdHJ5IHsKLQkJCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvYWQgZnJvbSBpbnZhbGlkIGlucHV0U3RyZWFtIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkKLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xvYWRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCWxvYWRlci5sb2FkKGZpbGVuYW1lKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbG9hZCBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRJbWFnZUxvYWRlckxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOwotCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbG9hZGVyLnNhdmUob3V0U3RyZWFtLCAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgb3V0cHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIuc2F2ZShvdXRTdHJlYW0sIC0xKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdmUgdG8gaW52YWxpZCBvdXRwdXRTdHJlYW0gZm9ybWF0Iik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYm9vbGVhbiBqcGdTdXBwb3J0ZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaT0wOyBpPGltYWdlRm9ybWF0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGltYWdlRm9ybWF0c1tpXS5lcXVhbHMoImpwZyIpKSB7Ci0JCQkJanBnU3VwcG9ydGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoanBnU3VwcG9ydGVkKSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQkJCS8vIG11c3QgdXNlIGpwZyBzaW5jZSBzYXZlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgaW4gcG5nIGZvcm1hdAkJCi0JCQlTdHJpbmcgZmlsZXR5cGUgPSAianBnIjsKLQkJCWluU3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSArICIuIiArIGZpbGV0eXBlKTsJCi0JCQlsb2FkZXIubG9hZChpblN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUZvcm1hdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaW1hZ2VGb3JtYXRzW2ldLmVxdWFscyhmaWxldHlwZSkpIHsKLQkJCQkJLy8gc2F2ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0Ci0JCQkJCWxvYWRlci5zYXZlKG91dFN0cmVhbSwgaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JdHJ5IHsKLQkJbG9hZGVyLnNhdmUoZmlsZW5hbWUsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXZlIGZpbGVuYW1lID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBqMnNlIGFuZCBqMm1lKGNkYykgY2FuIGxvYWQgZnJvbSBhIGZpbGVuYW1lIGJ1dCwgajJtZShjbGRjKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNMaXN0ZW5lcnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKSkgdGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNMaXN0ZW5lcnMiKSkgdGVzdF9oYXNMaXN0ZW5lcnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X2xvYWRMamF2YV9pb19JbnB1dFN0cmVhbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfbG9hZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKSkgdGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUltYWdlTG9hZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zYXZlTGphdmFfaW9fT3V0cHV0U3RyZWFtSSIpKSB0ZXN0X3NhdmVMamF2YV9pb19PdXRwdXRTdHJlYW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zYXZlTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3Rfc2F2ZUxqYXZhX2xhbmdfU3RyaW5nSSgpOwotfQotLyogY3VzdG9tICovCi1ib29sZWFuIGxvYWRlckxpc3RlbmVyQ2FsbGVkOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5ODg0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWigpIHsKLQl0cnkgewotCQluZXcgSW1hZ2VMb2FkZXJFdmVudChudWxsLCBudWxsLCAwLCB0cnVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VMb2FkZXIgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQluZXcgSW1hZ2VMb2FkZXJFdmVudChuZXcgSW1hZ2VMb2FkZXIoKSwgbnVsbCwgMCwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JSW1hZ2VMb2FkZXJFdmVudCBldmVudCA9IG5ldyBJbWFnZUxvYWRlckV2ZW50KG5ldyBJbWFnZUxvYWRlcigpLCBudWxsLCAwLCB0cnVlKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVoiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ2NWYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKSkgdGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiZGQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JdHJ5IHsKLQkJbmV3IFBhbGV0dGVEYXRhKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7fSk7Ci0JYXNzZXJ0RmFsc2UoIjphOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bnVsbCwgbnVsbH0pOwotCWFzc2VydEZhbHNlKCI6YjoiLCBkYXRhLmlzRGlyZWN0KTsKLQotCW5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KTsKLQlhc3NlcnRGYWxzZSgiOmM6IiwgZGF0YS5pc0RpcmVjdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUkoKSB7Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgwLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBkYXRhLmlzRGlyZWN0KTsKLQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoLTEsIC0xLCAtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCWFzc2VydFRydWUoIjpjOiIsIGRhdGEuaXNEaXJlY3QpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JLy8gaW5kZXhlZCBwYWxldHRlIHRlc3RzCQotCVJHQltdIHJnYnMgPSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgbmV3IFJHQig1MCwgMTAwLCAxNTApfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ZWQgcGFsZXR0ZSB3aXRoIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQlkYXRhLmdldFBpeGVsKG5ldyBSR0IoMCwgMCwgMSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2Igbm90IGZvdW5kIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmE6Iiwgcmdicy5sZW5ndGgtMSwgZGF0YS5nZXRQaXhlbChyZ2JzW3JnYnMubGVuZ3RoLTFdKSk7Ci0JCi0JLy8gZGlyZWN0IHBhbGV0dGUgdGVzdHMJCi0JUkdCIHJnYiA9bmV3IFJHQigweDMyLCAweDY0LCAweDk2KTsKLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCQotCXRyeSB7Ci0JCWRhdGEuZ2V0UGl4ZWwobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpcmVjdCBwYWxldHRlIHdpdGggcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YjoiLCAweDMyNjQ5NiwgZGF0YS5nZXRQaXhlbChyZ2IpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0JJKCkgewotCS8vIGluZGV4ZWQgcGFsZXR0ZSB0ZXN0cwkKLQlSR0JbXSByZ2JzID0ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIG5ldyBSR0IoNTAsIDEwMCwgMTUwKX07Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YShyZ2JzKTsKLQotCXRyeSB7Ci0JCWRhdGEuZ2V0UkdCKHJnYnMubGVuZ3RoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igbm9uZXhpc3RlbnQgcGl4ZWwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCByZ2JzW3JnYnMubGVuZ3RoLTFdLCBkYXRhLmdldFJHQihyZ2JzLmxlbmd0aC0xKSk7Ci0KLQkvLyBkaXJlY3QgcGFsZXR0ZSB0ZXN0cwkKLQlSR0IgcmdiID1uZXcgUkdCKDB4MzIsIDB4NjQsIDB4OTYpOwotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YjoiLCByZ2IsIGRhdGEuZ2V0UkdCKDB4MzI2NDk2KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCcygpIHsKLQkvLyBpbmRleGVkIHBhbGV0dGUgdGVzdHMJCi0JUkdCW10gcmdicyA9IHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlQYWxldHRlRGF0YSBkYXRhID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgcmdicywgZGF0YS5nZXRSR0JzKCkpOwotCQotCS8vIGRpcmVjdCBwYWxldHRlIHRlc3RzCQotCWRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZik7Ci0JCi0JYXNzZXJ0TnVsbCgiOmI6IiwgZGF0YS5nZXRSR0JzKCkpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQnMiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9Db25zdHJ1Y3RvciRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQkkiKSkgdGVzdF9nZXRSR0JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0JzIikpIHRlc3RfZ2V0UkdCcygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2EyMGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQkvLyBUZXN0IG5ldyBQb2ludCAoaW50IHgsIGludCB5KQotCVBvaW50IHAgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHAueSk7Ci0KLQlwID0gbmV3IFBvaW50KC00LCAtMyk7Ci0JYXNzZXJ0RXF1YWxzKC00LCBwLngpOwotCWFzc2VydEVxdWFscygtMywgcC55KTsKLQotCXAgPSBuZXcgUG9pbnQoNTAwMDAwLCA3MDAwMDApOwotCWFzc2VydEVxdWFscyg1MDAwMDAsIHAueCk7Ci0JYXNzZXJ0RXF1YWxzKDcwMDAwMCwgcC55KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlQb2ludCBwMSA9IG5ldyBQb2ludCg1LCA1KTsKLQlQb2ludCBwMiA9IG5ldyBQb2ludCg1LCA1KTsKLQlhc3NlcnRUcnVlKCJQb2ludHMgc2hvdWxkIGJlIGVxdWFsIiwgcDEuZXF1YWxzKHAyKSk7Ci0KLQlwMSA9IG5ldyBQb2ludCgtNSwgLTUpOwotCXAyID0gbmV3IFBvaW50KC01LCAtNSk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBiZSBlcXVhbCIsIHAxLmVxdWFscyhwMikpOwotCi0JcDIgPSBuZXcgUG9pbnQoMywgNCk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcDEuZXF1YWxzKHAyKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JUG9pbnQgcDEgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JUG9pbnQgcDIgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGhhc2hDb2RlIiwgcDEuaGFzaENvZGUoKSA9PSBwMi5oYXNoQ29kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlQb2ludCBwID0gbmV3IFBvaW50KDMsIDQpOwotCWFzc2VydE5vdE51bGwocC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKHAudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCWFzc2VydEVxdWFscygiUG9pbnQgezMsIDR9IiwgcC50b1N0cmluZygpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTk5ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQkvLyBUZXN0IFJHQihpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKQotCW5ldyBSR0IoMjAsMTAwLDIwMCk7Ci0JCi0JbmV3IFJHQigwLDAsMCk7Ci0KLQkKLQotCXRyeSB7Ci0JCW5ldyBSR0IoLTEsIDIwLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlZCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjU2LCAyMCwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWQgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAsIC0xLCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigyMCwgMjU2LCA1MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdyZWVuID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAsIDUwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwLCA1MCwgMjU2KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYmx1ZSA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckZGRigpIHsKLQotCW5ldyBSR0IoMGYsMGYsMGYpOwotCQotCW5ldyBSR0IoMGYsMWYsMGYpOwotCW5ldyBSR0IoMGYsMGYsMWYpOwotCW5ldyBSR0IoMGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDFmLDBmLDFmKTsKLQluZXcgUkdCKDFmLDFmLDFmKTsKLQluZXcgUkdCKDFmLDBmLDFmKTsKLQluZXcgUkdCKDFmLDFmLDBmKTsKLQluZXcgUkdCKDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig1OWYsMGYsMWYpOwotCW5ldyBSR0IoNTlmLDFmLDFmKTsKLQluZXcgUkdCKDU5ZiwwZiwxZik7Ci0JbmV3IFJHQig1OWYsMWYsMGYpOwotCW5ldyBSR0IoNTlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig2MGYsMGYsMWYpOwotCW5ldyBSR0IoNjBmLDFmLDFmKTsKLQluZXcgUkdCKDYwZiwwZiwxZik7Ci0JbmV3IFJHQig2MGYsMWYsMGYpOwotCW5ldyBSR0IoNjBmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQig2MWYsMGYsMWYpOwotCW5ldyBSR0IoNjFmLDFmLDFmKTsKLQluZXcgUkdCKDYxZiwwZiwxZik7Ci0JbmV3IFJHQig2MWYsMWYsMGYpOwotCW5ldyBSR0IoNjFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxMTlmLDBmLDFmKTsKLQluZXcgUkdCKDExOWYsMWYsMWYpOwotCW5ldyBSR0IoMTE5ZiwwZiwxZik7Ci0JbmV3IFJHQigxMTlmLDFmLDBmKTsKLQluZXcgUkdCKDExOWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDEyMGYsMGYsMWYpOwotCW5ldyBSR0IoMTIwZiwxZiwxZik7Ci0JbmV3IFJHQigxMjBmLDBmLDFmKTsKLQluZXcgUkdCKDEyMGYsMWYsMGYpOwotCW5ldyBSR0IoMTIwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTIxZiwwZiwxZik7Ci0JbmV3IFJHQigxMjFmLDFmLDFmKTsKLQluZXcgUkdCKDEyMWYsMGYsMWYpOwotCW5ldyBSR0IoMTIxZiwxZiwwZik7Ci0JbmV3IFJHQigxMjFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxNzlmLDBmLDFmKTsKLQluZXcgUkdCKDE3OWYsMWYsMWYpOwotCW5ldyBSR0IoMTc5ZiwwZiwxZik7Ci0JbmV3IFJHQigxNzlmLDFmLDBmKTsKLQluZXcgUkdCKDE3OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDE4MGYsMGYsMWYpOwotCW5ldyBSR0IoMTgwZiwxZiwxZik7Ci0JbmV3IFJHQigxODBmLDBmLDFmKTsKLQluZXcgUkdCKDE4MGYsMWYsMGYpOwotCW5ldyBSR0IoMTgwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTgxZiwwZiwxZik7Ci0JbmV3IFJHQigxODFmLDFmLDFmKTsKLQluZXcgUkdCKDE4MWYsMGYsMWYpOwotCW5ldyBSR0IoMTgxZiwxZiwwZik7Ci0JbmV3IFJHQigxODFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigyMzlmLDBmLDFmKTsKLQluZXcgUkdCKDIzOWYsMWYsMWYpOwotCW5ldyBSR0IoMjM5ZiwwZiwxZik7Ci0JbmV3IFJHQigyMzlmLDFmLDBmKTsKLQluZXcgUkdCKDIzOWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDI0MGYsMGYsMWYpOwotCW5ldyBSR0IoMjQwZiwxZiwxZik7Ci0JbmV3IFJHQigyNDBmLDBmLDFmKTsKLQluZXcgUkdCKDI0MGYsMWYsMGYpOwotCW5ldyBSR0IoMjQwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMjQxZiwwZiwxZik7Ci0JbmV3IFJHQigyNDFmLDFmLDFmKTsKLQluZXcgUkdCKDI0MWYsMGYsMWYpOwotCW5ldyBSR0IoMjQxZiwxZiwwZik7Ci0JbmV3IFJHQigyNDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigyOTlmLDBmLDFmKTsKLQluZXcgUkdCKDI5OWYsMWYsMWYpOwotCW5ldyBSR0IoMjk5ZiwwZiwxZik7Ci0JbmV3IFJHQigyOTlmLDFmLDBmKTsKLQluZXcgUkdCKDI5OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDMwMGYsMGYsMWYpOwotCW5ldyBSR0IoMzAwZiwxZiwxZik7Ci0JbmV3IFJHQigzMDBmLDBmLDFmKTsKLQluZXcgUkdCKDMwMGYsMWYsMGYpOwotCW5ldyBSR0IoMzAwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMzAxZiwwZiwxZik7Ci0JbmV3IFJHQigzMDFmLDFmLDFmKTsKLQluZXcgUkdCKDMwMWYsMGYsMWYpOwotCW5ldyBSR0IoMzAxZiwxZiwwZik7Ci0JbmV3IFJHQigzMDFmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigzNTlmLDBmLDFmKTsKLQluZXcgUkdCKDM1OWYsMWYsMWYpOwotCW5ldyBSR0IoMzU5ZiwwZiwxZik7Ci0JbmV3IFJHQigzNTlmLDFmLDBmKTsKLQluZXcgUkdCKDM1OWYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDM2MGYsMGYsMWYpOwotCW5ldyBSR0IoMzYwZiwxZiwxZik7Ci0JbmV3IFJHQigzNjBmLDBmLDFmKTsKLQluZXcgUkdCKDM2MGYsMWYsMGYpOwotCW5ldyBSR0IoMzYwZiwwLjZmLDAuNGYpOwotCQotCXRyeSB7Ci0JCW5ldyBSR0IoNDAwZiwgMC41ZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGh1ZSA+IDM2MCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigtNWYsIDAuNWYsIDAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBodWUgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIC0wLjVmLCAwLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F0dXJhdGlvbiA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAwZiwgMzAwZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdHVyYXRpb24gPiAxIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIDAuNWYsIC0wLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYnJpZ2h0bmVzcyA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAwZiwgMC41ZiwgNDAwZik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJyaWdodG5lc3MgPiAxIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlpbnQgciA9IDAsIGcgPSAxMjcsIGIgPSAyNTQ7Ci0JUkdCIHJnYjEgPSBuZXcgUkdCKHIsIGcsIGIpOwotCVJHQiByZ2IyOwotCQotCXJnYjIgPSByZ2IxOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiVHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgUkdCIGluc3RhbmNlIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlyZ2IyID0gbmV3IFJHQihyLCBnLCBiKTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlJlZmVyZW5jZXMgdG8gdHdvIGRpZmZlcmVudCBSR0IgaW5zdGFuY2VzIHdpdGggc2FtZSBSIEcgQiBwYXJhbWV0ZXJzIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlpZiAocmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcsIGIpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKHIsIGcrMSwgYikpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IociwgZywgYisxKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihyKzEsIGcrMSwgYisxKSkpIHsKLQkJZmFpbCgiQ29tcGFyaW5nIHR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIFIgRyBCIHBhcmFtZXRlcnMgZm91bmQgZXF1YWwiKTsgICAgCQotCX0KLQotCWZsb2F0IGh1ZSA9IDIyMGYsIHNhdCA9IDAuNmYsIGJyaWdodCA9IDAuN2Y7Ci0JcmdiMSA9IG5ldyBSR0IoaHVlLCBzYXQsIGJyaWdodCk7Ci0JcmdiMiA9IHJnYjE7Ci0JaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQlmYWlsKCJUd28gcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBSR0IgaW5zdGFuY2Ugbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCXJnYjIgPSBuZXcgUkdCKGh1ZSwgc2F0LCBicmlnaHQpOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiUmVmZXJlbmNlcyB0byB0d28gZGlmZmVyZW50IFJHQiBpbnN0YW5jZXMgd2l0aCBzYW1lIEggUyBCIHBhcmFtZXRlcnMgbm90IGZvdW5kIGVxdWFsIik7Ci0JfQotCQotCWlmIChyZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSsxLCBzYXQsIGJyaWdodCkpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IoaHVlLCBzYXQrMC4xZiwgYnJpZ2h0KSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihodWUsIHNhdCwgYnJpZ2h0KzAuMWYpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSsxLCBzYXQrMC4xZiwgYnJpZ2h0KzAuMWYpKSkgewotCQlmYWlsKCJDb21wYXJpbmcgdHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb24gb2YgSCBTIEIgcGFyYW1ldGVycyBmb3VuZCBlcXVhbCIpOyAgICAJCi0JfQotfQotcHVibGljIHZvaWQgdGVzdF9nZXRIU0IoKSB7Ci0JZmxvYXRbXSBoc2IgPSBuZXcgZmxvYXRbXSB7Ci0JCQkJMGYsMGYsMGYsCi0JCQkJMGYsMWYsMWYsCi0JCQkJMGYsMWYsMGYsCi0JCQkJMGYsMGYsMWYsCi0JCQkJMGYsMC42ZiwwLjRmLAotCQkJCTFmLDBmLDFmLAotCQkJCTFmLDFmLDFmLAotCQkJCTFmLDBmLDFmLAotCQkJCTFmLDFmLDBmLAotCQkJCTFmLDAuNmYsMC40ZiwKLQkJCQk1OWYsMGYsMWYsCi0JCQkJNTlmLDFmLDFmLAotCQkJCTU5ZiwwZiwxZiwKLQkJCQk1OWYsMWYsMGYsCi0JCQkJNTlmLDAuNmYsMC40ZiwKLQkJCQk2MGYsMGYsMWYsCi0JCQkJNjBmLDFmLDFmLAotCQkJCTYwZiwwZiwxZiwKLQkJCQk2MGYsMWYsMGYsCi0JCQkJNjBmLDAuNmYsMC40ZiwKLQkJCQk2MWYsMGYsMWYsCi0JCQkJNjFmLDFmLDFmLAotCQkJCTYxZiwwZiwxZiwKLQkJCQk2MWYsMWYsMGYsCi0JCQkJNjFmLDAuNmYsMC40ZiwKLQkJCQkxMTlmLDBmLDFmLAotCQkJCTExOWYsMWYsMWYsCi0JCQkJMTE5ZiwwZiwxZiwKLQkJCQkxMTlmLDFmLDBmLAotCQkJCTExOWYsMC42ZiwwLjRmLAotCQkJCTEyMGYsMGYsMWYsCi0JCQkJMTIwZiwxZiwxZiwKLQkJCQkxMjBmLDBmLDFmLAotCQkJCTEyMGYsMWYsMGYsCi0JCQkJMTIwZiwwLjZmLDAuNGYsCi0JCQkJMTIxZiwwZiwxZiwKLQkJCQkxMjFmLDFmLDFmLAotCQkJCTEyMWYsMGYsMWYsCi0JCQkJMTIxZiwxZiwwZiwKLQkJCQkxMjFmLDAuNmYsMC40ZiwKLQkJCQkxNzlmLDBmLDFmLAotCQkJCTE3OWYsMWYsMWYsCi0JCQkJMTc5ZiwwZiwxZiwKLQkJCQkxNzlmLDFmLDBmLAotCQkJCTE3OWYsMC42ZiwwLjRmLAotCQkJCTE4MGYsMGYsMWYsCi0JCQkJMTgwZiwxZiwxZiwKLQkJCQkxODBmLDBmLDFmLAotCQkJCTE4MGYsMWYsMGYsCi0JCQkJMTgwZiwwLjZmLDAuNGYsCi0JCQkJMTgxZiwwZiwxZiwKLQkJCQkxODFmLDFmLDFmLAotCQkJCTE4MWYsMGYsMWYsCi0JCQkJMTgxZiwxZiwwZiwKLQkJCQkxODFmLDAuNmYsMC40ZiwKLQkJCQkyMzlmLDBmLDFmLAotCQkJCTIzOWYsMWYsMWYsCi0JCQkJMjM5ZiwwZiwxZiwKLQkJCQkyMzlmLDFmLDBmLAotCQkJCTIzOWYsMC42ZiwwLjRmLAotCQkJCTI0MGYsMGYsMWYsCi0JCQkJMjQwZiwxZiwxZiwKLQkJCQkyNDBmLDBmLDFmLAotCQkJCTI0MGYsMWYsMGYsCi0JCQkJMjQwZiwwLjZmLDAuNGYsCi0JCQkJMjQxZiwwZiwxZiwKLQkJCQkyNDFmLDFmLDFmLAotCQkJCTI0MWYsMGYsMWYsCi0JCQkJMjQxZiwxZiwwZiwKLQkJCQkyNDFmLDAuNmYsMC40ZiwKLQkJCQkyOTlmLDBmLDFmLAotCQkJCTI5OWYsMWYsMWYsCi0JCQkJMjk5ZiwwZiwxZiwKLQkJCQkyOTlmLDFmLDBmLAotCQkJCTI5OWYsMC42ZiwwLjRmLAotCQkJCTMwMGYsMGYsMWYsCi0JCQkJMzAwZiwxZiwxZiwKLQkJCQkzMDBmLDBmLDFmLAotCQkJCTMwMGYsMWYsMGYsCi0JCQkJMzAwZiwwLjZmLDAuNGYsCi0JCQkJMzAxZiwwZiwxZiwKLQkJCQkzMDFmLDFmLDFmLAotCQkJCTMwMWYsMGYsMWYsCi0JCQkJMzAxZiwxZiwwZiwKLQkJCQkzMDFmLDAuNmYsMC40ZiwKLQkJCQkzNTlmLDBmLDFmLAotCQkJCTM1OWYsMWYsMWYsCi0JCQkJMzU5ZiwwZiwxZiwKLQkJCQkzNTlmLDFmLDBmLAotCQkJCTM1OWYsMC42ZiwwLjRmLAotCQkJCTM2MGYsMGYsMWYsCi0JCQkJMzYwZiwxZiwxZiwKLQkJCQkzNjBmLDBmLDFmLAotCQkJCTM2MGYsMWYsMGYsCi0JCQkJMzYwZiwwLjZmLDAuNGYsCi0JCQkJMjIwZiwwLjZmLDAuN2Z9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaHNiLmxlbmd0aDsgaSs9MykgewotCQlSR0IgcmdiMSA9IG5ldyBSR0IoaHNiW2ldLCBoc2JbaSsxXSwgaHNiW2krMl0pOwotCQlmbG9hdFtdIGhzYjIgPSByZ2IxLmdldEhTQigpOwotCQlSR0IgcmdiMiA9IG5ldyBSR0IoaHNiMlswXSwgaHNiMlsxXSwgaHNiMlsyXSk7Ci0JCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJCWZhaWwoIlR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIFJHQiB1c2luZyBnZXRIU0IoKSBmdW5jdGlvbiBub3QgZm91bmQgZXF1YWwiKTsKLQkJfQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JaW50IHIgPSAyNTUsIGcgPSAxMDAsIGIgPSAwOwotCVJHQiByZ2IxID0gbmV3IFJHQihyLCBnLCBiKTsKLQlSR0IgcmdiMiA9IG5ldyBSR0IociwgZywgYik7Ci0JCi0JaW50IGhhc2gxID0gcmdiMS5oYXNoQ29kZSgpOwotCWludCBoYXNoMiA9IHJnYjIuaGFzaENvZGUoKTsKLQkKLQlpZiAoaGFzaDEgIT0gaGFzaDIpIHsKLQkJZmFpbCgiVHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBzYW1lIFIgRyBCIHBhcmFtZXRlcnMgcmV0dXJuZWQgZGlmZmVyZW50IGhhc2ggY29kZXMiKTsKLQl9Ci0JCi0JaWYgKHJnYjEuaGFzaENvZGUoKSA9PSBuZXcgUkdCKGcsIGIsIHIpLmhhc2hDb2RlKCkgfHwKLQkJcmdiMS5oYXNoQ29kZSgpID09IG5ldyBSR0IoYiwgciwgZykuaGFzaENvZGUoKSkgewotCQlmYWlsKCJUd28gUkdCIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBSIEcgQiBwYXJhbWV0ZXJzIHJldHVybmVkIHRoZSBzYW1lIGhhc2ggY29kZSIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUkdCIHJnYiA9IG5ldyBSR0IoMCwgMTAwLCAyMDApOwotCi0JU3RyaW5nIHMgPSByZ2IudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJSR0IudG9TdHJpbmcgcmV0dXJucyBhIG51bGwgb3IgZW1wdHkgU3RyaW5nIik7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckZGRiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhTQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yRkZGIikpIHRlc3RfQ29uc3RydWN0b3JGRkYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhTQiIpKSB0ZXN0X2dldEhTQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTRlZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJSSgpIHsKLQkvLyBUZXN0IG5ldyBSZWN0YW5nbGUgKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgzLCA0LCA1LCA2KTsKLQlhc3NlcnRFcXVhbHMoMywgci54KTsKLQlhc3NlcnRFcXVhbHMoNCwgci55KTsKLQlhc3NlcnRFcXVhbHMoNSwgci53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKDYsIHIuaGVpZ2h0KTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKC00LCAtMywgLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMoLTQsIHIueCk7Ci0JYXNzZXJ0RXF1YWxzKC0zLCByLnkpOwotCWFzc2VydEVxdWFscygtMiwgci53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCByLmhlaWdodCk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSg1MDAwMDAsIDcwMDAwMCwgMjAwMDAwLCAxMDAwMDApOwotCWFzc2VydEVxdWFscyg1MDAwMDAsIHIueCk7Ci0JYXNzZXJ0RXF1YWxzKDcwMDAwMCwgci55KTsKLQlhc3NlcnRFcXVhbHMoMjAwMDAwLCByLndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoMTAwMDAwLCByLmhlaWdodCk7Ci19Ci0KLS8qKgotICogRGVzdHJ1Y3RpdmVseSByZXBsYWNlcyB0aGUgeCwgeSwgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKLSAqIGluIHRoZSByZWNlaXZlciB3aXRoIG9uZXMgd2hpY2ggcmVwcmVzZW50IHRoZSB1bmlvbiBvZiB0aGUKLSAqIHJlY3RhbmdsZXMgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlciBhbmQgdGhlIGdpdmVuIHJlY3RhbmdsZS4KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNCwgNCksIHIxKTsKLQotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNCwgNCksIHIxKTsKLQkKLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCksIHIxKTsKLQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoNiwgNiwgMCwgMCk7Ci0JcjEuYWRkKHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBhZGQgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCA1LCA0KSwgcjEpOwotCi0JdHJ5IHsKLQkJcjEuYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb2ludCBzcGVjaWZpZWQgYnkgdGhlCi0gKiBhcmd1bWVudHMgaXMgaW5zaWRlIHRoZSBhcmVhIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNJSSgpIHsKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgxLCAyKSIsIHIuY29udGFpbnMoMSwgMikpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA0KSIsIHIuY29udGFpbnMoMywgNCkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA1KSIsIHIuY29udGFpbnMoMywgNSkpOwotCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDYpIiwgci5jb250YWlucygzLCA2KSk7Ci0vLwotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICg0LCA1KSIsIHIuY29udGFpbnMoNCwgNSkpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoNCwgNikiLCByLmNvbnRhaW5zKDQsIDYpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQgKDksIDEwKSIsICFyLmNvbnRhaW5zKDksIDEwKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICgtMSwgLTEpIiwgIXIuY29udGFpbnMoLTEsIC0xKSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlIHRoZQotICogYXJlYSBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVyLgotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgdGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBQb2ludCgxLCAyKSIsIHIuY29udGFpbnMobmV3IFBvaW50KDEsIDIpKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoMywgNCkiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgzLCA0KSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA1KSIsIHIuY29udGFpbnMobmV3IFBvaW50KDMsIDUpKSk7Ci0KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgzLCA2KSkpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoNCwgNSkiLCByLmNvbnRhaW5zKG5ldyBQb2ludCg0LCA1KSkpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBQb2ludCg0LCA2KSIsIHIuY29udGFpbnMobmV3IFBvaW50KDQsIDYpKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIFBvaW50KDksIDEwKSIsICFyLmNvbnRhaW5zKG5ldyBQb2ludCg5LCAxMCkpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQgKC0xLCAtMSkiLCAhci5jb250YWlucyhuZXcgUG9pbnQoLTEsIC0xKSkpOwotCi0JdHJ5IHsKLQkJci5jb250YWlucyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIGJlIGVxdWFsIiwgcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgNCwgNSwgNik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDIsIDMsIDQsIDUpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAyLCAzKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoNCwgNSwgMywgMik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGhhc2hDb2RlIiwgcjEuaGFzaENvZGUoKSA9PSByMi5oYXNoQ29kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMiwgMik7Ci0JCi0JcjEuaW50ZXJzZWN0KHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3QgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAxLCAyKSwgcjEpOwotCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlyMS5pbnRlcnNlY3QocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApLCByMSk7Ci0KLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSk7Ci0JcjEuaW50ZXJzZWN0KHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3QgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgcjEpOwotCi0JdHJ5IHsKLQkJcjEuaW50ZXJzZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMSwgMiksIHIxLmludGVyc2VjdGlvbihyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApLCByMS5pbnRlcnNlY3Rpb24ocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCByMS5pbnRlcnNlY3Rpb24ocjIpKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdGlvbihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0lJSUkoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgyLCAzLCA3LCA4KSIsIHIxLmludGVyc2VjdHMoMiwgMywgNywgOCkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyLCAzLCA3LCA4KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsIHIyLmludGVyc2VjdHMoMSwgMiwgMywgNCkpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIiwgIXIxLmludGVyc2VjdHMoMjAwLCAzMDAsIDQwMCwgNTAwKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgIXIyLmludGVyc2VjdHMoMSwgMiwgMywgNCkpOwotCQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMywgMywgMCwgMCkiLCByMS5pbnRlcnNlY3RzKDMsIDMsIDAsIDApKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgMCwgMCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMywgMywgLTEsIC0xKSIsICFyMS5pbnRlcnNlY3RzKDMsIDMsIC0xLCAtMSkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMiwgMywgNywgOCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpIiwgcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyLCAzLCA3LCA4KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsIHIyLmludGVyc2VjdHMocjEpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSIsICFyMS5pbnRlcnNlY3RzKHIyKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgIXIyLmludGVyc2VjdHMocjEpKTsKLQkKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIDAsIDApIiwgcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAwLCAwKSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsIHIyLmludGVyc2VjdHMocjEpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMywgMywgLTEsIC0xKSIsICFyMS5pbnRlcnNlY3RzKHIyKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgIXIyLmludGVyc2VjdHMocjEpKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDAsIDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBlbXB0eSIsIHIuaXNFbXB0eSgpKTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIC0zLCAtNCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIGlzIGVtcHR5Iiwgci5pc0VtcHR5KCkpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIGlzIG5vdCBlbXB0eSIsICFyLmlzRW1wdHkoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDMsIDQsIDUsIDYpOwotCWFzc2VydE5vdE51bGwoci50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKHIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHszLCA0LCA1LCA2fSIsIHIudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgdW5pb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCA0LCA0KSwgcjEudW5pb24ocjIpKTsKLQkKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgdW5pb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSwgcjEudW5pb24ocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCksIHIxLnVuaW9uKHIyKSk7Ci0KLQl0cnkgewotCQlyMS51bmlvbihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250YWluc0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VtcHR5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRhaW5zSUkiKSkgdGVzdF9jb250YWluc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9jb250YWluc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNJSUlJIikpIHRlc3RfaW50ZXJzZWN0c0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbXB0eSIpKSB0ZXN0X2lzRW1wdHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZmU2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVnaW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVnaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCS8vIHRlc3QgUmVnaW9uKCkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbigpOwotCWlmIChyZWcuaXNEaXNwb3NlZCgpKSB7Ci0JCWZhaWwoIkNvbnN0cnVjdG9yIGZvciBSZWdpb24gZGlkbid0IGluaXRpYWxpemUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuaXNEaXNwb3NlZCgpKSB7Ci0JCWZhaWwoIkNvbnN0cnVjdG9yIGZvciBSZWdpb24gZGlkbid0IGluaXRpYWxpemUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGQkSSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQl0cnkgewotCQlyZWcuYWRkKChpbnRbXSludWxsKTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIGEgbnVsbCByZWN0YW5nbGUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5hZGQobmV3IGludFtde30pOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDI1LCAwLDI1fSk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlyZWcuZGlzcG9zZSgpOwotCVJlY3RhbmdsZSBleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMCw1MCwyNSk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJhZGQgMSBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDI1LCAwLDI1fSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMjUsIDUwLDI1LCA1MCw0MCwgMCw0MH0pOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlyZWcuZGlzcG9zZSgpOwotCWV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwwLDUwLDQwKTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoImFkZCAyIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotCQotLy8JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLS8vCXJlZy5hZGQobmV3IGludFtdIHsxMCwxMCwgNDAsMzAsIDIwLDYwLCA1LDU1fSk7Ci0vLwlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0vLwlyZWcuZGlzcG9zZSgpOwotLy8JZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICg1LDEwLDM1LDUwKTsKLS8vCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLS8vCQlmYWlsKCJhZGQgMyBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotLy8JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCS8vIGFkZCBhIHJlY3RhbmdsZQotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgwLCAwLCAxMDAsIDUwKSk7Ci0JLy8gYWRkIGEgc2Vjb25kIHJlY3RhbmdsZQotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgyMDAsIDIwMCwgMTAsMTApKTsJCi0KLQl0cnkgewotCQlyZWcuYWRkKChSZWN0YW5nbGUpbnVsbCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIG51bGwgcmVjdGFuZ2xlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgyMCwzMCwxMCw1KSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIHJlY3RhbmdsZSBhZnRlciBSZWdpb24gZ290IGRpc3Bvc2VkIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JLy8gbWFrZSBhIHNlY29uZCByZWdpb24gYW5kIGFkZCBpdCB0byB0aGUgZmlyc3Qgb25lCi0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoNDAsIDUwLCAxMCwgMjApKTsKLQlyZWcxLmFkZChyZWcyKTsKLQotCXRyeSB7Ci0JCXJlZzEuYWRkKChSZWdpb24pbnVsbCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIG51bGwgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSwxMDAsMjAwKSk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlyZWcxLmFkZChyZWcyKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkaW5nIHRvIGEgUmVnaW9uIGEgUmVnaW9uIHdoaWNoIGdvdCBkaXNwb3NlZCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnMS5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMSwxLDEwMCwyMDApKTsKLQkJcmVnMS5hZGQocmVnMik7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIFJlZ2lvbiB0byBhIFJlZ2lvbiB3aGljaCBnb3QgZGlzcG9zZWQiKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zSUkoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwyMDAsMTAwKTsKLQlQb2ludCBwb2ludEluUmVjdDEgPSBuZXcgUG9pbnQoMTAsMTApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoNTAsNTAsMTAwMCwxMDAwKTsKLQlQb2ludCBwb2ludEluUmVjdDIgPSBuZXcgUG9pbnQoMTA0OSwxMDA5KTsKLQlQb2ludCBwb2ludE5vdEluUmVjdDEyID0gbmV3IFBvaW50KDQ5LDExMCk7Ci0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludEluUmVjdDEueCwgcG9pbnRJblJlY3QxLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIkVtcHR5IHJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSB8fAotCQkhcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0Mi54LCBwb2ludEluUmVjdDIueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCWlmIChyZWcuY29udGFpbnMocG9pbnROb3RJblJlY3QxMi54LCBwb2ludE5vdEluUmVjdDEyLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9CQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMjAwLDEwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QxID0gbmV3IFBvaW50KDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDUwLDUwLDEwMDAsMTAwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QyID0gbmV3IFBvaW50KDEwNDksMTAwOSk7Ci0JUG9pbnQgcG9pbnROb3RJblJlY3QxMiA9IG5ldyBQb2ludCg0OSwxMTApOwotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuY29udGFpbnMocG9pbnRJblJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJFbXB0eSByZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSkgfHwKLQkJIXJlZy5jb250YWlucyhwb2ludEluUmVjdDIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50Tm90SW5SZWN0MTIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgbm90IGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgxLDEsNTAsMTAwKSk7Ci0JaWYgKHJlZy5pc0Rpc3Bvc2VkKCkpIHsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBub3QgYmUgaW4gdGhlIGRpc3Bvc2VkIHN0YXRlIik7Ci0JfQotCQotCS8vIGRpc3Bvc2UgdHdpY2UgYXMgdGhpcyBpcyBhbGxvd2VkCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJaWYgKCFyZWcuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmYWlsKCJSZWdpb24gc2hvdWxkIGJlIGluIHRoZSBkaXNwb3NlZCBzdGF0ZSIpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMjUsIDEwMCwgMjAwLCA3ODApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsIDEwNSwgMjA1LCA3ODUpOwotCQotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChyZWN0MSk7Ci0KLQlSZWdpb24gcmVnMiA9IHJlZzE7Ci0JCi0JaWYgKCFyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgUmVnaW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIik7Ci0JfQotCQotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKHJlY3QxKTsKLQkKLS8vIEN1cnJlbnRseSwgUmVnaW9ucyBhcmUgb25seSAiZXF1YWwiIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBoYW5kbGUuCi0vLyBUaGlzIGlzIHNvIHRoYXQgaWRlbnRpY2FsIG9iamVjdHMgYXJlIHByb3Blcmx5IGhhc2hlZC4KLS8vIFdlIGFyZSBjb25zaWRlcmluZyBhZGRpbmcgYSBuZXcgbWV0aG9kIHRoYXQgd2lsbCBjb21wYXJlIFJlZ2lvbnMgZm9yIHRoZSBzYW1lIGFyZWEuCi0vLwlpZiAoIXJlZzEuZXF1YWxzKHJlZzIpKSB7Ci0vLwkJcmVnMS5kaXNwb3NlKCk7Ci0vLwkJcmVnMi5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgidHdvIGluc3RhbmNlcyBvZiBSZWdpb24gcmVwcmVzZW50aW5nIHRoZSBzYW1lIGFyZWEgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwiKTsKLS8vCX0JCQotCQotCXJlZzIuZGlzcG9zZSgpOwotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vbiBlbXB0eSByZWdpb24gY29uc2lkZXJlZCBlcXVhbCB0byBlbXB0eSBvbmUiKTsKLQl9Ci0JCi0JcmVnMi5hZGQocmVjdDIpOwotCWlmIChyZWcxLmVxdWFscyhyZWcyKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInR3byBkaWZmZXJlbnQgcmVnaW9ucyBjb25zaWRlcmVkIGVxdWFsIik7Ci0JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXJlZy5nZXRCb3VuZHMoKTsKLQkJZmFpbCgiUmVnaW9uIGRpc3Bvc2VkIHNob3VsZCB0aHJvdyBFeGNlcHRpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwxMCw1MCwzMCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgxMDAsMTAwLDEwLDEwKTsKLQkvLyB0aGUgcmVjdGFuZ2xlIGVuY2xvc2luZyB0aGUgdHdvIHByZWNlZGluZyByZWN0YW5nbGVzCi0JUmVjdGFuZ2xlIHJlY3QxMkJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAwLDEwMCk7Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlY3QxKTsKLQlSZWN0YW5nbGUgcmVjdDFCaXMgPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKHJlY3QxQmlzLnggIT0gcmVjdDEueCB8fCByZWN0MUJpcy55ICE9IHJlY3QxLnkgfHwgCi0JCXJlY3QxQmlzLmhlaWdodCAhPSByZWN0MS5oZWlnaHQgfHwgcmVjdDFCaXMud2lkdGggIT0gcmVjdDEud2lkdGgpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiZ2V0Qm91bmRzIGRvZXNuJ3QgcmV0dXJuIHRoZSBib3JkZXJzIG9mIHRoZSByZWN0YW5nbGUgYXJlYSB3aGljaCB3YXMgc2V0IHVwIik7Ci0JfQotCQotCXJlZy5hZGQocmVjdDIpOwotCVJlY3RhbmdsZSByZWN0MTIgPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKHJlY3QxMi54ICE9IHJlY3QxMkJvdW5kcy54IHx8IHJlY3QxMi55ICE9IHJlY3QxMkJvdW5kcy55IHx8IAotCQlyZWN0MTIuaGVpZ2h0ICE9IHJlY3QxMkJvdW5kcy5oZWlnaHQgfHwgcmVjdDEyLndpZHRoICE9IHJlY3QxMkJvdW5kcy53aWR0aCkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJnZXRCb3VuZHMgZG9lc24ndCByZXR1cm4gdGhlIGJvcmRlcnMgb2YgdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYXJlYSB3aGljaCB3YXMgc2V0IHVwIik7Ci0JfQotCQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCVJlZ2lvbiByZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJCi0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgyNSwgMTAwLCAyMDAsIDc4MCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCwgMTA1LCAyMDUsIDc4NSk7Ci0JCi0JcmVnMS5hZGQocmVjdDEpOwotCXJlZzIuYWRkKHJlY3QyKTsKLQkKLQlpZiAocmVnMS5oYXNoQ29kZSgpID09IHJlZzIuaGFzaENvZGUoKSkgewotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInR3byBkaWZmZXJlbnQgcmVnaW9ucyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgaGFzaENvZGUiKTsKLQl9Ci0JcmVnMi5kaXNwb3NlKCk7CQotCi0JcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQocmVjdDEpOwotCi0KLS8vIEJVRzogdGhpcyBzaG91bGQgcGFzcwkKLS8vCWlmIChyZWcxLmhhc2hDb2RlKCkgIT0gcmVnMi5oYXNoQ29kZSgpKSB7Ci0vLwkJcmVnMS5kaXNwb3NlKCk7Ci0vLwkJcmVnMi5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgidHdvIHJlZ2lvbnMgcmVwcmVzZW50aW5nIHNhbWUgYXJlYSBzaG91bGQgaGF2ZSBzYW1lIGhhc2hDb2RlIik7Ci0vLwl9Ci0JCi0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDMgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDQgPSBuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDUgPSBuZXcgUmVjdGFuZ2xlKDI1LDIwLDI1LDEwKTsKLQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmludGVyc2VjdChyZWN0MSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5pbnRlcnNlY3QocmVjdDEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLmludGVyc2VjdChyZWN0Mik7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcuaW50ZXJzZWN0KHJlY3QzKTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QzKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnLmludGVyc2VjdChyZWN0NCk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMyIpOwotCX0KLQlyZWcuYWRkKHJlY3QxLnVuaW9uKHJlY3Q0KSk7Ci0JcmVnLmludGVyc2VjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0NSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCA0Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0KLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5hZGQocmVjdDQpOwotCXJlZy5pbnRlcnNlY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgyNSwyMCwyNSw1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzEuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0KLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5pbnRlcnNlY3QocmVnMSk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuaW50ZXJzZWN0KHJlZzEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCQotCVJlZ2lvbiByZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCi0JcmVnLmFkZChyZWcxKTsKLQlyZWcuaW50ZXJzZWN0KHJlZzIpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzEuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZzIuZGlzcG9zZSgpOwotCQotCVJlZ2lvbiByZWczID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWczLmFkZChuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwLDEwKSk7Ci0JCi0JcmVnLmludGVyc2VjdChyZWczKTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzMuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWczLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZzMuZGlzcG9zZSgpOwotCQotCVJlZ2lvbiByZWc0ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc0LmFkZChuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKSk7Ci0KLQlyZWcuaW50ZXJzZWN0KHJlZzQpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMyIpOwotCX0KLQkKLQlSZWdpb24gcmVnNSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnNS5hZGQobmV3IFJlY3RhbmdsZSgyNSwyMCwyNSwxMCkpOwotCQotCXJlZy5hZGQocmVnMS5nZXRCb3VuZHMoKS51bmlvbihyZWc0LmdldEJvdW5kcygpKSk7Ci0JcmVnLmludGVyc2VjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzUuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCA0Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0KLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLmFkZChyZWc0KTsKLQlyZWcuaW50ZXJzZWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgyNSwyMCwyNSw1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDUiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWc0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzSUlJSSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDUwLDMwKTsKLQlSZWN0YW5nbGUgcmVjdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoNTksNDksMTAsMjApOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxID0gbmV3IFJlY3RhbmdsZSgwLDUsMTAsMTUpOwotCQotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsNDAsMTAsMTAwKTsKLQlSZWN0YW5nbGUgcmVjdEludGVyMiA9IG5ldyBSZWN0YW5nbGUoMzksMTM5LDEsNSk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEyID0gbmV3IFJlY3RhbmdsZSg0MCw1MCw1LDE1KTsKLQkKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEueCwgcmVjdEludGVyMS55LCByZWN0SW50ZXIxLndpZHRoLCByZWN0SW50ZXIxLmhlaWdodCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0MS54LCByZWN0MS55LCByZWN0MS53aWR0aCwgcmVjdDEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGNhbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QxLngsIHJlY3QxLnksIHJlY3QxLndpZHRoLCByZWN0MS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMS54LCByZWN0SW50ZXIxLnksIHJlY3RJbnRlcjEud2lkdGgsIHJlY3RJbnRlcjEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEueCwgcmVjdE5vdEludGVyMS55LCByZWN0Tm90SW50ZXIxLndpZHRoLCByZWN0Tm90SW50ZXIxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QyLngsIHJlY3QyLnksIHJlY3QyLndpZHRoLCByZWN0Mi5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlIik7Ci0JfQotCWlmICghcmVnLmludGVyc2VjdHMocmVjdEludGVyMi54LCByZWN0SW50ZXIyLnksIHJlY3RJbnRlcjIud2lkdGgsIHJlY3RJbnRlcjIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEyLngsIHJlY3ROb3RJbnRlcjEyLnksIHJlY3ROb3RJbnRlcjEyLndpZHRoLCByZWN0Tm90SW50ZXIxMi5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwzMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDU5LDQ5LDEwLDIwKTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoMCw1LDEwLDE1KTsKLQkKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLDQwLDEwLDEwMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjIgPSBuZXcgUmVjdGFuZ2xlKDM5LDEzOSwxLDUpOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxMiA9IG5ldyBSZWN0YW5nbGUoNDAsNTAsNSwxNSk7Ci0JCi0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGNhbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyByZXR1cm4gdHJ1ZSBvbiByZWN0YW5nbGUgbm90IGludGVyc2VjdGluZyB3aXRoIHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3QyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgZGlkbid0IHJldHVybiB0cnVlICIpOwotCX0KLQlpZiAocmVnLmludGVyc2VjdHMocmVjdE5vdEludGVyMTIpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCS8vIHRlc3QgaW4gZGlzcG9zZSgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbXB0eSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWN0YW5nbGUgZW1wdHlSZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsMCwyMDApOwotCVJlY3RhbmdsZSBlbXB0eVJlY3QyID0gbmV3IFJlY3RhbmdsZSgxMCwyMCwxMCwwKTsKLQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMTAwKTsKLQkKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSBkaWRuJ3QgcmV0dXJuIHRydWUgb24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCQotCXJlZy5hZGQoZW1wdHlSZWN0MSk7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgZGlkbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQotCXJlZy5hZGQoZW1wdHlSZWN0Mik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgZGlkbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQotCXJlZy5hZGQocmVjdCk7Ci0JaWYgKHJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaXNFbXB0eSByZXR1cm5lZCB0cnVlIG9uIG5vbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3VidHJhY3QkSSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QoKGludFtdKW51bGwpOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBzdWJ0cmFjdCBhIG51bGwgYXJyYXkiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdChuZXcgaW50W117fSk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQlyZWcuZGlzcG9zZSgpOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuc3VidHJhY3QobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDIwLCAwLDIwfSk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlyZWcuZGlzcG9zZSgpOwotCVJlY3RhbmdsZSBleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMjAsNTAsNSk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJzdWJ0cmFjdCAxIGZhaWxlZCAtIGV4cGVjdGVkOiAiK2V4cGVjdGVkKyIgYWN0dWFsOiAiK2JveCk7Ci0JfQotCQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMCwgNTAsMCwgNTAsMjUsIDAsMjV9KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JcmVnLnN1YnRyYWN0KG5ldyBpbnRbXSB7MCwyNSwgNTAsMjUsIDUwLDQwLCAwLDQwfSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCXJlZy5kaXNwb3NlKCk7Ci0JZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsMjUpOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgic3VidHJhY3QgMiBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q0ID0gbmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q1ID0gbmV3IFJlY3RhbmdsZSgwLDAsNjAsMjApOwotCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QocmVjdDEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuc3VidHJhY3QocmVjdDEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuc3VidHJhY3QocmVjdDIpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuc3VidHJhY3QocmVjdDMpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWcuc3VidHJhY3QocmVjdDQpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAzIik7Ci0JfQotCXJlZy5hZGQocmVjdDEudW5pb24ocmVjdDQpKTsKLQlyZWcuc3VidHJhY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLmFkZChyZWN0NCk7Ci0JcmVnLnN1YnRyYWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpIHsKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMS5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KHJlZzEpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0JCi0JcmVnLmFkZChyZWcxKTsKLQlyZWcuc3VidHJhY3QocmVnMik7Ci0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnMi5kaXNwb3NlKCk7Ci0JCi0JUmVnaW9uIHJlZzMgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzMuYWRkKG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApKTsKLQkKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5zdWJ0cmFjdChyZWczKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZzMuZGlzcG9zZSgpOwotCQotCVJlZ2lvbiByZWc0ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc0LmFkZChuZXcgUmVjdGFuZ2xlKDUwLDI1LDEwLDEwKSk7Ci0JCi0JcmVnLnN1YnRyYWN0KHJlZzQpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMyIpOwotCX0KLQotCVJlZ2lvbiByZWc1ID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWc1LmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw2MCwyMCkpOwotCQotCXJlZy5hZGQocmVnMS5nZXRCb3VuZHMoKS51bmlvbihyZWc0LmdldEJvdW5kcygpKSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLDIwLDYwLDE1KSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlyZWc1LmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDQiKTsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWcxKTsKLQlyZWcuYWRkKHJlZzQpOwotCXJlZy5zdWJ0cmFjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJcmVnNS5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnNC5kaXNwb3NlKCk7Ci0JcmVnNS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCi0JU3RyaW5nIHMgPSByZWcudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJ0b1N0cmluZyByZXR1cm5zIG51bGwgb3IgZW1wdHkgc3RyaW5nIik7Ci0JfQotCQotCXJlZy5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAsMjApKTsKLQlzID0gcmVnLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgidG9TdHJpbmcgcmV0dXJucyBudWxsIG9yIGVtcHR5IHN0cmluZyIpOwotCX0KLQotCXJlZy5kaXNwb3NlKCk7Ci0JcyA9IHJlZy50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoInRvU3RyaW5nIHJldHVybnMgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKLQl9CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkgbm90IHdyaXR0ZW4iKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VtcHR5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGQkSSIpKSB0ZXN0X2FkZCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0lJIikpIHRlc3RfY29udGFpbnNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzSUlJSSIpKSB0ZXN0X2ludGVyc2VjdHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VtcHR5IikpIHRlc3RfaXNFbXB0eSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3VidHJhY3QkSSIpKSB0ZXN0X3N1YnRyYWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4YTY2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0ZpbGxMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGIyMTVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAxMCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAxMDAsIDEwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KHNoZWxsLCAxMCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudChzaGVsbCwgMTAsIFNXVC5MRUZUKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGF0dGFjaG1lbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JkMmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1EYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2M1ZTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYzNjkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhKTsKLQlhc3NlcnRUcnVlKGRhdGEudmVydGljYWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCWFzc2VydFRydWUoZGF0YS53aWR0aEhpbnQgPT0gU1dULkRFRkFVTFQpOwotCWFzc2VydFRydWUoZGF0YS5oZWlnaHRIaW50ID09IFNXVC5ERUZBVUxUKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEluZGVudCA9PSAwKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbFNwYW4gPT0gMSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsU3BhbiA9PSAxKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9PSBmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID09IEdyaWREYXRhLkZJTEwpOwotCWFzc2VydFRydWUoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID09IEdyaWREYXRhLkZJTEwpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID09IHRydWUpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoMTAwLCAxMDApOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLndpZHRoSGludCA9PSAxMDApOwotCWFzc2VydFRydWUoZGF0YS5oZWlnaHRIaW50ID09IDEwMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZjJjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWRMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklaIikpIHRlc3RfQ29uc3RydWN0b3JJWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzU0N2MyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0RhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93RGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93RGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJIikpIHRlc3RfQ29uc3RydWN0b3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk0OTZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkM2ZhYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dUIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PTEUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvckkiKSkgdGVzdF9lcnJvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Vycm9ySUkiKSkgdGVzdF9lcnJvcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUiKSkgdGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjI3NzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERvY3VtZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVscEZpbGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWxwRmlsZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGFzdEVycm9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMYXN0RXJyb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lc0lJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXROYW1lc0lJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlTm9SZXBseUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscEZpbGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMYXN0RXJyb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lc0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VOb1JlcGx5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvY3VtZW50YXRpb25JIikpIHRlc3RfZ2V0RG9jdW1lbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlbHBGaWxlSSIpKSB0ZXN0X2dldEhlbHBGaWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExhc3RFcnJvciIpKSB0ZXN0X2dldExhc3RFcnJvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUkiKSkgdGVzdF9nZXROYW1lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZXNJSSIpKSB0ZXN0X2dldE5hbWVzSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JIikpIHRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5SSIpKSB0ZXN0X2dldFByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcyIpKSB0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSIpKSB0ZXN0X2ludm9rZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKSkgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkiKSkgdGVzdF9pbnZva2VOb1JlcGx5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpKSB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9zZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MTdkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZG9WZXJiSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZG9WZXJiSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluZGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvZ3JhbUlEKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9ncmFtSUQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0RpcnR5KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0RpcnR5IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzRm9jdXNDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcXVlcnlTdGF0dXNJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9xdWVyeVN0YXR1c0kgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfaW9fRmlsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kb1ZlcmJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5kZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcm9ncmFtSUQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlydHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRm9jdXNDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9xdWVyeVN0YXR1c0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50IikpIHRlc3RfZGVhY3RpdmF0ZUluUGxhY2VDbGllbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RvVmVyYkkiKSkgdGVzdF9kb1ZlcmJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X2V4ZWNJSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmRlbnQiKSkgdGVzdF9nZXRJbmRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb2dyYW1JRCIpKSB0ZXN0X2dldFByb2dyYW1JRCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXJ0eSIpKSB0ZXN0X2lzRGlydHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRm9jdXNDb250cm9sIikpIHRlc3RfaXNGb2N1c0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3F1ZXJ5U3RhdHVzSSIpKSB0ZXN0X3F1ZXJ5U3RhdHVzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaIikpIHRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGRhOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJhY2tncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9yZWdyb3VuZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpdGVQcm9wZXJ0eUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfYWRkRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXRlUHJvcGVydHlJIikpIHRlc3RfZ2V0U2l0ZVByb3BlcnR5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25JTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCIpKSB0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ZWI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNmQ3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGcmFtZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRhaW5lck1lbnVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU1lbnVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGaWxlTWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXaW5kb3dNZW51cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2luZG93TWVudXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTWVudXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpbmRvd01lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRhaW5lck1lbnVzIikpIHRlc3RfZ2V0Q29udGFpbmVyTWVudXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbGVNZW51cyIpKSB0ZXN0X2dldEZpbGVNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2luZG93TWVudXMiKSkgdGVzdF9nZXRXaW5kb3dNZW51cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTcyODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZ1bmN0aW9uRGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnVuY3Rpb25EZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGM1YmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCIpKSB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDIwNjFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiOTFhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUHJvcGVydHlEZXNjcmlwdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVQcm9wZXJ0eURlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmQ1YmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JGKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckYgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySVMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySVMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2goKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93bigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93biBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JTKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvclMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvclooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdXRvbWF0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdXRvbWF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm9vbGVhbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm9vbGVhbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJ5UmVmKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCeVJlZiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BhdGNoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREaXNwYXRjaCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZsb2F0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGbG9hdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hvcnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNob3J0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUeXBlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VW5rbm93bigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VW5rbm93biBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmRigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZGIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZlMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmUyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZaIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JGIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySVMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yUyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdXRvbWF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb29sZWFuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCeVJlZiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZsb2F0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNob3J0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFR5cGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFVua25vd24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmRiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZlMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmWiIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yRiIpKSB0ZXN0X0NvbnN0cnVjdG9yRigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklTIikpIHRlc3RfQ29uc3RydWN0b3JJUygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JRGlzcGF0Y2goKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yUyIpKSB0ZXN0X0NvbnN0cnVjdG9yUygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JaIikpIHRlc3RfQ29uc3RydWN0b3JaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXV0b21hdGlvbiIpKSB0ZXN0X2dldEF1dG9tYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvb2xlYW4iKSkgdGVzdF9nZXRCb29sZWFuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCeVJlZiIpKSB0ZXN0X2dldEJ5UmVmKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNwYXRjaCIpKSB0ZXN0X2dldERpc3BhdGNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGbG9hdCIpKSB0ZXN0X2dldEZsb2F0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnQiKSkgdGVzdF9nZXRJbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNob3J0IikpIHRlc3RfZ2V0U2hvcnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0cmluZyIpKSB0ZXN0X2dldFN0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHlwZSIpKSB0ZXN0X2dldFR5cGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFVua25vd24iKSkgdGVzdF9nZXRVbmtub3duKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZkYiKSkgdGVzdF9zZXRCeVJlZkYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmSSIpKSB0ZXN0X3NldEJ5UmVmSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZTIikpIHRlc3Rfc2V0QnlSZWZTKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZloiKSkgdGVzdF9zZXRCeVJlZlooKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4MzM5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnREaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludERpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXByaW50RGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0Jc2V0RGlhbG9nKHByaW50RGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgUHJpbnREaWFsb2coc2hlbGwpOwotCQotCXRyeSB7Ci0JCW5ldyBQcmludERpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQluZXcgUHJpbnREaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkKLQl0cnkgewotCQluZXcgUHJpbnREaWFsb2cobnVsbCwgU1dULk5PTkUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5kUGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RW5kUGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW50VG9GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcmludFRvRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNjb3BlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTY29wZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0YXJ0UGFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RhcnRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuZFBhZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFbmRQYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByaW50VG9GaWxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJpbnRUb0ZpbGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2NvcGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTY29wZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdGFydFBhZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTdGFydFBhZ2VJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuZFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW50VG9GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTY29wZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhcnRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmRQYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJpbnRUb0ZpbGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTY29wZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0YXJ0UGFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuZFBhZ2UiKSkgdGVzdF9nZXRFbmRQYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludFRvRmlsZSIpKSB0ZXN0X2dldFByaW50VG9GaWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTY29wZSIpKSB0ZXN0X2dldFNjb3BlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGFydFBhZ2UiKSkgdGVzdF9nZXRTdGFydFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmRQYWdlSSIpKSB0ZXN0X3NldEVuZFBhZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcmludFRvRmlsZVoiKSkgdGVzdF9zZXRQcmludFRvRmlsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNjb3BlSSIpKSB0ZXN0X3NldFNjb3BlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3RhcnRQYWdlSSIpKSB0ZXN0X3NldFN0YXJ0UGFnZUkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi0JUHJpbnREaWFsb2cgcHJpbnREaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZlMzA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgZGV0YWlsID0gIiI7Ci0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgewotCQkvKiBUaGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBzbyB2ZXJpZnkgdGhhdCB0aGUKLQkJICogY29uc3RydWN0b3IgdGhyb3dzIGFuIEVSUk9SX05PX0hBTkRMRVMgU1dURXJyb3IuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBleCkgewotCQkJaWYgKGV4LmNvZGUgPT0gU1dULkVSUk9SX05PX0hBTkRMRVMpIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRVJST1JfTk9fSEFORExFUyBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhdCBsZWFzdCBhIGRlZmF1bHQgcHJpbnRlciwgc28gdmVyaWZ5IHRoYXQKLQkJICogdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb25zLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKCk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQkJZGV0YWlsID0gZXguZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKCJFeGNlcHRpb24gdGhyb3duOiAiICsgZGV0YWlsLCBleGNlcHRpb25UaHJvd24pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTdHJpbmcgZGV0YWlsID0gIiI7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQkvKiBUaGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBzbyB2ZXJpZnkgdGhhdCB0aGUKLQkJICogY29uc3RydWN0b3IgdGhyb3dzIGFuIEVSUk9SX05PX0hBTkRMRVMgU1dURXJyb3IuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJCWlmIChleC5jb2RlID09IFNXVC5FUlJPUl9OT19IQU5ETEVTKSBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkVSUk9SX05PX0hBTkRMRVMgbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JfSBlbHNlIHsKLQkJLyogVGhlcmUgaXMgYXQgbGVhc3QgYSBkZWZhdWx0IHByaW50ZXIsIHNvIHZlcmlmeSB0aGF0Ci0JCSAqIHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9ucy4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJCXByaW50ZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCQlkZXRhaWwgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoIkV4Y2VwdGlvbiB0aHJvd246ICIgKyBkZXRhaWwsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NhbmNlbEpvYigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2FuY2VsSm9iIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMTAsIDEwKTsKLQlhc3NlcnRUcnVlKCJ0cmltIHdpZHRoIG9yIGhlaWdodCBpcyBpbmNvcnJlY3QiLCB0cmltLndpZHRoID49IDEwICYmIHRyaW0uaGVpZ2h0ID49IDEwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lbmRKb2IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2VuZEpvYiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VuZFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2VuZFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSBib3VuZHMgPSBwcmludGVyLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoImJvdW5kcyB3aWR0aCBvciBoZWlnaHQgaXMgemVybyIsIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJpbnRlci5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0VHJ1ZSgiY2xpZW50QXJlYSB3aWR0aCBvciBoZWlnaHQgaXMgemVybyIsIGNsaWVudEFyZWEud2lkdGggPiAwICYmIGNsaWVudEFyZWEuaGVpZ2h0ID4gMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCWFzc2VydFRydWUoImRwaSB4IG9yIHkgaXMgemVybyIsIGRwaS54ID4gMCAmJiBkcGkueSA+IDApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSgpIHsKLQkvLyBUZXN0ZWQgaW4gdGVzdF9nZXRQcmludGVyRGF0YS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmludGVyRGF0YSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZSgiZ2V0UHJpbnRlckRhdGEgIT0gZGF0YSB1c2VkIGluIGNvbnN0cnVjdG9yIiwKLQkJCWRhdGEgPT0gcHJpbnRlci5nZXRQcmludGVyRGF0YSgpKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmludGVyTGlzdCgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCS8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIHZlcmlmeSB0aGF0IHRoZQotCQkgKiBwcmludGVyIGxpc3QgaXMgZW1wdHkuCi0JCSAqLwotCQlQcmludGVyRGF0YSBsaXN0W10gPSBQcmludGVyLmdldFByaW50ZXJMaXN0KCk7Ci0JCWFzc2VydFRydWUoInByaW50ZXIgbGlzdCBjb250YWlucyBpdGVtcyBldmVuIHRob3VnaCB0aGVyZSBhcmUgbm8gcHJpbnRlcnMiLAotCQkJCWxpc3QubGVuZ3RoID09IDApOwotCX0gZWxzZSB7Ci0JCS8qIElmIHRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCB2ZXJpZnkKLQkJICogdGhhdCB0aGUgcHJpbnRlciBsaXN0IGlzIG5vdCBlbXB0eS4KLQkJICovCi0JCVByaW50ZXJEYXRhIGxpc3RbXSA9IFByaW50ZXIuZ2V0UHJpbnRlckxpc3QoKTsKLQkJYXNzZXJ0VHJ1ZSgicHJpbnRlciBsaXN0IGlzIGVtcHR5IiwgbGlzdC5sZW5ndGggPiAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdGFydFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0YXJ0UGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2FuY2VsSm9iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VuZEpvYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZW5kUGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREUEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbnRlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW50ZXJMaXN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RhcnRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2FuY2VsSm9iIikpIHRlc3RfY2FuY2VsSm9iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VuZEpvYiIpKSB0ZXN0X2VuZEpvYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZW5kUGFnZSIpKSB0ZXN0X2VuZFBhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERQSSIpKSB0ZXN0X2dldERQSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhIikpIHRlc3RfZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludGVyRGF0YSIpKSB0ZXN0X2dldFByaW50ZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmludGVyTGlzdCIpKSB0ZXN0X2dldFByaW50ZXJMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3RhcnRKb2JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0YXJ0UGFnZSIpKSB0ZXN0X3N0YXJ0UGFnZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdjY2Q4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlckRhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IFByaW50ZXJEYXRhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCW5ldyBQcmludGVyRGF0YSgiaGVsbG8iLCAidGhlcmUiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gbmV3IFByaW50ZXJEYXRhKCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ5NjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShwcm9ncmFtLmVxdWFscyhwcm9ncmFtKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCQotCS8vIFRoaXMgdGVzdCBpcyBpbmNvbXBsZXRlIGJlY2F1c2UgYSB0cnVlIHRlc3Qgb2YgZXhlY3V0ZSB3b3VsZCBvcGVuCi0JLy8gYW4gYXBwbGljYXRpb24gdGhhdCBjYW5ub3QgYmUgcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQuCi0JCi0JdHJ5IHsKLQkJUHJvZ3JhbVtdIHByb2dyYW1zID0gUHJvZ3JhbS5nZXRQcm9ncmFtcygpOwotCQlpZiAocHJvZ3JhbXMgIT0gbnVsbCAmJiBwcm9ncmFtcy5sZW5ndGggPiAwKSB7Ci0KLQkJCS8vIENhbm5vdCB0ZXN0IGVtcHR5IHN0cmluZyBhcmd1bWVudCBiZWNhdXNlIGl0IG1heSBsYXVuY2ggc29tZXRoaW5nLgotCQkJLy9ib29sZWFuIHJlc3VsdCA9IHByb2dyYW1zWzBdLmV4ZWN1dGUoIiIpOwotCQkJLy9hc3NlcnRGYWxzZShyZXN1bHQpOwotCQkJCi0JCQkvLyB0ZXN0IG51bGwgYXJndW1lbnQKLQkJCQkKLQkJCXByb2dyYW1zWzBdLmV4ZWN1dGUobnVsbCk7Ci0JCQlmYWlsKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIpOwotCQl9Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSBhIG51bGwgcmVzdWx0IGlzIGFsbG93ZWQuCi0JCX0KLQl9Ci0JCi0JdHJ5IHsKLQkJUHJvZ3JhbS5maW5kUHJvZ3JhbShudWxsKTsKLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCWZhaWwoIkludmFsaWQgRXhjZXB0aW9uIHRocm93biBvZiB0eXBlICIrZS5nZXRDbGFzcygpKTsKLQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCWZhaWwoIkludmFsaWQgRXJyb3IgdGhyb3duIG9mIHR5cGUgIitlLmdldENsYXNzKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFeHRlbnNpb25zKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydE5vdE51bGwoZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VEYXRhKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJcHJvZ3JhbS5nZXRJbWFnZURhdGEoKTsKLQkJCQkvLyBOb3RoaW5nIHRvIGRvLgotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb2dyYW0uZ2V0TmFtZSgpOwotCQkJCWFzc2VydE5vdE51bGwoIlByb2dyYW0gaGFzIG51bGwgbmFtZSIsbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvZ3JhbXMoKSB7Ci0JUHJvZ3JhbVtdIHByb2dyYW1zID0gUHJvZ3JhbS5nZXRQcm9ncmFtcygpOwotCQotCS8vIFRoZSByZXN1bHQgaXMgbm90IHdlbGwtZG9jdW1lbnRlZCwgYnV0IGl0IHNob3VsZCAKLQkvLyBiZSBub24tbnVsbCBhbmQgY29udGFpbiBubyBudWxsIGVudHJpZXMuCi0JCi0JYXNzZXJ0Tm90TnVsbChwcm9ncmFtcyk7Ci0JCi0JSGFzaHRhYmxlIGxvb2t1cCA9IG5ldyBIYXNodGFibGUoKTsKLQlmb3IgKGludCBpPTA7IGk8cHJvZ3JhbXMubGVuZ3RoOyBpKyspIHsKLQkJCi0JCS8vIHRlc3Qgbm9uLW51bGwgZW50cnkKLQkJYXNzZXJ0Tm90TnVsbChwcm9ncmFtc1tpXSk7Ci0JCQotCQkvLyB0ZXN0IHVuaXF1ZSBoYXNoIGNvZGUKLQkJaW50IGhhc2hDb2RlID0gcHJvZ3JhbXNbaV0uaGFzaENvZGUoKTsKLQkJSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihoYXNoQ29kZSk7Ci0JCWlmIChsb29rdXAuY29udGFpbnMoa2V5KSkgewotCQkJZmFpbCgiRHVwbGljYXRlIGhhc2ggY29kZSBmb3IgIitwcm9ncmFtc1tpXSsiIChzYW1lIGFzICIrbG9va3VwLmdldChrZXkpKyIpIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb29rdXAucHV0KGtleSxwcm9ncmFtc1tpXSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfZ2V0UHJvZ3JhbXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZygpIHsKLQotCS8vIFRoaXMgdGVzdCBpcyBpbmNvbXBsZXRlIGJlY2F1c2UgYSB0cnVlIHRlc3Qgb2YgbGF1bmNoIHdvdWxkIG9wZW4KLQkvLyBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbm5vdCBiZSBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZC4KLQkKLQkvLyBDYW5ub3QgdGVzdCBlbXB0eSBzdHJpbmcgYXJndW1lbnQgYmVjYXVzZSBpdCBtYXkgbGF1bmNoIHNvbWV0aGluZy4KLQkKLQkvLyB0ZXN0IG51bGwgYXJndW1lbnQKLQkKLQl0cnkgewotCQlQcm9ncmFtLmxhdW5jaChudWxsKTsKLQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBzdHJpbmcgPSBwcm9ncmFtLnRvU3RyaW5nKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgidG9TdHJpbmcgcmV0dXJuZWQgbnVsbCIsc3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9leGVjdXRlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4dGVuc2lvbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvZ3JhbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXh0ZW5zaW9ucyIpKSB0ZXN0X2dldEV4dGVuc2lvbnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlRGF0YSIpKSB0ZXN0X2dldEltYWdlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZSIpKSB0ZXN0X2dldE5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb2dyYW1zIikpIHRlc3RfZ2V0UHJvZ3JhbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkNzljOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLUJ1dHRvbiBidXR0b247Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXNldFdpZGdldChidXR0b24pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gVGVzdCBCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5OVUxMKTsKLQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0KLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQotCW5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0KLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCB8IFNXVC5DSEVDSyk7Ci0KLQl0cnkgewotCQluZXcgQnV0dG9uKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCWJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlidXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWJ1dHRvbi5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQlidXR0b24uY29tcHV0ZVNpemUoMCwgMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKC0xMCwgLTEwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgtMTAsIC0xMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwLCAxMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAsIDEwLCBmYWxzZSk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QWxpZ25tZW50SSgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbloKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiAgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoU1dULkxFRlQsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5SSUdIVCwgYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWJ1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5DRU5URVIsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5VUCk7IC8vIGJhZCB2YWx1ZSBmb3IgcHVzaCBidXR0b24KLQlhc3NlcnRUcnVlKFNXVC5VUCAhPSBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JQnV0dG9uIGFycm93QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhTV1QuTEVGVCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5SSUdIVCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5VUCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5VUCwgYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5ET1dOKTsKLQlhc3NlcnRFcXVhbHMoU1dULkRPV04sIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsgLy8gYmFkIHZhbHVlIGZvciBhcnJvdyBidXR0b24KLQlhc3NlcnRUcnVlKFNXVC5DRU5URVIgIT0gYXJyb3dCdXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCWFycm93QnV0dG9uLmRpc3Bvc2UoKTsKLQotCWludCBhbGlnbm1lbnQgPSA1NTsgLy8gc29tZSBib2d1cyBudW1iZXIKLQlidXR0b24uc2V0QWxpZ25tZW50KGFsaWdubWVudCk7Ci0JYXNzZXJ0VHJ1ZShhbGlnbm1lbnQgIT0gYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQlCdXR0b24gYnRuID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkFSUk9XKTsKLQlidG4uc2V0Rm9jdXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBidXR0b24uZ2V0SW1hZ2UoKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgYnV0dG9uLmdldEltYWdlKCkpOwotCi0JYnV0dG9uLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoYnV0dG9uLmdldEltYWdlKCkpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2Uoc2hlbGwuZ2V0RGlzcGxheSgpLCAxMCwgMTApOwotCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBidXR0b24uZ2V0SW1hZ2UoKSk7Ci0KLQlidXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25aKCkgewotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciBjaGVjayBib3gKLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCWJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCWJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIWJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgYXJyb3cgYnV0dG9uCi0JQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciBwdXNoIGJ1dHRvbgotCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIHJhZGlvIGJ1dHRvbgotCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKG5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIHRvZ2dsZSBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuVE9HR0xFKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUobmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAic29tZSB0ZXh0IiwgImxka2FzaGRvZWh1Zndlb3ZjbmhzbHZocmVnb2plYmNrcmVhdmJrdWh4Yml1ZnZjeWhiaWZ1eWV3dmJpdXJleWQuLGNtbmVzbGpsaWV3amZjaHZid29pZml2YmV3b3JpeHVpZXVydmJpdXZib2hmbGtzamVhaGZjbGl1cmVhZmd5Y2lhYmVsaXR2eXJ3dGxpY3V5cnRsaXVyZXliY2xpdXlyZXVjZXl2YmxpdXJleWJjdCIsICJcbiBcbiBcYiBcdCAiLCAiXDAifTsKLQlpbnQgZ29vZENhc2VzID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Z29vZENhc2VzOyBpKyspewotCQlidXR0b24uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImdvb2QgY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBidXR0b24uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLQotCXRyeSB7Ci0JCWJ1dHRvbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0ZXh0ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYnV0dG9uLnNldFRleHQoIiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb2N1cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbGlnbm1lbnQiKSkgdGVzdF9nZXRBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25aIikpIHRlc3Rfc2V0U2VsZWN0aW9uWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLy9jdXN0b20KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoaW50IHN0eWxlKSB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBzdHlsZSk7Ci0gICAgc2V0V2lkZ2V0KGJ1dHRvbik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQ0hFQ0spOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotLy8gICAgZGlmZmVyZW5jZXMgYmV0d2VlbiBwdXNoIGFuZCB0aGUgcmVzdCBvZiB0aGUgYnV0dG9ucwotLy8JICBkaWZmZXJlbnQgYWNyb3NzIHBsYXRmb3JtcwotLy8gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgLy9hcnJvdyBkb2VzIG5vdCBwcm9kdWNlIGEgdHJhdmVyc2UgbW5lbW9uaWMgb24geHAKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDIwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDE1LCAxNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODlhNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXMKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLUNhbnZhcyBjYW52YXM7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgMCk7Ci0Jc3VwZXIuc2V0V2lkZ2V0KGNhbnZhcyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkKLQkJY2FudmFzLmRpc3Bvc2UoKTsKLQljYW52YXMgPSAoQ2FudmFzKXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IENhbnZhcyhudWxsLCBTV1QuTk9ORSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Njcm9sbElJSUlJSVooKSB7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgMCwgMCwgNTAsIDUwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgMCwgMCwgNTAsIDUwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoMTAwMDAsIDEwMDAwLCAxMDAsIDEwMCwgNTAwLCA1MDAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwMDAwLCAxMDAwMCwgMTAwLCAxMDAsIDUwMCwgNTAwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoLTEwMCwgLTEwMCwgMTAsIDEwLCAzMCwgMzAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKC0xMDAsIC0xMDAsIDEwLCAxMCwgMzAsIDMwLCB0cnVlKTsKLQotCWNhbnZhcy5zY3JvbGwoMTAsIDEwLCAtMjAwLCAtMjAwLCAxMDAsIDEwMCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAsIDEwLCAtMjAwLCAtMjAwLCAxMDAsIDEwMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwMCwgMTAwLCA1MCwgNTAsIC01MCwgLTUwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgNTAsIDUwLCAtNTAsIC01MCwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JQ2FyZXRbXSBjYXJldHMgPSBuZXcgQ2FyZXRbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNhcmV0c1tpXSA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OT05FKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljYW52YXMuc2V0Q2FyZXQoY2FyZXRzW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCJDYXJldCAjICIgKyBpICsgIm5vdCBzZXQgcHJvcGVybHkiLCBjYW52YXMuZ2V0Q2FyZXQoKSwgY2FyZXRzW2ldKTsKLQl9Ci0KLQljYW52YXMuc2V0Q2FyZXQobnVsbCk7Ci0JYXNzZXJ0TnVsbCgiQ2FyZXQgc2hvdWxkIGJlIG51bGwiICwgY2FudmFzLmdldENhcmV0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSBjYW52YXMuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoY2FudmFzLmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQljYW52YXMuc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjYW52YXMuZ2V0Rm9udCgpLmVxdWFscyhmb250KSk7Ci0JY2FudmFzLnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zY3JvbGxJSUlJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldCIpKSB0ZXN0X2dldENhcmV0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zY3JvbGxJSUlJSUlaIikpIHRlc3Rfc2Nyb2xsSUlJSUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQiKSkgdGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20qLwotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMjAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2IyYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1DYW52YXMgY2FudmFzOwotQ2FyZXQgY2FyZXQ7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTlVMTCk7Ci0JY2FyZXQgPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KGNhcmV0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJKCkgewotCXRyeSB7Ci0JCW5ldyBDYXJldChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKTsKLQljYXJldC5zZXRCb3VuZHMocmVjdCk7Ci0JYXNzZXJ0VHJ1ZShjYXJldC5nZXRCb3VuZHMoKS5lcXVhbHMocmVjdCkpOwotCi0JcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDMwLDMwKTsKLQljYXJldC5zZXRCb3VuZHMocmVjdCk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUgKDAsMCw2MCw3MCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9jYXRpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbnZhcywgY2FyZXQuZ2V0UGFyZW50KCkpOwotCi0JYXNzZXJ0VHJ1ZShjYXJldC5nZXREaXNwbGF5KCk9PXNoZWxsLmdldERpc3BsYXkoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCFjYXJldC5pc1Zpc2libGUoKSk7IC8vYmVjYXVzZSB0aGUgc2hlbGwgaXMgbm90IHZpc2libGUKLQotCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNhcmV0LmlzVmlzaWJsZSgpKTsKLQotCWNhcmV0LnNldFZpc2libGUodHJ1ZSk7Ci0JY2FudmFzLnNldFZpc2libGUodHJ1ZSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNhcmV0LmdldFZpc2libGUoKSA9PSB0cnVlKTsKLQljYW52YXMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLQkJYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0VmlzaWJsZSgpKTsKLQl9Ci0KLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQljYW52YXMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JY2FyZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuZ2V0VmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCWNhcmV0LnNldEJvdW5kcygwLCAwLCAzMCwgMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWNhcmV0LnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDAsMCwzMCwzMCkpOwotCi0JdHJ5IHsKLQkJY2FyZXQuc2V0Qm91bmRzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBib3VuZHMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSBjYXJldC5nZXRGb250KCk7Ci0JY2FyZXQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY2FyZXQuZ2V0Rm9udCgpKTsKLQljYXJldC5zZXRGb250KG51bGwpOwotCQotCWZvbnQgPSBuZXcgRm9udChjYXJldC5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWNhcmV0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNhcmV0LmdldEZvbnQoKSk7Ci0KLQljYXJldC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNhcmV0LnNldEZvbnQoZm9udCk7Ci0JCWNhcmV0LnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBjYXJldC5nZXRJbWFnZSgpOwotCWNhcmV0LnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGNhcmV0LmdldEltYWdlKCkpOwotCi0JY2FyZXQuc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChjYXJldC5nZXRJbWFnZSgpKTsKLQotCWltYWdlID0gbmV3IEltYWdlKHNoZWxsLmdldERpc3BsYXkoKSwgMTAsIDEwKTsKLQljYXJldC5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBjYXJldC5nZXRJbWFnZSgpKTsKLQotCWNhcmV0LnNldEltYWdlKG51bGwpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQljYXJldC5zZXRJbWFnZShpbWFnZSk7Ci0JCWNhcmV0LnNldEltYWdlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExvY2F0aW9uSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2l6ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JY2FyZXQuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCJDYXJldCBzaG91bGQgYmUgdmlzaWJsZSIsIGNhcmV0LmdldFZpc2libGUoKT09dHJ1ZSk7Ci0KLQljYXJldC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJDYXJldCBzaG91bGQgbm90IGJlIHZpc2libGUiLCBjYXJldC5nZXRWaXNpYmxlKCk9PWZhbHNlKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvdW5kc0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXNJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmlzaWJsZSIpKSB0ZXN0X2dldFZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzVmlzaWJsZSIpKSB0ZXN0X2lzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzSUlJSSIpKSB0ZXN0X3NldEJvdW5kc0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uSUkiKSkgdGVzdF9zZXRMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVJSSIpKSB0ZXN0X3NldFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhMGUzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coY29sb3JEaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQotCXRyeSB7Ci0JCW5ldyBDb2xvckRpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQluZXcgQ29sb3JEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQkKLQl0cnkgewotCQluZXcgQ29sb3JEaWFsb2cobnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDAsIDAsIDApOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29sb3JEaWFsb2cuZ2V0UkdCKCkgPT0gbnVsbCk7CQotCQkKLQljb2xvckRpYWxvZy5zZXRSR0IocmdiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb2xvckRpYWxvZy5nZXRSR0IoKSA9PSByZ2IpOwotCi0JY29sb3JEaWFsb2cuc2V0UkdCKG51bGwpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbG9yRGlhbG9nLmdldFJHQigpID09IG51bGwpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0IiKSkgdGVzdF9nZXRSR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzViMjBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm8KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi0JQ29tYm8gY29tYm87Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGNvbWJvKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuRFJPUF9ET1dOLCBTV1QuU0lNUExFfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBTdHJpbmcudmFsdWVPZihpKSwgKGNvbWJvLmdldFN0eWxlKCkgJiBjYXNlc1tpXSkgPT0gY2FzZXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5hZGQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5hZGQoIiIpOwotCWFzc2VydEVxdWFscygiOmE6IiwgbmV3IFN0cmluZ1tdeyIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCIiKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBTdHJpbmdbXXsiIiwgIiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIG5ldyBTdHJpbmdbXXsiIiwgIiIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCXRyeSB7Ci0JCWNvbWJvLmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLmFkZCgic3RyaW5nIiwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCJzdHJpbmcwIiwgMCk7Ci0JdHJ5IHsKLQkJY29tYm8uYWRkKCJzdHJpbmcxIiwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID4gc2l6ZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JY29tYm8uYWRkKCJmcmVkIiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkIiwgImZyZWQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JaW50IG51bWJlciA9IDM7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkMCBmcmVkMSBmcmVkMiBmcmVkIiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkMSIsICJmcmVkMiIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JbnVtYmVyID0gMzsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkMCBmcmVkIGZyZWQxIGZyZWQyIiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkMCBmcmVkIGZyZWQxIGZyZWQyIiwgbmV3IFN0cmluZ1tdeyJmcmVkIiwgImZyZWQwIiwgImZyZWQiLCAiZnJlZDEiLCAiZnJlZDIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIGZyZWQwIGZyZWQgZnJlZDEgZnJlZCBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQiLCAiZnJlZDIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIG1ldGhvZHMgc2VuZCBhIE1vZGlmeSBldmVudAkKLQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQljb21iby5zZXRUZXh0KCJuZXcgdGV4dCIpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQljb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCWNvbWJvLnNldFRleHQoImxpbmUiKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQljb21iby5zZWxlY3QoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCWNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0cnkgewotCQljb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDApKSk7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCAwKSkpOyAgLy9ub3RoaW5nIGlzIHNlbGVjdGVkCi0JY29tYm8uc2V0VGV4dCgic29tZSB0ZXh0Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCA1KSkpOwotCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkueD09Y29tYm8uZ2V0U2VsZWN0aW9uKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmNvcHkoKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsMCkpOwotCWNvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMjMxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTQ1NiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQljb21iby5hZGQoIjEyMyIpOwotCWNvbWJvLmFkZCgiNDU2Iik7Ci0JY29tYm8uYWRkKCI3ODkiKTsKLQljb21iby5zZWxlY3QoMCk7Ci0JY29tYm8uc2VsZWN0KDIpOwotCWNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09IC0xKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCS8vIGluZGljZXMgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkCi0JU3RyaW5nW10gaXRlbXMgPSB7Iml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIn07Ci0JY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCWNvbWJvLnNlbGVjdCgxKTsKLQljb21iby5kZXNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWNvbWJvLmRlc2VsZWN0KDIpOwotCi0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PWkpOwotCQljb21iby5kZXNlbGVjdChpKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PS0xKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JLy8gQ29tYm8gY2Fubm90IGhhdmUgY2hpbGRyZW4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IGkpOwotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWFzc2VydFRydWUoIjphYToiLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSBudW1iZXIpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gbnVtYmVyLWkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JY29tYm8uZ2V0SXRlbUhlaWdodCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXRyeSB7Ci0JCWNvbWJvLmdldEl0ZW0oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKGNvbWJvLmdldEl0ZW0oaSkuZXF1YWxzKCJmcmVkIiArIGkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQljb21iby5yZW1vdmVBbGwoKTsKLQljb21iby5hZGQoIjEiKTsKLQljb21iby5hZGQoIjIiKTsKLQljb21iby5hZGQoIjMiKTsKLQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXMubGVuZ3RoPT0zKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtc1swXS5lcXVhbHMoIjEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXNbMV0uZXF1YWxzKCIyIikpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zWzJdLmVxdWFscygiMyIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0T3JpZW50YXRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5nZXRTZWxlY3Rpb24oKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDEsMykpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uc2VsZWN0KGkpOwotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJY29tYm8uZGVzZWxlY3QoaSk7Ci0JCWFzc2VydEVxdWFscygtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJmcmVkIiwgImZyZWRmcmVkIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIFN0cmluZy52YWx1ZU9mKGkpLCBjYXNlc1tpXS5lcXVhbHMoY29tYm8uZ2V0VGV4dCgpKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRIZWlnaHQoKSB7Ci0JY29tYm8uZ2V0VGV4dEhlaWdodCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRMaW1pdCgpIHsKLQljb21iby5zZXRUZXh0TGltaXQoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dExpbWl0KCk9PTMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc0ZvY3VzKCkgewotCS8vIG5vdCBwdWJsaWMgYXBpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JY29tYm8ucmVtb3ZlKCJmcmVkMyIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJmcmVkMyIpKTsKLQlmb3IgKGludCBpID0gNDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZSgyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZDIiKSk7Ci0JZm9yIChpbnQgaSA9IDM7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLmluZGV4T2YobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoInN0cmluZzAiLCAtMSkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAwKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCBpICsgMSkgPT0gLTEpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAwKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMzsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCAzKSA9PSBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpLCBpKSA9PSBpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmN1dCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci0JY29tYm8ucGFzdGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxMjM0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCWNvbWJvLmFkZCgiMSIpOwotCWNvbWJvLmFkZCgiMiIpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldEl0ZW1zKCkubGVuZ3RoPT0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCJzdHJpbmcwIik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpdGVtcyIsIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7ICAvLyBhbGwgaXRlbXMgdGhlIHNhbWUKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpdGVtcyIsIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOyAvLyBkaWZmZXJlbnQgaXRlbXMKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgMCwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQkJaWYgKFN3dEp1bml0LmlzV2luZG93cyB8fCBTd3RKdW5pdC5pc0dUSyB8fCBTd3RKdW5pdC5pc0NhcmJvbikgewotCQkJLy8gVGhlIGJlaGF2aW9yIG9uIFdpbmRvd3MgYW5kIEdUSyB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHJlbW92ZWQKLQkJCS8vIGlzIHRvIHNpbXBseSBzYXkgdGhhdCBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0JCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgYmVoYXZpb3Igb24gb3RoZXIgcGxhdGZvcm1zIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW0gaXMgcmVtb3ZlZAotCQkJLy8gaXMgdG8gc2VsZWN0IHRoZSBpdGVtIHRoYXQgaXMgbm93IGF0IHRoZSBzYW1lIGluZGV4LCBhbmQgc2VuZCBhCi0JCQkvLyBzZWxlY3Rpb24gZXZlbnQuIElmIHRoZXJlIGlzIG5vIGl0ZW0gYXQgdGhlIHNlbGVjdGVkIGluZGV4LCB0aGVuCi0JCQkvLyB0aGUgcGxhdGZvcm0gc2F5cyB0aGF0IG5vIGl0ZW1zIGFyZSBzZWxlY3RlZC4KLQkJCWlmIChpIDwgbnVtYmVyIC0gMSkgewotCQkJCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIDAsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7IC8vIGRpZmZlcmVudCBpdGVtcwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5yZW1vdmUobnVtYmVyLWktMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUlJKCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgwLCA0KTsKLQlhc3NlcnRFcXVhbHMoMCwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscygyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgzLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgyLCAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgtMSwgbnVtYmVyLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIiArIGkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIik7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCXRyeSB7CQotCQljb21iby5yZW1vdmUoImZyZWQiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSBub3QgZm91bmQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscyhudW1iZXIsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRNb2RpZnlMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SSgpIHsKLQljb21iby5hZGQoIjEyMyIpOwotCWNvbWJvLmFkZCgiNDU2Iik7Ci0JY29tYm8uYWRkKCI3ODkiKTsKLQljb21iby5zZWxlY3QoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT09IDEpOwotCQotCS8vIGluZGljZXMgb3V0IG9mIHJhbmdlIGFyZSBpZ25vcmVkCi0JY29tYm8uc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgzLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsICJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKC0xLCAibmV3IHZhbHVlIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JY29tYm8uYWRkKCJqb2UiKTsKLQljb21iby5zZXRJdGVtKDAsICJmcmVkIik7CQotCWFzc2VydFRydWUoImZyZWQiLCBjb21iby5nZXRJdGVtKDApLmVxdWFscygiZnJlZCIpKTsKLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oNCwgImZyZWQiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5zZXRJdGVtKGksICJmcmVkIiArIGkpOwotCWFzc2VydEVxdWFscygiOmE6IiwgbmV3IFN0cmluZ1tdeyJmcmVkMCIsICJmcmVkMSIsICJmcmVkMiIsICJmcmVkMyIsICJmcmVkNCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQljb21iby5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlTdHJpbmdbXVtdIGl0ZW1zID0ge3t9LCB7IiJ9LCB7IiIsICIifSwgeyJmcmVkIn0sIHsiZnJlZDAiLCAiZnJlZDAifSwgeyJmcmVkIiwgImZyZWQifX07Ci0KLQlmb3IgKGludCBpID0gMCA7IGk8IGl0ZW1zLmxlbmd0aDsgaSsrKXsKLQkJY29tYm8uc2V0SXRlbXMoaXRlbXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoIjphOiIgKyBpLCBpdGVtc1tpXSwgY29tYm8uZ2V0SXRlbXMoKSk7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQljb21iby5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JaWYgKChjb21iby5nZXRTdHlsZSgpICYgU1dULk1JUlJPUkVEKSAhPSAwKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldE9yaWVudGF0aW9uKCk9PVNXVC5SSUdIVF9UT19MRUZUKTsKLQl9Ci0JY29tYm8uc2V0T3JpZW50YXRpb24oU1dULkxFRlRfVE9fUklHSFQpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbWJvLmdldE9yaWVudGF0aW9uKCk9PVNXVC5MRUZUX1RPX1JJR0hUKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldFNlbGVjdGlvbihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9pbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgMCkpKTsKLQljb21iby5zZXRUZXh0KCJzb21lIHRleHQiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDUpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQl0cnkgewotCQljb21iby5zZXRUZXh0TGltaXQoMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpbWl0ID09IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uc2V0VGV4dExpbWl0KDMpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHRMaW1pdCgpPT0zKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgImZyZWQiLCAiZnJlZDAifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbWJvLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YzoiICsgaSwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXNlc1tpXSkpOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZW50YXRpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhclNlbGVjdGlvbiIpKSB0ZXN0X2NsZWFyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb3B5IikpIHRlc3RfY29weSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3V0IikpIHRlc3RfY3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEkiKSkgdGVzdF9kZXNlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRIZWlnaHQiKSkgdGVzdF9nZXRUZXh0SGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0TGltaXQiKSkgdGVzdF9nZXRUZXh0TGltaXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bhc3RlIikpIHRlc3RfcGFzdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGltaXRJIikpIHRlc3Rfc2V0VGV4dExpbWl0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljb21iby5zZXRCb3VuZHMoMTAsIDIwLCAzMCwgNDApOwotCS8vIG9ubHkgY2hlY2sgeCwgeSwgYW5kIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnggPT0gMTApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueSA9PSAyMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS53aWR0aCA9PSAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY29tYm8uc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLQkvLyBvbmx5IGNoZWNrIHgsIHksIGFuZCB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnkgPT0gMjApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkud2lkdGggPT0gMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQljb21iby5zZXRTaXplKDMwLCA0MCk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzApOwotCi0JY29tYm8uc2V0U2l6ZSgzMiwgNDMpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQljb21iby5zZXRTaXplKG5ldyBQb2ludCgzMCwgNDApKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMCk7Ci0KLQljb21iby5zZXRCb3VuZHMoMzIsIDQzLCAzMywgNDQpOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMzKTsKLQotCWNvbWJvLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29tYm8uc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb21iby5zZXRTaXplKG5ldyBQb2ludCgzMiwgNDMpKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMik7Ci19Ci0KLXByaXZhdGUgdm9pZCBhZGQoKSB7Ci0gICAgY29tYm8uYWRkKCJ0aGlzIik7Ci0gICAgY29tYm8uYWRkKCJpcyIpOwotICAgIGNvbWJvLmFkZCgiU1dUIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMzAsIGNvbWJvLmdldEl0ZW1IZWlnaHQoKSoyLCAKLSAgICAgICAgICAgIAkJIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT04pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIC8vb24gYXJyb3cKLSAgICBjb25zaXN0ZW5jeUV2ZW50KGNvbWJvLmdldFNpemUoKS54LTEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIC8vb24gdGV4dAotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4YTA4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSB7Ci0KLUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgMCk7Ci0Jc3VwZXIuc2V0V2lkZ2V0KGNvbXBvc2l0ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0ge1NXVC5IX1NDUk9MTCwgU1dULlZfU0NST0xMLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbigpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBDb250cm9sW117fSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBDb250cm9sW117YzF9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQlMaXN0IGMyID0gbmV3IExpc3QoY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIG5ldyBDb250cm9sW117YzEsIGMyfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JQnV0dG9uIGMzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIDApOwotCWFzc2VydEVxdWFscygiOmQ6IiwgbmV3IENvbnRyb2xbXXtjMSwgYzIsIGMzfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JYzIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmU6IiwgbmV3IENvbnRyb2xbXXtjMSwgYzN9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci0JCi0JQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCi0JYXNzZXJ0RXF1YWxzKCI6ZjoiLCBuZXcgQ29udHJvbFtde30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMYXlvdXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYkxpc3QoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9sYXlvdXRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF5b3V0WigpIHsKLQkvLyB0ZXN0ZWQgaW4gc3BlY2lmaWMgTGF5b3V0IGNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCS8vIHRlc3RlZCBpbiBzcGVjaWZpYyBMYXlvdXQgY2xhc3NlcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlDb250cm9sW10gdGFibGlzdCA9IG5ldyBDb250cm9sW10ge2J1dHRvbjEsIGJ1dHRvbjJ9OwotCWNvbXBvc2l0ZS5zZXRUYWJMaXN0KHRhYmxpc3QpOwotCWFzc2VydEVxdWFscyh0YWJsaXN0LCBjb21wb3NpdGUuZ2V0VGFiTGlzdCgpKTsKLQlidXR0b24xLmRpc3Bvc2UoKTsKLQlidXR0b24yLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRyZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFiTGlzdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbiIpKSB0ZXN0X2dldENoaWxkcmVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXlvdXQiKSkgdGVzdF9nZXRMYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYkxpc3QiKSkgdGVzdF9nZXRUYWJMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoY29tcG9zaXRlICE9IG51bGwpCi0JCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JY29tcG9zaXRlID0gKENvbXBvc2l0ZSl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE0ZGJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQlDb250cm9sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRDb250cm9sTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW92ZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcigpIHsKLQlGb2N1c0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c0luLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzT3V0LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlIZWxwTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSGVscExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKSB7Ci0JS2V5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5LZXlVcCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKSB7Ci0JTW91c2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VEb3duLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlVXAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCkgewotCU1vdXNlTW92ZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRNb3VzZU1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZU1vdmUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQlNb3VzZVRyYWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW91c2VUcmFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZUVudGVyLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRXhpdCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZUhvdmVyLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKSB7Ci0JUGFpbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRQYWludExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlHQyBnYyA9IGV2ZW50LmdjID0gbmV3IEdDKGNvbnRyb2wpOwkKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuUGFpbnQsIGV2ZW50KTsKLQlnYy5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZVBhaW50TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKCkgewotCVRyYXZlcnNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkVHJhdmVyc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5UcmF2ZXJzZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJKCkgewotCWNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29udHJvbC5nZXRTaXplKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgY29udHJvbC5nZXRTaXplKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCVBvaW50IHNpemUgPSBjb250cm9sLmdldFNpemUoKTsKLQljb250cm9sLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55LCBmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29udHJvbC5nZXRTaXplKCkueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgY29udHJvbC5nZXRTaXplKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9yY2VGb2N1cygpIHsKLQkvLyB0aGlzIGlzIGRpZmZpY3VsdCB0byB0ZXN0IGluIENvbnRyb2wuCi0JLy8gc3ViY2xhc3NlcyB0aGF0IHdpc2ggdG8gdGVzdCB0aGlzIHNob3VsZCBvdmVycmlkZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY2Nlc3NpYmxlKCkgewotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpOwotCWFzc2VydFRydWUoIjphOiIsIGFjY2Vzc2libGUgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvcmRlcldpZHRoKCkgewotCWNvbnRyb2wuZ2V0Qm9yZGVyV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Qm91bmRzSUlJSSBhbmQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGF5b3V0RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmdldExvY2F0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgzMiwgNDMpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNb25pdG9yKCkgewotCU1vbml0b3IgbW9uaXRvciA9IGNvbnRyb2wuZ2V0TW9uaXRvcigpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcik7Ci0JRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7Ci0JTW9uaXRvcltdIG1vbml0b3JzID0gZGlzcGxheS5nZXRNb25pdG9ycygpOwotCWludCBpOwotCS8qIG1vbml0b3IgbXVzdCBiZSBsaXN0ZWQgaW4gRGlzcGxheS5nZXRNb25pdG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAobW9uaXRvci5lcXVhbHMobW9uaXRvcnNbaV0pKSBicmVhazsKLQl9Ci0JaWYgKGkgPT0gbW9uaXRvcnMubGVuZ3RoKSB7Ci0JCWZhaWwoIkNvbnRyb2wuZ2V0TW9uaXRvciBkb2VzIG5vdCByZXR1cm4gYSBtb25pdG9yIGxpc3RlZCBpbiBEaXNwbGF5LmdldE1vbml0b3JzIik7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGNvbnRyb2wuZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxsKCkgewotCWFzc2VydEVxdWFscyhzaGVsbCwgY29udHJvbC5nZXRTaGVsbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNpemVJSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGludGVudGlvbmFsbHkgbm90IHRlc3RlZCAtIG5vdCBwdWJsaWMgQVBJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCWNvbnRyb2wuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuaXNFbmFibGVkKCkpOwotCi0JY29udHJvbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0ZvY3VzQ29udHJvbCgpIHsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzRm9jdXNDb250cm9sKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzUmVwYXJlbnRhYmxlKCkgewotCWFzc2VydEVxdWFscyAoImlzUmVwYXJlbnRhYmxlIiwgY29udHJvbC5pc1JlcGFyZW50YWJsZSgpLCBpc1JlcGFyZW50YWJsZVBsYXRmb3JtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc1Zpc2libGUoKSk7ICAvL2JlY2F1c2UgdGhlIHNoZWxsIGlzIG5vdCB2aXNpYmxlCi0KLQljb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCi0JaWYgKCFTd3RKdW5pdC5pc0FJWCkgewotCQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgYmUgdmlzaWJsZSIsIGNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBub3QgYmUgdmlzaWJsZSIsICFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JY29udHJvbC5tb3ZlQWJvdmUobnVsbCk7Ci0KLQljb250cm9sLm1vdmVBYm92ZShjb250cm9sKTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgMCk7Ci0JY29udHJvbC5tb3ZlQWJvdmUoYik7Ci0JYi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW92ZUJlbG93TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JY29udHJvbC5tb3ZlQmVsb3cobnVsbCk7Ci0KLQljb250cm9sLm1vdmVCZWxvdyhjb250cm9sKTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgMCk7Ci0JY29udHJvbC5tb3ZlQmVsb3coYik7Ci0JYi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQljb250cm9sLnBhY2soKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYWNrWigpIHsKLQljb250cm9sLnBhY2sodHJ1ZSk7Ci0JY29udHJvbC5wYWNrKGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXcoKSB7Ci0JY29udHJvbC5yZWRyYXcoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXdJSUlJWigpIHsKLQljb250cm9sLnJlZHJhdygwLCAwLCAwLCAwLCBmYWxzZSk7Ci0KLQljb250cm9sLnJlZHJhdygwLCAwLCAwLCAwLCB0cnVlKTsKLQotCWNvbnRyb2wucmVkcmF3KC0xMCwgLTEwLCAtMTAsIC0xMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygxMCwgMTAsIDEwLCAxMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygxMCwgMTAsIDEwLCAxMCwgZmFsc2UpOwotCi0JY29udHJvbC5yZWRyYXcoMTAwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDAsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCAyNTUsIDAsIDApOwotCWNvbnRyb2wuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBjb250cm9sLmdldEJhY2tncm91bmQoKSk7Ci0JY29udHJvbC5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpLmVxdWFscyhjb2xvcikpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCWNvbnRyb2wuc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCksIGNvbnRyb2wuZ2V0Qm91bmRzKCkpOwotCi0JY29udHJvbC5zZXRCb3VuZHMoMjAsIDMwLCA0MCwgNTApOwotCWFzc2VydEVxdWFscyhmYWxzZSwgY29udHJvbC5nZXRCb3VuZHMoKS5lcXVhbHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQljb250cm9sLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApLCBjb250cm9sLmdldEJvdW5kcygpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMjAsIDMwLCA0MCwgNTApKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbnRyb2wuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKSk7Ci0KLQl0cnkgewotCQljb250cm9sLnNldEJvdW5kcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29udHJvbC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcHR1cmVaKCkgewotCWNvbnRyb2wuc2V0Q2FwdHVyZSh0cnVlKTsKLQotCWNvbnRyb2wuc2V0Q2FwdHVyZShmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKSB7Ci0JY29udHJvbC5zZXRDdXJzb3IobnVsbCk7Ci0KLQlDdXJzb3IgYyA9IG5ldyBDdXJzb3IoY29udHJvbC5nZXREaXNwbGF5KCksIDApOwotCWNvbnRyb2wuc2V0Q3Vyc29yKGMpOwotCWMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCWNvbnRyb2wuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuZ2V0RW5hYmxlZCgpKTsKLQotCWNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzKCkgewotCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnQgZm9udCA9IGNvbnRyb2wuZ2V0Rm9udCgpOwotCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY29udHJvbC5nZXRGb250KCkpOwotCQotCWZvbnQgPSBuZXcgRm9udChjb250cm9sLmdldERpc3BsYXkoKSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JY29udHJvbC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBjb250cm9sLmdldEZvbnQoKSk7Ci0KLQljb250cm9sLnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY29udHJvbC5zZXRGb250KGZvbnQpOwotCQljb250cm9sLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQljb250cm9sLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldEZvcmVncm91bmQoKS5lcXVhbHMoY29sb3IpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCkgewotCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0aGlzKTsKLQlhc3NlcnRFcXVhbHModGhpcywgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKCJhc2xkc2FoZGFoY2FzbGNzaGRhYyIpOwotCWFzc2VydEVxdWFscygiYXNsZHNhaGRhaGNhc2xjc2hkYWMiLCBjb250cm9sLmdldExheW91dERhdGEoKSk7Ci0KLQljb250cm9sLnNldExheW91dERhdGEodGhpcy5nZXRDbGFzcygpKTsKLQlhc3NlcnRFcXVhbHModGhpcy5nZXRDbGFzcygpLCBjb250cm9sLmdldExheW91dERhdGEoKSk7Ci0KLQljb250cm9sLnNldExheW91dERhdGEobnVsbCk7Ci0JYXNzZXJ0TnVsbChjb250cm9sLmdldExheW91dERhdGEoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbigxMSwgMjIpOwotCWNvbnRyb2wuc2V0U2l6ZSgzMiwgNDMpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIG5ldyBQb2ludCgxMSwgMjIpKTsKLQotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTAsIDEwKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBuZXcgUG9pbnQoMTAsIDEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXRyeSB7Ci0JCWNvbnRyb2wuc2V0TG9jYXRpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvY2F0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JUG9pbnQgbG9jID0gbmV3IFBvaW50KDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci0KLQlsb2MgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLQotCWxvYyA9IG5ldyBQb2ludCgxMDAwMCwgMTAwMDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24obG9jKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBsb2MpOwotCi0JbG9jID0gbmV3IFBvaW50KC0xMCwgLTEwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUgKCkgewotCS8qIHRoaXMgaXMgYSB2YWxpZCB0aGluZyB0byBkbywgeW91IGNhbiByZXNldCBhIG1lbnUgdG8gbm90aGluZyAqLwotCWNvbnRyb2wuc2V0TWVudShudWxsKTsKLQotCU1lbnUgbSA9IG5ldyBNZW51KGNvbnRyb2wpOwotCWNvbnRyb2wuc2V0TWVudShtKTsKLQlhc3NlcnRFcXVhbHMobSwgY29udHJvbC5nZXRNZW51KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0JaWYgKGNvbnRyb2wuaXNSZXBhcmVudGFibGUoKSkgewotCQlTaGVsbCBvcmlnaW5hbFBhcmVudCA9IG5ldyBTaGVsbCgpOwotCQlTaGVsbCBuZXdQYXJlbnQgPSBuZXcgU2hlbGwoKTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKG9yaWdpbmFsUGFyZW50LCBTV1QuUFVTSCk7Ci0JCWIuc2V0UGFyZW50KG5ld1BhcmVudCk7Ci0JCW9yaWdpbmFsUGFyZW50LmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSghYi5pc0Rpc3Bvc2VkKCkpOwotCQluZXdQYXJlbnQuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWRyYXdaKCkgewotCWNvbnRyb2wuc2V0UmVkcmF3KGZhbHNlKTsKLQotCWNvbnRyb2wuc2V0UmVkcmF3KHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzMCwgNDApLCBjb250cm9sLmdldFNpemUoKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcygzMiwgNDMsIDMwLCA0MCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbigxMSwgMjIpOwotCWNvbnRyb2wuc2V0U2l6ZSgzMiwgNDMpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzIsIDQzKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JY29udHJvbC5zZXRTaXplKDAsIDApOwotCQotCWNvbnRyb2wuc2V0U2l6ZSgxMCwgMTApOwotCi0JY29udHJvbC5zZXRTaXplKDEwMDAwLCAxMDAwMCk7Ci0KLQljb250cm9sLnNldFNpemUoLTEwLCAtMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoMzAsIDQwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgzMCwgNDApLCBjb250cm9sLmdldFNpemUoKSk7Ci0KLQl0cnkgewotCQljb250cm9sLnNldFNpemUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDAsIDApKTsKLQkKLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDEwLCAxMCkpOwotCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgxMDAwMCwgMTAwMDApKTsKLQotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoLTEwLCAtMTApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWNvbnRyb2wuc2V0VG9vbFRpcFRleHQoIlRoaXMgaXMgYSB0aXAiKTsKLQlhc3NlcnRFcXVhbHMoIlRoaXMgaXMgYSB0aXAiLCBjb250cm9sLmdldFRvb2xUaXBUZXh0KCkpOwotCi0JY29udHJvbC5zZXRUb29sVGlwVGV4dChudWxsKTsKLQlhc3NlcnROdWxsKGNvbnRyb2wuZ2V0VG9vbFRpcFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY29udHJvbC5nZXRWaXNpYmxlKCkpOwotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldFZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9Db250cm9sSUkoKSB7Ci0JUG9pbnQgY29udHJvbENvb3JkcyA9IGNvbnRyb2wudG9Db250cm9sKDAsIDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMCwgMCksIGNvbnRyb2wudG9EaXNwbGF5KGNvbnRyb2xDb29yZHMueCwgY29udHJvbENvb3Jkcy55KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlQb2ludCBjb250cm9sQ29vcmRzID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KDAsIDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvRGlzcGxheShjb250cm9sQ29vcmRzKSk7Ci0JdHJ5IHsKLQkJY29udHJvbC50b0NvbnRyb2wobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9EaXNwbGF5SUkoKSB7Ci0JUG9pbnQgZGlzcGxheUNvb3JkcyA9IGNvbnRyb2wudG9EaXNwbGF5KDAsIDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMCwgMCksIGNvbnRyb2wudG9Db250cm9sKGRpc3BsYXlDb29yZHMueCwgZGlzcGxheUNvb3Jkcy55KSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlQb2ludCBkaXNwbGF5Q29vcmRzID0gY29udHJvbC50b0Rpc3BsYXkobmV3IFBvaW50KDAsIDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvQ29udHJvbChkaXNwbGF5Q29vcmRzKSk7Ci0JdHJ5IHsKLQkJY29udHJvbC50b0Rpc3BsYXkobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNpemUgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJhdmVyc2VJKCkgewotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX0VTQ0FQRSk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfUkVUVVJOKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUKTsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlKCkgewotCWNvbnRyb2wudXBkYXRlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9yY2VGb2N1cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWNjZXNzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm9yZGVyV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGF5b3V0RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1vbml0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0ZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNSZXBhcmVudGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FwdHVyZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvRGlzcGxheUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0Rpc3BsYXlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90cmF2ZXJzZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VwZGF0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIikpIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpKSB0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKSkgdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKSkgdGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIikpIHRlc3RfYWRkUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIikpIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUkiKSkgdGVzdF9jb21wdXRlU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3JjZUZvY3VzIikpIHRlc3RfZm9yY2VGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWNjZXNzaWJsZSIpKSB0ZXN0X2dldEFjY2Vzc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3JkZXJXaWR0aCIpKSB0ZXN0X2dldEJvcmRlcldpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExheW91dERhdGEiKSkgdGVzdF9nZXRMYXlvdXREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51IikpIHRlc3RfZ2V0TWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TW9uaXRvciIpKSB0ZXN0X2dldE1vbml0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGwiKSkgdGVzdF9nZXRTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZpc2libGUiKSkgdGVzdF9nZXRWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1JlcGFyZW50YWJsZSIpKSB0ZXN0X2lzUmVwYXJlbnRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfbW92ZUFib3ZlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfbW92ZUJlbG93TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhY2siKSkgdGVzdF9wYWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrWiIpKSB0ZXN0X3BhY2taKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXciKSkgdGVzdF9yZWRyYXcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlZHJhd0lJSUlaIikpIHRlc3RfcmVkcmF3SUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzSUlJSSIpKSB0ZXN0X3NldEJvdW5kc0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcHR1cmVaIikpIHRlc3Rfc2V0Q2FwdHVyZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIikpIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXRMYXlvdXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uSUkiKSkgdGVzdF9zZXRMb2NhdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpKSB0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFyZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpKSB0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplSUkiKSkgdGVzdF9zZXRTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b0NvbnRyb2xJSSIpKSB0ZXN0X3RvQ29udHJvbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9EaXNwbGF5SUkiKSkgdGVzdF90b0Rpc3BsYXlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyYXZlcnNlSSIpKSB0ZXN0X3RyYXZlcnNlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdXBkYXRlIikpIHRlc3RfdXBkYXRlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCUNvbnRyb2wgY29udHJvbDsKLQlib29sZWFuIGV2ZW50T2NjdXJyZWQ7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCWNvbnRyb2wgPSAoQ29udHJvbCl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotLyogYSBkaWZmZXJlbnQgbWV0aG9kIGluIENvbnNpc3RlbmN5VXRpbGl0eSBpcyBpbnZva2VkIGRlcGVuZGluZyBvbiB3aGF0IG1ldGhvZCAKLSAqIGVxdWFscwotICogQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLOgotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCAJCQkJICAKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wKLSAqIAkJCXBhcmFtQyBpcyB0aGUgbW91c2UgYnV0dG9uIHRvIGNsaWNrLgotICogCQkJcGFyYW1EIGlmIGl0IGVxdWFscyBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIHRoZW4gYW5vdGhlciBjbGljawotICogCQkJd2lsbCBiZSBtYWRlIG9uIHRoZSBib3JkZXIgb2YgdGhlIHNoZWxsLCB0byBlc2NhcGUgdGhlIG1lbnUgdGhhdCBjYW1lIHVwCi0gKiAJCQkoaWUgcmlnaHQgY2xpY2tpbmcgaW4gYSB0ZXh0IHdpZGdldCkKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhEaXNwbGF5LCBQb2ludCwgaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLCi0gKiAJCQlwYXJhbUEgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIAkJCQkgIAotICogCQkJcGFyYW1CIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbAotICogCQkJcGFyYW1DIGlzIHRoZSBtb3VzZSBidXR0b24gdG8gY2xpY2suCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlQ2xpY2soRGlzcGxheSwgUG9pbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHOgotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgb3JpZ2luIG9mIGRyYWcKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIG9yaWdpbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUMgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBkZXN0aW5hdGlvbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBkZXN0aW5hdGlvbiBvZiBkcmFnCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RHJhZyhEaXNwbGF5LCBQb2ludCwgUG9pbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTOiAgCi0gKiAJCSAJcGFyYW1BIGlzIHRoZSBjaGFyYWN0ZXIgdG8gcHJlc3MKLSAqIAkJCXBhcmFtQiBpcyB0aGUga2V5Q29kZSAKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RLZXlQcmVzcyhEaXNwbGF5LCBpbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTOiAgCi0gKiAJCSAJcGFyYW1BIGlzIHRoZSBjaGFyYWN0ZXIgdG8gcHJlc3MgYW5kIGhvbGQKLSAqIAkJCXBhcmFtQiBpcyB0aGUga2V5Q29kZSAKLSAqIAkJCXBhcmFtQyBpcyB0aGUgc2Vjb25kIGtleSB0byBwcmVzcyB3aGlsZSB0aGUgZmlyc3Qgb25lIGlzIGhlbGQgKGllIGN0cmwtYSkKLSAqIAkJCXBhcmFtRCBpcyB0aGUgc2Vjb25kIGtleWNvZGUKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3REb3VibGVLZXlQcmVzcyhEaXNwbGF5LCBpbnQsIGludCwgaW50LCBpbnQpIAotICogQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTjoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIGZpcnN0IGNsaWNrCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBmaXJzdCBjbGljawotICogCQkJcGFyYW1DIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgc2Vjb25kIGNsaWNrCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBzZWNvbmQgY2xpY2sKLSAqIAkJCWludm9rZXMgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTZWxlY3Rpb24oRGlzcGxheSwgUG9pbnQsIFBvaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlk6Ci0gKiAJCQlwYXJhbUEgaXMgdGhlIGJ1dHRvbiB0byBjbGljayB3aXRoCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KERpc3BsYXksIFBvaW50LCBpbnQpCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoZmluYWwgaW50IHBhcmFtQSwgZmluYWwgaW50IHBhcmFtQiwgCi0gICAgICAgIAkJCQkJCWZpbmFsIGludCBwYXJhbUMsIGZpbmFsIGludCBwYXJhbUQsCi0gICAgICAgIAkJCQkJCWZpbmFsIGludCBtZXRob2QsIFZlY3RvciBldmVudHMsIGJvb2xlYW4gZm9jdXMpIHsKLSAgICBpZihmVGVzdENvbnNpc3RlbmN5KSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHNoZWxsLmdldERpc3BsYXkoKTsKLSAgICAgICAgaWYoZXZlbnRzID09IG51bGwpIAotICAgICAgICAgICAgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdCA9IGdldFRlc3ROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCgpKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dCgiUGFyZW50Iik7Ci0KLSAgICAgICAgc2hlbGwucGFjaygpOwotICAgIAlzaGVsbC5vcGVuKCk7Ci0gICAgCWlmKGNvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgIAkgICAgKChTaGVsbCljb250cm9sKS5wYWNrKCk7Ci0gICAgICAgIAkoKFNoZWxsKWNvbnRyb2wpLm9wZW4oKTsKLSAgICAJfQotICAgIAlmaW5hbCBQb2ludFtdIHB0ID0gZGV0ZXJtaW5lTG9jYXRpb25zKHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kKTsKLSAgICAgICAgaWYoZm9jdXMgJiYgIWNvbnRyb2wuc2V0Rm9jdXMoKSkKLSAgICAgICAgICAgIGNvbnRyb2wuZm9yY2VGb2N1cygpOwotICAgICAgICBTdHJpbmdbXSBleHBlY3RlZEV2ZW50cyA9IGhvb2tFeHBlY3RlZEV2ZW50cyh0ZXN0LCBldmVudHMpOwotICAgICAgICBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkud2FrZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaChtZXRob2QpIHsKLSAgICAgICAgICAgICAgICAJY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0s6Ci0gICAgICAgICAgICAgICAgCQlBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdENsaWNrKGRpc3BsYXksIHB0WzBdLCBwYXJhbUMpKTsKLSAgICAgICAgICAgICAgICAJCWlmKHBhcmFtRCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUpIHsKLSAgICAgICAgICAgICAgICAJCSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhkaXNwbGF5LCBwdFsxXSwgMSkpOwotICAgICAgICAgICAgICAgIAkJfSAgCi0gICAgICAgICAgICAgICAgCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRE9VQkxFQ0xJQ0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3REb3VibGVDbGljayhkaXNwbGF5LCBwdFswXSwgcGFyYW1DKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RLZXlQcmVzcyhkaXNwbGF5LCBwYXJhbUEsIHBhcmFtQikpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlS2V5UHJlc3MoZGlzcGxheSwgcGFyYW1BLCBwYXJhbUIsIHBhcmFtQywgcGFyYW1EKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RHJhZyhkaXNwbGF5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0WzBdLCBwdFsxXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTjoKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTZWxlY3Rpb24oZGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFswXSwgcHRbMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoU3d0SnVuaXQuaXNDYXJib24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RTaGVsbEljb25pZnkoZGlzcGxheSwgcHRbMF0sIHBhcmFtQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KGRpc3BsYXksIHB0WzFdLCBwYXJhbUEpKTsKLSAgICAgICAgICAgICAgICAgICAgCWlmKGNvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotICAgICAgICAgICAgICAgICAgICAJICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgKChTaGVsbCljb250cm9sKS5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9fSk7Ci0gICAgICAgICAgICAgICAgICAgIAl9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgCSAgICBmYWlsKCJJY29uaWZ5aW5nIGEgbm9uIHNoZWxsIGNvbnRyb2wiKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0uc3RhcnQoKTsKLQotICAgICAgICB3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICBpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldFVwKCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0cyA9IG5ldyBTdHJpbmdbZXZlbnRzLnNpemUoKV07Ci0gICAgICAgIGV2ZW50cy5jb3B5SW50byhyZXN1bHRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QgKyAiIGV2ZW50IG9yZGVyaW5nIiwgZXhwZWN0ZWRFdmVudHMsIHJlc3VsdHMpOwotICAgIH0KLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lFdmVudChpbnQgcGFyYW1BLCBpbnQgcGFyYW1CLCAKLQkJCQkJCQkJaW50IHBhcmFtQywgaW50IHBhcmFtRCwKLQkJCQkJCQkJaW50IG1ldGhvZCwgVmVjdG9yIGV2ZW50cykgewotICAgIGNvbnNpc3RlbmN5RXZlbnQocGFyYW1BLCBwYXJhbUIsIHBhcmFtQywgcGFyYW1ELCBtZXRob2QsIGV2ZW50cywgdHJ1ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwgCi0JCQkJCQkJCWludCBwYXJhbUMsIGludCBwYXJhbUQsCi0JCQkJCQkJCWludCBtZXRob2QpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kLCBudWxsLCB0cnVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKSB7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQoKSk7Ci0gICAgc2hlbGwucGFjaygpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbChTaGVsbCBzaGVsbCkgewotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgc2hlbGwucGFjaygpOwotfQotCi0KLXByb3RlY3RlZCBQb2ludFtdIGRldGVybWluZUxvY2F0aW9ucyhpbnQgcGFyYW1BLCBpbnQgcGFyYW1CLAotICAgICAgICAJCQkJCQkgICAgIGludCBwYXJhbUMsIGludCBwYXJhbUQsIGludCBtZXRob2QpIHsKLSAgICBQb2ludFtdIGFycmF5ID0gbmV3IFBvaW50WzJdOwotICAgIGlmKG1ldGhvZCA+PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spCi0gICAgICAgIGFycmF5WzBdID0gY29udHJvbC50b0Rpc3BsYXkocGFyYW1BLCBwYXJhbUIpOwotICAgIGlmKG1ldGhvZCA+PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRykgCi0gICAgICAgIGFycmF5WzFdID0gY29udHJvbC50b0Rpc3BsYXkocGFyYW1DLCBwYXJhbUQpOwotICAgIGlmKG1ldGhvZCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0sgJiYgcGFyYW1EID09IENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSkKLSAgICAgICAgYXJyYXlbMV0gPSBzaGVsbC50b0Rpc3BsYXkoMjUsIC0xMCk7Ci0gICAgZWxzZSBpZihtZXRob2QgPT0gQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlkpIHsKLSAgICAgICAgYXJyYXlbMF0gPSBjb250cm9sLnRvRGlzcGxheSgwLDApOwotICAgICAgICBhcnJheVsxXSA9IGNvbnRyb2wudG9EaXNwbGF5KGNvbnRyb2wuZ2V0U2l6ZSgpLnggLTIwLCAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5OwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMDBkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldChjb29sQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCggIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbU9yZGVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtT3JkZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtU2l6ZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1TaXplcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2tlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9ja2VkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V3JhcEluZGljZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdyYXBJbmRpY2VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NrZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMb2NrZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V3JhcEluZGljZXMkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V3JhcEluZGljZXMkSSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbU9yZGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtU2l6ZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdyYXBJbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NrZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXcmFwSW5kaWNlcyRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1PcmRlciIpKSB0ZXN0X2dldEl0ZW1PcmRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbVNpemVzIikpIHRlc3RfZ2V0SXRlbVNpemVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NrZWQiKSkgdGVzdF9nZXRMb2NrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdyYXBJbmRpY2VzIikpIHRlc3RfZ2V0V3JhcEluZGljZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9ja2VkWiIpKSB0ZXN0X3NldExvY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdyYXBJbmRpY2VzJEkiKSkgdGVzdF9zZXRXcmFwSW5kaWNlcyRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBDdXN0b20gKi8KLQotQ29vbEJhciBjb29sQmFyOwotCi0KLXByaXZhdGUgdm9pZCBjcmVhdGVDb29sQmFyKFZlY3RvciBldmVudHMpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQpOwotCVRvb2xCYXJbXSBjb29sSXRlbVRvb2xCYXIgPSBuZXcgVG9vbEJhclsyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJY29vbEl0ZW1Ub29sQmFyW2ldID0gbmV3IFRvb2xCYXIoY29vbEJhciwgU1dULkZMQVQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29vbEl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhjb29sSXRlbVRvb2xCYXJbaV0sIHRlc3QsIGV2ZW50cyk7Ci0JCWludCB0b29sSXRlbVdpZHRoID0gMDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0oY29vbEl0ZW1Ub29sQmFyW2ldLCBTV1QuQ0hFQ0spOwotCQkJaXRlbS5zZXRUZXh0KCJDQiIgKyAoKGkqMikgKyBqKSk7Ci0JCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkgKyBqKTsKLQkJCWlmIChpdGVtLmdldFdpZHRoKCkgPiB0b29sSXRlbVdpZHRoKQotCQkJICAgIHRvb2xJdGVtV2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgdGVzdCwgZXZlbnRzKTsKLQkJfQotICAgICAgICBjb29sSXRlbS5zZXRDb250cm9sKGNvb2xJdGVtVG9vbEJhcltpXSk7Ci0gICAgICAgIFBvaW50IHNpemU7Ci0gICAgICAgIGlmKGkgPT0gMSkKLSAgICAgICAgICAgIHNpemUgPSBjb29sSXRlbVRvb2xCYXJbaV0uY29tcHV0ZVNpemUoMjAsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2l6ZSA9IGNvb2xJdGVtVG9vbEJhcltpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgICBQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xJdGVtV2lkdGgvMywgY29vbFNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotICAgICAgICBjb29sSXRlbS5zZXRTaXplKGNvb2xTaXplLngvMywgY29vbFNpemUueSk7Ci0gICAgICAgIGNvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQlzZXRXaWRnZXQoY29vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIC8vY2hldnJvbgotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngsIDIsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVDb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBQb2ludFtdIHBvaW50cyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwb2ludHNbMF0ueC0xMiwgMCwgcG9pbnRzWzBdLngtMTIsIDUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngsIDAsIHBvaW50c1swXS54LCA1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVDb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBQb2ludFtdIHBvaW50cyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwb2ludHNbMF0ueC0xMiwgMCwgcG9pbnRzWzBdLngtOCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT04sIGV2ZW50cyk7Ci19Ci0KLWNsYXNzIENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQlwcml2YXRlIE1lbnUgbWVudSA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJLyoqCi0JCSAqIEEgc2VsZWN0aW9uIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiB0aGUgY29vbCBpdGVtCi0JCSAqIGlzIHNlbGVjdGVkIGJ5IGl0cyBncmlwcGVyIG9yIGlmIHRoZSBkcm9wIGRvd24gYXJyb3cKLQkJICogKG9yICdjaGV2cm9uJykgaXMgc2VsZWN0ZWQuIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbAotCQkgKiB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIHdpZGdldCB3YXMgc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJLyogSWYgdGhlIHBvcHVwIG1lbnUgaXMgYWxyZWFkeSB1cCAoaS5lLiB1c2VyIHByZXNzZWQgYXJyb3cgdHdpY2UpLAotCQkJICogdGhlbiBkaXNwb3NlIGl0LgotCQkJICovCi0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQkJbWVudSA9IG51bGw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvKiBHZXQgdGhlIGNvb2wgaXRlbSBhbmQgY29udmVydCBpdHMgYm91bmRzIHRvIGRpc3BsYXkgY29vcmRpbmF0ZXMuICovCi0JCQlDb29sSXRlbSBjb29sSXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBjb29sSXRlbS5nZXRCb3VuZHMgKCk7Ci0JCQlpdGVtQm91bmRzLndpZHRoID0gZXZlbnQueCAtIGl0ZW1Cb3VuZHMueDsKLQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50IChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCWl0ZW1Cb3VuZHMueSA9IHB0Lnk7Ci0JCQkKLQkJCS8qIEdldCB0aGUgdG9vbGJhciBmcm9tIHRoZSBjb29sIGl0ZW0uICovCi0JCQlUb29sQmFyIHRvb2xCYXIgPSAoVG9vbEJhcikgY29vbEl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCVRvb2xJdGVtW10gdG9vbHMgPSB0b29sQmFyLmdldEl0ZW1zICgpOwotCQkJaW50IHRvb2xDb3VudCA9IHRvb2xzLmxlbmd0aDsKLQkJCQkJCQkKLQkJCS8qIENvbnZlcnQgdGhlIGJvdW5kcyBvZiBlYWNoIHRvb2wgaXRlbSB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLAotCQkJICogYW5kIGRldGVybWluZSB3aGljaCBvbmVzIGFyZSBwYXN0IHRoZSBib3VuZHMgb2YgdGhlIGNvb2wgaXRlbS4KLQkJCSAqLwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0b29sQ291bnQpIHsKLQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCXRvb2xCb3VuZHMueCA9IHB0Lng7Ci0JCQkJdG9vbEJvdW5kcy55ID0gcHQueTsKLQkJICAJCVJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gPSBpdGVtQm91bmRzLmludGVyc2VjdGlvbiAodG9vbEJvdW5kcyk7Ci0JCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJICAJCWkrKzsKLQkJCX0KLQkJCQotCQkJLyogQ3JlYXRlIGEgcG9wLXVwIG1lbnUgd2l0aCBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgaGlkZGVuIGJ1dHRvbnMuICovCi0JCQltZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29sQ291bnQ7IGorKykgewotCQkJCVRvb2xJdGVtIHRvb2wgPSB0b29sc1tqXTsKLQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VGV4dCgpOwotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuTk9ORSk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCX0KLQkJCQotCQkJLyogRGlzcGxheSB0aGUgcG9wLXVwIG1lbnUgYXQgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBhcnJvdyBidXR0b24uCi0JCQkgKiBEaXNwb3NlIHRoZSBtZW51IHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIGl0LgotCQkJICovCi0JCQlwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBjb29sQmFyLmdldERpc3BsYXkgKCk7Ci0JCQl3aGlsZSAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKSAmJiBtZW51LmlzVmlzaWJsZSAoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCQl9Ci0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJbWVudS5kaXNwb3NlICgpOwotCQkJCW1lbnUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWJhNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlzZXRXaWRnZXQoY29vbEl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQluZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IENvb2xJdGVtKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwkKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMCk7Ci0JdHJ5IHsKLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotCX0KLQl0cnkgewotCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gMiIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotCX0KLQlhc3NlcnRFcXVhbHMoMSwgY29vbEJhci5nZXRJdGVtQ291bnQoKSk7Ci0JY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDApOwotCWFzc2VydEVxdWFscygzLCBjb29sQmFyLmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoY29vbEl0ZW0sIGNvb2xCYXIuZ2V0SXRlbSgwKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCi0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCVBvaW50IHNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlhc3NlcnRUcnVlKHNpemUyLnggPT0gc2l6ZS54KTsKLQotCXNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSg1MCwgMjUpOwotCXNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoMTAwLCAyNSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCArIDUwLCBzaXplMi54KTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS55LCBzaXplMi55KTsKLQotCXNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSgxLDEpOwotCXNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoMjYsIDI2KTsKLQlhc3NlcnRFcXVhbHMoMjUsIHNpemUyLnggLSBzaXplLngpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWFzc2VydEVxdWFscyhzaXplLngsIHJlY3Qud2lkdGgpOwotCWFzc2VydEVxdWFscyhzaXplLnksIHJlY3QuaGVpZ2h0KTsKLQkKLQljb29sSXRlbS5zZXRTaXplKDI1LCAyNSk7Ci0JcmVjdCA9IGNvb2xJdGVtLmdldEJvdW5kcygpOwotCWNvb2xJdGVtLnNldFNpemUoMTAwLCAyNSk7Ci0JUmVjdGFuZ2xlIG5ld1JlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRFcXVhbHMocmVjdC53aWR0aCArIDc1LCBuZXdSZWN0LndpZHRoKTsKLQlhc3NlcnRFcXVhbHMocmVjdC54LCBuZXdSZWN0LngpOwotCWFzc2VydEVxdWFscyhyZWN0LnksIG5ld1JlY3QueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JYXNzZXJ0TnVsbChjb29sSXRlbS5nZXRDb250cm9sKCkpOwotCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlDb250cm9sIGNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci0KLQlidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JY29udHJvbCA9IGNvb2xJdGVtLmdldENvbnRyb2woKTsKLQlhc3NlcnRFcXVhbHMoYnV0dG9uLCBjb250cm9sKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtU2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWluaW11bVNpemUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWFzc2VydEVxdWFscyhjb29sQmFyLCBjb29sSXRlbS5nZXRQYXJlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJlZmVycmVkU2l6ZSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgcHJlZiA9IGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKTsKLQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHByZWYpOwotCWFzc2VydEVxdWFscyhwcmVmLCBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpemUoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRFcXVhbHMocmVjdC53aWR0aCwgc2l6ZS54KTsKLQlhc3NlcnRFcXVhbHMocmVjdC5oZWlnaHQsIHNpemUueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChudWxsKTsKLQkKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCVBvaW50IHNpemUyID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWFzc2VydFRydWUoc2l6ZTIueCA+IHNpemUueCk7Ci0JCi0JaWYgKCFNSU5JTUFMX0NPTkZPUk1BTkNFKSB7Ci0JCXNpemUgPSBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJc2l6ZTIgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSk7Ci0JCWFzc2VydEVxdWFscyhzaXplMiwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLmRpc3Bvc2UoKTsKLQl0cnkgewotCQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB3aGVuIGNvbnRyb2wuaXNEaXNwb3NlZCgpIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JdHJ5IHsKLQkJY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gY29udHJvbCBoYXMgd3JvbmcgcGFyZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtU2l6ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5pbXVtU2l6ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcmVmZXJyZWRTaXplSUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShzaXplKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS54LCBjb29sSXRlbS5nZXRTaXplKCkueCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCkpOwotCWFzc2VydEVxdWFscyhzaXplLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFByZWZlcnJlZFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gbmV3IFBvaW50KDUwLCAzMCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShzaXplKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFByZWZlcnJlZFNpemUoKTsKLQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKDUwLCAzMCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUyLCBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0KLQljb29sSXRlbS5zZXRTaXplKDUwLCA1MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCg1MCwgNTApLCBjb29sSXRlbS5nZXRTaXplKCkpOwotCi0JY29vbEl0ZW0uc2V0U2l6ZSgwLCAwKTsKLQlQb2ludCBzbWFsbGVzdCA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRTaXplKDEsIDEpOwotCWFzc2VydEVxdWFscyhzbWFsbGVzdCwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLQkKLQlSZWN0YW5nbGUgcmVjdCA9IGNvb2xJdGVtLmdldEJvdW5kcygpOwotCVBvaW50IHNpemUgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHNpemUgPSBuZXcgUG9pbnQoNTAsIDUwKTsKLQljb29sSXRlbS5zZXRTaXplKHNpemUpOwotCVBvaW50IHNpemUyID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFNpemUoNTAsIDUwKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZTIsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW1TaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByZWZlcnJlZFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmVmZXJyZWRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFByZWZlcnJlZFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUkiKSkgdGVzdF9jb21wdXRlU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtU2l6ZSIpKSB0ZXN0X2dldE1pbmltdW1TaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByZWZlcnJlZFNpemUiKSkgdGVzdF9nZXRQcmVmZXJyZWRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaXplIikpIHRlc3RfZ2V0U2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bVNpemVJSSIpKSB0ZXN0X3NldE1pbmltdW1TaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJIikpIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFByZWZlcnJlZFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplSUkiKSkgdGVzdF9zZXRTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBNSU5JTUFMX0NPTkZPUk1BTkNFID0gZmFsc2U7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYThkZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EZWNvcmF0aW9ucwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQkvLyBkbyBub3RoaW5nLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCBhbiBhYnN0cmFjdCBjbGFzcywgaXQgd2FzIG5ldmVyIG1lYW50IHRvIAotCS8vIGJlIGluc3RhbnRpYXRlZAotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gZG8gbm90aGluZywgZXZlbiB0aG91Z2ggdGhpcyBpcyBub3QgYW4gYWJzdHJhY3QgY2xhc3MsIGl0IHdhcyBuZXZlciBtZWFudCB0byAKLQkvLyBiZSBpbnN0YW50aWF0ZWQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0JZGVjb3JhdGlvbnMuY29tcHV0ZVRyaW0oMCwwLDAsMCk7Ci0JZGVjb3JhdGlvbnMuY29tcHV0ZVRyaW0oMCwwLDEwLDIwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlSZWN0YW5nbGUgcmVjdCA9IGRlY29yYXRpb25zLmdldENsaWVudEFyZWEoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCByZWN0LmhlaWdodCA+PSAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCByZWN0LndpZHRoID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHRCdXR0b24oKSB7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZGVjb3JhdGlvbnMsIFNXVC5QVVNIKTsKLQlkZWNvcmF0aW9ucy5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0RGVmYXVsdEJ1dHRvbigpID09IGJ1dHRvbik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0JSW1hZ2VbXSBjYXNlcyA9IHtudWxsLCBuZXcgSW1hZ2UobnVsbCwgMTAwLCAxMDApfTsKLQlmb3IoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKyl7Ci0JCWRlY29yYXRpb25zLnNldEltYWdlKGNhc2VzW2ldKTsKLQkgCWFzc2VydEVxdWFscyhkZWNvcmF0aW9ucy5nZXRJbWFnZSgpLCBjYXNlc1tpXSk7Ci0JIAlpZiAoY2FzZXNbaV0hPW51bGwpCi0JICAJCWNhc2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbigpIHsKLQlkZWNvcmF0aW9ucy5zZXRMb2NhdGlvbigxMCwxNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0TG9jYXRpb24oKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBkZWNvcmF0aW9ucy5nZXRMb2NhdGlvbigpLnkgPT0gMTUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltaXplZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TWF4aW1pemVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnVCYXIoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0TWVudUJhcigpID09IG51bGwpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKGRlY29yYXRpb25zLCBTV1QuQkFSKTsKLQlkZWNvcmF0aW9ucy5zZXRNZW51QmFyIChiYXIpOwotCWFzc2VydFRydWUoIjpiOiIsIGRlY29yYXRpb25zLmdldE1lbnVCYXIoKSA9PSBiYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltaXplZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0TWluaW1pemVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpemUoKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQlkZWNvcmF0aW9ucy5zZXRUZXh0KCJ0ZXN0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVjb3JhdGlvbnMuZ2V0VGV4dCgpLmVxdWFscygidGVzdCIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1JlcGFyZW50YWJsZSgpIHsKLQkvKiBEZWNvcmF0aW9ucyBhcmUgbm90IHJlcGFyZW50YWJsZSwgc2VlIHdpbjMyIGltcGxlbWVudGF0aW9uIG9mIGlzUmVwYXJlbnRhYmxlKCkgKi8KLQlhc3NlcnRGYWxzZShkZWNvcmF0aW9ucy5pc1JlcGFyZW50YWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREZWZhdWx0QnV0dG9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbigpIHsKLQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZGVjb3JhdGlvbnMsIFNXVC5OVUxMKTsKLQlkZWNvcmF0aW9ucy5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0JYXNzZXJ0VHJ1ZSgiYnV0dG9uIG5vdCBkZWZhdWx0IiwgZGVjb3JhdGlvbnMuZ2V0RGVmYXVsdEJ1dHRvbigpID09IGJ1dHRvbik7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCWRlY29yYXRpb25zLnNldERlZmF1bHRCdXR0b24obnVsbCk7Ci0JCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0RGVmYXVsdEJ1dHRvbigpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwoIjphOiIsIGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWxvYWRJbWFnZXMoKTsKLQlkZWNvcmF0aW9ucy5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydFRydWUoIjpiOiIsIGltYWdlc1swXSA9PSBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBpbWFnZXNbMV0gIT0gZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JZGVjb3JhdGlvbnMuc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbCgiOmQ6IiwgZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JZnJlZUltYWdlcygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltaXplZFooKSB7Ci0JZGVjb3JhdGlvbnMuc2V0TWF4aW1pemVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBkZWNvcmF0aW9ucy5nZXRNYXhpbWl6ZWQoKSA9PSBmYWxzZSk7Ci0JZGVjb3JhdGlvbnMuc2V0TWF4aW1pemVkKHRydWUpOwotCWFzc2VydFRydWUoIjoyOiIsIGRlY29yYXRpb25zLmdldE1heGltaXplZCgpID09IHRydWUpOwotCWFzc2VydFRydWUoIjozOiIsIGRlY29yYXRpb25zLmdldE1pbmltaXplZCgpID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZW51QmFyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKSB7Ci0JYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXRNZW51KCkpOwotCU1lbnUgdGVzdE1lbnUgPSBuZXcgTWVudShkZWNvcmF0aW9ucyk7Ci0JZGVjb3JhdGlvbnMuc2V0TWVudSh0ZXN0TWVudSk7Ci0JYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lbnUiLCBkZWNvcmF0aW9ucy5nZXRNZW51KCkgPT0gdGVzdE1lbnUpOwotCWRlY29yYXRpb25zLnNldE1lbnUobnVsbCk7Ci0JYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXRNZW51KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltaXplZFooKSB7Ci0JZGVjb3JhdGlvbnMuc2V0TWluaW1pemVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBkZWNvcmF0aW9ucy5nZXRNaW5pbWl6ZWQoKSA9PSBmYWxzZSk7Ci0JZGVjb3JhdGlvbnMuc2V0TWluaW1pemVkKHRydWUpOwotCWFzc2VydFRydWUoIjoyOiIsIGRlY29yYXRpb25zLmdldE1pbmltaXplZCgpID09IHRydWUpOwotCWFzc2VydFRydWUoIjozOiIsIGRlY29yYXRpb25zLmdldE1heGltaXplZCgpID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJZGVjb3JhdGlvbnMuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWRlY29yYXRpb25zLnNldFRleHQodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiYSIsIGRlY29yYXRpb25zLmdldFRleHQoKS5lcXVhbHModGVzdFN0cikpOwotCWRlY29yYXRpb25zLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoImIiLCBkZWNvcmF0aW9ucy5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdHJ5IHsKLQkJZGVjb3JhdGlvbnMuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCS8vIHRlc3QgaW4gc3ViY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0QnV0dG9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW1pemVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZW51QmFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbWl6ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREZWZhdWx0QnV0dG9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW1pemVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbWl6ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRCdXR0b24iKSkgdGVzdF9nZXREZWZhdWx0QnV0dG9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZXMiKSkgdGVzdF9nZXRJbWFnZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uIikpIHRlc3RfZ2V0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1heGltaXplZCIpKSB0ZXN0X2dldE1heGltaXplZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudUJhciIpKSB0ZXN0X2dldE1lbnVCYXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltaXplZCIpKSB0ZXN0X2dldE1pbmltaXplZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1JlcGFyZW50YWJsZSIpKSB0ZXN0X2lzUmVwYXJlbnRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREZWZhdWx0QnV0dG9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbiIpKSB0ZXN0X3NldERlZmF1bHRCdXR0b25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltaXplZFoiKSkgdGVzdF9zZXRNYXhpbWl6ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51QmFyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51QmFyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltaXplZFoiKSkgdGVzdF9zZXRNaW5pbWl6ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1EZWNvcmF0aW9ucyBkZWNvcmF0aW9uczsKLUltYWdlW10gaW1hZ2VzID0gbmV3IEltYWdlIFtTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoKlN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aF07Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCWlmIChkZWNvcmF0aW9ucyAhPSBudWxsICYmICFkZWNvcmF0aW9ucy5pc0Rpc3Bvc2VkKCkpCi0JCWRlY29yYXRpb25zLmRpc3Bvc2UoKTsKLQlkZWNvcmF0aW9ucyA9IChEZWNvcmF0aW9ucyl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZXMoKSB7Ci0JaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCWludCBudW1GaWxlcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCWludCBpbmRleCA9IGkqbnVtRmlsZXM7Ci0JCWZvciAoaW50IGo9MDsgajxudW1GaWxlczsgaisrKXsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzW2pdOwotCQkJSW5wdXRTdHJlYW0gIHJlc291cmNlID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJaW1hZ2VzIFtpbmRleCtqXSA9IG5ldyBJbWFnZSAoc2hlbGwuZ2V0RGlzcGxheSgpLCByZXNvdXJjZSk7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gY29udGludWU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBmcmVlSW1hZ2VzKCkgewotCWZvciAoaW50IGk9MDsgaTxpbWFnZXMubGVuZ3RoOyBpKyspIGltYWdlc1tpXS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGFjODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBkaWFsb2cuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIHdlIHVzZSB0aGlzIGNhbGwgaW4gYSBDb25zdHJ1Y3RvciB0ZXN0IHNvIHRoYXQgd2UgY2FuCi0JLy8gY2hlY2sgaWYgdGhlIHN0eWxlIGlzIHRoZSBvbmUgdGhhdCB3YXMgY3JlYXRlZAotCWRpYWxvZy5nZXRTdHlsZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlhbG9nLmdldFRleHQoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWRpYWxvZy5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGRpYWxvZy5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkaWFsb2cuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGlhbG9nLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkaWFsb2cuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotcHJpdmF0ZSBEaWFsb2cgZGlhbG9nOwotcHJpdmF0ZSBpbnQganVuaXRTdHlsZTsKLQotcHJvdGVjdGVkIHZvaWQgc2V0RGlhbG9nKERpYWxvZyBuZXdEaWFsb2cpIHsKLQlkaWFsb2cgPSBuZXdEaWFsb2c7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUpIHsKLQlzdHlsZSA9IGp1bml0U3R5bGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODI0OGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZGlyRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhkaXJEaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBEaXJlY3RvcnlEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcGFyZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyUGF0aCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0JaWYgKGZUZXN0RGlhbG9nT3BlbikKLQkJZGlyRGlhbG9nLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAiLi8qIjsKLQlkaXJEaWFsb2cuc2V0RmlsdGVyUGF0aCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKCIiKSk7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGlyRGlhbG9nLmdldE1lc3NhZ2UoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWRpckRpYWxvZy5zZXRNZXNzYWdlKHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkaXJEaWFsb2cuc2V0TWVzc2FnZSgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgZGlyRGlhbG9nLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlkaXJEaWFsb2cuc2V0TWVzc2FnZShudWxsKTsKLQkJZmFpbCAoIm51bGwgYXJndW1lbnQgZGlkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyUGF0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlclBhdGgiKSkgdGVzdF9nZXRGaWx0ZXJQYXRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlyZWN0b3J5RGlhbG9nIGRpckRpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWRiZGM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgRGlzcGxheSBvYmplY3QgcGVyIHRocmVhZC4KLQkvLyBJZiBhIHNlY29uZCBEaXNwbGF5IGlzIGNyZWF0ZWQgb24gdGhlIHNhbWUgdGhyZWFkLCBhbiAKLQkvLyBJbnZhbGlkVGhyZWFkQWNjZXNzRXhjZXB0aW9uIGlzIHRocm93bi4KLQkvLwotCS8vIEVhY2ggdGVzdCB3aWxsIGNyZWF0ZSBpdHMgb3duIERpc3BsYXkgYW5kIG11c3QgZGlzcG9zZSBvZiBpdCAKLQkvLyBiZWZvcmUgY29tcGxldGluZy4KLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRGlzcGxheSBkaXNwID0gbmV3IERpc3BsYXkoKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpIHsKLQlEaXNwbGF5IGRpc3A7Ci0JZGlzcCA9IG5ldyBEaXNwbGF5KG51bGwpOwotCWRpc3AuZGlzcG9zZSgpOwotCQotCWRpc3AgPSBuZXcgRGlzcGxheShuZXcgRGV2aWNlRGF0YSgpKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCWZpbmFsIGludCBDTE9TRV9DQUxMQkFDSyA9IDA7Ci0JZmluYWwgaW50IERJU1BPU0VfQ0FMTEJBQ0sgPSAxOwotCWZpbmFsIGJvb2xlYW5bXSBjYWxsYmFja1JlY2VpdmVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlfTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQkJZWxzZSBpZiAoZS50eXBlID09IFNXVC5EaXNwb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10gPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRGaWx0ZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZEZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydFRydWUoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBhZGRMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKCI6YToiLCBjYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSk7Ci0KLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcGxheS5iZWVwKCk7Ci0JCQl9Ci0JCX0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9iZWVwKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5iZWVwKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcGxheS5jbG9zZSgpOwotCWFzc2VydFRydWUoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQkvLyBBbHNvIHRlc3RzIGRpc3Bvc2UgYW5kIGlzRGlzcG9zZWQKLQlEaXNwbGF5IHRlc3REaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlkaXNwb3NlRXhlY1JhbiA9IGZhbHNlOwotCXRlc3REaXNwbGF5LmRpc3Bvc2VFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZGlzcG9zZUV4ZWNSYW4gPSB0cnVlOwotCQl9Ci0JfSk7Ci0JYXNzZXJ0RXF1YWxzKCJEaXNwbGF5IHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCBmYWxzZSwgdGVzdERpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQl0ZXN0RGlzcGxheS5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiRGlzcGxheSBzaG91bGQgYmUgZGlzcG9zZWQiLCB0ZXN0RGlzcGxheS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydFRydWUoIkRpc3Bvc2VFeGVjIFJ1bm5hYmxlIGRpZCBub3QgcnVuIiwgZGlzcG9zZUV4ZWNSYW4pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQoKSB7Ci0JYXNzZXJ0TnVsbChEaXNwbGF5LmZpbmREaXNwbGF5KG5ldyBUaHJlYWQoKSkpOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKGRpc3BsYXksIERpc3BsYXkuZmluZERpc3BsYXkoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kV2lkZ2V0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZmluZFdpZGdldEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBY3RpdmVTaGVsbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCWFzc2VydE5vdE51bGwocmVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQlhc3NlcnROb3ROdWxsKHJlY3QpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJyZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJzb3JDb250cm9sKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5nZXRDdXJzb3JDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnNvckxvY2F0aW9uKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwocHQpOwotCQlhc3NlcnRUcnVlKHB0LnggPj0gMCk7Ci0JCWFzc2VydFRydWUocHQueSA+PSAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Vyc29yU2l6ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q3Vyc29yU2l6ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoT2JqZWN0KSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHNldERhdGEoU3RyaW5nLCBPYmplY3QpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlZmF1bHQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlhc3NlcnROb3ROdWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGFsaWdubWVudCA9IGRpc3BsYXkuZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JCWFzc2VydFRydWUoImdldERpc21pc3NhbEFsaWdubWVudCBzaG91bGQgcmV0dXJuIFNXVC5MRUZUIG9yIFNXVC5SSUdIVCIsCi0JCQlhbGlnbm1lbnQgPT0gU1dULkxFRlQgfHwgYWxpZ25tZW50ID09IFNXVC5SSUdIVCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrVGltZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCB0aW1lID0gZGlzcGxheS5nZXREb3VibGVDbGlja1RpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aW1lID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzQ29udHJvbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuZ2V0Rm9jdXNDb250cm9sKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEljb25EZXB0aCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBkZXB0aCA9IGRpc3BsYXkuZ2V0SWNvbkRlcHRoKCk7Ci0JCWFzc2VydFRydWUoZGVwdGggPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yW10gbW9uaXRvcnMgPSBkaXNwbGF5LmdldE1vbml0b3JzKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9ycyk7Ci0JYXNzZXJ0VHJ1ZSgiYXQgbGVhc3Qgb25lIG1vbml0b3Igc2hvdWxkIGJlIHJldHVybmVkIiwgbW9uaXRvcnMubGVuZ3RoID49IDEpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspCi0JCWFzc2VydFRydWUoIm1vbml0b3IgYXQgaW5kZXggIitpKyIgc2hvdWxkIG5vdCBiZSBudWxsIiwgbW9uaXRvcnNbaV0gIT0gbnVsbCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeU1vbml0b3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlNb25pdG9yIG1vbml0b3IgPSBkaXNwbGF5LmdldFByaW1hcnlNb25pdG9yKCk7Ci0JYXNzZXJ0Tm90TnVsbChtb25pdG9yKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbHMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbDEgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFNoZWxscygpLmxlbmd0aCA9PSAyKTsKLQkJc2hlbGwxLmRpc3Bvc2UoKTsKLQkJc2hlbGwyLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3luY1RocmVhZCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aHJlYWRSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCVRocmVhZCBub25VSVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEFzc3VtZSBubyBzeW5jRXhlYyBydW5uYWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW52b2tlZC4KLQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgYSBydW5uYWJsZSBhbmQgaW52b2tlIHdpdGggc3luY0V4ZWMgdG8gdmVyaWZ5IHRoYXQKLQkJCQkvLyB0aGUgaW52b2tpbmcgdGhyZWFkIGlzIHRoZSBzeW5jVGhyZWFkLgotCQkJCWZpbmFsIFRocmVhZCBpbnZva2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWFzc2VydEVxdWFscyhpbnZva2luZ1RocmVhZCwgZGlzcGxheS5nZXRTeW5jVGhyZWFkKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGEgcnVubmFibGUgYW5kIGludm9rZSB3aXRoIGFzeW5jRXhlYyB0byB2ZXJpZnkgdGhhdAotCQkJCS8vIHRoZSBzeW5jVGhyZWFkIGlzIG51bGwgd2hpbGUgaXQncyBydW5uaW5nLgotCQkJCWZpbmFsIGJvb2xlYW5bXSBhc3luY0V4ZWNSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhc3NlcnROdWxsKGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl3aGlsZSAoIWFzeW5jRXhlY1JhblswXSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQl0aHJlYWRSYW5bMF0gPSB0cnVlOwotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9KTsKLQkJbm9uVUlUaHJlYWQuc3RhcnQoKTsKLQkJCi0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IFtdIGNvbG9ySWRzID0gewotCQkJU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVywgU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XLAotCQkJU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1csIFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVywKLQkJCVNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCwgU1dULkNPTE9SX1dJREdFVF9CT1JERVIsCi0JCQlTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQsIFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQsCi0JCQlTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5ELCBTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04sCi0JCQlTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCwKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgY29sb3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydE5vdE51bGwoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcklkc1tpXSkpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250IGZvbnQgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKTsKLQkJYXNzZXJ0Tm90TnVsbChmb250KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGhyZWFkKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUG9pbnQgcmVzdWx0OwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgLTEwLCAtMjApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMTAsLTEyMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDMwLCA0MCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE3MCwtNjApLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIC01LCAtMTUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDE5NSw4NSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDI1LCAzNSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjI1LDEzNSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIC0yLCAtNCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMiAtIHNoZWxsT2Zmc2V0LngsLTEwNCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCA2LCA4KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTk0IC0gc2hlbGxPZmZzZXQueCwtOTIgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIC0zLCAtNik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCA5LCAxMik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDIwOSxzaGVsbE9mZnNldC55ICsgMTEyKSwgcmVzdWx0KTsKLQkJCi0JCWJ1dHRvbjEuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgMCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJUmVjdGFuZ2xlIHJlc3VsdDsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAtMTAsIC0yMCwgMTMwLCAxNDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDUwLCA2MCwgMTcwLCAxODApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjAwLDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgLTUsIC0xNSwgMTI1LCAxMzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxOTUsODUsMTI1LDEzNSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDQ1LCA1NSwgMTY1LCAxNzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyNDUsMTU1LDE2NSwxNzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMCwgMCwgMTAwLCAxMDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgLTIsIC00LCAxMDYsIDEwOCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55LDEwNiwxMDgpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAxMCwgMTIsIDExNCwgMTE2KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE5MCAtIHNoZWxsT2Zmc2V0LngsLTg4IC0gc2hlbGxPZmZzZXQueSwxMTQsMTE2KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAtMywgLTYsIDEwOSwgMTEyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIDE1LCAxOCwgMTIxLCAxMjQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDAsIDEwMCwgMTAwKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjEuc2V0Qm91bmRzKDAsMCwxMDAsMTAwKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbjIuc2V0Qm91bmRzKDIwMCwxMDAsMTAwLDEwMCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLDAsNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJCi0JCVBvaW50IHJlc3VsdDsKLQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMCwwKTsKLQkJUG9pbnQgc2hlbGxPZmZzZXQgPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCi0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCwtMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFBvaW50KC0xMCwtMjApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjEwLC0xMjApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUG9pbnQoMzAsNDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTcwLC02MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIG5ldyBQb2ludCgtNSwtMTUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxOTUsODUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUG9pbnQoMjUsMzUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyMjUsMTM1KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIHBvaW50KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAwIC0gc2hlbGxPZmZzZXQueCwtMTAwIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBQb2ludCgtMiwtNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFBvaW50KDYsOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0xOTQgLSBzaGVsbE9mZnNldC54LC05MiAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBQb2ludCgtMywtNikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgbmV3IFBvaW50KDksMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjA5LHNoZWxsT2Zmc2V0LnkgKyAxMTIpLCByZXN1bHQpOwotCQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBwb2ludCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUG9pbnQpIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbnVsbCBwb2ludCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcG9pbnQgYmVpbmcgbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlSZWN0YW5nbGUgcmVzdWx0OwotCQlSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwwLDEwMCwxMDApOwotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCwtMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKC0xMCwgLTIwLCAxMzAsIDE0MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjEwLC0xMjAsMTMwLDE0MCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoNTAsIDYwLCAxNzAsIDE4MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTUwLC00MCwxNzAsMTgwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIHJlY3QpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyMDAsMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUmVjdGFuZ2xlKC01LCAtMTUsIDEyNSwgMTM1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDE5NSw4NSwxMjUsMTM1KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFJlY3RhbmdsZSg0NSwgNTUsIDE2NSwgMTc1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDI0NSwxNTUsMTY1LDE3NSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnksMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoLTIsIC00LCAxMDYsIDEwOCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSwxMDYsMTA4KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgbmV3IFJlY3RhbmdsZSgxMCwgMTIsIDExNCwgMTE2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0xOTAgLSBzaGVsbE9mZnNldC54LC04OCAtIHNoZWxsT2Zmc2V0LnksMTE0LDExNiksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIwMCxzaGVsbE9mZnNldC55ICsgMTAwLDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUmVjdGFuZ2xlKC0zLCAtNiwgMTA5LCAxMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDE5NyxzaGVsbE9mZnNldC55ICsgOTQsMTA5LDExMiksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBSZWN0YW5nbGUoMTUsIDE4LCAxMjEsIDEyNCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZShzaGVsbE9mZnNldC54ICsgMjE1LHNoZWxsT2Zmc2V0LnkgKyAxMTgsMTIxLDEyNCksIHJlc3VsdCk7Ci0JCQotCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIHJlY3QpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcmVjdCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAoUmVjdGFuZ2xlKSBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcG9pbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSBiZWluZyBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JZmluYWwgaW50IEtFWUNPREUgPSBTV1QuU0hJRlQ7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5wb3N0KG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9zdCB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCXNoZWxsLnNldEJvdW5kcyhkaXNwbGF5LmdldEJvdW5kcygpKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCUV2ZW50IGV2ZW50OwotCQkKLQkJLy8gVGVzdCBrZXkgZXZlbnRzIChkb3duL3VwKQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSAtMTsgIAkJCQkvLyBib2d1cyBrZXkgY29kZQotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwkvLyB1c2VzIGRlZmF1bHQgMCBjaGFyYWN0ZXIKLQkJLy8gZG9uJ3QgdGVzdCBLZXlEb3duL0tleVVwIHdpdGggYSBjaGFyYWN0ZXIgdG8gYXZvaWQgc2VuZGluZyB0byAKLQkJLy8gcmFuZG9tIHdpbmRvdyBpZiB0ZXN0IHNoZWxsIGxvb3NlcyBmb2N1cwotCQkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQotCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCWV2ZW50LmtleUNvZGUgPSBLRVlDT0RFOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQkKLQkJLy8gVGVzdCBtb3VzZSBldmVudHMgKGRvd24vdXAvbW92ZSkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJZXZlbnQueCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoLzI7Ci0JCWV2ZW50LnkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMjsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3duOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsgIC8vIG1pc3NpbmcgYnV0dG9uCi0JCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCWFzc2VydEZhbHNlKGRpc3BsYXkucG9zdChldmVudCkpOyAgLy8gbWlzc2luZyBidXR0b24KLQkJZXZlbnQuYnV0dG9uID0gMTsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCS8vIFRlc3QgdW5zdXBwb3J0ZWQgZXZlbnQKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvdWJsZUNsaWNrOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCi0JCS8vIGNhbid0IHZlcmlmeSB0aGF0IHRoZSBldmVudHMgd2VyZSBhY3R1YWxseSBzZW50IHRvIGEgbGlzdGVuZXIuCi0JCS8vIHRoZSB0ZXN0IHNoZWxsIHdvbid0IHJlY2VpdmUgYW55IGV2ZW50cyBpZiBpdCBoYXMgbG9zdCBmb2N1cywgCi0JCS8vIGUuZy4sIGR1ZSB0byB1c2VyIGludGVydmVudGlvbiBvciBhbm90aGVyIHByb2Nlc3MgcG9wcGluZyB1cCAKLQkJLy8gYSB3aW5kb3cuIAotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWFkQW5kRGlzcGF0Y2goKSB7Ci0JLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyByZWx5IG9uIHJlYWRBbmREaXNwYXRjaCBpbiBvcmRlciB0byBzdWNjZWVkLAotCS8vIHRodXMgbm8gdGVzdCBpcyBuZWVkZWQgaGVyZS4KLQkvLyAgICB0ZXN0X2dldFN5bmNUaHJlYWQoKQotCS8vICAgIHRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5yZW1vdmVGaWx0ZXIoU1dULkRpc3Bvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkNsb3NlLCBsaXN0ZW5lcik7Ci0JCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuQ2xvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQkJZGlzcGxheS5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuY2xvc2UoKTsKLQl9Ci0JYXNzZXJ0RmFsc2UoY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbGVhc2UoKSB7Ci0JLy8gT3ZlcnJpZGluZyB0ZXN0X3JlbGVhc2UgZnJvbSBEZXZpY2UuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCURpc3BsYXkuc2V0QXBwTmFtZSgiTXkgQXBwbGljYXRpb24gTmFtZSIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldEN1cnNvckxvY2F0aW9uKDAsMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0Q3Vyc29yTG9jYXRpb24obmV3IFBvaW50KDAsMCkpOwotCQl0cnkgewotCQkJZGlzcGxheS5zZXRDdXJzb3JMb2NhdGlvbihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNldEN1cnNvckxvY2F0aW9uIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldERhdGEobmV3IEludGVnZXIoMTApKTsKLQkJSW50ZWdlciBpID0gKEludGVnZXIpZGlzcGxheS5nZXREYXRhKCk7Ci0JCWFzc2VydE5vdE51bGwoaSk7Ci0JCWFzc2VydFRydWUoaS5lcXVhbHMobmV3IEludGVnZXIoMTApKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXREYXRhKCJJbnRlZ2VyIiwgbmV3IEludGVnZXIoMTApKTsKLQkJZGlzcGxheS5zZXREYXRhKCJTdHJpbmciLCAieHl6Iik7Ci0JCUludGVnZXIgaSA9IChJbnRlZ2VyKWRpc3BsYXkuZ2V0RGF0YSgiSW50ZWdlciIpOwotCQlhc3NlcnROb3ROdWxsKGkpOwotCQlhc3NlcnRUcnVlKGkuZXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSkpOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpZGlzcGxheS5nZXREYXRhKCJTdHJpbmciKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0VHJ1ZShzLmVxdWFscygieHl6IikpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgYm9vbGVhbltdIGFzeW5jRXhlY1JhbiA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5zZXRTeW5jaHJvbml6ZXIobnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwb3N0IHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igc2V0IHN5bmNocm9uaXplciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWNsYXNzIE15U3luY2hyb25pemVyIGV4dGVuZHMgU3luY2hyb25pemVyIHsKLQkJCWJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOwotCQkJTXlTeW5jaHJvbml6ZXIoRGlzcGxheSBkKSB7Ci0JCQkJc3VwZXIoZCk7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgdm9pZCBhc3luY0V4ZWMgKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQkJaW52b2tlZCA9IHRydWU7Ci0JCQkJc3VwZXIuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCX0KLQkJfQotCQkKLQkJTXlTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXIgPSBuZXcgTXlTeW5jaHJvbml6ZXIoZGlzcGxheSk7Ci0JCWRpc3BsYXkuc2V0U3luY2hyb25pemVyKG15U3luY2hyb25pemVyKTsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFzeW5jRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJYXNzZXJ0VHJ1ZShteVN5bmNocm9uaXplci5pbnZva2VkKTsKLQkJYXNzZXJ0VHJ1ZShhc3luY0V4ZWNSYW5bMF0pOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zbGVlcCgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVRocmVhZCB0aHJlYWQ7Ci0JCWJvb2xlYW4gZXZlbnRRdWV1ZWQ7Ci0JCQotCQkvLyBFbnN1cmUgZXZlbnQgcXVldWUgaXMgZW1wdHksIG90aGVyd2lzZSBzbGVlcCgpIHdpbGwganVzdCByZXR1cm4uCi0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9Ci0JCXRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRGVsYXkgdG8gZW5zdXJlIHRoZSBVSSB0aHJlYWQgaGFzIGJlZW4gcHV0IHRvIHNsZWVwLgotCQkJCQlzbGVlcCgzMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQkvLyBVc2Ugd2FrZSgpIHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS53YWtlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQkvLyBOb3RlIHRoYXQgc2xlZXAgc2VlbXMgdG8gYWx3YXlzIHJldHVybiB0cnVlLCBhdCBsZWFzdAotCQkvLyBvbiBXaW5kb3dzLCBzaW5jZSB3YWtlKCkgdXNlcyBhIG51bGwgZXZlbnQuIAotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJCi0JCS8vIEVuc3VyZSBldmVudCBxdWV1ZSBpcyBlbXB0eSwgb3RoZXJ3aXNlIHNsZWVwKCkgd2lsbCBqdXN0IHJldHVybi4KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30KLQkJdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBEZWxheSB0byBlbnN1cmUgdGhlIFVJIHRocmVhZCBoYXMgYmVlbiBwdXQgdG8gc2xlZXAuCi0JCQkJCXNsZWVwKDMwMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJCS8vIENhdXNlIE9TIHRvIGdlbmVyYXRlIGFuIGV2ZW50IHRvIHJldml2ZSBmcm9tIHNsZWVwKCkuCi0JCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVNoZWxsIHMgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJCQlzLm9wZW4oKTsKLQkJCQkJCXMuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCQlldmVudFF1ZXVlZCA9IGRpc3BsYXkuc2xlZXAoKTsKLQkJYXNzZXJ0VHJ1ZShldmVudFF1ZXVlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSgpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkuYmVlcCgpOwotCQkJfQotCQl9KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlmaW5hbCBib29sZWFuW10gdGltZXJFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlmaW5hbCBib29sZWFuW10gdGhyZWFkUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQkKLQkJdHJ5IHsKLQkJCWRpc3BsYXkudGltZXJFeGVjKDAsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgdGltZXJFeGVjIHdpdGggbnVsbCBydW5uYWJsZSIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS50aW1lckV4ZWMoLTEwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRpbWVyRXhlY1JhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlmaW5hbCBpbnQgZGVsYXkgPSAzMDAwOwotCQlmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlkaXNwbGF5LnRpbWVyRXhlYyhkZWxheSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCS8vIGRlYnVnIGludGVybWl0dGVudCB0ZXN0IGZhaWx1cmUKLQkJCQlpZiAoZW5kVGltZSA8IChzdGFydFRpbWUgKyBkZWxheSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaXNwbGF5LnRpbWVyRXhlYyByYW4gZWFybHkgIiArICgoc3RhcnRUaW1lICsgZGVsYXkpIC0gZW5kVGltZSkpOwotCQkJCX0KLQkJCQkvL2Fzc2VydFRydWUoIlRpbWVyIHJhbiBlYXJseSEgbXMgZWFybHk6ICIsIGVuZFRpbWUgPj0gKHN0YXJ0VGltZSArIGRlbGF5KSk7Ci0JCQkJdGhyZWFkUmFuWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXdoaWxlICghdGhyZWFkUmFuWzBdKSB7Ci0JCQkvLyBUaGUgcmVhZCBhbmQgZGlzcGF0Y2ggbG9vcCBtdXN0IGJlIHJ1bm5pbmcgaW4gb3JkZXIKLQkJCS8vIGZvciB0aGUgcnVubmFibGUgaW4gdGhlIHRpbWVyIGV4ZWMgdG8gYmUgZXhlY3V0ZWQuCi0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJCi0JCS8vIFZlcmlmeSB0aGUgdGltZXJFeGVjIHdpdGggbGVzcyB0aGFuIHplcm8gbWlsbGlzZWNvbmRzIGRpZG4ndCBleGVjdXRlLgotCQlhc3NlcnRGYWxzZSgiPCAwIG1zIHRpbWVyIGRpZCBleGVjdXRlIiwgdGltZXJFeGVjUmFuWzBdKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdXBkYXRlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS51cGRhdGUoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2FrZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2xlZXAoKSBtZXRob2QKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9iZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWN0aXZlU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3VycmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnNvclNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SWNvbkRlcHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9ycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJpbWFyeU1vbml0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxscyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3luY1RocmVhZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUaHJlYWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWFkQW5kRGlzcGF0Y2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NsZWVwIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dha2UiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXN5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2JlZXAiKSkgdGVzdF9iZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9zZSIpKSB0ZXN0X2Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZpbmREaXNwbGF5TGphdmFfbGFuZ19UaHJlYWQiKSkgdGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kV2lkZ2V0SSIpKSB0ZXN0X2ZpbmRXaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBY3RpdmVTaGVsbCIpKSB0ZXN0X2dldEFjdGl2ZVNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJyZW50IikpIHRlc3RfZ2V0Q3VycmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3Vyc29yQ29udHJvbCIpKSB0ZXN0X2dldEN1cnNvckNvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvckxvY2F0aW9uIikpIHRlc3RfZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvclNpemUiKSkgdGVzdF9nZXRDdXJzb3JTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhIikpIHRlc3RfZ2V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0IikpIHRlc3RfZ2V0RGVmYXVsdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50IikpIHRlc3RfZ2V0RGlzbWlzc2FsQWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREb3VibGVDbGlja1RpbWUiKSkgdGVzdF9nZXREb3VibGVDbGlja1RpbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzQ29udHJvbCIpKSB0ZXN0X2dldEZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SWNvbkRlcHRoIikpIHRlc3RfZ2V0SWNvbkRlcHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb25pdG9ycyIpKSB0ZXN0X2dldE1vbml0b3JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmltYXJ5TW9uaXRvciIpKSB0ZXN0X2dldFByaW1hcnlNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbHMiKSkgdGVzdF9nZXRTaGVsbHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5bmNUaHJlYWQiKSkgdGVzdF9nZXRTeW5jVGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Db2xvckkiKSkgdGVzdF9nZXRTeXN0ZW1Db2xvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUZvbnQiKSkgdGVzdF9nZXRTeXN0ZW1Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHJlYWQiKSkgdGVzdF9nZXRUaHJlYWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJIikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlYWRBbmREaXNwYXRjaCIpKSB0ZXN0X3JlYWRBbmREaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0QXBwTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJIikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIiKSkgdGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zbGVlcCIpKSB0ZXN0X3NsZWVwKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3RfdGltZXJFeGVjSUxqYXZhX2xhbmdfUnVubmFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2FrZSIpKSB0ZXN0X3dha2UoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1ib29sZWFuIGRpc3Bvc2VFeGVjUmFuOwotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHZpcnR1YWxseSBldmVyeSBtZXRob2QgYW5kIGluIHBhcnRpY3VsYXIKLQkvLyAgIHRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlCi19Ci0KLS8qIE92ZXJsb2FkZWQgdGVzdHMgZnJvbSBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RFBJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUG9pbnQgcCA9IGRpc3BsYXkuZ2V0RFBJKCk7Ci0JCWFzc2VydFRydWUoImhvcml6b250YWwgRFBJIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIHAueCA+IDApOwotCQlhc3NlcnRUcnVlKCJ2ZXJ0aWNhbCBEUEkgbm90IGdyZWF0ZXIgdGhhbiB6ZXJvIiwgcC55ID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlcHRoKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJaW50IGQgPSBkaXNwbGF5LmdldERlcHRoKCk7Ci0JCWFzc2VydFRydWUoImRlcHRoIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIGQgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ooKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlGb250RGF0YVtdIHNjYWxhYmxlID0gZGlzcGxheS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJRm9udERhdGFbXSBub25fc2NhbGFibGUgPSBkaXNwbGF5LmdldEZvbnRMaXN0KG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gZm9udHMgZGV0ZWN0ZWQiLCAoc2NhbGFibGUubGVuZ3RoICsgbm9uX3NjYWxhYmxlLmxlbmd0aCkgPiAwKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2FybmluZ3MoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmdldFdhcm5pbmdzKCk7Ci0JCS8vIFNpbmNlIHRoZSBiZWhhdmlvciBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgdGhlcmUncwotCQkvLyBubyBnb29kIHRlc3QgZm9yIHRoZSByZXN1bHQgdmFsdWUuCi0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRGlzcG9zZWQoKSB7Ci0JRGlzcGxheSBkaXNwID0gbmV3IERpc3BsYXkoKTsKLQlhc3NlcnRGYWxzZShkaXNwLmlzRGlzcG9zZWQoKSk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShkaXNwLmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2FybmluZ3NaKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXRXYXJuaW5ncyh0cnVlKTsKLQkJZGlzcGxheS5zZXRXYXJuaW5ncyhmYWxzZSk7Ci0JCS8vIFNpbmNlIHRoZSBiZWhhdmlvciBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgdGhlcmUncwotCQkvLyBubyBnb29kIHRlc3QgZm9yIGludm9raW5nIHRoaXMgbWV0aG9kLgotCQkvLyBOb3RlIHRoYXQgb24gV2luZG93cywgdGhlIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCi0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlNTA3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWE3NDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5FeHBhbmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkV4cGFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV4cGFuZEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXhwYW5kQmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlleHBhbmRCYXIgPSBuZXcgRXhwYW5kQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoZXhwYW5kQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFeHBhbmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0V4cGFuZExpc3RlbmVyKCkgewotCWZpbmFsIGJvb2xlYW5bXSBsaXN0ZW5lckNhbGxlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQlFeHBhbmRMaXN0ZW5lciBleHBhbmRMaXN0ZW5lciA9IG5ldyBFeHBhbmRMaXN0ZW5lcigpIHsJCQotCQlwdWJsaWMgdm9pZCBpdGVtQ29sbGFwc2VkKEV4cGFuZEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkWzBdID0gdHJ1ZTsJCQkKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtRXhwYW5kZWQoRXhwYW5kRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWRbMF0gPSB0cnVlOwkJCQotCQl9Ci0JfTsKLQotCXRyeSB7Ci0JCWV4cGFuZEJhci5hZGRFeHBhbmRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkRXhwYW5kTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JZXhwYW5kQmFyLmFkZEV4cGFuZExpc3RlbmVyKGV4cGFuZExpc3RlbmVyKTsKLQlleHBhbmRCYXIubm90aWZ5TGlzdGVuZXJzKFNXVC5FeHBhbmQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZFswXSk7Ci0KLQlsaXN0ZW5lckNhbGxlZFswXSA9IGZhbHNlOwotCWV4cGFuZEJhci5ub3RpZnlMaXN0ZW5lcnMoU1dULkNvbGxhcHNlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgbGlzdGVuZXJDYWxsZWRbMF0pOwotCQotCXRyeSB7Ci0JCWV4cGFuZEJhci5yZW1vdmVFeHBhbmRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlRXhwYW5kTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdGVuZXJDYWxsZWRbMF0gPSBmYWxzZTsKLQlleHBhbmRCYXIucmVtb3ZlRXhwYW5kTGlzdGVuZXIoZXhwYW5kTGlzdGVuZXIpOwotCWV4cGFuZEJhci5ub3RpZnlMaXN0ZW5lcnMoU1dULkV4cGFuZCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkWzBdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCW5ldyBFeHBhbmRCYXIobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGV4cGFuZEJhci5nZXRJdGVtQ291bnQoKSA9PSBpKTsKLQkgIAluZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlFeHBhbmRJdGVtW10gaXRlbXMgPSBuZXcgRXhwYW5kSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiLCBleHBhbmRCYXIuZ2V0SXRlbShpKT09aXRlbXNbaV0pOwotCX0KLQotCWV4cGFuZEJhciA9IG5ldyBFeHBhbmRCYXIoc2hlbGwsIDApOwotCW51bWJlciA9IDU7Ci0JaXRlbXMgPSBuZXcgRXhwYW5kSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLQl0cnkgewotCQlleHBhbmRCYXIuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlFeHBhbmRJdGVtW10gaXRlbXMgPSBuZXcgRXhwYW5kSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKykgewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCBleHBhbmRCYXIuZ2V0SXRlbXMoKSk7Ci0JCi0JZXhwYW5kQmFyLmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgRXhwYW5kSXRlbVtdIHtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIGV4cGFuZEJhci5nZXRJdGVtcygpKTsKLQotCWV4cGFuZEJhci5nZXRJdGVtcygpWzNdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IEV4cGFuZEl0ZW1bXSB7aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIGV4cGFuZEJhci5nZXRJdGVtcygpKTsKLQotCWV4cGFuZEJhci5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IEV4cGFuZEl0ZW1bXSB7aXRlbXNbMV0sIGl0ZW1zWzNdfSwgZXhwYW5kQmFyLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNwYWNpbmcoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X3NldFNwYWNpbmdJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlFeHBhbmRJdGVtW10gaXRlbXMgPSBuZXcgRXhwYW5kSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkgIAlpdGVtc1tpXSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGV4cGFuZEJhci5pbmRleE9mKGl0ZW1zW2ldICkgPT0gaSk7Ci0JfQotCQotCWl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JICAJaXRlbXNbaV0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlleHBhbmRCYXIuaW5kZXhPZihudWxsKTsJCQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZXhwYW5kSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lcigpIHsKLS8vdGVzdGVkIGluIHRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTcGFjaW5nSSgpIHsKLQlleHBhbmRCYXIuc2V0U3BhY2luZygwKTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kQmFyLmdldFNwYWNpbmcoKSwgMCk7Ci0JCi0JZXhwYW5kQmFyLnNldFNwYWNpbmcoMyk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEJhci5nZXRTcGFjaW5nKCksIDMpOwotCQotCWV4cGFuZEJhci5zZXRTcGFjaW5nKC00KTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kQmFyLmdldFNwYWNpbmcoKSwgMyk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTcGFjaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTcGFjaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFeHBhbmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0V4cGFuZExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFeHBhbmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0V4cGFuZExpc3RlbmVyIikpIHRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3BhY2luZyIpKSB0ZXN0X2dldFNwYWNpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNwYWNpbmdJIikpIHRlc3Rfc2V0U3BhY2luZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRXhwYW5kQmFyKFZlY3RvciBldmVudHMpIHsKLQlleHBhbmRCYXIgPSBuZXcgRXhwYW5kQmFyKHNoZWxsLCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCUV4cGFuZEl0ZW0gaXRlbSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIkV4cGFuZEJhciIgKyBpKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCXNldFdpZGdldChleHBhbmRCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlRXhwYW5kQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUV4cGFuZEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUV4cGFuZEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUV4cGFuZEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDE1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgRXhwYW5kQmFyIGV4cGFuZEJhcjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg0YTdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlleHBhbmRCYXIgPSBuZXcgRXhwYW5kQmFyKHNoZWxsLCAwKTsKLQlleHBhbmRJdGVtID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsgCi0Jc2V0V2lkZ2V0KGV4cGFuZEl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW1JKCkgewotCXRyeSB7Ci0JCW5ldyBFeHBhbmRJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW1JSSgpIHsKLQlFeHBhbmRJdGVtIGl0ZW0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIFNXVC5OVUxMLCAwKTsgLy9jcmVhdGUgYW4gZXhwYW5kIGl0ZW0gYXQgaW5kZXggMAotCWFzc2VydE5vdE51bGwoaXRlbSk7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRCYXIuZ2V0SXRlbSgwKS5lcXVhbHMoaXRlbSkpOwotCWl0ZW0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIFNXVC5OVUxMLCAxKTsKLQlhc3NlcnROb3ROdWxsKGl0ZW0pOwotCWFzc2VydFRydWUoZXhwYW5kQmFyLmdldEl0ZW0oMSkuZXF1YWxzKGl0ZW0pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCWFzc2VydE51bGwoZXhwYW5kSXRlbS5nZXRDb250cm9sKCkpOwotCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZXhwYW5kQmFyLCBTV1QuUFVTSCk7Ci0JZXhwYW5kSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JQ29udHJvbCBjb250cm9sID0gZXhwYW5kSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci0KLQlidXR0b24gPSBuZXcgQnV0dG9uKGV4cGFuZEJhciwgU1dULlBVU0gpOwotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCWNvbnRyb2wgPSBleHBhbmRJdGVtLmdldENvbnRyb2woKTsKLQlhc3NlcnRFcXVhbHMoYnV0dG9uLCBjb250cm9sKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFeHBhbmRlZCgpIHsKLS8vdGVzdGVkIGluIHRlc3Rfc2V0RXhwYW5kZWRaKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEhlYWRlckhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLS8vdGVzdGVkIGluIHRlc3Rfc2V0SGVpZ2h0SSgpCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsJCi0JYXNzZXJ0RXF1YWxzKGV4cGFuZEl0ZW0uZ2V0UGFyZW50KCksIGV4cGFuZEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChudWxsKTsJCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZXhwYW5kQmFyLCBTV1QuUFVTSCk7Ci0JZXhwYW5kSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihleHBhbmRCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb250cm9sLmlzRGlzcG9zZWQoKSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXRyeSB7Ci0JCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gY29udHJvbCBoYXMgd3JvbmcgcGFyZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRlZFooKSB7Ci0JZXhwYW5kSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JZXhwYW5kSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEl0ZW0uZ2V0RXhwYW5kZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlaWdodEkoKSB7Ci0JZXhwYW5kSXRlbS5zZXRIZWlnaHQoMzApOwotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldEhlaWdodCgpLCAzMCk7Ci0JZXhwYW5kSXRlbS5zZXRIZWlnaHQoLTgpOwotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldEhlaWdodCgpLCAzMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwoZXhwYW5kSXRlbS5nZXRJbWFnZSgpKTsKLQlleHBhbmRJdGVtLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgZXhwYW5kSXRlbS5nZXRJbWFnZSgpKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEl0ZW0uZ2V0SW1hZ2UoKSAhPSBpbWFnZXNbMV0pOwotCWV4cGFuZEl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChleHBhbmRJdGVtLmdldEltYWdlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlleHBhbmRJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiQUJDREVGRyIpKTsKLQl0cnkgewotCQlleHBhbmRJdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWV4cGFuZEl0ZW0uc2V0VGV4dCgiQUJDREVGRyIpOwotCWFzc2VydFRydWUoZXhwYW5kSXRlbS5nZXRUZXh0KCkuc3RhcnRzV2l0aCgiQUJDREVGRyIpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4cGFuZGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW1JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4cGFuZGVkIikpIHRlc3RfZ2V0RXhwYW5kZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpKSB0ZXN0X2dldEhlYWRlckhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVpZ2h0IikpIHRlc3RfZ2V0SGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RXhwYW5kZWRaIikpIHRlc3Rfc2V0RXhwYW5kZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIZWlnaHRJIikpIHRlc3Rfc2V0SGVpZ2h0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQlzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRXhwYW5kQmFyIGV4cGFuZEJhcjsKLUV4cGFuZEl0ZW0gZXhwYW5kSXRlbTsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjM5MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coZmlsZURpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JLy8gVGVzdCBGaWxlRGlhbG9nKFNoZWxsKQotCW5ldyBGaWxlRGlhbG9nKHNoZWxsKTsKLQl0cnkgewotCQluZXcgRmlsZURpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQkvLyBUZXN0IEZpbGVEaWFsb2coU2hlbGwsIGludCkKLQlGaWxlRGlhbG9nIGZkOwotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlhc3NlcnRUcnVlKGZkLmdldFN0eWxlKCk9PVNXVC5OVUxMKTsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuUFJJTUFSWV9NT0RBTCk7Ci0JYXNzZXJ0VHJ1ZShmZC5nZXRTdHlsZSgpPT1TV1QuUFJJTUFSWV9NT0RBTCk7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlNZU1RFTV9NT0RBTCk7Ci0JYXNzZXJ0VHJ1ZShmZC5nZXRTdHlsZSgpPT1TV1QuU1lTVEVNX01PREFMKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU5hbWUoKSB7Ci0JLy8JdGVzdGVkIGluIHRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZU5hbWVzKCkgewotCVN0cmluZ1tdIG5hbWVzID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZXMoKTsKLQlhc3NlcnRUcnVlKG5hbWVzLmxlbmd0aD09MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJOYW1lcygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyUGF0aCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCWlmIChmVGVzdERpYWxvZ09wZW4pCi0JCWZpbGVEaWFsb2cub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmlsZURpYWxvZy5zZXRGaWxlTmFtZSgiIik7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lLmVxdWFscygiIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsZU5hbWUobnVsbCk7Ci0JbmFtZSA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQlhc3NlcnRUcnVlKG5hbWU9PW51bGwpOwotCWZpbGVEaWFsb2cuc2V0RmlsZU5hbWUoInNvbWVmaWxlLnRlc3QiKTsKLQluYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCWFzc2VydFRydWUobmFtZS5lcXVhbHMoInNvbWVmaWxlLnRlc3QiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsidHh0IiwiamF2YSJ9KTsKLQlTdHJpbmcgZmlsdGVyc1tdID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJFeHRlbnNpb25zKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnNbMF0uZXF1YWxzKCJ0eHQiKSk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzFdLmVxdWFscygiamF2YSIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiIn0pOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlckV4dGVuc2lvbnMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDEpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhudWxsKTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJFeHRlbnNpb25zKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzPT1udWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7ImEudHh0IiwiYi5qYXZhIn0pOwotCVN0cmluZyBmaWx0ZXJzW10gPSBmaWxlRGlhbG9nLmdldEZpbHRlck5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnNbMF0uZXF1YWxzKCJhLnR4dCIpKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnNbMV0uZXF1YWxzKCJiLmphdmEiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyIifSk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyTmFtZXMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnMubGVuZ3RoID09IDEpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobnVsbCk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyTmFtZXMoKTsKLQlhc3NlcnRUcnVlKGZpbHRlcnM9PW51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAiLi8qIjsKLQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscygiIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbGVOYW1lIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTmFtZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlck5hbWVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJQYXRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWxlTmFtZSIpKSB0ZXN0X2dldEZpbGVOYW1lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWxlTmFtZXMiKSkgdGVzdF9nZXRGaWxlTmFtZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMiKSkgdGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJOYW1lcyIpKSB0ZXN0X2dldEZpbHRlck5hbWVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJQYXRoIikpIHRlc3RfZ2V0RmlsdGVyUGF0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJFeHRlbnNpb25zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJOYW1lcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTVmNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZwotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coZm9udERpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCW5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQl0cnkgewotCQluZXcgRm9udERpYWxvZyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQl0cnkgewotCQluZXcgRm9udERpYWxvZyhudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250TGlzdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9udExpc3Qgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSR0IoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCUZvbnREYXRhIFtdIGZvbnREYXRhID0gbmV3IEZvbnREYXRhIFsxXTsKLQlmb250RGF0YSBbMF0gPSBuZXcgRm9udERhdGEgKCk7Ci0KLQlhc3NlcnROdWxsKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSk7CQotCQkKLQlmb250RGlhbG9nLnNldEZvbnRMaXN0KGZvbnREYXRhKTsKLQlhc3NlcnRFcXVhbHMoZm9udERpYWxvZy5nZXRGb250TGlzdCgpLCBmb250RGF0YSk7Ci0KLQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG51bGwpOwotCWFzc2VydE51bGwoZm9udERpYWxvZy5nZXRGb250TGlzdCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDI1NSwgMCwgMCk7Ci0JZm9udERpYWxvZy5zZXRSR0IocmdiKTsKLQlSR0IgcmdiMiA9IGZvbnREaWFsb2cuZ2V0UkdCKCk7Ci0JYXNzZXJ0RXF1YWxzKHJnYiwgcmdiMik7CQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0ZvbnREaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRMaXN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnREYXRhIikpIHRlc3RfZ2V0Rm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRMaXN0IikpIHRlc3RfZ2V0Rm9udExpc3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQiIpKSB0ZXN0X2dldFJHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExpc3QkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Gb250RGlhbG9nIGZvbnREaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM3ZDZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXAKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlncm91cCA9IG5ldyBHcm91cChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGdyb3VwKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCWdyb3VwID0gbmV3IEdyb3VwKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuU0hBRE9XX0lOLCBTV1QuU0hBRE9XX09VVCwgU1dULlNIQURPV19FVENIRURfSU4sIFNXVC5TSEFET1dfRVRDSEVEX09VVH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgdGV4dCIsICJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWdyb3VwLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIGdyb3VwLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUdyb3VwIGdyb3VwOwotCi0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDk5ZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsb2FkSW1hZ2VzKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci0JZnJlZUltYWdlcygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSgpIHsKLQkvLyBhYnN0cmFjdCBjbGFzcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwoaXRlbS5nZXRJbWFnZSgpKTsKLQlpdGVtLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgaXRlbS5nZXRJbWFnZSgpKTsKLQlhc3NlcnRUcnVlKGl0ZW0uZ2V0SW1hZ2UoKSAhPSBpbWFnZXNbMV0pOwotCWl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChpdGVtLmdldEltYWdlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgdGVzdFN0ciA9ICJ0ZXN0IHN0cmluZyI7Ci0JaXRlbS5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoImEiLCBpdGVtLmdldFRleHQoKS5lcXVhbHModGVzdFN0cikpOwotCWl0ZW0uc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiYiIsIGl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWl0ZW0uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldElJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUl0ZW0gaXRlbTsKLUltYWdlW10gaW1hZ2VzID0gbmV3IEltYWdlIFtTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoKlN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aF07Ci0KLXByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlpbnQgbnVtRmlsZXMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGg7Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlpbnQgaW5kZXggPSBpKm51bUZpbGVzOwotCQlmb3IgKGludCBqPTA7IGo8bnVtRmlsZXM7IGorKyl7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1tqXTsKLQkJCUlucHV0U3RyZWFtICByZXNvdXJjZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCWltYWdlcyBbaW5kZXgral0gPSBuZXcgSW1hZ2UgKHNoZWxsLmdldERpc3BsYXkoKSwgcmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3aWRnZXQpIHsKLQlpdGVtID0gKEl0ZW0pIHdpZGdldDsKLQlzdXBlci5zZXRXaWRnZXQod2lkZ2V0KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGZyZWVJbWFnZXMoKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlpZiAoaW1hZ2VzW2ldICE9IG51bGwpCi0JCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzAwNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xhYmVsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGxhYmVsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0vLwlzdXBlci50ZWFyRG93bigpOwotCi0JaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKHNoZWxsLmlzRGlzcG9zZWQoKSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobGFiZWwuaXNEaXNwb3NlZCgpLCBmYWxzZSk7Ci0JfQotCi0Jc2hlbGwuZGlzcG9zZSgpOwotCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCWFzc2VydFRydWUoc2hlbGwuaXNEaXNwb3NlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShsYWJlbC5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCl7Ci0JdHJ5IHsKLQkJbGFiZWwgPSBuZXcgTGFiZWwobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIDApOwotCi0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgU1dULlNFUEFSQVRPUiwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTCwgU1dULlNIQURPV19JTiwgU1dULlNIQURPV19PVVR9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCl7Ci0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLSAJICBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgY2FzZXNbaV0pOwotCSAgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldEFsaWdubWVudCgpLCBjYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpewotCUltYWdlW10gY2FzZXMgPSB7bnVsbCwgbmV3IEltYWdlKG51bGwsIDEwMCwgMTAwKX07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCSBsYWJlbC5zZXRJbWFnZShjYXNlc1tpXSk7Ci0JIGFzc2VydEVxdWFscyhsYWJlbC5nZXRJbWFnZSgpLCBjYXNlc1tpXSk7Ci0JIGlmIChjYXNlc1tpXSE9bnVsbCkKLQkgIGNhc2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAic29tZSBuYW1lIiwgInNkYXNkbGtqc2hjZGFzY2Vjb2V3Y3dlIn07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCSBsYWJlbC5zZXRUZXh0KGNhc2VzW2ldKTsKLQkgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldFRleHQoKSwgY2FzZXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbGlnbm1lbnRJKCl7Ci0JaW50W10gY2FzZXMgPSB7U1dULkxFRlQsIFNXVC5SSUdIVCwgU1dULkNFTlRFUn07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLSAJICBsYWJlbC5zZXRBbGlnbm1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0RXF1YWxzKGxhYmVsLmdldEFsaWdubWVudCgpLCBjYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIGdldEltYWdlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpewotCXRyeSB7Ci0JCWxhYmVsLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbGlnbm1lbnQiKSkgdGVzdF9nZXRBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUxhYmVsIGxhYmVsOwotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzU3ODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgMCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCX0KLQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQzNTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbmsKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbmsKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluayBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLQlMaW5rIGxpbms7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCXNldFdpZGdldChsaW5rKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIFRlc3QgTGluayhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuTlVMTCk7Ci0JbGluay5kaXNwb3NlKCk7Ci0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGluay5kaXNwb3NlKCk7Ci0JbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsaW5rLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlsaW5rID0gbmV3IExpbmsobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaW5rLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbGluay5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlsaW5rLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaW5rLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWxpbmsuY29tcHV0ZVNpemUoMCwgMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDAsIDAsIGZhbHNlKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoLTEwLCAtMTApOwotCi0JbGluay5jb21wdXRlU2l6ZSgtMTAsIC0xMCwgZmFsc2UpOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMCwgMTApOwotCi0JbGluay5jb21wdXRlU2l6ZSgxMCwgMTAsIGZhbHNlKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsKLQkJCSIiLAotCQkJImEiLAotCQkJImFhIiwKLQkJCSJhYWFhYWFhYWFhIiwKLQkJCSJhJiIsCi0JCQkiJiIsCi0JCQkiJmEiLAotCQkJIiZhJiIsCi0JCQkiJmEiLAotCQkJIiY8YT4iLAotCQkJIjxhPiIsCi0JCQkiJmE8YT4iLAotCQkJIjxhPjwvYT4iLAotCQkJIjxhPjwvYT4mIiwKLQkJCSI8YT48L2E+YSYiLAotCQkJIjxhPjwvYT4mYSIsCi0JCQkiJmE8YT5hPC9hPiZhIiwKLQkJCSImYTxhPiZhPC9hPiZhIiwKLQkJCSJUZXh0IDxhIGhyZWY9XCJ1cmwuY29tXCI+TGluazwvYT4gdGV4dCA8QSBjb2xvcj0jMjEyMTIxPkxpbmsgMjwvQT4gIiwKLQkJCSJUZXh0PGEgIFx0ICAgeHh4PVwieXl5ICBcIiAgICAgICAgaWQ9XCJpZHNcIiBocmVmPVwiSFJFRlwiICAgICA+TGluazwgL2E+RW5kIiwKLQkJCSJUZSYmeHQgJnRleHQgJiYgPGE+TCZpbms8L2E+IGgmaSA8YT5mZSYmbGlwZTwvYT4gJmwgJmVuZCYmIiwKLQkJCSJUZXh0IDxhIGlkPVwiMVwiPkxpbms8L2E+IHNvbWV0aGluZyA8YSBocmVmPVwiYmxhIGJsYTJcIiA+TGluazI8L2E+IHNvbWV0aGluZ2Vsc2UgPGE+TGluazMgbGFyZ2UgbGFyZ2U8L2E+LiBzb21lIHRleHQgdG8gdGVzdCB0aGlzIHdyYXBwaW5nIHRoaW5nIDxBIGhyZWY9XCJsYXN0XCI+dGhpcyBpcyBzdXBwb3NlIHRvIGJlIGEgdmVyeSBsb25nIGxpbmsgdGV4dCB0aGUgc3ByYXdzIG92ZXIgc2V2ZXJhbCBsaW5lcyBpbiB0aGUgdGV4dCBsYXlvdXQ8L2E+LmVuZCIsCi0JCQkiVGhlIFNXVCBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSA8QT5lZmZpY2llbnQ8L0E+LCA8QT5wb3J0YWJsZTwvQT4gPEE+YWNjZXNzIHRvIHRoZSB1c2VyLWludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtczwvQT4gb24gd2hpY2ggaXQgaXMgaW1wbGVtZW50ZWQuIiwKLQkJCSJzb21lIHRleHQiLCAKLQkJCSJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QiLCAKLQkJCSJcbiBcbiBcYiBcdCAiLCAKLQkJCSJcMCJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKyl7Ci0JCWxpbmsuc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscyhsaW5rLmdldFRleHQoKSAsIGNhc2VzW2ldKTsKLQl9Ci0JdHJ5IHsKLQkJbGluay5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0ZXh0ID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ZDhlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIFNXVC5NVUxUSSk7Ci0KLQlzZXRXaWRnZXQobGlzdCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlsaXN0ID0gbmV3IExpc3QobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsgLy9zaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0KLQkJewotCQkJMCwKLQkJCVNXVC5TSU5HTEUsCi0JCQlTV1QuTVVMVEksCi0JCQlTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwsCi0JCQlTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwsCi0JCQlTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlsaXN0ID0gbmV3IExpc3Qoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQlsaXN0LmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3QuYWRkKCIiKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0IiwgInNvbWUgdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQl0cnkgewotCQlsaXN0LmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3QuYWRkKCIiKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0IiwgInNvbWUgdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl0cnkgewotCQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LmFkZCgiIiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbmV3IFN0cmluZ1tdIHsiIn0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgXG4gdGV4dCIsIDEpOwotCWFzc2VydFNhbWUoIjpiOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmM6IiwgbmV3IFN0cmluZ1tdIHsic29tZSB0ZXh0IiwgIiIsICJzb21lIFxuIHRleHQiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0JdHJ5IHsKLQkJbGlzdC5hZGQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzdHJpbmciLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3QKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzb21lIHRleHQiLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCQotCWxpc3QuYWRkKCIiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBuZXcgU3RyaW5nW10geyIifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSBcbiB0ZXh0IiwgMSk7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIHRleHQiLCAwKTsKLQlhc3NlcnRTYW1lKCI6YzoiLCBuZXcgU3RyaW5nW10geyJzb21lIHRleHQiLCAiIiwgInNvbWUgXG4gdGV4dCIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQl0cnkgewotCQlsaXN0LmFkZChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdCRJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoIjphOiIsIGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQl0cnkgewotCQlsaXN0LmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10gewotCX0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pc1NlbGVjdGVkKDApLCBmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMiwgMCwgMCB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAzIH0pOwotCS8qCWFzc2VydCgiOmQ6IiwgIWxpc3QuaXNTZWxlY3RlZCgwKSk7Ci0JYXNzZXJ0KCI6ZGQ6IiwgIWxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JYXNzZXJ0KCI6ZGRkOiIsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JYXNzZXJ0KCI6ZGRkOiIsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ki8KLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCXRyeSB7Ci0JCWxpc3QuZGVzZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMCB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAzIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDIsIDAsIDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGl0ZW1zLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiZnJlZCIgKyBpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JU3RyaW5nW10gaXRlbXMyID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JYXNzZXJ0U2FtZShpdGVtczIsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoNSk7Ci0JYXNzZXJ0U2FtZShpdGVtczIsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoNSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCgyKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JbGlzdC5kZXNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJmcmVkIiArIGk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCi0JLy8gdGVzdHMgaWYgZGVzZWxlY3QoaSwgaikgaXMgdGhlIHNhbWUgYXMgZm9yIChpPTA7IGk8PWo7ICsraSkgZGVzZWxlY3QoaSk7Ci0JaW50W11bXSBjYXNlcyA9IHsgeyAzLCAxIH0sIHsKLQkJCS0zLCAtMiB9LCB7Ci0JCQktMiwgLTEgfSwgewotCQkJLTEsIC0xIH0sIHsKLQkJCTEwLCAxIH0KLQl9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7ICsraSkgewotCQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgY2FzZXNbaV1bMF0sIGNhc2VzW2ldWzFdLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCX0KLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMywgbmV3IGludFtdIHsgNCB9KTsKLQkJZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzMCwgbmV3IGludFtdIHsKLQkJfSk7Ci0JfQotCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAzLCBuZXcgaW50W10geyAwLCA0IH0pOwotCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAxLCBuZXcgaW50W10geyAwLCAyLCAzLCA0IH0pOwotCS8vIGRvbmUKLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWFzc2VydFNhbWUoIjphOiIsIGl0ZW1zMiwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KDAsIDApOwotCWFzc2VydFNhbWUoIjpiYmI6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0JbGlzdC5kZXNlbGVjdCgyLCAzKTsKLQlhc3NlcnRFcXVhbHMoIjpiYjoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JbGlzdC5kZXNlbGVjdCgwLCAyKTsKLQlhc3NlcnRFcXVhbHMoIjpkZGRkOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlsaXN0LmRlc2VsZWN0KDIsIDApOwotCWFzc2VydFNhbWUoCi0JCSI6ZGRkZGQ6IiwKLQkJbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQkKLQlsaXN0LnNlbGVjdCgwKTsKLQotCWxpc3QuZGVzZWxlY3QoLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgtMSwgLTEpOwotCWFzc2VydEVxdWFscygiOmU6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3QuZGVzZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KDMsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KDAsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdCgxLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9jdXNJbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIn07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpKTsKLQlsaXN0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRGb2N1c0luZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZSgyKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZSgyKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gbGlzdC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWludCBuZXdMaW5lSGVpZ2h0ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbmV3TGluZUhlaWdodCA+IGxpbmVIZWlnaHQpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCXRyeSB7Ci0JCWxpc3QuZ2V0SXRlbSg1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgzKSwgIml0ZW0zIik7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JdHJ5IHsKLQkJbGlzdC5nZXRJdGVtKDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbGlzdC5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLy9hc3NlcnQoIjphOiIsIGxpc3QuZ2V0SXRlbSg1KT09bnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJpdGVtMyIsIGxpc3QuZ2V0SXRlbSgzKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlTdHJpbmdbXVtdIGNhc2VzID0geyB7Ci0JCX0sIHsKLQkJCSIiIH0sIHsKLQkJCSIiLCAiIiB9LCB7Ci0JCQkidGV4dDEiLCAidGV4dDIiIH0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscygiY2FzZTogIiArIGksIGNhc2VzW2ldLCBsaXN0LmdldEl0ZW1zKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JU3RyaW5nW11bXSBjYXNlcyA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkiIiwgIiIgfSwgewotCQkJInRleHQxIiwgInRleHQyIiB9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb3A6IiArIGkpOwotCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oY2FzZXNbaV0pOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJsaXN0OiIgKyBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiY2FzZToiICsgaSArIGNhc2VzW2ldKTsKLQkJYXNzZXJ0U2FtZSgiY2FzZTogIiArIGksIGNhc2VzW2ldLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMTsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotCQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwKLQkJCWxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7IGNhc2VzW2ldWzBdIH0pOwotCX0KLQotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JaW50W10gc2VsID0geyAwLCAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgsIDIpOwotCVN0cmluZ1tdIHNlbEl0ZW1zID0gbmV3IFN0cmluZ1tdIHtpdGVtc1swXSwgaXRlbXNbMl19OwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgc2VsSXRlbXMpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAyKTsKLQlzZWxJdGVtcyA9IG5ldyBTdHJpbmdbXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIHNlbEl0ZW1zKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKS5sZW5ndGgsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpWzBdLCBpdGVtc1sxXSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigxLCAwKTsKLQlTdHJpbmdbXSBlbXB0eSA9IHsKLQl9OwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQlTdHJpbmdbXSBib2d1c19pdGVtcyA9IHsgImJvZ3VzX3RleHQxIiwgImJvZ3VzX3RleHQyIiwgImJvZ3VzX3RleHQzIiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKGJvZ3VzX2l0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3RzIAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXNbMF0sIGxpc3QuZ2V0U2VsZWN0aW9uKClbMF0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXNbMV0sIGxpc3QuZ2V0U2VsZWN0aW9uKClbMF0pOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcwotICoKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotICogICAgPGxpPkVSUk9SX0NBTk5PVF9HRVRfQ09VTlQgLSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzIGJlY2F1c2Ugb2YgYW4gb3BlcmF0aW5nIHN5c3RlbSBmYWlsdXJlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgMCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDIiIH0pOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQkvLyBub3QgcHJvcGVybHkgc3BlYydkIGZvciBtdWx0aS1zZWxlY3QgbGlzdHMKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQxIiB9KTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MiIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDMiIH0pOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlpbnRbXSBzZWwgPSB7IDAsIDEsIDIgfTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IC0xLCAwLCAxLCAyLCAzIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7IDAsIDEsIDIgfSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10geyAxLCAyIH0sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMCB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAyIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDMiKSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDQiKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQyIiB9OyAvL3R3byBpZGVudGljYWwKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0MiIpLCAxKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIsIDQpKTsKLQotCQotCWFzc2VydEVxdWFscygyLCBsaXN0LmluZGV4T2YoInRleHQzIikpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQ0IikpOwotCi0JCi0JdHJ5IHsKLQkJbGlzdC5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDMiLCA0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDMiLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAxKSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMikpOwotCi0JU3RyaW5nW10gaXRlbXMyID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDIiIH07IC8vdHdvIGlkZW50aWNhbAotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDIpLCAyKTsKLQotCXRyeSB7Ci0JCSBsaXN0LmluZGV4T2YobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtczIpOwotCS8vCWFzc2VydCgibGlzdC5pbmRleE9mKFwidGV4dDJcIiwgLTEpPT0xIiwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIC0xKT09MSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAyKSk7Ci0KLQl0cnkgewotCQlsaXN0LmluZGV4T2YobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNTZWxlY3RlZEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MiIgfTsgLy90d28gaWRlbnRpY2FsCi0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMykpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDIpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMykpOwotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSRJKCkgewotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGljZXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDAiLCAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAwLCAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JLy8gaW5kZXggPiBudW1iZXIgb2YgZWxlbWVudHMgaW4gbGlzdAotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDQsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAzLCAxLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAtMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjpiOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgLTIsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDEsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiOmQ6IiwKLQkJbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiLCAidGV4dDMiIH0pOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCXRyeSB7Ci0JCWludFtdIGluZGljZXMgPSBudWxsOwotCQlsaXN0LnJlbW92ZShpbmRpY2VzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kaWNlcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRFcXVhbHMoIjpmOiIsIGxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiB9KTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDMsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZzoiLCBsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIgfSk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkvLyBpbmRleCA+IG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgNCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCWFzc2VydEVxdWFscygiOmg6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAzLCAxLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQlhc3NlcnRFcXVhbHMoIjpoOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgLTEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjppOiIsIGl0ZW1zLCBsaXN0LmdldEl0ZW1zKCkpOwotCi0JCi0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMSwgMSB9KTsKLQlhc3NlcnRFcXVhbHMoIjpqOiIsCi0JCW5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIsICJ0ZXh0MyIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiwgInRlc3QyIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgxKSwgInRleHQzIik7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgwKSwgInRleHQzIik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3QucmVtb3ZlKDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDApLCAidGV4dDEiKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JbGlzdC5yZW1vdmUoMSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCWFzc2VydFRydWUobGlzdC5nZXRJdGVtKDEpLmVxdWFscygidGV4dDMiKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMCksICJ0ZXh0MyIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDMiLCBsaXN0LmdldEl0ZW0oMSkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCA0KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5yZW1vdmUoMiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdGFydCBpbmRleCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JCi0JbGlzdC5yZW1vdmUoMSwgMik7Ci0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDEiLCBsaXN0LmdldEl0ZW0oMCkpOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMiwgMTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscygidGV4dDIiLCBsaXN0LmdldEl0ZW0oMSkpOwotCi0JbGlzdC5yZW1vdmUoMiwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgoU3RyaW5nKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKCJpdGVtczk4OSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5yZW1vdmUoInRleHQzIik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoInRleHQyIik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKChTdHJpbmcpIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgiaXRlbXM5ODkiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MyIpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MiIpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdCRJKCkgewotCXRyeSB7Ci0JCWxpc3Quc2VsZWN0KChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMCwgMiB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAyIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5hZGQoIml0ZW00Iik7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAtMSwgMCwgMSwgMiwgMyB9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWludFtdIGluZCA9IG5ldyBpbnRbMzJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kLmxlbmd0aDsgaSsrKSBpbmRbaV0gPSBpOwotCWxpc3Quc2VsZWN0KGluZCk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50W10ge30pOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IC0xIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlpdGVtcyA9IGxpc3QuZ2V0SXRlbXMoKTsKLQotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgMCwgMywgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQlzZWxlY3QkSV9oZWxwZXIoaXRlbXMsIC0xLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdCRJX2hlbHBlcihpdGVtcywgLTEsIDMwLCBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0IH0pOwotCi0JCi0JLyotLS0gU2luZ2xlLXNlbGVjdCAtLS0qLwotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkKLQl0cnkgewotCQlsaXN0LnNlbGVjdCgoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W117IC0xIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAyIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDQgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgNSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDQgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAwLCAxLCAyLCAzIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgLTEsIDAsIDEsIDIsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JaW50W10gc2VsZWN0aW9uID0gbmV3IGludFszMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHNlbGVjdGlvbltpXSA9IGk7Ci0JbGlzdC5zZWxlY3Qoc2VsZWN0aW9uKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W117IDEsIDEsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W117fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiLCAidGVzdDIiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpLCAwKTsKLQlsaXN0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDQpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JbGlzdC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWxpc3Quc2VsZWN0KDIpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMSk7Ci0JYXNzZXJ0U2FtZSgic2VsZWN0KDEpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMyk7Ci0JYXNzZXJ0U2FtZSgKLQkJInNlbGVjdCgzKToiLAotCQlsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDUpOwotCWFzc2VydFNhbWUoCi0JCSJzZWxlY3QoNSk6IiwKLQkJbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoMCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0xKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMSk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTIpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0yKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCg0KTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCg0KToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWxpc3Quc2VsZWN0KDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2VsZWN0KDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgwKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQkKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0xKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMik7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTIpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDQpOwotCWFzc2VydEVxdWFscygic2VsZWN0KDQpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdElJKCkgewotCWxpc3Quc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlpbnQgbnVtYmVyID0gNTsKLQotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWludFtdIGVtcHR5ID0ge307Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9ICJpdGVtIiArIGk7Ci0KLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEwLCAxLCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAzLCAxLCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgLTEsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDUsIDUsIGVtcHR5KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDQsIDUsIG5ldyBpbnRbXSB7IDQgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMCwgbmV3IGludFtdIHsgMCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDIsIDQsIG5ldyBpbnRbXSB7IDIsIDMsIDQgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAwLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdIHsgMSB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzMCwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAzLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QoLTEwLCAtOSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQotCWxpc3Quc2VsZWN0KDEwMDAsIDIwMDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDEsIDIpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAzKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5zZWxlY3QoMiwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDMsIDUpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgwLCAxKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQlsaXN0LnNlbGVjdCgtMTAsIC05KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JbGlzdC5zZWxlY3QoMTAwMCwgMjAwMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbGlzdC5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5zZWxlY3QoMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZWxlY3QoMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMywgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCi0JbGlzdC5zZWxlY3QoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5zZWxlY3QoNSwgNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDUsIDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDMsIDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMCwgMCwgbmV3IGludFtdezB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEsIDEsIG5ldyBpbnRbXXsxfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAyLCAyLCBuZXcgaW50W117Mn0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMywgMywgbmV3IGludFtdezN9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDQsIDQsIG5ldyBpbnRbXXs0fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCA1LCA1LCBuZXcgaW50W117fSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxMCwgMSwgbmV3IGludFtde30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMywgMSwgbmV3IGludFtde30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIC0xLCBuZXcgaW50W117fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250RGF0YSBmb250RGF0YSA9IGxpc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMTIsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgbGlzdC5nZXRGb250KCkpOwotCWFzc2VydFRydWUoIml0ZW1IZWlnaHQ9IiArIGxpc3QuZ2V0SXRlbUhlaWdodCgpICsgIiwgbGluZUhlaWdodD0iICsgbGluZUhlaWdodCwgbGlzdC5nZXRJdGVtSGVpZ2h0KCkgPiBsaW5lSGVpZ2h0KTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQlpbnRbXSBjYXNlcyA9IHsgLTEwLCAwLCAxMCB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCAiIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCi0JaW50IGNhc2VzMltdID0geyAxMCwgMTUsIDAgfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzMi5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzMltpXSwgImZyZWQiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JfQotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRJdGVtKDEsICJuZXcxIik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMCIsICJuZXcxIiwgIml0ZW0yIiwgIml0ZW0zIiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzW2ldLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JfQotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgIiIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMyLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXMyW2ldLCAiZnJlZCIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldEl0ZW0oMSwgIm5ldzEiKTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0wIiwgIm5ldzEiLCAiaXRlbTIiLCAiaXRlbTMiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gVE9ETyBBbiBTV1RFcnJvciBzaG91bGQgbmV2ZXIgaGFwcGVuIGFuZCBzaG91bGQgbm90Ci0JLy8gYmUgcGFydCBvZiB0aGUgdGVzdCBjYXNlLiAgTGlzdCBzaG91bGQgdGhyb3cgYW4gCi0JLy8gU1dURXhjZXB0aW9uLgotLy8JU3RyaW5nW11bXSBjYXNlcyA9IHsgeyBudWxsIH0sIHsKLS8vCQkJImRzYWRhIiwgbnVsbCwgImRzZGFzZGFzZCIgfQotLy8JfTsKLS8vCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLS8vCQl0cnkgewotLy8JCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLS8vCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgbm90IGZvdW5kIik7Ci0vLwkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotLy8JCX0KLS8vCX0KLQotCVN0cmluZ1tdW10gaXRlbUFyciA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkic2Rhc2QiIH0sIHsKLQkJCSJzZGFzZCIsICIzMjM0MzQiIH0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUFyci5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGl0ZW1BcnJbaV0pOwotCQlhc3NlcnRFcXVhbHMoaXRlbUFycltpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQXJyLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoaXRlbUFycltpXSk7Ci0JCWFzc2VydEVxdWFscygiY2FzZToiICsgaSwgaXRlbUFycltpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci0KLQkKLQl0cnkgewotCQlsaXN0LnNldEl0ZW1zKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJEkoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIE1VTFRJOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezMsIDEsIDUsIDJ9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezMsIDEsIDUsIDJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezEsIDIsIDMsIDV9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIDF9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAxLCAyLCAzLCA1fSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pOwotCi0JaW50W10gaW5kaWNlcyA9IG5ldyBpbnQgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpbmRpY2VzW2ldID0gaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaW5kaWNlcyk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihpbmRpY2VzKSIsIGluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pIiwgbmV3IGludFswXSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgbnVtYmVyIC0gMiwgbnVtYmVyIC0gMX0pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbigoaW50W10pIG51bGwpIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgU0lOR0xFOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnQgW10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JaW5kaWNlcyA9IG5ldyBpbnQgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpbmRpY2VzW2ldID0gaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaW5kaWNlcyk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihpbmRpY2VzKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgbnVtYmVyLCAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCAwLCBudW1iZXIgLSAyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQgIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCX0KLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAxIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAxIn0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgLTEiLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgWzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIC0xIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQkKLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmcgW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9ICJmcmVkICIgKyBpOwotCX0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlciwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKSwgImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgIiArIG51bWJlciwgImZyZWQgMSJ9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ImZyZWQgMCIsICJmcmVkIDEifSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJbGlzdC5hZGQoImZyZWQgIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nWzBdKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChTdHJpbmdbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkIDIifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMSIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAtMSIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQotCWl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSAiZnJlZCAiICsgaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKSwgImZyZWQgIiArIChudW1iZXIgLSAxKX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAiLCAiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAxIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgMCJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgbnVtYmVyID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCX0KLQotCWxpc3Quc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtNSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiZnJlZCIgKyBpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMik7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsxLCAyfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAyLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDIsIG51bWJlciAtIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigyLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0KLQlsaXN0LnJlbW92ZUFsbCgpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbig0LCA0KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7NH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgNCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTMsIC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDIsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyICsgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDIsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCWxpc3Quc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0VG9wSW5kZXgoMykgaW4gZW1wdHkgbGlzdCIsIDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFRvcEluZGV4KGk9IiArIGkgKyAiKSIsIGksIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFRvcEluZGV4KDMpIGluIGVtcHR5IGxpc3QiLCAwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0VG9wSW5kZXgoaT0iICsgaSArICIpIiwgaSwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQl9Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWxpc3Quc2hvd1NlbGVjdGlvbigpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWxpc3Quc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNTZWxlY3RlZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZSRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0JEkiKSkgdGVzdF9kZXNlbGVjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEFsbCIpKSB0ZXN0X2Rlc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdEkiKSkgdGVzdF9kZXNlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SUkiKSkgdGVzdF9kZXNlbGVjdElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb2N1c0luZGV4IikpIHRlc3RfZ2V0Rm9jdXNJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTZWxlY3RlZEkiKSkgdGVzdF9pc1NlbGVjdGVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlJEkiKSkgdGVzdF9yZW1vdmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdCRJIikpIHRlc3Rfc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdElJIikpIHRlc3Rfc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKSkgdGVzdF9zZXRTZWxlY3Rpb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1MaXN0IGxpc3Q7Ci0vKioKLSAqIFRlc3QgaWYgJ2Rlc2VsZWN0KHUsIHYpJyBpcyB0aGUgc2FtZSBhcyAnZm9yIChpPXU7IGk8PXY7ICsraSkgZGVzZWxlY3QoaSk7JwotICovCi1wcm90ZWN0ZWQgdm9pZCBkZXNlbGVjdElJX2hlbHBlcigKLQlTdHJpbmdbXSBpdGVtcywKLQlpbnQgc3RhcnQsCi0JaW50IGVuZCwKLQlpbnRbXSBleHBlY3RlZEluZGljZXMpIHsKLQkJCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCi0JbGlzdC5kZXNlbGVjdChzdGFydCwgZW5kKTsKLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaWYgKCAwICE9IChsaXN0LmdldFN0eWxlKCkgJiBTV1QuTVVMVEkpICkgewotCQlhc3NlcnRTYW1lKCJzZXRTZWxlY3Rpb24oaXRlbXMpOiIsIGl0ZW1zLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKLQkJbGlzdC5kZXNlbGVjdChpKTsKLQl9Ci0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotLyoqCi0gKiBEaXNwb3NlIG9mIHRoZSBtYWluIGxpc3QgYW5kIGNyZWF0ZSBhIG5ldywgc2luZ2xlLXNlbGVjdGlvbiBvbmUuCi0gKi8KLXByb3RlY3RlZCBMaXN0IHNldFNpbmdsZUxpc3QoKSB7Ci0JbGlzdC5kaXNwb3NlKCk7Ci0JbGlzdCA9IG5ldyBMaXN0KHNoZWxsLCBTV1QuU0lOR0xFKTsKLQlzZXRXaWRnZXQobGlzdCk7Ci0JcmV0dXJuIGxpc3Q7Ci19Ci0vKioKLSAqIFNpbWlsYXIgdG8gZGVzZWxlY3RJSV9oZWxwZXIsIGNoZWNrcyBpZiBzZWxlY3QodSwgdikgaXMgdGhlIHNhbWUgYXMKLSAqIGZvciAoaT11OyBpPD12OyArK2kpIHNlbGVjdChpKQotICovCi1wcm90ZWN0ZWQgdm9pZCBzZWxlY3RJSV9oZWxwZXIoCi0JU3RyaW5nW10gaXRlbXMsCi0JaW50IHN0YXJ0LAotCWludCBlbmQsCi0JaW50W10gZXhwZWN0ZWRJbmRpY2VzKSB7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZWxlY3Qoc3RhcnQsIGVuZCk7Ci0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiZGVzZWxlY3RBbGw6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIC8vIDw9IG9uIHB1cnBvc2UKLQkJbGlzdC5zZWxlY3QoaSk7Ci0KLQlhc3NlcnRTYW1lKCI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLX0KLS8qKgotICogU2ltaWxhciB0byBkZXNlbGVjdElJX2hlbHBlciwgY2hlY2tzIGlmIHNlbGVjdChpbnQgW11hcnIpIGdpdmVzIHRoZSBzYW1lCi0gKiByZXN1bHQgYXMgc2V2ZXJhbCBpbmRpdmlkdWFsIHNlbGVjdChpbnQpIGNhbGxzLiBUaGUgaW50W10gdXNlZCBmb3Igc2VsZWN0aW9uCi0gKiB3aWxsIGJlIGZpbGxlZCBhbGwgaW50ZWdlcnMgZnJvbSBzdGFydCB0byBlbmQgaW5jbHVzaXZlLCBpbiBvcmRlci4KLSAqLwotcHJvdGVjdGVkIHZvaWQgc2VsZWN0JElfaGVscGVyKAotCVN0cmluZ1tdIGl0ZW1zLAotCWludCBzdGFydCwKLQlpbnQgZW5kLAotCWludFtdIGV4cGVjdGVkSW5kaWNlcykgewotCWludFtdIHNlbGVjdGlvbiA9IG5ldyBpbnRbZW5kIC0gc3RhcnQgKyAxXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7ICsraSkgewotCQlzZWxlY3Rpb25baV0gPSBpICsgc3RhcnQ7Ci0JfQotCi0JbGlzdC5zZWxlY3Qoc2VsZWN0aW9uKTsKLQotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoImRlc2VsZWN0QWxsOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSAvLyA8PSBvbiBwdXJwb3NlCi0JCWxpc3Quc2VsZWN0KGkpOwotCi0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkKCkgewotICAgIGxpc3QuYWRkKCJ0aGlzIik7Ci0gICAgbGlzdC5hZGQoImlzIik7Ci0gICAgbGlzdC5hZGQoIlNXVCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZWM3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNiM2QxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lbnUgPSBuZXcgTWVudShzaGVsbCk7Ci0Jc2V0V2lkZ2V0KG1lbnUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTlVMTCk7Ci0JbmV3IE1lbnUoY29tcCk7Ci0JY29tcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCkgewotCU1lbnUgbmV3TWVudTsKLQlTaGVsbCBudWxsU2hlbGwgPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShudWxsU2hlbGwsIFNXVC5OVUxMKTsKLQkJbmV3TWVudS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpIHsKLQluZXcgTWVudShtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBudWxsOwotCXRyeSB7Ci0JCW5ld01lbnUgPSBuZXcgTWVudShtSXRlbSk7Ci0JCW5ld01lbnUuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQluZXdNZW51ID0gbmV3IE1lbnUobUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUhlbHBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudS5hZGRIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZUhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCU1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgTWVudUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCi0JdHJ5IHsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZE1lbnVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51LmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5TaG93LCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuSGlkZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51LnJlbW92ZU1lbnVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTWVudUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5yZW1vdmVNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuU2hvdywgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0SXRlbSgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RGVmYXVsdEl0ZW0gbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW1Db3VudCgpLCBpKTsKLQkgIAluZXcgTWVudUl0ZW0obWVudSwgMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCU1lbnVJdGVtIG1JdGVtMCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JTWVudUl0ZW0gbUl0ZW0xID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRJdGVtKDApLCBtSXRlbTApOwotCWFzc2VydEVxdWFscyhtZW51LmdldEl0ZW0oMSksIG1JdGVtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JTWVudUl0ZW1bXSBpdGVtcyA9IG5ldyBNZW51SXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgTWVudUl0ZW0obWVudSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscygiOmE6IiwgaXRlbXMsIG1lbnUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWVudS5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIG5ldyBNZW51SXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbWVudS5nZXRJdGVtcygpKTsKLQotCW1lbnUuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgbWVudS5nZXRJdGVtcygpKTsKLQotCW1lbnUuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbM119LCBtZW51LmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRQYXJlbnQoKSwgc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCU1lbnUgbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlhc3NlcnROdWxsKG5ld01lbnUuZ2V0UGFyZW50SXRlbSgpKTsKLQltSXRlbS5zZXRNZW51KG5ld01lbnUpOwotCWFzc2VydEVxdWFscyhuZXdNZW51LmdldFBhcmVudEl0ZW0oKSwgbUl0ZW0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudE1lbnUoKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCU1lbnUgbmV3TWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlhc3NlcnROdWxsKG5ld01lbnUuZ2V0UGFyZW50TWVudSgpKTsKLQltSXRlbS5zZXRNZW51KG5ld01lbnUpOwotCWFzc2VydEVxdWFscyhuZXdNZW51LmdldFBhcmVudE1lbnUoKSwgbWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGwoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0U2hlbGwoKSwgc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldFZpc2libGUgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JTWVudUl0ZW1bXSBtaXMgPSBuZXcgTWVudUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCW1pc1tpXSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydEVxdWFscyhtZW51LmluZGV4T2YobWlzW2ldKSwgaSk7Ci0JCWlmIChpPjEpCi0JCQlhc3NlcnRUcnVlKG1lbnUuaW5kZXhPZihtaXNbaS0xXSkgIT0gaSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JLy8gVGhpcyB0ZXN0IGNhbiBub3QgYmUgcnVuIGFzIGl0IGN1cnJlbnRseSBpcyB3cml0dGVuLiAgT24gV2luZG93cywgaWYgYSAKLQkvLyBtZW51IGhhcyBubyBtZW51IGl0ZW1zLCBpdCB3aWxsIG5vdCBiZWNvbWUgdmlzaWJsZS4KLQkvLyBJZiB3ZSBhZGQgbWVudSBpdGVtcyB0byB0aGUgbWVudSB0aGVuIGEgc2Vjb25kIHByb2JsZW0gaXMgZW5jb3VudGVyZWQgCi0JLy8gYmVjYXVzZSBtZW51LnNldFZpc2libGUoKSBlbnRlcnMgaW50byBhIG1vZGFsIGxvb3AgYW5kIGV4ZWN1dGlvbiBvZiAKLQkvLyB0aGUgSlVuaXQgdGVzdCBjYXNlIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsIHRoZSBtZW51IGlzIHNlbGVjdGVkIGFuZCBjbG9zZWQuCi0JaWYgKHRydWUpIHJldHVybjsKLQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmlzVmlzaWJsZSgpKTsKLQotCS8vIGFwaSBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLQkJbWVudS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbnUuaXNWaXNpYmxlKCksIGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRIZWxwTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRNZW51TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0JTWVudUl0ZW0gbUl0ZW0wID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlNZW51SXRlbSBtSXRlbTEgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCW1lbnUuc2V0RGVmYXVsdEl0ZW0obUl0ZW0wKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXREZWZhdWx0SXRlbSgpLCBtSXRlbTApOwotCWFzc2VydFRydWUoIkFmdGVyIHNldERlZmF1bHRJdGVtKG1JdGVtMCk6IiwgbWVudS5nZXREZWZhdWx0SXRlbSgpICE9IG1JdGVtMSk7Ci0JbWVudS5zZXREZWZhdWx0SXRlbShtSXRlbTEpOwotCWFzc2VydEVxdWFscyhtZW51LmdldERlZmF1bHRJdGVtKCksIG1JdGVtMSk7Ci0JYXNzZXJ0VHJ1ZSgiQWZ0ZXIgc2V0RGVmYXVsdEl0ZW0obUl0ZW0xKToiLCBtZW51LmdldERlZmF1bHRJdGVtKCkgIT0gbUl0ZW0wKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQltZW51LnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldEVuYWJsZWQoKSk7Ci0JbWVudS5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRGYWxzZShtZW51LmdldEVuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25JSSgpIHsKLQltZW51LnNldExvY2F0aW9uKDAsMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCW1lbnUuc2V0TG9jYXRpb24obmV3IFBvaW50KDAsMCkpOwotCXRyeSB7Ci0JCW1lbnUuc2V0TG9jYXRpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQkvLyBUaGlzIHRlc3QgY2FuIG5vdCBiZSBydW4gYXMgaXQgY3VycmVudGx5IGlzIHdyaXR0ZW4uICBPbiBXaW5kb3dzLCBpZiBhIAotCS8vIG1lbnUgaGFzIG5vIG1lbnUgaXRlbXMsIGl0IHdpbGwgbm90IGJlY29tZSB2aXNpYmxlLgotCS8vIElmIHdlIGFkZCBtZW51IGl0ZW1zIHRvIHRoZSBtZW51IHRoZW4gYSBzZWNvbmQgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZCAKLQkvLyBiZWNhdXNlIG1lbnUuc2V0VmlzaWJsZSgpIGVudGVycyBpbnRvIGEgbW9kYWwgbG9vcCBhbmQgZXhlY3V0aW9uIG9mIAotCS8vIHRoZSBKVW5pdCB0ZXN0IGNhc2Ugd2lsbCBub3QgY29udGludWUgdW50aWwgdGhlIG1lbnUgaXMgc2VsZWN0ZWQgYW5kIGNsb3NlZC4KLQlpZiAodHJ1ZSkgcmV0dXJuOwotCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0VmlzaWJsZSgpKTsKLQkvLyBBUEkgbm90IGltcGxlbWVudGVkIHlldCAKLQlpZiAoZkNoZWNrVmlzaWJpbGl0eSkgewotCQltZW51LnNldFZpc2libGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWVudS5nZXRWaXNpYmxlKCksIGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9uc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudE1lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9uc0kiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9uc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpKSB0ZXN0X2FkZE1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdEl0ZW0iKSkgdGVzdF9nZXREZWZhdWx0SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50TWVudSIpKSB0ZXN0X2dldFBhcmVudE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxsIikpIHRlc3RfZ2V0U2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZpc2libGUiKSkgdGVzdF9nZXRWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbklJIikpIHRlc3Rfc2V0TG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTWVudSBtZW51OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyOWI2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltZW51ID0gbmV3IE1lbnUoc2hlbGwpOwotCW1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIDApOwotCXNldFdpZGdldChtZW51SXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkoKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCWFzc2VydE5vdE51bGwobUl0ZW0pOwotCQotCXRyeSB7Ci0JCW5ldyBNZW51SXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0hFQ0spOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULkNIRUNLKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULkNBU0NBREUpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTdHlsZSgpPT1TV1QuUFVTSCk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlNFUEFSQVRPUik7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTdHlsZSgpPT1TV1QuUkFESU8pOwotCW1JdGVtLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkoKSB7Ci0JTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwsIDApOyAvL2NyZWF0ZSBhIG1lbnUgaXRlbSBhdCBpbmRleCAwCi0JYXNzZXJ0Tm90TnVsbChtSXRlbSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldEl0ZW0oMCkuZXF1YWxzKG1JdGVtKSk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwsIDEpOwotCWFzc2VydE5vdE51bGwobUl0ZW0pOwotCWFzc2VydFRydWUobWVudS5nZXRJdGVtKDEpLmVxdWFscyhtSXRlbSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlBcm1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBcm1MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0QXJtZWQoQXJtRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5hZGRBcm1MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkQXJtTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkQXJtTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuQXJtLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlQXJtTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudUl0ZW0ucmVtb3ZlQXJtTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuQXJtLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCUhlbHBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBIZWxwTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhlbHBSZXF1ZXN0ZWQoSGVscEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0uYWRkSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5yZW1vdmVIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnVJdGVtLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRTZWxlY3Rpb25MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWNjZWxlcmF0b3IoKSB7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnWCcpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMSArICdYJyk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDIgKyAnWScpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMiArICdZJyk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDMgKyAnWicpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuTU9EMyArICdaJyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRFbmFibGVkWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVudSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldFBhcmVudCgpLCBtZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0U2VsZWN0aW9uWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCW1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5pc0VuYWJsZWQoKSk7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmlzRW5hYmxlZCgpLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBY2NlbGVyYXRvckkoKSB7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnWicpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRBY2NlbGVyYXRvcigpLCBTV1QuQ1RSTCArICdaJyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldEVuYWJsZWQoKSk7Ci0JbWVudUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnVJdGVtLmdldEVuYWJsZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKG1lbnVJdGVtLmdldEltYWdlKCkpOwotCW1lbnVJdGVtLnNldEltYWdlKGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgbWVudUl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRJbWFnZSgpICE9IGltYWdlc1sxXSk7Ci0JbWVudUl0ZW0uc2V0SW1hZ2UobnVsbCk7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKSB7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRNZW51KCkpOwotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobUl0ZW0uZ2V0TWVudSgpLCBuZXdNZW51KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25aKCkgewotCi0JaW50W10gaXRlbVN0eWxlcyA9IHtTV1QuQ0hFQ0ssIFNXVC5SQURJT307Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1TdHlsZXMubGVuZ3RoOyBpKyspCi0JewotCQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBpdGVtU3R5bGVzW2ldKTsKLQkJbUl0ZW0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1JdGVtLmdldFNlbGVjdGlvbigpLCBmYWxzZSk7Ci0JCW1JdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtSXRlbS5nZXRTZWxlY3Rpb24oKSk7Ci0JCW1JdGVtLmRpc3Bvc2UoKTsKLQl9IAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQltZW51SXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRUZXh0KCkuZXF1YWxzKCJBQkNERUZHIikpOwotCXRyeSB7Ci0JCW1lbnVJdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCW1lbnVJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdBJyk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRUZXh0KCkuc3RhcnRzV2l0aCgiQUJDREVGRyIpKTsKLQltZW51SXRlbS5zZXRBY2NlbGVyYXRvcigwKTsKLQltZW51SXRlbS5zZXRUZXh0KCJBQiZDREVGRyIpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiQUImQ0RFRkciKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBY2NlbGVyYXRvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBY2NlbGVyYXRvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpKSB0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjY2VsZXJhdG9yIikpIHRlc3RfZ2V0QWNjZWxlcmF0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZW51IikpIHRlc3RfZ2V0TWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFjY2VsZXJhdG9ySSIpKSB0ZXN0X3NldEFjY2VsZXJhdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1NZW51IG1lbnU7Ci1NZW51SXRlbSBtZW51SXRlbTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IxZTIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3gKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3gKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKG1lc3NhZ2VCb3gpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi0vKioKLSAqIFBvc3NpYmxlIGV4Y2VwdGlvbnM6Ci0gKiAKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhcmVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQ8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfU1VCQ0xBU1MgLSBpZiB0aGlzIGNsYXNzIGlzIG5vdCBhbiBhbGxvd2VkIHN1YmNsYXNzPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKXsKLQluZXcgTWVzc2FnZUJveChzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IE1lc3NhZ2VCb3gobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1lc3NhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotLyoqCi0gKiBNYWtlcyB0aGUgZGlhbG9nIHZpc2libGUgYW5kIGJyaW5ncyBpdCB0byB0aGUgZnJvbnQKLSAqIG9mIHRoZSBkaXNwbGF5LgotICoKLSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgc2VsZWN0ZWQgdG8gZGlzbWlzcyB0aGUKLSAqICAgICAgICAgbWVzc2FnZSBib3ggKGUuZy4gU1dULk9LLCBTV1QuQ0FOQ0VMLCBldGMuLi4pCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpewotCWlmIChmVGVzdERpYWxvZ09wZW4pCi0JCW1lc3NhZ2VCb3gub3BlbigpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGRpYWxvZydzIG1lc3NhZ2UsIHdoaWNoIGlzIGEgZGVzY3JpcHRpb24gb2YKLSAqIHRoZSBwdXJwb3NlIGZvciB3aGljaCBpdCB3YXMgb3BlbmVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBiZQotICogdmlzaWJsZSBvbiB0aGUgZGlhbG9nIHdoaWxlIGl0IGlzIG9wZW4uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCAiIik7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSh0ZXN0U3RyKTsKLQlhc3NlcnRFcXVhbHMobWVzc2FnZUJveC5nZXRNZXNzYWdlKCksIHRlc3RTdHIpOwotCW1lc3NhZ2VCb3guc2V0TWVzc2FnZSgiIik7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCAiIik7Ci0JdHJ5IHsKLQkJbWVzc2FnZUJveC5zZXRNZXNzYWdlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZXNzYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTWVzc2FnZUJveCBtZXNzYWdlQm94OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODRhYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTW9uaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQltb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlwcmltYXJ5ID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvcigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHByaW1hcnkuZXF1YWxzKG1vbml0b3JzW2ldKSkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1vbml0b3JzLmxlbmd0aCkgZmFpbCgpOwotCWZvciAoaSA9IDA7IGkgIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJTW9uaXRvciB0ZXN0ID0gbW9uaXRvcnNbaV07Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbW9uaXRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCWlmICh0ZXN0LmVxdWFscyhtb25pdG9yc1tqXSkpIHsKLQkJCQlpZiAoaSAhPSBqKSBmYWlsKCJNb25pdG9ycyAiK2krIiBhbmQgIitqKyIgc2hvdWxkIG5vdCBiZSBlcXVhbCIpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRCb3VuZHMoKTsKLQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlib3VuZHMgPSBtb25pdG9yc1tpXS5nZXRCb3VuZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBwcmltYXJ5LmdldENsaWVudEFyZWEoKTsKLQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlib3VuZHMgPSBtb25pdG9yc1tpXS5nZXRDbGllbnRBcmVhKCk7Ci0JCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtb25pdG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAocHJpbWFyeS5lcXVhbHMobW9uaXRvcnNbaV0pKSB7Ci0JCQlhc3NlcnRUcnVlKHByaW1hcnkuaGFzaENvZGUoKSA9PSBtb25pdG9yc1tpXS5oYXNoQ29kZSgpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci1Nb25pdG9yW10gbW9uaXRvcnMgPSBudWxsOwotTW9uaXRvciBwcmltYXJ5ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MGIzZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlByb2dyZXNzQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Qcm9ncmVzc0JhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHByb2dyZXNzQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWF4aW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb2N1cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1heGltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1pbmltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0U2VsZWN0aW9uIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb2N1cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXMiKSkgdGVzdF9zZXRGb2N1cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCkgewotCS8vIFVuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkvLyBzdG9wcGluZy4KLQkKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgcHJvZ3Jlc3NCYXIuZ2V0TWluaW11bSgpKTsKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgcHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpKTsKLQkvL2lmIChwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldFNlbGVjdGlvbigpKTsKLQotCWNoZWNrKG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpLCBtYXhFeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHByb2dyZXNzQmFyLmdldE1pbmltdW0oKSwgbWluRXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDAsIDEwMCwgNTAsIH0sCi17MSwgMSwgMTAwLCA1MCwgfSwKLXsyLCAyLCAxMDAsIDUwLCB9LAotezMsIDMsIDEwMCwgNTAsIH0sCi17NCwgNCwgMTAwLCA1MCwgfSwKLXs1LCA1LCAxMDAsIDUwLCB9LAotezYsIDYsIDEwMCwgNTAsIH0sCi17NywgNywgMTAwLCA1MCwgfSwKLXs4LCA4LCAxMDAsIDUwLCB9LAotezksIDksIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMSwgMTAwLCA1MCwgfSwKLXsxMiwgMTIsIDEwMCwgNTAsIH0sCi17MTMsIDEzLCAxMDAsIDUwLCB9LAotezE0LCAxNCwgMTAwLCA1MCwgfSwKLXsxNSwgMTUsIDEwMCwgNTAsIH0sCi17MTYsIDE2LCAxMDAsIDUwLCB9LAotezE3LCAxNywgMTAwLCA1MCwgfSwKLXsxOCwgMTgsIDEwMCwgNTAsIH0sCi17MTksIDE5LCAxMDAsIDUwLCB9LAotezIwLCAyMCwgMTAwLCA1MCwgfSwKLXsyMSwgMjEsIDEwMCwgNTAsIH0sCi17MjIsIDIyLCAxMDAsIDUwLCB9LAotezIzLCAyMywgMTAwLCA1MCwgfSwKLXsyNCwgMjQsIDEwMCwgNTAsIH0sCi17MjUsIDI1LCAxMDAsIDUwLCB9LAotezI2LCAyNiwgMTAwLCA1MCwgfSwKLXsyNywgMjcsIDEwMCwgNTAsIH0sCi17MjgsIDI4LCAxMDAsIDUwLCB9LAotezI5LCAyOSwgMTAwLCA1MCwgfSwKLXszMCwgMzAsIDEwMCwgNTAsIH0sCi17MzEsIDMxLCAxMDAsIDUwLCB9LAotezMyLCAzMiwgMTAwLCA1MCwgfSwKLXszMywgMzMsIDEwMCwgNTAsIH0sCi17MzQsIDM0LCAxMDAsIDUwLCB9LAotezM1LCAzNSwgMTAwLCA1MCwgfSwKLXszNiwgMzYsIDEwMCwgNTAsIH0sCi17MzcsIDM3LCAxMDAsIDUwLCB9LAotezM4LCAzOCwgMTAwLCA1MCwgfSwKLXszOSwgMzksIDEwMCwgNTAsIH0sCi17NDAsIDQwLCAxMDAsIDUwLCB9LAotezQxLCA0MSwgMTAwLCA1MCwgfSwKLXs0MiwgNDIsIDEwMCwgNTAsIH0sCi17NDMsIDQzLCAxMDAsIDUwLCB9LAotezQ0LCA0NCwgMTAwLCA1MCwgfSwKLXs0NSwgNDUsIDEwMCwgNTAsIH0sCi17NDYsIDQ2LCAxMDAsIDUwLCB9LAotezQ3LCA0NywgMTAwLCA1MCwgfSwKLXs0OCwgNDgsIDEwMCwgNTAsIH0sCi17NDksIDQ5LCAxMDAsIDUwLCB9LAotezUwLCA1MCwgMTAwLCA1MCwgfSwKLXs1MSwgNTEsIDEwMCwgNTEsIH0sCi17NTIsIDUyLCAxMDAsIDUyLCB9LAotezUzLCA1MywgMTAwLCA1MywgfSwKLXs1NCwgNTQsIDEwMCwgNTQsIH0sCi17NTUsIDU1LCAxMDAsIDU1LCB9LAotezU2LCA1NiwgMTAwLCA1NiwgfSwKLXs1NywgNTcsIDEwMCwgNTcsIH0sCi17NTgsIDU4LCAxMDAsIDU4LCB9LAotezU5LCA1OSwgMTAwLCA1OSwgfSwKLXs2MCwgNjAsIDEwMCwgNjAsIH0sCi17NjEsIDYxLCAxMDAsIDYxLCB9LAotezYyLCA2MiwgMTAwLCA2MiwgfSwKLXs2MywgNjMsIDEwMCwgNjMsIH0sCi17NjQsIDY0LCAxMDAsIDY0LCB9LAotezY1LCA2NSwgMTAwLCA2NSwgfSwKLXs2NiwgNjYsIDEwMCwgNjYsIH0sCi17NjcsIDY3LCAxMDAsIDY3LCB9LAotezY4LCA2OCwgMTAwLCA2OCwgfSwKLXs2OSwgNjksIDEwMCwgNjksIH0sCi17NzAsIDcwLCAxMDAsIDcwLCB9LAotezcxLCA3MSwgMTAwLCA3MSwgfSwKLXs3MiwgNzIsIDEwMCwgNzIsIH0sCi17NzMsIDczLCAxMDAsIDczLCB9LAotezc0LCA3NCwgMTAwLCA3NCwgfSwKLXs3NSwgNzUsIDEwMCwgNzUsIH0sCi17NzYsIDc2LCAxMDAsIDc2LCB9LAotezc3LCA3NywgMTAwLCA3NywgfSwKLXs3OCwgNzgsIDEwMCwgNzgsIH0sCi17NzksIDc5LCAxMDAsIDc5LCB9LAotezgwLCA4MCwgMTAwLCA4MCwgfSwKLXs4MSwgODEsIDEwMCwgODEsIH0sCi17ODIsIDgyLCAxMDAsIDgyLCB9LAotezgzLCA4MywgMTAwLCA4MywgfSwKLXs4NCwgODQsIDEwMCwgODQsIH0sCi17ODUsIDg1LCAxMDAsIDg1LCB9LAotezg2LCA4NiwgMTAwLCA4NiwgfSwKLXs4NywgODcsIDEwMCwgODcsIH0sCi17ODgsIDg4LCAxMDAsIDg4LCB9LAotezg5LCA4OSwgMTAwLCA4OSwgfSwKLXs5MCwgOTAsIDEwMCwgOTAsIH0sCi17OTEsIDkxLCAxMDAsIDkxLCB9LAotezkyLCA5MiwgMTAwLCA5MiwgfSwKLXs5MywgOTMsIDEwMCwgOTMsIH0sCi17OTQsIDk0LCAxMDAsIDk0LCB9LAotezk1LCA5NSwgMTAwLCA5NSwgfSwKLXs5NiwgOTYsIDEwMCwgOTYsIH0sCi17OTcsIDk3LCAxMDAsIDk3LCB9LAotezk4LCA5OCwgMTAwLCA5OCwgfSwKLXs5OSwgOTksIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCB9LAotezEwMiwgMTAsIDEwMCwgNTAsIH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCB9LAotezEwNSwgMTAsIDEwMCwgNTAsIH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCB9LAotezEwOCwgMTAsIDEwMCwgNTAsIH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCB9LAotezExMSwgMTAsIDEwMCwgNTAsIH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCB9LAotezExNCwgMTAsIDEwMCwgNTAsIH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCB9LAotezExNywgMTAsIDEwMCwgNTAsIH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTksIDEwLCAxMDAsIDUwLCB9LAotezEyMCwgMTAsIDEwMCwgNTAsIH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCB9LAotezEyMywgMTAsIDEwMCwgNTAsIH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMTAsIDEwMCwgNTAsIH0sCi17MSwgMTAsIDEwMCwgNTAsIH0sCi17MiwgMTAsIDEwMCwgNTAsIH0sCi17MywgMTAsIDEwMCwgNTAsIH0sCi17NCwgMTAsIDEwMCwgNTAsIH0sCi17NSwgMTAsIDEwMCwgNTAsIH0sCi17NiwgMTAsIDEwMCwgNTAsIH0sCi17NywgMTAsIDEwMCwgNTAsIH0sCi17OCwgMTAsIDEwMCwgNTAsIH0sCi17OSwgMTAsIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMCwgMTEsIDExLCB9LAotezEyLCAxMCwgMTIsIDEyLCB9LAotezEzLCAxMCwgMTMsIDEzLCB9LAotezE0LCAxMCwgMTQsIDE0LCB9LAotezE1LCAxMCwgMTUsIDE1LCB9LAotezE2LCAxMCwgMTYsIDE2LCB9LAotezE3LCAxMCwgMTcsIDE3LCB9LAotezE4LCAxMCwgMTgsIDE4LCB9LAotezE5LCAxMCwgMTksIDE5LCB9LAotezIwLCAxMCwgMjAsIDIwLCB9LAotezIxLCAxMCwgMjEsIDIxLCB9LAotezIyLCAxMCwgMjIsIDIyLCB9LAotezIzLCAxMCwgMjMsIDIzLCB9LAotezI0LCAxMCwgMjQsIDI0LCB9LAotezI1LCAxMCwgMjUsIDI1LCB9LAotezI2LCAxMCwgMjYsIDI2LCB9LAotezI3LCAxMCwgMjcsIDI3LCB9LAotezI4LCAxMCwgMjgsIDI4LCB9LAotezI5LCAxMCwgMjksIDI5LCB9LAotezMwLCAxMCwgMzAsIDMwLCB9LAotezMxLCAxMCwgMzEsIDMxLCB9LAotezMyLCAxMCwgMzIsIDMyLCB9LAotezMzLCAxMCwgMzMsIDMzLCB9LAotezM0LCAxMCwgMzQsIDM0LCB9LAotezM1LCAxMCwgMzUsIDM1LCB9LAotezM2LCAxMCwgMzYsIDM2LCB9LAotezM3LCAxMCwgMzcsIDM3LCB9LAotezM4LCAxMCwgMzgsIDM4LCB9LAotezM5LCAxMCwgMzksIDM5LCB9LAotezQwLCAxMCwgNDAsIDQwLCB9LAotezQxLCAxMCwgNDEsIDQxLCB9LAotezQyLCAxMCwgNDIsIDQyLCB9LAotezQzLCAxMCwgNDMsIDQzLCB9LAotezQ0LCAxMCwgNDQsIDQ0LCB9LAotezQ1LCAxMCwgNDUsIDQ1LCB9LAotezQ2LCAxMCwgNDYsIDQ2LCB9LAotezQ3LCAxMCwgNDcsIDQ3LCB9LAotezQ4LCAxMCwgNDgsIDQ4LCB9LAotezQ5LCAxMCwgNDksIDQ5LCB9LAotezUwLCAxMCwgNTAsIDUwLCB9LAotezUxLCAxMCwgNTEsIDUwLCB9LAotezUyLCAxMCwgNTIsIDUwLCB9LAotezUzLCAxMCwgNTMsIDUwLCB9LAotezU0LCAxMCwgNTQsIDUwLCB9LAotezU1LCAxMCwgNTUsIDUwLCB9LAotezU2LCAxMCwgNTYsIDUwLCB9LAotezU3LCAxMCwgNTcsIDUwLCB9LAotezU4LCAxMCwgNTgsIDUwLCB9LAotezU5LCAxMCwgNTksIDUwLCB9LAotezYwLCAxMCwgNjAsIDUwLCB9LAotezYxLCAxMCwgNjEsIDUwLCB9LAotezYyLCAxMCwgNjIsIDUwLCB9LAotezYzLCAxMCwgNjMsIDUwLCB9LAotezY0LCAxMCwgNjQsIDUwLCB9LAotezY1LCAxMCwgNjUsIDUwLCB9LAotezY2LCAxMCwgNjYsIDUwLCB9LAotezY3LCAxMCwgNjcsIDUwLCB9LAotezY4LCAxMCwgNjgsIDUwLCB9LAotezY5LCAxMCwgNjksIDUwLCB9LAotezcwLCAxMCwgNzAsIDUwLCB9LAotezcxLCAxMCwgNzEsIDUwLCB9LAotezcyLCAxMCwgNzIsIDUwLCB9LAotezczLCAxMCwgNzMsIDUwLCB9LAotezc0LCAxMCwgNzQsIDUwLCB9LAotezc1LCAxMCwgNzUsIDUwLCB9LAotezc2LCAxMCwgNzYsIDUwLCB9LAotezc3LCAxMCwgNzcsIDUwLCB9LAotezc4LCAxMCwgNzgsIDUwLCB9LAotezc5LCAxMCwgNzksIDUwLCB9LAotezgwLCAxMCwgODAsIDUwLCB9LAotezgxLCAxMCwgODEsIDUwLCB9LAotezgyLCAxMCwgODIsIDUwLCB9LAotezgzLCAxMCwgODMsIDUwLCB9LAotezg0LCAxMCwgODQsIDUwLCB9LAotezg1LCAxMCwgODUsIDUwLCB9LAotezg2LCAxMCwgODYsIDUwLCB9LAotezg3LCAxMCwgODcsIDUwLCB9LAotezg4LCAxMCwgODgsIDUwLCB9LAotezg5LCAxMCwgODksIDUwLCB9LAotezkwLCAxMCwgOTAsIDUwLCB9LAotezkxLCAxMCwgOTEsIDUwLCB9LAotezkyLCAxMCwgOTIsIDUwLCB9LAotezkzLCAxMCwgOTMsIDUwLCB9LAotezk0LCAxMCwgOTQsIDUwLCB9LAotezk1LCAxMCwgOTUsIDUwLCB9LAotezk2LCAxMCwgOTYsIDUwLCB9LAotezk3LCAxMCwgOTcsIDUwLCB9LAotezk4LCAxMCwgOTgsIDUwLCB9LAotezk5LCAxMCwgOTksIDUwLCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCB9LAotezEwMywgMTAsIDEwMywgNTAsIH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCB9LAotezEwNiwgMTAsIDEwNiwgNTAsIH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCB9LAotezEwOSwgMTAsIDEwOSwgNTAsIH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCB9LAotezExMiwgMTAsIDExMiwgNTAsIH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCB9LAotezExNSwgMTAsIDExNSwgNTAsIH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCB9LAotezExOCwgMTAsIDExOCwgNTAsIH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCB9LAotezEyMSwgMTAsIDEyMSwgNTAsIH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCB9LAotezEyNCwgMTAsIDEyNCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXByb2dyZXNzQmFyLnNldE1heGltdW0oMTAwKTsKLQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDEwKTsKLQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgfSwKLXstMTQsIDEwLCAxMDAsIDEwLCB9LAotey0xMywgMTAsIDEwMCwgMTAsIH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgfSwKLXstMTEsIDEwLCAxMDAsIDEwLCB9LAotey0xMCwgMTAsIDEwMCwgMTAsIH0sCi17LTksIDEwLCAxMDAsIDEwLCB9LAotey04LCAxMCwgMTAwLCAxMCwgfSwKLXstNywgMTAsIDEwMCwgMTAsIH0sCi17LTYsIDEwLCAxMDAsIDEwLCB9LAotey01LCAxMCwgMTAwLCAxMCwgfSwKLXstNCwgMTAsIDEwMCwgMTAsIH0sCi17LTMsIDEwLCAxMDAsIDEwLCB9LAotey0yLCAxMCwgMTAwLCAxMCwgfSwKLXstMSwgMTAsIDEwMCwgMTAsIH0sCi17MCwgMTAsIDEwMCwgMTAsIH0sCi17MSwgMTAsIDEwMCwgMTAsIH0sCi17MiwgMTAsIDEwMCwgMTAsIH0sCi17MywgMTAsIDEwMCwgMTAsIH0sCi17NCwgMTAsIDEwMCwgMTAsIH0sCi17NSwgMTAsIDEwMCwgMTAsIH0sCi17NiwgMTAsIDEwMCwgMTAsIH0sCi17NywgMTAsIDEwMCwgMTAsIH0sCi17OCwgMTAsIDEwMCwgMTAsIH0sCi17OSwgMTAsIDEwMCwgMTAsIH0sCi17MTAsIDEwLCAxMDAsIDEwLCB9LAotezExLCAxMCwgMTAwLCAxMSwgfSwKLXsxMiwgMTAsIDEwMCwgMTIsIH0sCi17MTMsIDEwLCAxMDAsIDEzLCB9LAotezE0LCAxMCwgMTAwLCAxNCwgfSwKLXsxNSwgMTAsIDEwMCwgMTUsIH0sCi17MTYsIDEwLCAxMDAsIDE2LCB9LAotezE3LCAxMCwgMTAwLCAxNywgfSwKLXsxOCwgMTAsIDEwMCwgMTgsIH0sCi17MTksIDEwLCAxMDAsIDE5LCB9LAotezIwLCAxMCwgMTAwLCAyMCwgfSwKLXsyMSwgMTAsIDEwMCwgMjEsIH0sCi17MjIsIDEwLCAxMDAsIDIyLCB9LAotezIzLCAxMCwgMTAwLCAyMywgfSwKLXsyNCwgMTAsIDEwMCwgMjQsIH0sCi17MjUsIDEwLCAxMDAsIDI1LCB9LAotezI2LCAxMCwgMTAwLCAyNiwgfSwKLXsyNywgMTAsIDEwMCwgMjcsIH0sCi17MjgsIDEwLCAxMDAsIDI4LCB9LAotezI5LCAxMCwgMTAwLCAyOSwgfSwKLXszMCwgMTAsIDEwMCwgMzAsIH0sCi17MzEsIDEwLCAxMDAsIDMxLCB9LAotezMyLCAxMCwgMTAwLCAzMiwgfSwKLXszMywgMTAsIDEwMCwgMzMsIH0sCi17MzQsIDEwLCAxMDAsIDM0LCB9LAotezM1LCAxMCwgMTAwLCAzNSwgfSwKLXszNiwgMTAsIDEwMCwgMzYsIH0sCi17MzcsIDEwLCAxMDAsIDM3LCB9LAotezM4LCAxMCwgMTAwLCAzOCwgfSwKLXszOSwgMTAsIDEwMCwgMzksIH0sCi17NDAsIDEwLCAxMDAsIDQwLCB9LAotezQxLCAxMCwgMTAwLCA0MSwgfSwKLXs0MiwgMTAsIDEwMCwgNDIsIH0sCi17NDMsIDEwLCAxMDAsIDQzLCB9LAotezQ0LCAxMCwgMTAwLCA0NCwgfSwKLXs0NSwgMTAsIDEwMCwgNDUsIH0sCi17NDYsIDEwLCAxMDAsIDQ2LCB9LAotezQ3LCAxMCwgMTAwLCA0NywgfSwKLXs0OCwgMTAsIDEwMCwgNDgsIH0sCi17NDksIDEwLCAxMDAsIDQ5LCB9LAotezUwLCAxMCwgMTAwLCA1MCwgfSwKLXs1MSwgMTAsIDEwMCwgNTEsIH0sCi17NTIsIDEwLCAxMDAsIDUyLCB9LAotezUzLCAxMCwgMTAwLCA1MywgfSwKLXs1NCwgMTAsIDEwMCwgNTQsIH0sCi17NTUsIDEwLCAxMDAsIDU1LCB9LAotezU2LCAxMCwgMTAwLCA1NiwgfSwKLXs1NywgMTAsIDEwMCwgNTcsIH0sCi17NTgsIDEwLCAxMDAsIDU4LCB9LAotezU5LCAxMCwgMTAwLCA1OSwgfSwKLXs2MCwgMTAsIDEwMCwgNjAsIH0sCi17NjEsIDEwLCAxMDAsIDYxLCB9LAotezYyLCAxMCwgMTAwLCA2MiwgfSwKLXs2MywgMTAsIDEwMCwgNjMsIH0sCi17NjQsIDEwLCAxMDAsIDY0LCB9LAotezY1LCAxMCwgMTAwLCA2NSwgfSwKLXs2NiwgMTAsIDEwMCwgNjYsIH0sCi17NjcsIDEwLCAxMDAsIDY3LCB9LAotezY4LCAxMCwgMTAwLCA2OCwgfSwKLXs2OSwgMTAsIDEwMCwgNjksIH0sCi17NzAsIDEwLCAxMDAsIDcwLCB9LAotezcxLCAxMCwgMTAwLCA3MSwgfSwKLXs3MiwgMTAsIDEwMCwgNzIsIH0sCi17NzMsIDEwLCAxMDAsIDczLCB9LAotezc0LCAxMCwgMTAwLCA3NCwgfSwKLXs3NSwgMTAsIDEwMCwgNzUsIH0sCi17NzYsIDEwLCAxMDAsIDc2LCB9LAotezc3LCAxMCwgMTAwLCA3NywgfSwKLXs3OCwgMTAsIDEwMCwgNzgsIH0sCi17NzksIDEwLCAxMDAsIDc5LCB9LAotezgwLCAxMCwgMTAwLCA4MCwgfSwKLXs4MSwgMTAsIDEwMCwgODEsIH0sCi17ODIsIDEwLCAxMDAsIDgyLCB9LAotezgzLCAxMCwgMTAwLCA4MywgfSwKLXs4NCwgMTAsIDEwMCwgODQsIH0sCi17ODUsIDEwLCAxMDAsIDg1LCB9LAotezg2LCAxMCwgMTAwLCA4NiwgfSwKLXs4NywgMTAsIDEwMCwgODcsIH0sCi17ODgsIDEwLCAxMDAsIDg4LCB9LAotezg5LCAxMCwgMTAwLCA4OSwgfSwKLXs5MCwgMTAsIDEwMCwgOTAsIH0sCi17OTEsIDEwLCAxMDAsIDkxLCB9LAotezkyLCAxMCwgMTAwLCA5MiwgfSwKLXs5MywgMTAsIDEwMCwgOTMsIH0sCi17OTQsIDEwLCAxMDAsIDk0LCB9LAotezk1LCAxMCwgMTAwLCA5NSwgfSwKLXs5NiwgMTAsIDEwMCwgOTYsIH0sCi17OTcsIDEwLCAxMDAsIDk3LCB9LAotezk4LCAxMCwgMTAwLCA5OCwgfSwKLXs5OSwgMTAsIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTA0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTEwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTExLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTE0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTIwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTI0LCAxMCwgMTAwLCAxMDAsIH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjBkODY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2gKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNhc2gKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2goU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNhc2ggPSBuZXcgU2FzaChzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHNhc2gpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2FzaCA9IG5ldyBTYXNoKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXNhc2ggPSBuZXcgU2FzaChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UKLQkvLyB0byBzZXQgdGhlIGZvbnQgb2YgYSBTYXNoLgotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2goKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVNhc2ggc2FzaDsKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNhc2goKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLSAgICBTYXNoIHNhc2ggPSBuZXcgU2FzaChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLSAgICBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgc2V0V2lkZ2V0KHNhc2gpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY3JlYXRlU2FzaCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgY3JlYXRlU2FzaCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0MTI0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY2FsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2NhbGUgPSBuZXcgU2NhbGUoc2hlbGwsIDApOwotCXNldFdpZGdldChzY2FsZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzY2FsZSA9IG5ldyBTY2FsZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIG9jY3VycmVkIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TWF4aW11bSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYWdlSW5jcmVtZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5jcmVtZW50SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW5jcmVtZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1heGltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0TWluaW11bSIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2NhbGUuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRTZWxlY3Rpb24iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2NhbGUuCi19Ci0KLVNjYWxlIHNjYWxlOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JIC8vVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCSAvL3N0b3BwaW5nLgotCQotCS8vaWYgKHRyYWNrQmFyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNaW5pbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyB0cmFja0Jhci5nZXRNYXhpbXVtKCkpOwotCS8vaWYgKHRyYWNrQmFyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCWNoZWNrKG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoc2NhbGUuZ2V0TWF4aW11bSgpLCBtYXhFeHBlY3RlZCk7Ci0JYXNzZXJ0RXF1YWxzKHNjYWxlLmdldE1pbmltdW0oKSwgbWluRXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhzY2FsZS5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDAsIDEwMCwgNTAsIH0sCi17MSwgMSwgMTAwLCA1MCwgfSwKLXsyLCAyLCAxMDAsIDUwLCB9LAotezMsIDMsIDEwMCwgNTAsIH0sCi17NCwgNCwgMTAwLCA1MCwgfSwKLXs1LCA1LCAxMDAsIDUwLCB9LAotezYsIDYsIDEwMCwgNTAsIH0sCi17NywgNywgMTAwLCA1MCwgfSwKLXs4LCA4LCAxMDAsIDUwLCB9LAotezksIDksIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMSwgMTAwLCA1MCwgfSwKLXsxMiwgMTIsIDEwMCwgNTAsIH0sCi17MTMsIDEzLCAxMDAsIDUwLCB9LAotezE0LCAxNCwgMTAwLCA1MCwgfSwKLXsxNSwgMTUsIDEwMCwgNTAsIH0sCi17MTYsIDE2LCAxMDAsIDUwLCB9LAotezE3LCAxNywgMTAwLCA1MCwgfSwKLXsxOCwgMTgsIDEwMCwgNTAsIH0sCi17MTksIDE5LCAxMDAsIDUwLCB9LAotezIwLCAyMCwgMTAwLCA1MCwgfSwKLXsyMSwgMjEsIDEwMCwgNTAsIH0sCi17MjIsIDIyLCAxMDAsIDUwLCB9LAotezIzLCAyMywgMTAwLCA1MCwgfSwKLXsyNCwgMjQsIDEwMCwgNTAsIH0sCi17MjUsIDI1LCAxMDAsIDUwLCB9LAotezI2LCAyNiwgMTAwLCA1MCwgfSwKLXsyNywgMjcsIDEwMCwgNTAsIH0sCi17MjgsIDI4LCAxMDAsIDUwLCB9LAotezI5LCAyOSwgMTAwLCA1MCwgfSwKLXszMCwgMzAsIDEwMCwgNTAsIH0sCi17MzEsIDMxLCAxMDAsIDUwLCB9LAotezMyLCAzMiwgMTAwLCA1MCwgfSwKLXszMywgMzMsIDEwMCwgNTAsIH0sCi17MzQsIDM0LCAxMDAsIDUwLCB9LAotezM1LCAzNSwgMTAwLCA1MCwgfSwKLXszNiwgMzYsIDEwMCwgNTAsIH0sCi17MzcsIDM3LCAxMDAsIDUwLCB9LAotezM4LCAzOCwgMTAwLCA1MCwgfSwKLXszOSwgMzksIDEwMCwgNTAsIH0sCi17NDAsIDQwLCAxMDAsIDUwLCB9LAotezQxLCA0MSwgMTAwLCA1MCwgfSwKLXs0MiwgNDIsIDEwMCwgNTAsIH0sCi17NDMsIDQzLCAxMDAsIDUwLCB9LAotezQ0LCA0NCwgMTAwLCA1MCwgfSwKLXs0NSwgNDUsIDEwMCwgNTAsIH0sCi17NDYsIDQ2LCAxMDAsIDUwLCB9LAotezQ3LCA0NywgMTAwLCA1MCwgfSwKLXs0OCwgNDgsIDEwMCwgNTAsIH0sCi17NDksIDQ5LCAxMDAsIDUwLCB9LAotezUwLCA1MCwgMTAwLCA1MCwgfSwKLXs1MSwgNTEsIDEwMCwgNTEsIH0sCi17NTIsIDUyLCAxMDAsIDUyLCB9LAotezUzLCA1MywgMTAwLCA1MywgfSwKLXs1NCwgNTQsIDEwMCwgNTQsIH0sCi17NTUsIDU1LCAxMDAsIDU1LCB9LAotezU2LCA1NiwgMTAwLCA1NiwgfSwKLXs1NywgNTcsIDEwMCwgNTcsIH0sCi17NTgsIDU4LCAxMDAsIDU4LCB9LAotezU5LCA1OSwgMTAwLCA1OSwgfSwKLXs2MCwgNjAsIDEwMCwgNjAsIH0sCi17NjEsIDYxLCAxMDAsIDYxLCB9LAotezYyLCA2MiwgMTAwLCA2MiwgfSwKLXs2MywgNjMsIDEwMCwgNjMsIH0sCi17NjQsIDY0LCAxMDAsIDY0LCB9LAotezY1LCA2NSwgMTAwLCA2NSwgfSwKLXs2NiwgNjYsIDEwMCwgNjYsIH0sCi17NjcsIDY3LCAxMDAsIDY3LCB9LAotezY4LCA2OCwgMTAwLCA2OCwgfSwKLXs2OSwgNjksIDEwMCwgNjksIH0sCi17NzAsIDcwLCAxMDAsIDcwLCB9LAotezcxLCA3MSwgMTAwLCA3MSwgfSwKLXs3MiwgNzIsIDEwMCwgNzIsIH0sCi17NzMsIDczLCAxMDAsIDczLCB9LAotezc0LCA3NCwgMTAwLCA3NCwgfSwKLXs3NSwgNzUsIDEwMCwgNzUsIH0sCi17NzYsIDc2LCAxMDAsIDc2LCB9LAotezc3LCA3NywgMTAwLCA3NywgfSwKLXs3OCwgNzgsIDEwMCwgNzgsIH0sCi17NzksIDc5LCAxMDAsIDc5LCB9LAotezgwLCA4MCwgMTAwLCA4MCwgfSwKLXs4MSwgODEsIDEwMCwgODEsIH0sCi17ODIsIDgyLCAxMDAsIDgyLCB9LAotezgzLCA4MywgMTAwLCA4MywgfSwKLXs4NCwgODQsIDEwMCwgODQsIH0sCi17ODUsIDg1LCAxMDAsIDg1LCB9LAotezg2LCA4NiwgMTAwLCA4NiwgfSwKLXs4NywgODcsIDEwMCwgODcsIH0sCi17ODgsIDg4LCAxMDAsIDg4LCB9LAotezg5LCA4OSwgMTAwLCA4OSwgfSwKLXs5MCwgOTAsIDEwMCwgOTAsIH0sCi17OTEsIDkxLCAxMDAsIDkxLCB9LAotezkyLCA5MiwgMTAwLCA5MiwgfSwKLXs5MywgOTMsIDEwMCwgOTMsIH0sCi17OTQsIDk0LCAxMDAsIDk0LCB9LAotezk1LCA5NSwgMTAwLCA5NSwgfSwKLXs5NiwgOTYsIDEwMCwgOTYsIH0sCi17OTcsIDk3LCAxMDAsIDk3LCB9LAotezk4LCA5OCwgMTAwLCA5OCwgfSwKLXs5OSwgOTksIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDEsIDEwLCAxMDAsIDUwLCB9LAotezEwMiwgMTAsIDEwMCwgNTAsIH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDQsIDEwLCAxMDAsIDUwLCB9LAotezEwNSwgMTAsIDEwMCwgNTAsIH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDcsIDEwLCAxMDAsIDUwLCB9LAotezEwOCwgMTAsIDEwMCwgNTAsIH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTAsIDEwLCAxMDAsIDUwLCB9LAotezExMSwgMTAsIDEwMCwgNTAsIH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTMsIDEwLCAxMDAsIDUwLCB9LAotezExNCwgMTAsIDEwMCwgNTAsIH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTYsIDEwLCAxMDAsIDUwLCB9LAotezExNywgMTAsIDEwMCwgNTAsIH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTksIDEwLCAxMDAsIDUwLCB9LAotezEyMCwgMTAsIDEwMCwgNTAsIH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjIsIDEwLCAxMDAsIDUwLCB9LAotezEyMywgMTAsIDEwMCwgNTAsIH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWF4aW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgfSwKLXstMTQsIDEwLCAxMDAsIDUwLCB9LAotey0xMywgMTAsIDEwMCwgNTAsIH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgfSwKLXstMTEsIDEwLCAxMDAsIDUwLCB9LAotey0xMCwgMTAsIDEwMCwgNTAsIH0sCi17LTksIDEwLCAxMDAsIDUwLCB9LAotey04LCAxMCwgMTAwLCA1MCwgfSwKLXstNywgMTAsIDEwMCwgNTAsIH0sCi17LTYsIDEwLCAxMDAsIDUwLCB9LAotey01LCAxMCwgMTAwLCA1MCwgfSwKLXstNCwgMTAsIDEwMCwgNTAsIH0sCi17LTMsIDEwLCAxMDAsIDUwLCB9LAotey0yLCAxMCwgMTAwLCA1MCwgfSwKLXstMSwgMTAsIDEwMCwgNTAsIH0sCi17MCwgMTAsIDEwMCwgNTAsIH0sCi17MSwgMTAsIDEwMCwgNTAsIH0sCi17MiwgMTAsIDEwMCwgNTAsIH0sCi17MywgMTAsIDEwMCwgNTAsIH0sCi17NCwgMTAsIDEwMCwgNTAsIH0sCi17NSwgMTAsIDEwMCwgNTAsIH0sCi17NiwgMTAsIDEwMCwgNTAsIH0sCi17NywgMTAsIDEwMCwgNTAsIH0sCi17OCwgMTAsIDEwMCwgNTAsIH0sCi17OSwgMTAsIDEwMCwgNTAsIH0sCi17MTAsIDEwLCAxMDAsIDUwLCB9LAotezExLCAxMCwgMTEsIDExLCB9LAotezEyLCAxMCwgMTIsIDEyLCB9LAotezEzLCAxMCwgMTMsIDEzLCB9LAotezE0LCAxMCwgMTQsIDE0LCB9LAotezE1LCAxMCwgMTUsIDE1LCB9LAotezE2LCAxMCwgMTYsIDE2LCB9LAotezE3LCAxMCwgMTcsIDE3LCB9LAotezE4LCAxMCwgMTgsIDE4LCB9LAotezE5LCAxMCwgMTksIDE5LCB9LAotezIwLCAxMCwgMjAsIDIwLCB9LAotezIxLCAxMCwgMjEsIDIxLCB9LAotezIyLCAxMCwgMjIsIDIyLCB9LAotezIzLCAxMCwgMjMsIDIzLCB9LAotezI0LCAxMCwgMjQsIDI0LCB9LAotezI1LCAxMCwgMjUsIDI1LCB9LAotezI2LCAxMCwgMjYsIDI2LCB9LAotezI3LCAxMCwgMjcsIDI3LCB9LAotezI4LCAxMCwgMjgsIDI4LCB9LAotezI5LCAxMCwgMjksIDI5LCB9LAotezMwLCAxMCwgMzAsIDMwLCB9LAotezMxLCAxMCwgMzEsIDMxLCB9LAotezMyLCAxMCwgMzIsIDMyLCB9LAotezMzLCAxMCwgMzMsIDMzLCB9LAotezM0LCAxMCwgMzQsIDM0LCB9LAotezM1LCAxMCwgMzUsIDM1LCB9LAotezM2LCAxMCwgMzYsIDM2LCB9LAotezM3LCAxMCwgMzcsIDM3LCB9LAotezM4LCAxMCwgMzgsIDM4LCB9LAotezM5LCAxMCwgMzksIDM5LCB9LAotezQwLCAxMCwgNDAsIDQwLCB9LAotezQxLCAxMCwgNDEsIDQxLCB9LAotezQyLCAxMCwgNDIsIDQyLCB9LAotezQzLCAxMCwgNDMsIDQzLCB9LAotezQ0LCAxMCwgNDQsIDQ0LCB9LAotezQ1LCAxMCwgNDUsIDQ1LCB9LAotezQ2LCAxMCwgNDYsIDQ2LCB9LAotezQ3LCAxMCwgNDcsIDQ3LCB9LAotezQ4LCAxMCwgNDgsIDQ4LCB9LAotezQ5LCAxMCwgNDksIDQ5LCB9LAotezUwLCAxMCwgNTAsIDUwLCB9LAotezUxLCAxMCwgNTEsIDUwLCB9LAotezUyLCAxMCwgNTIsIDUwLCB9LAotezUzLCAxMCwgNTMsIDUwLCB9LAotezU0LCAxMCwgNTQsIDUwLCB9LAotezU1LCAxMCwgNTUsIDUwLCB9LAotezU2LCAxMCwgNTYsIDUwLCB9LAotezU3LCAxMCwgNTcsIDUwLCB9LAotezU4LCAxMCwgNTgsIDUwLCB9LAotezU5LCAxMCwgNTksIDUwLCB9LAotezYwLCAxMCwgNjAsIDUwLCB9LAotezYxLCAxMCwgNjEsIDUwLCB9LAotezYyLCAxMCwgNjIsIDUwLCB9LAotezYzLCAxMCwgNjMsIDUwLCB9LAotezY0LCAxMCwgNjQsIDUwLCB9LAotezY1LCAxMCwgNjUsIDUwLCB9LAotezY2LCAxMCwgNjYsIDUwLCB9LAotezY3LCAxMCwgNjcsIDUwLCB9LAotezY4LCAxMCwgNjgsIDUwLCB9LAotezY5LCAxMCwgNjksIDUwLCB9LAotezcwLCAxMCwgNzAsIDUwLCB9LAotezcxLCAxMCwgNzEsIDUwLCB9LAotezcyLCAxMCwgNzIsIDUwLCB9LAotezczLCAxMCwgNzMsIDUwLCB9LAotezc0LCAxMCwgNzQsIDUwLCB9LAotezc1LCAxMCwgNzUsIDUwLCB9LAotezc2LCAxMCwgNzYsIDUwLCB9LAotezc3LCAxMCwgNzcsIDUwLCB9LAotezc4LCAxMCwgNzgsIDUwLCB9LAotezc5LCAxMCwgNzksIDUwLCB9LAotezgwLCAxMCwgODAsIDUwLCB9LAotezgxLCAxMCwgODEsIDUwLCB9LAotezgyLCAxMCwgODIsIDUwLCB9LAotezgzLCAxMCwgODMsIDUwLCB9LAotezg0LCAxMCwgODQsIDUwLCB9LAotezg1LCAxMCwgODUsIDUwLCB9LAotezg2LCAxMCwgODYsIDUwLCB9LAotezg3LCAxMCwgODcsIDUwLCB9LAotezg4LCAxMCwgODgsIDUwLCB9LAotezg5LCAxMCwgODksIDUwLCB9LAotezkwLCAxMCwgOTAsIDUwLCB9LAotezkxLCAxMCwgOTEsIDUwLCB9LAotezkyLCAxMCwgOTIsIDUwLCB9LAotezkzLCAxMCwgOTMsIDUwLCB9LAotezk0LCAxMCwgOTQsIDUwLCB9LAotezk1LCAxMCwgOTUsIDUwLCB9LAotezk2LCAxMCwgOTYsIDUwLCB9LAotezk3LCAxMCwgOTcsIDUwLCB9LAotezk4LCAxMCwgOTgsIDUwLCB9LAotezk5LCAxMCwgOTksIDUwLCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDIsIDUwLCB9LAotezEwMywgMTAsIDEwMywgNTAsIH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgfSwKLXsxMDUsIDEwLCAxMDUsIDUwLCB9LAotezEwNiwgMTAsIDEwNiwgNTAsIH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgfSwKLXsxMDgsIDEwLCAxMDgsIDUwLCB9LAotezEwOSwgMTAsIDEwOSwgNTAsIH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMTEsIDUwLCB9LAotezExMiwgMTAsIDExMiwgNTAsIH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgfSwKLXsxMTQsIDEwLCAxMTQsIDUwLCB9LAotezExNSwgMTAsIDExNSwgNTAsIH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgfSwKLXsxMTcsIDEwLCAxMTcsIDUwLCB9LAotezExOCwgMTAsIDExOCwgNTAsIH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgfSwKLXsxMjAsIDEwLCAxMjAsIDUwLCB9LAotezEyMSwgMTAsIDEyMSwgNTAsIH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgfSwKLXsxMjMsIDEwLCAxMjMsIDUwLCB9LAotezEyNCwgMTAsIDEyNCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXNjYWxlLnNldE1heGltdW0oMTAwKTsKLQlzY2FsZS5zZXRNaW5pbXVtKDEwKTsKLQlzY2FsZS5zZXRTZWxlY3Rpb24oNTApOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgfSwKLXstMTQsIDEwLCAxMDAsIDEwLCB9LAotey0xMywgMTAsIDEwMCwgMTAsIH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgfSwKLXstMTEsIDEwLCAxMDAsIDEwLCB9LAotey0xMCwgMTAsIDEwMCwgMTAsIH0sCi17LTksIDEwLCAxMDAsIDEwLCB9LAotey04LCAxMCwgMTAwLCAxMCwgfSwKLXstNywgMTAsIDEwMCwgMTAsIH0sCi17LTYsIDEwLCAxMDAsIDEwLCB9LAotey01LCAxMCwgMTAwLCAxMCwgfSwKLXstNCwgMTAsIDEwMCwgMTAsIH0sCi17LTMsIDEwLCAxMDAsIDEwLCB9LAotey0yLCAxMCwgMTAwLCAxMCwgfSwKLXstMSwgMTAsIDEwMCwgMTAsIH0sCi17MCwgMTAsIDEwMCwgMTAsIH0sCi17MSwgMTAsIDEwMCwgMTAsIH0sCi17MiwgMTAsIDEwMCwgMTAsIH0sCi17MywgMTAsIDEwMCwgMTAsIH0sCi17NCwgMTAsIDEwMCwgMTAsIH0sCi17NSwgMTAsIDEwMCwgMTAsIH0sCi17NiwgMTAsIDEwMCwgMTAsIH0sCi17NywgMTAsIDEwMCwgMTAsIH0sCi17OCwgMTAsIDEwMCwgMTAsIH0sCi17OSwgMTAsIDEwMCwgMTAsIH0sCi17MTAsIDEwLCAxMDAsIDEwLCB9LAotezExLCAxMCwgMTAwLCAxMSwgfSwKLXsxMiwgMTAsIDEwMCwgMTIsIH0sCi17MTMsIDEwLCAxMDAsIDEzLCB9LAotezE0LCAxMCwgMTAwLCAxNCwgfSwKLXsxNSwgMTAsIDEwMCwgMTUsIH0sCi17MTYsIDEwLCAxMDAsIDE2LCB9LAotezE3LCAxMCwgMTAwLCAxNywgfSwKLXsxOCwgMTAsIDEwMCwgMTgsIH0sCi17MTksIDEwLCAxMDAsIDE5LCB9LAotezIwLCAxMCwgMTAwLCAyMCwgfSwKLXsyMSwgMTAsIDEwMCwgMjEsIH0sCi17MjIsIDEwLCAxMDAsIDIyLCB9LAotezIzLCAxMCwgMTAwLCAyMywgfSwKLXsyNCwgMTAsIDEwMCwgMjQsIH0sCi17MjUsIDEwLCAxMDAsIDI1LCB9LAotezI2LCAxMCwgMTAwLCAyNiwgfSwKLXsyNywgMTAsIDEwMCwgMjcsIH0sCi17MjgsIDEwLCAxMDAsIDI4LCB9LAotezI5LCAxMCwgMTAwLCAyOSwgfSwKLXszMCwgMTAsIDEwMCwgMzAsIH0sCi17MzEsIDEwLCAxMDAsIDMxLCB9LAotezMyLCAxMCwgMTAwLCAzMiwgfSwKLXszMywgMTAsIDEwMCwgMzMsIH0sCi17MzQsIDEwLCAxMDAsIDM0LCB9LAotezM1LCAxMCwgMTAwLCAzNSwgfSwKLXszNiwgMTAsIDEwMCwgMzYsIH0sCi17MzcsIDEwLCAxMDAsIDM3LCB9LAotezM4LCAxMCwgMTAwLCAzOCwgfSwKLXszOSwgMTAsIDEwMCwgMzksIH0sCi17NDAsIDEwLCAxMDAsIDQwLCB9LAotezQxLCAxMCwgMTAwLCA0MSwgfSwKLXs0MiwgMTAsIDEwMCwgNDIsIH0sCi17NDMsIDEwLCAxMDAsIDQzLCB9LAotezQ0LCAxMCwgMTAwLCA0NCwgfSwKLXs0NSwgMTAsIDEwMCwgNDUsIH0sCi17NDYsIDEwLCAxMDAsIDQ2LCB9LAotezQ3LCAxMCwgMTAwLCA0NywgfSwKLXs0OCwgMTAsIDEwMCwgNDgsIH0sCi17NDksIDEwLCAxMDAsIDQ5LCB9LAotezUwLCAxMCwgMTAwLCA1MCwgfSwKLXs1MSwgMTAsIDEwMCwgNTEsIH0sCi17NTIsIDEwLCAxMDAsIDUyLCB9LAotezUzLCAxMCwgMTAwLCA1MywgfSwKLXs1NCwgMTAsIDEwMCwgNTQsIH0sCi17NTUsIDEwLCAxMDAsIDU1LCB9LAotezU2LCAxMCwgMTAwLCA1NiwgfSwKLXs1NywgMTAsIDEwMCwgNTcsIH0sCi17NTgsIDEwLCAxMDAsIDU4LCB9LAotezU5LCAxMCwgMTAwLCA1OSwgfSwKLXs2MCwgMTAsIDEwMCwgNjAsIH0sCi17NjEsIDEwLCAxMDAsIDYxLCB9LAotezYyLCAxMCwgMTAwLCA2MiwgfSwKLXs2MywgMTAsIDEwMCwgNjMsIH0sCi17NjQsIDEwLCAxMDAsIDY0LCB9LAotezY1LCAxMCwgMTAwLCA2NSwgfSwKLXs2NiwgMTAsIDEwMCwgNjYsIH0sCi17NjcsIDEwLCAxMDAsIDY3LCB9LAotezY4LCAxMCwgMTAwLCA2OCwgfSwKLXs2OSwgMTAsIDEwMCwgNjksIH0sCi17NzAsIDEwLCAxMDAsIDcwLCB9LAotezcxLCAxMCwgMTAwLCA3MSwgfSwKLXs3MiwgMTAsIDEwMCwgNzIsIH0sCi17NzMsIDEwLCAxMDAsIDczLCB9LAotezc0LCAxMCwgMTAwLCA3NCwgfSwKLXs3NSwgMTAsIDEwMCwgNzUsIH0sCi17NzYsIDEwLCAxMDAsIDc2LCB9LAotezc3LCAxMCwgMTAwLCA3NywgfSwKLXs3OCwgMTAsIDEwMCwgNzgsIH0sCi17NzksIDEwLCAxMDAsIDc5LCB9LAotezgwLCAxMCwgMTAwLCA4MCwgfSwKLXs4MSwgMTAsIDEwMCwgODEsIH0sCi17ODIsIDEwLCAxMDAsIDgyLCB9LAotezgzLCAxMCwgMTAwLCA4MywgfSwKLXs4NCwgMTAsIDEwMCwgODQsIH0sCi17ODUsIDEwLCAxMDAsIDg1LCB9LAotezg2LCAxMCwgMTAwLCA4NiwgfSwKLXs4NywgMTAsIDEwMCwgODcsIH0sCi17ODgsIDEwLCAxMDAsIDg4LCB9LAotezg5LCAxMCwgMTAwLCA4OSwgfSwKLXs5MCwgMTAsIDEwMCwgOTAsIH0sCi17OTEsIDEwLCAxMDAsIDkxLCB9LAotezkyLCAxMCwgMTAwLCA5MiwgfSwKLXs5MywgMTAsIDEwMCwgOTMsIH0sCi17OTQsIDEwLCAxMDAsIDk0LCB9LAotezk1LCAxMCwgMTAwLCA5NSwgfSwKLXs5NiwgMTAsIDEwMCwgOTYsIH0sCi17OTcsIDEwLCAxMDAsIDk3LCB9LAotezk4LCAxMCwgMTAwLCA5OCwgfSwKLXs5OSwgMTAsIDEwMCwgOTksIH0sCi17MTAwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTAzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTA0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTA5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTEwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTExLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTEzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTE0LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE1LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE2LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE3LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE4LCAxMCwgMTAwLCAxMDAsIH0sCi17MTE5LCAxMCwgMTAwLCAxMDAsIH0sCi17MTIwLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIxLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIyLCAxMCwgMTAwLCAxMDAsIH0sCi17MTIzLCAxMCwgMTAwLCAxMDAsIH0sCi17MTI0LCAxMCwgMTAwLCAxMDAsIH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2Q5MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5IX1NDUk9MTCk7Ci0Jc2Nyb2xsQmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLQlzZXRXaWRnZXQoc2Nyb2xsQmFyKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVN0cmluZyhpbnRbXSBpbnRBcnJheSkgewotCXJldHVybiAiICgiK2ludEFycmF5WzFdKyIsIitpbnRBcnJheVsyXSsiLCIraW50QXJyYXlbM10rIiwiK2ludEFycmF5WzRdKyIpIjsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNjcm9sbEJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlzY3JvbGxCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXNjcm9sbEJhci5zZXRTZWxlY3Rpb24oMTAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0Jc2Nyb2xsQmFyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0cnkgewotCQlzY3JvbGxCYXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVhckRvd24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEVuYWJsZWQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW5jcmVtZW50KCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNYXhpbXVtKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNaW5pbXVtKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRQYWdlSW5jcmVtZW50KCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyhjYW52YXMsIHNjcm9sbEJhci5nZXRQYXJlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNlbGVjdGlvbigpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpemUoKSB7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0U2l6ZSgpLnggPiAwKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRTaXplKCkueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRodW1iKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRodW1iKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCXNjcm9sbEJhci5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmlzRW5hYmxlZCgpKTsKLQotCXNjcm9sbEJhci5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFzY3JvbGxCYXIuaXNFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQlzY3JvbGxCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5pc1Zpc2libGUoKSk7IAotCXNjcm9sbEJhci5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFzY3JvbGxCYXIuaXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCXNjcm9sbEJhci5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldEVuYWJsZWQoKSk7Ci0KLQlzY3JvbGxCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmdldEVuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5jcmVtZW50SSgpIHsKLQlpbnRbXSBjYXNlcyA9IHsxLCAxMCwgMTAwMDB9OwotCWZvciAoaW50IGk9MDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLQkJc2Nyb2xsQmFyLnNldEluY3JlbWVudChjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscyhjYXNlc1tpXSwgc2Nyb2xsQmFyLmdldEluY3JlbWVudCgpKTsKLQl9IAotCi0Jc2Nyb2xsQmFyLnNldEluY3JlbWVudCgyNSk7Ci0Jc2Nyb2xsQmFyLnNldEluY3JlbWVudCgwKTsgLy8gc2V0dGluZyB0byAwIGZhaWxzIHNpbGVudGx5Ci0JYXNzZXJ0RXF1YWxzKDI1LCBzY3JvbGxCYXIuZ2V0SW5jcmVtZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1heGltdW1JKCl7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1heGltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldE1heCAiK2ludEFycmF5WzBdKyB2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bUkoKXsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWluaW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWluICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCl7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCQlzY3JvbGxCYXIuc2V0UGFnZUluY3JlbWVudChjYXNlc1tpXSk7Ci0JCWFzc2VydEVxdWFscyhzY3JvbGxCYXIuZ2V0UGFnZUluY3JlbWVudCgpLCBjYXNlc1tpXSk7Ci0JfSAKLQotCXNjcm9sbEJhci5zZXRQYWdlSW5jcmVtZW50KDI1KTsKLQlzY3JvbGxCYXIuc2V0UGFnZUluY3JlbWVudCgwKTsgLy8gc2V0dGluZyB0byAwIGZhaWxzIHNpbGVudGx5Ci0JYXNzZXJ0RXF1YWxzKDI1LCBzY3JvbGxCYXIuZ2V0UGFnZUluY3JlbWVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCl7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRTZWxlY3Rpb24oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0U2VsICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGh1bWJJKCl7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFRodW1iVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2Nyb2xsQmFyLnNldFRodW1iKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldFRobWIgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWYWx1ZXNJSUlJSUkoKSB7Ci0Jc2Nyb2xsQmFyLnNldFZhbHVlcygxMCwgMTAsIDUwLCAyLCA1LCAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzY3JvbGxCYXIuZ2V0TWluaW11bSgpID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzY3JvbGxCYXIuZ2V0TWF4aW11bSgpID09IDUwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzY3JvbGxCYXIuZ2V0VGh1bWIoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzY3JvbGxCYXIuZ2V0SW5jcmVtZW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc2Nyb2xsQmFyLmdldFBhZ2VJbmNyZW1lbnQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jc2Nyb2xsQmFyLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0VmlzaWJsZSgpKTsKLQotCXNjcm9sbEJhci5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFzY3JvbGxCYXIuZ2V0VmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGh1bWIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGh1bWJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRodW1iIikpIHRlc3RfZ2V0VGh1bWIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZpc2libGUiKSkgdGVzdF9nZXRWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzVmlzaWJsZSIpKSB0ZXN0X2lzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluY3JlbWVudEkiKSkgdGVzdF9zZXRJbmNyZW1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNYXhpbXVtSSIpKSB0ZXN0X3NldE1heGltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtSSIpKSB0ZXN0X3NldE1pbmltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpKSB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGh1bWJJIikpIHRlc3Rfc2V0VGh1bWJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKSkgdGVzdF9zZXRWYWx1ZXNJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1TY3JvbGxCYXIgc2Nyb2xsQmFyOwotQ2FudmFzIGNhbnZhczsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0vLwlpZiAoc2Nyb2xsQmFyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRNaW5pbXVtKCkpOwotLy8JfQotLy8JaWYgKHNjcm9sbEJhci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRNYXhpbXVtKCkpOwotLy8JfQotLy8JaWYgKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpKTsKLS8vCX0KLS8vCWlmIChzY3JvbGxCYXIuZ2V0VGh1bWIoKSAhPSB0aHVtYkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogVGh1bWIgRXhwZWN0ZWQ6ICIgKyB0aHVtYkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2Nyb2xsQmFyLmdldFRodW1iKCkpOwotLy8JfQotCWNoZWNrKGNhbGwsIG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQsIHRodW1iRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKFN0cmluZyBjYWxsLCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCWFzc2VydEVxdWFscyhjYWxsKyIgbWF4ICIsIG1heEV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0TWF4aW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1pbiAiLCBtaW5FeHBlY3RlZCwgc2Nyb2xsQmFyLmdldE1pbmltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBzZWwgIiwgc2VsZWN0aW9uRXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiB0aG1iICIsIHRodW1iRXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRUaHVtYigpKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRUaHVtYlZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMX0sCi17MiwgMTAsIDEwMCwgNTAsIDJ9LAotezMsIDEwLCAxMDAsIDUwLCAzfSwKLXs0LCAxMCwgMTAwLCA1MCwgNH0sCi17NSwgMTAsIDEwMCwgNTAsIDV9LAotezYsIDEwLCAxMDAsIDUwLCA2fSwKLXs3LCAxMCwgMTAwLCA1MCwgN30sCi17OCwgMTAsIDEwMCwgNTAsIDh9LAotezksIDEwLCAxMDAsIDUwLCA5fSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgNTAsIDExfSwKLXsxMiwgMTAsIDEwMCwgNTAsIDEyfSwKLXsxMywgMTAsIDEwMCwgNTAsIDEzfSwKLXsxNCwgMTAsIDEwMCwgNTAsIDE0fSwKLXsxNSwgMTAsIDEwMCwgNTAsIDE1fSwKLXsxNiwgMTAsIDEwMCwgNTAsIDE2fSwKLXsxNywgMTAsIDEwMCwgNTAsIDE3fSwKLXsxOCwgMTAsIDEwMCwgNTAsIDE4fSwKLXsxOSwgMTAsIDEwMCwgNTAsIDE5fSwKLXsyMCwgMTAsIDEwMCwgNTAsIDIwfSwKLXsyMSwgMTAsIDEwMCwgNTAsIDIxfSwKLXsyMiwgMTAsIDEwMCwgNTAsIDIyfSwKLXsyMywgMTAsIDEwMCwgNTAsIDIzfSwKLXsyNCwgMTAsIDEwMCwgNTAsIDI0fSwKLXsyNSwgMTAsIDEwMCwgNTAsIDI1fSwKLXsyNiwgMTAsIDEwMCwgNTAsIDI2fSwKLXsyNywgMTAsIDEwMCwgNTAsIDI3fSwKLXsyOCwgMTAsIDEwMCwgNTAsIDI4fSwKLXsyOSwgMTAsIDEwMCwgNTAsIDI5fSwKLXszMCwgMTAsIDEwMCwgNTAsIDMwfSwKLXszMSwgMTAsIDEwMCwgNTAsIDMxfSwKLXszMiwgMTAsIDEwMCwgNTAsIDMyfSwKLXszMywgMTAsIDEwMCwgNTAsIDMzfSwKLXszNCwgMTAsIDEwMCwgNTAsIDM0fSwKLXszNSwgMTAsIDEwMCwgNTAsIDM1fSwKLXszNiwgMTAsIDEwMCwgNTAsIDM2fSwKLXszNywgMTAsIDEwMCwgNTAsIDM3fSwKLXszOCwgMTAsIDEwMCwgNTAsIDM4fSwKLXszOSwgMTAsIDEwMCwgNTAsIDM5fSwKLXs0MCwgMTAsIDEwMCwgNTAsIDQwfSwKLXs0MSwgMTAsIDEwMCwgNTAsIDQxfSwKLXs0MiwgMTAsIDEwMCwgNTAsIDQyfSwKLXs0MywgMTAsIDEwMCwgNTAsIDQzfSwKLXs0NCwgMTAsIDEwMCwgNTAsIDQ0fSwKLXs0NSwgMTAsIDEwMCwgNTAsIDQ1fSwKLXs0NiwgMTAsIDEwMCwgNTAsIDQ2fSwKLXs0NywgMTAsIDEwMCwgNTAsIDQ3fSwKLXs0OCwgMTAsIDEwMCwgNTAsIDQ4fSwKLXs0OSwgMTAsIDEwMCwgNTAsIDQ5fSwKLXs1MCwgMTAsIDEwMCwgNTAsIDUwfSwKLXs1MSwgMTAsIDEwMCwgNDksIDUxfSwKLXs1MiwgMTAsIDEwMCwgNDgsIDUyfSwKLXs1MywgMTAsIDEwMCwgNDcsIDUzfSwKLXs1NCwgMTAsIDEwMCwgNDYsIDU0fSwKLXs1NSwgMTAsIDEwMCwgNDUsIDU1fSwKLXs1NiwgMTAsIDEwMCwgNDQsIDU2fSwKLXs1NywgMTAsIDEwMCwgNDMsIDU3fSwKLXs1OCwgMTAsIDEwMCwgNDIsIDU4fSwKLXs1OSwgMTAsIDEwMCwgNDEsIDU5fSwKLXs2MCwgMTAsIDEwMCwgNDAsIDYwfSwKLXs2MSwgMTAsIDEwMCwgMzksIDYxfSwKLXs2MiwgMTAsIDEwMCwgMzgsIDYyfSwKLXs2MywgMTAsIDEwMCwgMzcsIDYzfSwKLXs2NCwgMTAsIDEwMCwgMzYsIDY0fSwKLXs2NSwgMTAsIDEwMCwgMzUsIDY1fSwKLXs2NiwgMTAsIDEwMCwgMzQsIDY2fSwKLXs2NywgMTAsIDEwMCwgMzMsIDY3fSwKLXs2OCwgMTAsIDEwMCwgMzIsIDY4fSwKLXs2OSwgMTAsIDEwMCwgMzEsIDY5fSwKLXs3MCwgMTAsIDEwMCwgMzAsIDcwfSwKLXs3MSwgMTAsIDEwMCwgMjksIDcxfSwKLXs3MiwgMTAsIDEwMCwgMjgsIDcyfSwKLXs3MywgMTAsIDEwMCwgMjcsIDczfSwKLXs3NCwgMTAsIDEwMCwgMjYsIDc0fSwKLXs3NSwgMTAsIDEwMCwgMjUsIDc1fSwKLXs3NiwgMTAsIDEwMCwgMjQsIDc2fSwKLXs3NywgMTAsIDEwMCwgMjMsIDc3fSwKLXs3OCwgMTAsIDEwMCwgMjIsIDc4fSwKLXs3OSwgMTAsIDEwMCwgMjEsIDc5fSwKLXs4MCwgMTAsIDEwMCwgMjAsIDgwfSwKLXs4MSwgMTAsIDEwMCwgMTksIDgxfSwKLXs4MiwgMTAsIDEwMCwgMTgsIDgyfSwKLXs4MywgMTAsIDEwMCwgMTcsIDgzfSwKLXs4NCwgMTAsIDEwMCwgMTYsIDg0fSwKLXs4NSwgMTAsIDEwMCwgMTUsIDg1fSwKLXs4NiwgMTAsIDEwMCwgMTQsIDg2fSwKLXs4NywgMTAsIDEwMCwgMTMsIDg3fSwKLXs4OCwgMTAsIDEwMCwgMTIsIDg4fSwKLXs4OSwgMTAsIDEwMCwgMTEsIDg5fSwKLXs5MCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA0LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA3LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEwLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEzLCAxMCwgMTAwLCAxMCwgOTB9LAotezExNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE2LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjQsIDEwLCAxMDAsIDEwLCA5MH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxLCAxMDAsIDUwLCAxMH0sCi17MiwgMiwgMTAwLCA1MCwgMTB9LAotezMsIDMsIDEwMCwgNTAsIDEwfSwKLXs0LCA0LCAxMDAsIDUwLCAxMH0sCi17NSwgNSwgMTAwLCA1MCwgMTB9LAotezYsIDYsIDEwMCwgNTAsIDEwfSwKLXs3LCA3LCAxMDAsIDUwLCAxMH0sCi17OCwgOCwgMTAwLCA1MCwgMTB9LAotezksIDksIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTEsIDEwMCwgNTAsIDEwfSwKLXsxMiwgMTIsIDEwMCwgNTAsIDEwfSwKLXsxMywgMTMsIDEwMCwgNTAsIDEwfSwKLXsxNCwgMTQsIDEwMCwgNTAsIDEwfSwKLXsxNSwgMTUsIDEwMCwgNTAsIDEwfSwKLXsxNiwgMTYsIDEwMCwgNTAsIDEwfSwKLXsxNywgMTcsIDEwMCwgNTAsIDEwfSwKLXsxOCwgMTgsIDEwMCwgNTAsIDEwfSwKLXsxOSwgMTksIDEwMCwgNTAsIDEwfSwKLXsyMCwgMjAsIDEwMCwgNTAsIDEwfSwKLXsyMSwgMjEsIDEwMCwgNTAsIDEwfSwKLXsyMiwgMjIsIDEwMCwgNTAsIDEwfSwKLXsyMywgMjMsIDEwMCwgNTAsIDEwfSwKLXsyNCwgMjQsIDEwMCwgNTAsIDEwfSwKLXsyNSwgMjUsIDEwMCwgNTAsIDEwfSwKLXsyNiwgMjYsIDEwMCwgNTAsIDEwfSwKLXsyNywgMjcsIDEwMCwgNTAsIDEwfSwKLXsyOCwgMjgsIDEwMCwgNTAsIDEwfSwKLXsyOSwgMjksIDEwMCwgNTAsIDEwfSwKLXszMCwgMzAsIDEwMCwgNTAsIDEwfSwKLXszMSwgMzEsIDEwMCwgNTAsIDEwfSwKLXszMiwgMzIsIDEwMCwgNTAsIDEwfSwKLXszMywgMzMsIDEwMCwgNTAsIDEwfSwKLXszNCwgMzQsIDEwMCwgNTAsIDEwfSwKLXszNSwgMzUsIDEwMCwgNTAsIDEwfSwKLXszNiwgMzYsIDEwMCwgNTAsIDEwfSwKLXszNywgMzcsIDEwMCwgNTAsIDEwfSwKLXszOCwgMzgsIDEwMCwgNTAsIDEwfSwKLXszOSwgMzksIDEwMCwgNTAsIDEwfSwKLXs0MCwgNDAsIDEwMCwgNTAsIDEwfSwKLXs0MSwgNDEsIDEwMCwgNTAsIDEwfSwKLXs0MiwgNDIsIDEwMCwgNTAsIDEwfSwKLXs0MywgNDMsIDEwMCwgNTAsIDEwfSwKLXs0NCwgNDQsIDEwMCwgNTAsIDEwfSwKLXs0NSwgNDUsIDEwMCwgNTAsIDEwfSwKLXs0NiwgNDYsIDEwMCwgNTAsIDEwfSwKLXs0NywgNDcsIDEwMCwgNTAsIDEwfSwKLXs0OCwgNDgsIDEwMCwgNTAsIDEwfSwKLXs0OSwgNDksIDEwMCwgNTAsIDEwfSwKLXs1MCwgNTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgNTEsIDEwMCwgNTEsIDEwfSwKLXs1MiwgNTIsIDEwMCwgNTIsIDEwfSwKLXs1MywgNTMsIDEwMCwgNTMsIDEwfSwKLXs1NCwgNTQsIDEwMCwgNTQsIDEwfSwKLXs1NSwgNTUsIDEwMCwgNTUsIDEwfSwKLXs1NiwgNTYsIDEwMCwgNTYsIDEwfSwKLXs1NywgNTcsIDEwMCwgNTcsIDEwfSwKLXs1OCwgNTgsIDEwMCwgNTgsIDEwfSwKLXs1OSwgNTksIDEwMCwgNTksIDEwfSwKLXs2MCwgNjAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgNjEsIDEwMCwgNjEsIDEwfSwKLXs2MiwgNjIsIDEwMCwgNjIsIDEwfSwKLXs2MywgNjMsIDEwMCwgNjMsIDEwfSwKLXs2NCwgNjQsIDEwMCwgNjQsIDEwfSwKLXs2NSwgNjUsIDEwMCwgNjUsIDEwfSwKLXs2NiwgNjYsIDEwMCwgNjYsIDEwfSwKLXs2NywgNjcsIDEwMCwgNjcsIDEwfSwKLXs2OCwgNjgsIDEwMCwgNjgsIDEwfSwKLXs2OSwgNjksIDEwMCwgNjksIDEwfSwKLXs3MCwgNzAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgNzEsIDEwMCwgNzEsIDEwfSwKLXs3MiwgNzIsIDEwMCwgNzIsIDEwfSwKLXs3MywgNzMsIDEwMCwgNzMsIDEwfSwKLXs3NCwgNzQsIDEwMCwgNzQsIDEwfSwKLXs3NSwgNzUsIDEwMCwgNzUsIDEwfSwKLXs3NiwgNzYsIDEwMCwgNzYsIDEwfSwKLXs3NywgNzcsIDEwMCwgNzcsIDEwfSwKLXs3OCwgNzgsIDEwMCwgNzgsIDEwfSwKLXs3OSwgNzksIDEwMCwgNzksIDEwfSwKLXs4MCwgODAsIDEwMCwgODAsIDEwfSwKLXs4MSwgODEsIDEwMCwgODEsIDEwfSwKLXs4MiwgODIsIDEwMCwgODIsIDEwfSwKLXs4MywgODMsIDEwMCwgODMsIDEwfSwKLXs4NCwgODQsIDEwMCwgODQsIDEwfSwKLXs4NSwgODUsIDEwMCwgODUsIDEwfSwKLXs4NiwgODYsIDEwMCwgODYsIDEwfSwKLXs4NywgODcsIDEwMCwgODcsIDEwfSwKLXs4OCwgODgsIDEwMCwgODgsIDEwfSwKLXs4OSwgODksIDEwMCwgODksIDEwfSwKLXs5MCwgOTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgOTEsIDEwMCwgOTEsIDl9LAotezkyLCA5MiwgMTAwLCA5MiwgOH0sCi17OTMsIDkzLCAxMDAsIDkzLCA3fSwKLXs5NCwgOTQsIDEwMCwgOTQsIDZ9LAotezk1LCA5NSwgMTAwLCA5NSwgNX0sCi17OTYsIDk2LCAxMDAsIDk2LCA0fSwKLXs5NywgOTcsIDEwMCwgOTcsIDN9LAotezk4LCA5OCwgMTAwLCA5OCwgMn0sCi17OTksIDk5LCAxMDAsIDk5LCAxfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotezExNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsyLCAxMCwgMTAwLCA1MCwgMTB9LAotezMsIDEwLCAxMDAsIDUwLCAxMH0sCi17NCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1LCAxMCwgMTAwLCA1MCwgMTB9LAotezYsIDEwLCAxMDAsIDUwLCAxMH0sCi17NywgMTAsIDEwMCwgNTAsIDEwfSwKLXs4LCAxMCwgMTAwLCA1MCwgMTB9LAotezksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDEwLCAxMSwgMTAsIDF9LAotezEyLCAxMCwgMTIsIDEwLCAyfSwKLXsxMywgMTAsIDEzLCAxMCwgM30sCi17MTQsIDEwLCAxNCwgMTAsIDR9LAotezE1LCAxMCwgMTUsIDEwLCA1fSwKLXsxNiwgMTAsIDE2LCAxMCwgNn0sCi17MTcsIDEwLCAxNywgMTAsIDd9LAotezE4LCAxMCwgMTgsIDEwLCA4fSwKLXsxOSwgMTAsIDE5LCAxMCwgOX0sCi17MjAsIDEwLCAyMCwgMTAsIDEwfSwKLXsyMSwgMTAsIDIxLCAxMSwgMTB9LAotezIyLCAxMCwgMjIsIDEyLCAxMH0sCi17MjMsIDEwLCAyMywgMTMsIDEwfSwKLXsyNCwgMTAsIDI0LCAxNCwgMTB9LAotezI1LCAxMCwgMjUsIDE1LCAxMH0sCi17MjYsIDEwLCAyNiwgMTYsIDEwfSwKLXsyNywgMTAsIDI3LCAxNywgMTB9LAotezI4LCAxMCwgMjgsIDE4LCAxMH0sCi17MjksIDEwLCAyOSwgMTksIDEwfSwKLXszMCwgMTAsIDMwLCAyMCwgMTB9LAotezMxLCAxMCwgMzEsIDIxLCAxMH0sCi17MzIsIDEwLCAzMiwgMjIsIDEwfSwKLXszMywgMTAsIDMzLCAyMywgMTB9LAotezM0LCAxMCwgMzQsIDI0LCAxMH0sCi17MzUsIDEwLCAzNSwgMjUsIDEwfSwKLXszNiwgMTAsIDM2LCAyNiwgMTB9LAotezM3LCAxMCwgMzcsIDI3LCAxMH0sCi17MzgsIDEwLCAzOCwgMjgsIDEwfSwKLXszOSwgMTAsIDM5LCAyOSwgMTB9LAotezQwLCAxMCwgNDAsIDMwLCAxMH0sCi17NDEsIDEwLCA0MSwgMzEsIDEwfSwKLXs0MiwgMTAsIDQyLCAzMiwgMTB9LAotezQzLCAxMCwgNDMsIDMzLCAxMH0sCi17NDQsIDEwLCA0NCwgMzQsIDEwfSwKLXs0NSwgMTAsIDQ1LCAzNSwgMTB9LAotezQ2LCAxMCwgNDYsIDM2LCAxMH0sCi17NDcsIDEwLCA0NywgMzcsIDEwfSwKLXs0OCwgMTAsIDQ4LCAzOCwgMTB9LAotezQ5LCAxMCwgNDksIDM5LCAxMH0sCi17NTAsIDEwLCA1MCwgNDAsIDEwfSwKLXs1MSwgMTAsIDUxLCA0MSwgMTB9LAotezUyLCAxMCwgNTIsIDQyLCAxMH0sCi17NTMsIDEwLCA1MywgNDMsIDEwfSwKLXs1NCwgMTAsIDU0LCA0NCwgMTB9LAotezU1LCAxMCwgNTUsIDQ1LCAxMH0sCi17NTYsIDEwLCA1NiwgNDYsIDEwfSwKLXs1NywgMTAsIDU3LCA0NywgMTB9LAotezU4LCAxMCwgNTgsIDQ4LCAxMH0sCi17NTksIDEwLCA1OSwgNDksIDEwfSwKLXs2MCwgMTAsIDYwLCA1MCwgMTB9LAotezYxLCAxMCwgNjEsIDUwLCAxMH0sCi17NjIsIDEwLCA2MiwgNTAsIDEwfSwKLXs2MywgMTAsIDYzLCA1MCwgMTB9LAotezY0LCAxMCwgNjQsIDUwLCAxMH0sCi17NjUsIDEwLCA2NSwgNTAsIDEwfSwKLXs2NiwgMTAsIDY2LCA1MCwgMTB9LAotezY3LCAxMCwgNjcsIDUwLCAxMH0sCi17NjgsIDEwLCA2OCwgNTAsIDEwfSwKLXs2OSwgMTAsIDY5LCA1MCwgMTB9LAotezcwLCAxMCwgNzAsIDUwLCAxMH0sCi17NzEsIDEwLCA3MSwgNTAsIDEwfSwKLXs3MiwgMTAsIDcyLCA1MCwgMTB9LAotezczLCAxMCwgNzMsIDUwLCAxMH0sCi17NzQsIDEwLCA3NCwgNTAsIDEwfSwKLXs3NSwgMTAsIDc1LCA1MCwgMTB9LAotezc2LCAxMCwgNzYsIDUwLCAxMH0sCi17NzcsIDEwLCA3NywgNTAsIDEwfSwKLXs3OCwgMTAsIDc4LCA1MCwgMTB9LAotezc5LCAxMCwgNzksIDUwLCAxMH0sCi17ODAsIDEwLCA4MCwgNTAsIDEwfSwKLXs4MSwgMTAsIDgxLCA1MCwgMTB9LAotezgyLCAxMCwgODIsIDUwLCAxMH0sCi17ODMsIDEwLCA4MywgNTAsIDEwfSwKLXs4NCwgMTAsIDg0LCA1MCwgMTB9LAotezg1LCAxMCwgODUsIDUwLCAxMH0sCi17ODYsIDEwLCA4NiwgNTAsIDEwfSwKLXs4NywgMTAsIDg3LCA1MCwgMTB9LAotezg4LCAxMCwgODgsIDUwLCAxMH0sCi17ODksIDEwLCA4OSwgNTAsIDEwfSwKLXs5MCwgMTAsIDkwLCA1MCwgMTB9LAotezkxLCAxMCwgOTEsIDUwLCAxMH0sCi17OTIsIDEwLCA5MiwgNTAsIDEwfSwKLXs5MywgMTAsIDkzLCA1MCwgMTB9LAotezk0LCAxMCwgOTQsIDUwLCAxMH0sCi17OTUsIDEwLCA5NSwgNTAsIDEwfSwKLXs5NiwgMTAsIDk2LCA1MCwgMTB9LAotezk3LCAxMCwgOTcsIDUwLCAxMH0sCi17OTgsIDEwLCA5OCwgNTAsIDEwfSwKLXs5OSwgMTAsIDk5LCA1MCwgMTB9LAotezEwMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDEsIDEwLCAxMDEsIDUwLCAxMH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgMTB9LAotezEwMywgMTAsIDEwMywgNTAsIDEwfSwKLXsxMDQsIDEwLCAxMDQsIDUwLCAxMH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgMTB9LAotezEwNiwgMTAsIDEwNiwgNTAsIDEwfSwKLXsxMDcsIDEwLCAxMDcsIDUwLCAxMH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgMTB9LAotezEwOSwgMTAsIDEwOSwgNTAsIDEwfSwKLXsxMTAsIDEwLCAxMTAsIDUwLCAxMH0sCi17MTExLCAxMCwgMTExLCA1MCwgMTB9LAotezExMiwgMTAsIDExMiwgNTAsIDEwfSwKLXsxMTMsIDEwLCAxMTMsIDUwLCAxMH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgMTB9LAotezExNSwgMTAsIDExNSwgNTAsIDEwfSwKLXsxMTYsIDEwLCAxMTYsIDUwLCAxMH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgMTB9LAotezExOCwgMTAsIDExOCwgNTAsIDEwfSwKLXsxMTksIDEwLCAxMTksIDUwLCAxMH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgMTB9LAotezEyMSwgMTAsIDEyMSwgNTAsIDEwfSwKLXsxMjIsIDEwLCAxMjIsIDUwLCAxMH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgMTB9LAotezEyNCwgMTAsIDEyNCwgNTAsIDEwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0Jc2Nyb2xsQmFyLnNldE1heGltdW0oMTAwKTsKLQlzY3JvbGxCYXIuc2V0TWluaW11bSgxMCk7Ci0Jc2Nyb2xsQmFyLnNldFRodW1iKDEwKTsKLQlzY3JvbGxCYXIuc2V0U2VsZWN0aW9uKDUwKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCAxMCwgMTB9LAotey05LCAxMCwgMTAwLCAxMCwgMTB9LAotey04LCAxMCwgMTAwLCAxMCwgMTB9LAotey03LCAxMCwgMTAwLCAxMCwgMTB9LAotey02LCAxMCwgMTAwLCAxMCwgMTB9LAotey01LCAxMCwgMTAwLCAxMCwgMTB9LAotey00LCAxMCwgMTAwLCAxMCwgMTB9LAotey0zLCAxMCwgMTAwLCAxMCwgMTB9LAotey0yLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xLCAxMCwgMTAwLCAxMCwgMTB9LAotezAsIDEwLCAxMDAsIDEwLCAxMH0sCi17MSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsyLCAxMCwgMTAwLCAxMCwgMTB9LAotezMsIDEwLCAxMDAsIDEwLCAxMH0sCi17NCwgMTAsIDEwMCwgMTAsIDEwfSwKLXs1LCAxMCwgMTAwLCAxMCwgMTB9LAotezYsIDEwLCAxMDAsIDEwLCAxMH0sCi17NywgMTAsIDEwMCwgMTAsIDEwfSwKLXs4LCAxMCwgMTAwLCAxMCwgMTB9LAotezksIDEwLCAxMDAsIDEwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17MTEsIDEwLCAxMDAsIDExLCAxMH0sCi17MTIsIDEwLCAxMDAsIDEyLCAxMH0sCi17MTMsIDEwLCAxMDAsIDEzLCAxMH0sCi17MTQsIDEwLCAxMDAsIDE0LCAxMH0sCi17MTUsIDEwLCAxMDAsIDE1LCAxMH0sCi17MTYsIDEwLCAxMDAsIDE2LCAxMH0sCi17MTcsIDEwLCAxMDAsIDE3LCAxMH0sCi17MTgsIDEwLCAxMDAsIDE4LCAxMH0sCi17MTksIDEwLCAxMDAsIDE5LCAxMH0sCi17MjAsIDEwLCAxMDAsIDIwLCAxMH0sCi17MjEsIDEwLCAxMDAsIDIxLCAxMH0sCi17MjIsIDEwLCAxMDAsIDIyLCAxMH0sCi17MjMsIDEwLCAxMDAsIDIzLCAxMH0sCi17MjQsIDEwLCAxMDAsIDI0LCAxMH0sCi17MjUsIDEwLCAxMDAsIDI1LCAxMH0sCi17MjYsIDEwLCAxMDAsIDI2LCAxMH0sCi17MjcsIDEwLCAxMDAsIDI3LCAxMH0sCi17MjgsIDEwLCAxMDAsIDI4LCAxMH0sCi17MjksIDEwLCAxMDAsIDI5LCAxMH0sCi17MzAsIDEwLCAxMDAsIDMwLCAxMH0sCi17MzEsIDEwLCAxMDAsIDMxLCAxMH0sCi17MzIsIDEwLCAxMDAsIDMyLCAxMH0sCi17MzMsIDEwLCAxMDAsIDMzLCAxMH0sCi17MzQsIDEwLCAxMDAsIDM0LCAxMH0sCi17MzUsIDEwLCAxMDAsIDM1LCAxMH0sCi17MzYsIDEwLCAxMDAsIDM2LCAxMH0sCi17MzcsIDEwLCAxMDAsIDM3LCAxMH0sCi17MzgsIDEwLCAxMDAsIDM4LCAxMH0sCi17MzksIDEwLCAxMDAsIDM5LCAxMH0sCi17NDAsIDEwLCAxMDAsIDQwLCAxMH0sCi17NDEsIDEwLCAxMDAsIDQxLCAxMH0sCi17NDIsIDEwLCAxMDAsIDQyLCAxMH0sCi17NDMsIDEwLCAxMDAsIDQzLCAxMH0sCi17NDQsIDEwLCAxMDAsIDQ0LCAxMH0sCi17NDUsIDEwLCAxMDAsIDQ1LCAxMH0sCi17NDYsIDEwLCAxMDAsIDQ2LCAxMH0sCi17NDcsIDEwLCAxMDAsIDQ3LCAxMH0sCi17NDgsIDEwLCAxMDAsIDQ4LCAxMH0sCi17NDksIDEwLCAxMDAsIDQ5LCAxMH0sCi17NTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17NTEsIDEwLCAxMDAsIDUxLCAxMH0sCi17NTIsIDEwLCAxMDAsIDUyLCAxMH0sCi17NTMsIDEwLCAxMDAsIDUzLCAxMH0sCi17NTQsIDEwLCAxMDAsIDU0LCAxMH0sCi17NTUsIDEwLCAxMDAsIDU1LCAxMH0sCi17NTYsIDEwLCAxMDAsIDU2LCAxMH0sCi17NTcsIDEwLCAxMDAsIDU3LCAxMH0sCi17NTgsIDEwLCAxMDAsIDU4LCAxMH0sCi17NTksIDEwLCAxMDAsIDU5LCAxMH0sCi17NjAsIDEwLCAxMDAsIDYwLCAxMH0sCi17NjEsIDEwLCAxMDAsIDYxLCAxMH0sCi17NjIsIDEwLCAxMDAsIDYyLCAxMH0sCi17NjMsIDEwLCAxMDAsIDYzLCAxMH0sCi17NjQsIDEwLCAxMDAsIDY0LCAxMH0sCi17NjUsIDEwLCAxMDAsIDY1LCAxMH0sCi17NjYsIDEwLCAxMDAsIDY2LCAxMH0sCi17NjcsIDEwLCAxMDAsIDY3LCAxMH0sCi17NjgsIDEwLCAxMDAsIDY4LCAxMH0sCi17NjksIDEwLCAxMDAsIDY5LCAxMH0sCi17NzAsIDEwLCAxMDAsIDcwLCAxMH0sCi17NzEsIDEwLCAxMDAsIDcxLCAxMH0sCi17NzIsIDEwLCAxMDAsIDcyLCAxMH0sCi17NzMsIDEwLCAxMDAsIDczLCAxMH0sCi17NzQsIDEwLCAxMDAsIDc0LCAxMH0sCi17NzUsIDEwLCAxMDAsIDc1LCAxMH0sCi17NzYsIDEwLCAxMDAsIDc2LCAxMH0sCi17NzcsIDEwLCAxMDAsIDc3LCAxMH0sCi17NzgsIDEwLCAxMDAsIDc4LCAxMH0sCi17NzksIDEwLCAxMDAsIDc5LCAxMH0sCi17ODAsIDEwLCAxMDAsIDgwLCAxMH0sCi17ODEsIDEwLCAxMDAsIDgxLCAxMH0sCi17ODIsIDEwLCAxMDAsIDgyLCAxMH0sCi17ODMsIDEwLCAxMDAsIDgzLCAxMH0sCi17ODQsIDEwLCAxMDAsIDg0LCAxMH0sCi17ODUsIDEwLCAxMDAsIDg1LCAxMH0sCi17ODYsIDEwLCAxMDAsIDg2LCAxMH0sCi17ODcsIDEwLCAxMDAsIDg3LCAxMH0sCi17ODgsIDEwLCAxMDAsIDg4LCAxMH0sCi17ODksIDEwLCAxMDAsIDg5LCAxMH0sCi17OTAsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTEsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTMsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTQsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTYsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTcsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17OTksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAwLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA5MCwgMTB9LAotezExMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA5MCwgMTB9LAotezExOSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA5MCwgMTB9LAotfTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU0N2NjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsYWJsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jc2Nyb2xsYWJsZS5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXNjcm9sbGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvcml6b250YWxCYXIoKSB7Ci0Jc2Nyb2xsYWJsZS5nZXRIb3Jpem9udGFsQmFyKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVydGljYWxCYXIoKSB7Ci0Jc2Nyb2xsYWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhvcml6b250YWxCYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZlcnRpY2FsQmFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIb3Jpem9udGFsQmFyIikpIHRlc3RfZ2V0SG9yaXpvbnRhbEJhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmVydGljYWxCYXIiKSkgdGVzdF9nZXRWZXJ0aWNhbEJhcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlTY3JvbGxhYmxlIHNjcm9sbGFibGU7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXNjcm9sbGFibGUgPSAoU2Nyb2xsYWJsZSl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjVhMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRlc3RTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JYXNzZXJ0Tm90TnVsbCgiYTogIiwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCS8qIHRoaXMgc2hvdWxkIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgU1RZTEUgYml0cywgZm9yIG5vdyBqdXN0IHRlc3QgaW5kaXZpZHVhbCBiaXRzICovCi0JaW50W10gY2FzZXMgPSB7U1dULk5PX1RSSU0sIFNXVC5SRVNJWkUsIFNXVC5USVRMRSwgU1dULkNMT1NFLCBTV1QuTUVOVSwgU1dULk1JTiwgU1dULkJPUkRFUiwgCi0JCQkJICAgU1dULkNMSVBfQ0hJTERSRU4sIFNXVC5DTElQX1NJQkxJTkdTLCBTV1QuT05fVE9QLCBTV1QuRkxBVCwgU1dULlNNT09USH07Ci0JU2hlbGwgbmV3U2hlbGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IHNoZWxsLmdldERpc3BsYXkoKSk7Ci0JCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JYXNzZXJ0VHJ1ZSgiYTogIiwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IGRpc3BsYXkpOwotCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpIHsKLQlpbnRbXSBjYXNlcyA9IHtTV1QuTk9fVFJJTSwgU1dULlJFU0laRSwgU1dULlRJVExFLCBTV1QuQ0xPU0UsIFNXVC5NRU5VLCBTV1QuTUlOLCBTV1QuQk9SREVSLCAKLQkJCQkgICBTV1QuQ0xJUF9DSElMRFJFTiwgU1dULkNMSVBfU0lCTElOR1MsIFNXVC5PTl9UT1AsIFNXVC5GTEFULCBTV1QuU01PT1RIfTsKLQlTaGVsbCBuZXdTaGVsbDsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoImEgIiAraSwgbmV3U2hlbGwuZ2V0RGlzcGxheSgpID09IHNoZWxsLmdldERpc3BsYXkoKSk7Ci0JCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoc2hlbGwpOwotCWFzc2VydFRydWUoImE6ICIsIG5ld1NoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCS8qIHRoaXMgc2hvdWxkIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgU1RZTEUgYml0cywgZm9yIG5vdyBqdXN0IHRlc3QgaW5kaXZpZHVhbCBiaXRzICovCi0JaW50W10gY2FzZXMgPSB7U1dULk5PX1RSSU0sIFNXVC5SRVNJWkUsIFNXVC5USVRMRSwgU1dULkNMT1NFLCBTV1QuTUVOVSwgU1dULk1JTiwgU1dULkJPUkRFUiwgCi0JCQkJICAgU1dULkNMSVBfQ0hJTERSRU4sIFNXVC5DTElQX1NJQkxJTkdTLCBTV1QuT05fVE9QLCBTV1QuRkxBVCwgU1dULlNNT09USH07Ci0JU2hlbGwgbmV3U2hlbGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQluZXdTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJhICIgK2ksIG5ld1NoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLQkJbmV3U2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2hlbGxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTaGVsbExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbERlYWN0aXZhdGVkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsRGVpY29uaWZpZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxJY29uaWZpZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc2hlbGwuZm9yY2VBY3RpdmUoKTsKLQkvKiBjYW4ndCBhc3N1bWUgbGlzdGVuZXIgaXMgc3luY2hyb25vdXNseSBjYWxsZWQgd2hlbiBmb3JjZUFjdGl2ZSByZXR1cm5lZCAqLwotCS8qIGFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IHRydWUpOyAqLwotCQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0Jc2hlbGwucmVtb3ZlU2hlbGxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc2hlbGwuZm9yY2VBY3RpdmUoKTsKLQkvKiBjYW4ndCBhc3N1bWUgbGlzdGVuZXIgaXMgc3luY2hyb25vdXNseSBjYWxsZWQgd2hlbiBmb3JjZUFjdGl2ZSByZXR1cm5lZCAqLwotCS8qIGFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsgKi8KLQl0cnkgewotCQlzaGVsbC5yZW1vdmVTaGVsbExpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCi0JLy8gYm9ndXMgbGluZSB0aGF0ICdlbmFibGVkJyBncGZzCi0JLy8JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQl0ZXN0U2hlbGwuc2V0Qm91bmRzKDIwLDMwLDIwMCwgMjAwKTsKLQl0ZXN0U2hlbGwub3BlbigpOwotCXRlc3RTaGVsbC5jbG9zZSgpOwotCXNoZWxsLnNldEJvdW5kcygyMCwzMCwyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoKTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9yY2VBY3RpdmUoKSB7Ci0Jc2hlbGwuZm9yY2VBY3RpdmUoKTsKLQkvKiBjYW4ndCBhc3N1bWUgbGlzdGVuZXIgaXMgc3luY2hyb25vdXNseSBjYWxsZWQgd2hlbiBmb3JjZUFjdGl2ZSByZXR1cm5lZCAqLwotCS8qIGFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Qm91bmRzSUlJSSBhbmQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmEwOiIsIHNoZWxsLmdldEVuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIXNoZWxsLmdldEVuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltZUlucHV0TW9kZSgpIHsKLQlpbnQgbW9kZSA9IHNoZWxsLmdldEltZUlucHV0TW9kZSgpOwotCWFzc2VydFRydWUoIjphOiIsIG1vZGUgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0Jc2hlbGwuc2V0TG9jYXRpb24oMTAsMTUpOwotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldExvY2F0aW9uKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuZ2V0TG9jYXRpb24oKS55ID09IDE1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZWdpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UmVnaW9uKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRTaGVsbCgpPT1zaGVsbCk7Ci0JU2hlbGwgc2hlbGxfMSA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGxfMS5nZXRTaGVsbCgpPT0gc2hlbGxfMSk7Ci0Jc2hlbGxfMS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGxzKCkgewotCWludCBudW0gPSBzaGVsbC5nZXRTaGVsbHMoKS5sZW5ndGg7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbnVtID09IDEpOwotCVNoZWxsIHNoZWxsXzEgPSBuZXcgU2hlbGwoc2hlbGwpOwotCW51bSA9IHNoZWxsLmdldFNoZWxscygpLmxlbmd0aDsKLQlhc3NlcnRUcnVlKCI6YToiLCBudW0gPT0gMik7Ci0Jc2hlbGxfMS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmlzRW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCAhc2hlbGwuaXNFbmFibGVkKCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykKLQkJYXNzZXJ0VHJ1ZSgiOmIxOiIsICF0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2hlbGwuaXNFbmFibGVkKCkpOwotCWFzc2VydFRydWUoIjphOiIsIHRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci0JdGVzdFNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsICF0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXRlc3RTaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHRlc3RTaGVsbC5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gcmVtb3ZlU2hlbGxMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBY3RpdmUoKSB7Ci0JLyogQ3JlYXRlIHNoZWxsMiBhbmQgbWFrZSBpdCBhY3RpdmUuICovCi0JU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKCk7Ci0Jc2hlbGwyLm9wZW4oKTsKLQkKLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3IgdmlzaWJsZSBzaGVsbC4gKi8KLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCXNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoInZpc2libGUgc2hlbGwgd2FzIG5vdCBtYWRlIGFjdGl2ZSIsIHNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHNoZWxsKTsKLQkKLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3IgdmlzaWJsZSBkaWFsb2cgc2hlbGwuICovCi0Jc2hlbGwyLnNldEFjdGl2ZSgpOwotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCXRlc3RTaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJ2aXNpYmxlIGRpYWxvZyBzaGVsbCB3YXMgbm90IG1hZGUgYWN0aXZlIiwgdGVzdFNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IHRlc3RTaGVsbCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIG5vbi12aXNpYmxlIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlzaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJub24tdmlzaWJsZSBzaGVsbCB3YXMgbWFkZSBhY3RpdmUiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSAhPSBzaGVsbCk7Ci0KLQkvKiBUZXN0IHNldEFjdGl2ZSBmb3Igbm9uLXZpc2libGUgZGlhbG9nIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JdGVzdFNoZWxsLnNldEFjdGl2ZSgpOwotCWFzc2VydFRydWUoIm5vbi12aXNpYmxlIGRpYWxvZyBzaGVsbCB3YXMgbWFkZSBhY3RpdmUiLCB0ZXN0U2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgIT0gdGVzdFNoZWxsKTsKLQkKLQlzaGVsbDIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCS8vIHRlc3RlZCBpbiBnZXRFbmFibGVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltZUlucHV0TW9kZUkoKSB7Ci0Jc2hlbGwuc2V0SW1lSW5wdXRNb2RlKFNXVC5OT05FKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRJbWVJbnB1dE1vZGUoKSA9PSBTV1QuTk9ORSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIXNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQkvL3RoZXNlIG11c3QgYmUgcnVuIGJlZm9yZSB0aGUgc2hlbGwgdGVzdHMgYmVjYXVzZSBvZiBwciA3OTUwNAotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2xvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X09wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JCi0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb3JjZUFjdGl2ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWVJbnB1dE1vZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFjdGl2ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltZUlucHV0TW9kZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIiKSkgdGVzdF9hZGRTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2UiKSkgdGVzdF9jbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvcmNlQWN0aXZlIikpIHRlc3RfZm9yY2VBY3RpdmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltZUlucHV0TW9kZSIpKSB0ZXN0X2dldEltZUlucHV0TW9kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVnaW9uIikpIHRlc3RfZ2V0UmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbCIpKSB0ZXN0X2dldFNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbHMiKSkgdGVzdF9nZXRTaGVsbHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFjdGl2ZSIpKSB0ZXN0X3NldEFjdGl2ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1lSW5wdXRNb2RlSSIpKSB0ZXN0X3NldEltZUlucHV0TW9kZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIikpIHRlc3Rfc2V0UmVnaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSIpKSB0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlIikpIHRlc3RfY29uc2lzdGVuY3lfQ2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UiKSkgdGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9PcGVuIikpIHRlc3RfY29uc2lzdGVuY3lfT3BlbigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50ICgpIHsKLQkvLyBvdmVycmlkaW5nIENvbnRyb2wudGVzdF9nZXRQYXJlbnQKLQlhc3NlcnRUcnVlKHNoZWxsLmdldFBhcmVudCgpPT1udWxsKTsKLQlhc3NlcnRUcnVlKHRlc3RTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0JLy8gb3ZlcnJpZGluZyBXaWRnZXQudGVzdF9nZXRTdHlsZQotCWFzc2VydFRydWUoInRlc3RTaGVsbCBub3QgbW9kZWxlc3MiLCAodGVzdFNoZWxsLmdldFN0eWxlICgpICYgU1dULk1PREVMRVNTKSA9PSBTV1QuTU9ERUxFU1MpOwotCWludFtdIGNhc2VzID0ge1NXVC5NT0RFTEVTUywgU1dULlBSSU1BUllfTU9EQUwsIFNXVC5BUFBMSUNBVElPTl9NT0RBTCwgU1dULlNZU1RFTV9NT0RBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlTaGVsbCB0ZXN0U2hlbGwyID0gbmV3IFNoZWxsKHNoZWxsLCBjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoInNoZWxsICIgKyBpLCAodGVzdFNoZWxsMi5nZXRTdHlsZSAoKSAmIGNhc2VzW2ldKSA9PSBjYXNlc1tpXSk7Ci0JCXRlc3RTaGVsbDIuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JLy8gb3ZlcnJpZGluZyBDb250cm9sLnRlc3RfaXNWaXNpYmxlCi0JdGVzdFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuaXNWaXNpYmxlKCkpOwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc1Zpc2libGUoKSk7Ci0KLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoInNoZWxsLmlzVmlzaWJsZSgpIGE6Iiwgc2hlbGwuaXNWaXNpYmxlKCkpOwotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoInNoZWxsLmlzVmlzaWJsZSgpIGI6IiwgIXNoZWxsLmlzVmlzaWJsZSgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpCi0JCWFzc2VydFRydWUoInRlc3RTaGVsbC5pc1Zpc2libGUoKSBjOiIsICF0ZXN0U2hlbGwuaXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBTaGVsbHMgaGF2ZSBhIG1pbmltdW0gc2l6ZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgU2hlbGxzIGhhdmUgYSBtaW5pbXVtIHNpemUKLS8vCS8qIHdpbmRvd3MgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0vLwlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0vLwkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0vLwkJUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgyMCwgMzAsIHAxLngsIHAxLnkpOwotLy8JCVJlY3RhbmdsZSByMjsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLS8vCQkJdGVzdFNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gdGVzdFNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoImNoaWxkIHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwkJcjEgPSBuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgcDEueCwgcDEueSk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0vLwkJCXNoZWxsLnNldEJvdW5kcyhyMSk7Ci0vLwkJCXIyID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgicGFyZW50IHNoZWxsIGl0ZXJhdGlvbiAiICsgaSArICIgc2V0PSIgKyByMSArICIgZ2V0PSIgKyByMiwgcjEuZXF1YWxzKHIyKSk7Ci0vLwkJCXIxLndpZHRoICs9IDEwMDsKLS8vCQkJcjEuaGVpZ2h0ICs9IDEwMDsKLS8vCQl9Ci0vLwl9Ci0vLwkvKiBtb3RpZiAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLS8vCWlmIChTd3RKdW5pdC5pc01vdGlmKSB7Ci0vLwkJUG9pbnQgcDEgPSBuZXcgUG9pbnQoMTUsMzUpOwotLy8JCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMjAsIDMwLCBwMS54LCBwMS55KTsKLS8vCQlSZWN0YW5nbGUgcjI7Ci0vLwkJCi0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0vLwkJCXRlc3RTaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHRlc3RTaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJjaGlsZCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JCXIxID0gbmV3IFJlY3RhbmdsZSg1MCwgNTAsIHAxLngsIHAxLnkpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotLy8JCQlzaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoInBhcmVudCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JfQotfQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWdpb24oKSB7Ci0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlyZWdpb24uYWRkKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAxMDAsIDIwMCkpOwotCS8vIHRlc3Qgc2hlbGwgd2l0aG91dCBzdHlsZSBTV1QuTk9fVFJJTQotCWFzc2VydFRydWUoIjphOiIsIHNoZWxsLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsLnNldFJlZ2lvbihudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQkvLyB0ZXN0IHNoZWxsIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5OT19UUklNKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0Jc2hlbGwyLnNldFJlZ2lvbihyZWdpb24pOwotCWFzc2VydFRydWUoIjplOiIsIHNoZWxsMi5nZXRSZWdpb24oKS5oYW5kbGUgPT0gcmVnaW9uLmhhbmRsZSk7Ci0JcmVnaW9uLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkuaXNEaXNwb3NlZCgpKTsKLQlzaGVsbDIuc2V0UmVnaW9uKG51bGwpOwotCWFzc2VydFRydWUoIjpnOiIsIHNoZWxsMi5nZXRSZWdpb24oKSA9PSBudWxsKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUlJKCkgewotCS8qIHdpbmRvd3MgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxMjkyLCAxMDM2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLQkKLQkvKiBtb3RpZiAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgPz8gb3IgcDEueSA8ID8/ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiA/PyBvciBwMS55ID4gPz8gKi8KLQlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDIsIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTYwMCwgMTYwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JLyogd2luZG93cyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgxMTIsIDI3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTI5MiwgMTAzNik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLQkKLQkvKiBtb3RpZiAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgPz8gb3IgcDEueSA8ID8/ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiA/PyBvciBwMS55ID4gPz8gKi8KLQlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDIsIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54ICs9IDEwMDsKLQkJCW5ld1NpemUueSArPSAxMDA7Ci0JCX0KLQkJbmV3U2l6ZSA9IG5ldyBQb2ludCgxNjAwLCAxNjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotfQotCi1TaGVsbCB0ZXN0U2hlbGw7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVTaGVsbCgpIHsKLSAgICB0ZWFyRG93bigpOwotICAgIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0gICAgdGVzdFNoZWxsID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuTUlOKTsKLQl0ZXN0U2hlbGwuc2V0U2l6ZSgxMDAsMzAwKTsKLQl0ZXN0U2hlbGwuc2V0VGV4dCgiU2hlbGwiKTsKLSAgICB0ZXN0U2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIHNldFdpZGdldCh0ZXN0U2hlbGwpOwotICAgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfT3BlbigpIHsKLQlpZiAoZlRlc3RDb25zaXN0ZW5jeSkgewotCSAgICBjcmVhdGVTaGVsbCgpOwotCSAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIFN0cmluZ1tdIHRlbXAgPSBob29rRXhwZWN0ZWRFdmVudHModGVzdFNoZWxsLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCSAgICBzaGVsbC5wYWNrKCk7Ci0JICAgIHNoZWxsLm9wZW4oKTsKLQkgICAgdGVzdFNoZWxsLnBhY2soKTsKLQkgICAgdGVzdFNoZWxsLm9wZW4oKTsKLQkgICAgbmV3IFRocmVhZCgpIHsKLQkgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgVGhyZWFkKCkgewotCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJICAgICAgICBzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLQkgICAgfX0uc3RhcnQoKTsKLQkKLQkgICAgd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCSAgICAgICAgaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkgICAgfQotCSAgICBzZXRVcCgpOyAgICAgICAgCi0JICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2V2ZW50cy5zaXplKCldOwotCSAgICBldmVudHMuY29weUludG8ocmVzdWx0cyk7Ci0JICAgIGFzc2VydEVxdWFscyhnZXRUZXN0TmFtZSgpICsgIiBldmVudCBvcmRlcmluZyIsIHRlbXAsIHJlc3VsdHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5KCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxLCAwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuU0hFTExfSUNPTklGWSwgbnVsbCwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlKCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBpZighU3d0SnVuaXQuaXNDYXJib24pCi0gICAgICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFMVCwgMCwgU1dULkY0LCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUyk7Ci0gICAgZWxzZQotICAgICAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICBjcmVhdGVTaGVsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Rpc3Bvc2UoKSB7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLQotICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHRlc3RTaGVsbCwgU1dULlBVU0gpOwotICAgIGJ1dHRvbi5zZXRUZXh0KCJkaXNwb3NlIik7Ci0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLSAgICAgICAgICAgIGJ1dHRvbi5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB0ZXN0U2hlbGwuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCh0ZXN0U2hlbGwpOwotICAgIFBvaW50IHB0ID0gYnV0dG9uLmdldExvY2F0aW9uKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwdC54LCBwdC55LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzODhkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TbGlkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzbGlkZXIgPSBuZXcgU2xpZGVyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoc2xpZGVyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgdmFsdWVTdHJpbmcoaW50W10gaW50QXJyYXkpIHsKLQlyZXR1cm4gIiAoIitpbnRBcnJheVsxXSsiLCIraW50QXJyYXlbMl0rIiwiK2ludEFycmF5WzNdKyIsIitpbnRBcnJheVs0XSsiKSI7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlzbGlkZXIgPSBuZXcgU2xpZGVyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzbGlkZXIgPSBuZXcgU2xpZGVyKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXNsaWRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXNsaWRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXNsaWRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJc2xpZGVyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIG1ldGhvZCBzdWZmaWNpZW50IHRlc3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiBzZXRFbmFibGVkIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluY3JlbWVudCgpIHsKLQlpbnRbXSBjYXNlcyA9IHsxLCAxMCwgMTAwMDB9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBzbGlkZXIuc2V0SW5jcmVtZW50KGNhc2VzW2ldKTsKLQkgIGFzc2VydFRydWUoImNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwgc2xpZGVyLmdldEluY3JlbWVudCgpPT1jYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbXVtKCkgewotCXNsaWRlci5zZXRNYXhpbXVtKDIwMDApOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMjAwMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMjApOwotCWFzc2VydFRydWUoIjpiOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNYXhpbXVtKC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bSgpIHsKLQlzbGlkZXIuc2V0TWluaW11bSg1KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDUpOwotCXNsaWRlci5zZXRNaW5pbXVtKDIwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpIHsKLQlpbnRbXSBjYXNlcyA9IHsxLCAxMCwgMTAwMDB9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBzbGlkZXIuc2V0UGFnZUluY3JlbWVudChjYXNlc1tpXSk7Ci0JICBhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIHNsaWRlci5nZXRQYWdlSW5jcmVtZW50KCk9PWNhc2VzW2ldKTsKLQl9IAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0U2VsZWN0aW9uKCk9PSAxMCk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGh1bWIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGh1bWIoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQlzbGlkZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHNsaWRlci5nZXRFbmFibGVkKCkpOwotCXNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoc2xpZGVyLmdldEVuYWJsZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluY3JlbWVudEkoKSB7Ci0JLy8gdGVzdGVkIGluIGdldEluY3JlbWVudCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0TWF4aW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNYXggIitpbnRBcnJheVswXSsgdmFsdWVTdHJpbmcsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCkgewotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRNaW5pbXVtKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldE1pbiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpIHsKLQkgc2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMyk7Ci0JIGFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRQYWdlSW5jcmVtZW50KCk9PSAzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldFNlbCAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRodW1iSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRUaHVtYlZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldFRodW1iKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldFRobWIgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWYWx1ZXNJSUlJSUkoKSB7Ci0Jc2xpZGVyLnNldFZhbHVlcygxMCwgMTAsIDUwLCAyLCA1LCAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldFNlbGVjdGlvbigpID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzbGlkZXIuZ2V0TWluaW11bSgpID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDUwKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzbGlkZXIuZ2V0VGh1bWIoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzbGlkZXIuZ2V0SW5jcmVtZW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc2xpZGVyLmdldFBhZ2VJbmNyZW1lbnQoKSA9PSAxMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGh1bWIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUaHVtYkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZhbHVlc0lJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQXJyb3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbmNyZW1lbnQiKSkgdGVzdF9nZXRJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1heGltdW0iKSkgdGVzdF9nZXRNYXhpbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbXVtIikpIHRlc3RfZ2V0TWluaW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpKSB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGh1bWIiKSkgdGVzdF9nZXRUaHVtYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEluY3JlbWVudEkiKSkgdGVzdF9zZXRJbmNyZW1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNYXhpbXVtSSIpKSB0ZXN0X3NldE1heGltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtSSIpKSB0ZXN0X3NldE1pbmltdW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpKSB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGh1bWJJIikpIHRlc3Rfc2V0VGh1bWJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKSkgdGVzdF9zZXRWYWx1ZXNJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfQXJyb3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1RodW1iU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2xpZGVyLgotfQotCi1TbGlkZXIgc2xpZGVyOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgcmVwb3J0KFN0cmluZyBjYWxsLCBpbnQgc2V0LCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCS8vIFVuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkvLyBzdG9wcGluZy4KLS8vCWlmIChzbGlkZXIuZ2V0TWluaW11bSgpICE9IG1pbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldE1pbmltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2xpZGVyLmdldE1heGltdW0oKSAhPSBtYXhFeHBlY3RlZCl7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldE1heGltdW0oKSk7Ci0vLwl9Ci0vLwlpZiAoc2xpZGVyLmdldFNlbGVjdGlvbigpICE9IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogU2VsZWN0aW9uIEV4cGVjdGVkOiAiICsgc2VsZWN0aW9uRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzbGlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRUaHVtYigpICE9IHRodW1iRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBUaHVtYiBFeHBlY3RlZDogIiArIHRodW1iRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzbGlkZXIuZ2V0VGh1bWIoKSk7Ci0vLwl9Ci0JY2hlY2soY2FsbCwgbWluRXhwZWN0ZWQsIG1heEV4cGVjdGVkLCBzZWxlY3Rpb25FeHBlY3RlZCwgdGh1bWJFeHBlY3RlZCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIGNhbGwsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtYXggIiwgbWF4RXhwZWN0ZWQsIHNsaWRlci5nZXRNYXhpbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgbWluICIsIG1pbkV4cGVjdGVkLCBzbGlkZXIuZ2V0TWluaW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHNlbCAiLCBzZWxlY3Rpb25FeHBlY3RlZCwgc2xpZGVyLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIHRobWIgIiwgdGh1bWJFeHBlY3RlZCwgc2xpZGVyLmdldFRodW1iKCkpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFRodW1iVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxfSwKLXsyLCAxMCwgMTAwLCA1MCwgMn0sCi17MywgMTAsIDEwMCwgNTAsIDN9LAotezQsIDEwLCAxMDAsIDUwLCA0fSwKLXs1LCAxMCwgMTAwLCA1MCwgNX0sCi17NiwgMTAsIDEwMCwgNTAsIDZ9LAotezcsIDEwLCAxMDAsIDUwLCA3fSwKLXs4LCAxMCwgMTAwLCA1MCwgOH0sCi17OSwgMTAsIDEwMCwgNTAsIDl9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTAwLCA1MCwgMTF9LAotezEyLCAxMCwgMTAwLCA1MCwgMTJ9LAotezEzLCAxMCwgMTAwLCA1MCwgMTN9LAotezE0LCAxMCwgMTAwLCA1MCwgMTR9LAotezE1LCAxMCwgMTAwLCA1MCwgMTV9LAotezE2LCAxMCwgMTAwLCA1MCwgMTZ9LAotezE3LCAxMCwgMTAwLCA1MCwgMTd9LAotezE4LCAxMCwgMTAwLCA1MCwgMTh9LAotezE5LCAxMCwgMTAwLCA1MCwgMTl9LAotezIwLCAxMCwgMTAwLCA1MCwgMjB9LAotezIxLCAxMCwgMTAwLCA1MCwgMjF9LAotezIyLCAxMCwgMTAwLCA1MCwgMjJ9LAotezIzLCAxMCwgMTAwLCA1MCwgMjN9LAotezI0LCAxMCwgMTAwLCA1MCwgMjR9LAotezI1LCAxMCwgMTAwLCA1MCwgMjV9LAotezI2LCAxMCwgMTAwLCA1MCwgMjZ9LAotezI3LCAxMCwgMTAwLCA1MCwgMjd9LAotezI4LCAxMCwgMTAwLCA1MCwgMjh9LAotezI5LCAxMCwgMTAwLCA1MCwgMjl9LAotezMwLCAxMCwgMTAwLCA1MCwgMzB9LAotezMxLCAxMCwgMTAwLCA1MCwgMzF9LAotezMyLCAxMCwgMTAwLCA1MCwgMzJ9LAotezMzLCAxMCwgMTAwLCA1MCwgMzN9LAotezM0LCAxMCwgMTAwLCA1MCwgMzR9LAotezM1LCAxMCwgMTAwLCA1MCwgMzV9LAotezM2LCAxMCwgMTAwLCA1MCwgMzZ9LAotezM3LCAxMCwgMTAwLCA1MCwgMzd9LAotezM4LCAxMCwgMTAwLCA1MCwgMzh9LAotezM5LCAxMCwgMTAwLCA1MCwgMzl9LAotezQwLCAxMCwgMTAwLCA1MCwgNDB9LAotezQxLCAxMCwgMTAwLCA1MCwgNDF9LAotezQyLCAxMCwgMTAwLCA1MCwgNDJ9LAotezQzLCAxMCwgMTAwLCA1MCwgNDN9LAotezQ0LCAxMCwgMTAwLCA1MCwgNDR9LAotezQ1LCAxMCwgMTAwLCA1MCwgNDV9LAotezQ2LCAxMCwgMTAwLCA1MCwgNDZ9LAotezQ3LCAxMCwgMTAwLCA1MCwgNDd9LAotezQ4LCAxMCwgMTAwLCA1MCwgNDh9LAotezQ5LCAxMCwgMTAwLCA1MCwgNDl9LAotezUwLCAxMCwgMTAwLCA1MCwgNTB9LAotezUxLCAxMCwgMTAwLCA0OSwgNTF9LAotezUyLCAxMCwgMTAwLCA0OCwgNTJ9LAotezUzLCAxMCwgMTAwLCA0NywgNTN9LAotezU0LCAxMCwgMTAwLCA0NiwgNTR9LAotezU1LCAxMCwgMTAwLCA0NSwgNTV9LAotezU2LCAxMCwgMTAwLCA0NCwgNTZ9LAotezU3LCAxMCwgMTAwLCA0MywgNTd9LAotezU4LCAxMCwgMTAwLCA0MiwgNTh9LAotezU5LCAxMCwgMTAwLCA0MSwgNTl9LAotezYwLCAxMCwgMTAwLCA0MCwgNjB9LAotezYxLCAxMCwgMTAwLCAzOSwgNjF9LAotezYyLCAxMCwgMTAwLCAzOCwgNjJ9LAotezYzLCAxMCwgMTAwLCAzNywgNjN9LAotezY0LCAxMCwgMTAwLCAzNiwgNjR9LAotezY1LCAxMCwgMTAwLCAzNSwgNjV9LAotezY2LCAxMCwgMTAwLCAzNCwgNjZ9LAotezY3LCAxMCwgMTAwLCAzMywgNjd9LAotezY4LCAxMCwgMTAwLCAzMiwgNjh9LAotezY5LCAxMCwgMTAwLCAzMSwgNjl9LAotezcwLCAxMCwgMTAwLCAzMCwgNzB9LAotezcxLCAxMCwgMTAwLCAyOSwgNzF9LAotezcyLCAxMCwgMTAwLCAyOCwgNzJ9LAotezczLCAxMCwgMTAwLCAyNywgNzN9LAotezc0LCAxMCwgMTAwLCAyNiwgNzR9LAotezc1LCAxMCwgMTAwLCAyNSwgNzV9LAotezc2LCAxMCwgMTAwLCAyNCwgNzZ9LAotezc3LCAxMCwgMTAwLCAyMywgNzd9LAotezc4LCAxMCwgMTAwLCAyMiwgNzh9LAotezc5LCAxMCwgMTAwLCAyMSwgNzl9LAotezgwLCAxMCwgMTAwLCAyMCwgODB9LAotezgxLCAxMCwgMTAwLCAxOSwgODF9LAotezgyLCAxMCwgMTAwLCAxOCwgODJ9LAotezgzLCAxMCwgMTAwLCAxNywgODN9LAotezg0LCAxMCwgMTAwLCAxNiwgODR9LAotezg1LCAxMCwgMTAwLCAxNSwgODV9LAotezg2LCAxMCwgMTAwLCAxNCwgODZ9LAotezg3LCAxMCwgMTAwLCAxMywgODd9LAotezg4LCAxMCwgMTAwLCAxMiwgODh9LAotezg5LCAxMCwgMTAwLCAxMSwgODl9LAotezkwLCAxMCwgMTAwLCAxMCwgOTB9LAotezkxLCAxMCwgMTAwLCAxMCwgOTB9LAotezkyLCAxMCwgMTAwLCAxMCwgOTB9LAotezkzLCAxMCwgMTAwLCAxMCwgOTB9LAotezk0LCAxMCwgMTAwLCAxMCwgOTB9LAotezk1LCAxMCwgMTAwLCAxMCwgOTB9LAotezk2LCAxMCwgMTAwLCAxMCwgOTB9LAotezk3LCAxMCwgMTAwLCAxMCwgOTB9LAotezk4LCAxMCwgMTAwLCAxMCwgOTB9LAotezk5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA1LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA4LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTExLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE0LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE3LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyNCwgMTAsIDEwMCwgMTAsIDkwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0TWluaW11bVZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMCwgMTAwLCA1MCwgMTB9LAotezEsIDEsIDEwMCwgNTAsIDEwfSwKLXsyLCAyLCAxMDAsIDUwLCAxMH0sCi17MywgMywgMTAwLCA1MCwgMTB9LAotezQsIDQsIDEwMCwgNTAsIDEwfSwKLXs1LCA1LCAxMDAsIDUwLCAxMH0sCi17NiwgNiwgMTAwLCA1MCwgMTB9LAotezcsIDcsIDEwMCwgNTAsIDEwfSwKLXs4LCA4LCAxMDAsIDUwLCAxMH0sCi17OSwgOSwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMSwgMTAwLCA1MCwgMTB9LAotezEyLCAxMiwgMTAwLCA1MCwgMTB9LAotezEzLCAxMywgMTAwLCA1MCwgMTB9LAotezE0LCAxNCwgMTAwLCA1MCwgMTB9LAotezE1LCAxNSwgMTAwLCA1MCwgMTB9LAotezE2LCAxNiwgMTAwLCA1MCwgMTB9LAotezE3LCAxNywgMTAwLCA1MCwgMTB9LAotezE4LCAxOCwgMTAwLCA1MCwgMTB9LAotezE5LCAxOSwgMTAwLCA1MCwgMTB9LAotezIwLCAyMCwgMTAwLCA1MCwgMTB9LAotezIxLCAyMSwgMTAwLCA1MCwgMTB9LAotezIyLCAyMiwgMTAwLCA1MCwgMTB9LAotezIzLCAyMywgMTAwLCA1MCwgMTB9LAotezI0LCAyNCwgMTAwLCA1MCwgMTB9LAotezI1LCAyNSwgMTAwLCA1MCwgMTB9LAotezI2LCAyNiwgMTAwLCA1MCwgMTB9LAotezI3LCAyNywgMTAwLCA1MCwgMTB9LAotezI4LCAyOCwgMTAwLCA1MCwgMTB9LAotezI5LCAyOSwgMTAwLCA1MCwgMTB9LAotezMwLCAzMCwgMTAwLCA1MCwgMTB9LAotezMxLCAzMSwgMTAwLCA1MCwgMTB9LAotezMyLCAzMiwgMTAwLCA1MCwgMTB9LAotezMzLCAzMywgMTAwLCA1MCwgMTB9LAotezM0LCAzNCwgMTAwLCA1MCwgMTB9LAotezM1LCAzNSwgMTAwLCA1MCwgMTB9LAotezM2LCAzNiwgMTAwLCA1MCwgMTB9LAotezM3LCAzNywgMTAwLCA1MCwgMTB9LAotezM4LCAzOCwgMTAwLCA1MCwgMTB9LAotezM5LCAzOSwgMTAwLCA1MCwgMTB9LAotezQwLCA0MCwgMTAwLCA1MCwgMTB9LAotezQxLCA0MSwgMTAwLCA1MCwgMTB9LAotezQyLCA0MiwgMTAwLCA1MCwgMTB9LAotezQzLCA0MywgMTAwLCA1MCwgMTB9LAotezQ0LCA0NCwgMTAwLCA1MCwgMTB9LAotezQ1LCA0NSwgMTAwLCA1MCwgMTB9LAotezQ2LCA0NiwgMTAwLCA1MCwgMTB9LAotezQ3LCA0NywgMTAwLCA1MCwgMTB9LAotezQ4LCA0OCwgMTAwLCA1MCwgMTB9LAotezQ5LCA0OSwgMTAwLCA1MCwgMTB9LAotezUwLCA1MCwgMTAwLCA1MCwgMTB9LAotezUxLCA1MSwgMTAwLCA1MSwgMTB9LAotezUyLCA1MiwgMTAwLCA1MiwgMTB9LAotezUzLCA1MywgMTAwLCA1MywgMTB9LAotezU0LCA1NCwgMTAwLCA1NCwgMTB9LAotezU1LCA1NSwgMTAwLCA1NSwgMTB9LAotezU2LCA1NiwgMTAwLCA1NiwgMTB9LAotezU3LCA1NywgMTAwLCA1NywgMTB9LAotezU4LCA1OCwgMTAwLCA1OCwgMTB9LAotezU5LCA1OSwgMTAwLCA1OSwgMTB9LAotezYwLCA2MCwgMTAwLCA2MCwgMTB9LAotezYxLCA2MSwgMTAwLCA2MSwgMTB9LAotezYyLCA2MiwgMTAwLCA2MiwgMTB9LAotezYzLCA2MywgMTAwLCA2MywgMTB9LAotezY0LCA2NCwgMTAwLCA2NCwgMTB9LAotezY1LCA2NSwgMTAwLCA2NSwgMTB9LAotezY2LCA2NiwgMTAwLCA2NiwgMTB9LAotezY3LCA2NywgMTAwLCA2NywgMTB9LAotezY4LCA2OCwgMTAwLCA2OCwgMTB9LAotezY5LCA2OSwgMTAwLCA2OSwgMTB9LAotezcwLCA3MCwgMTAwLCA3MCwgMTB9LAotezcxLCA3MSwgMTAwLCA3MSwgMTB9LAotezcyLCA3MiwgMTAwLCA3MiwgMTB9LAotezczLCA3MywgMTAwLCA3MywgMTB9LAotezc0LCA3NCwgMTAwLCA3NCwgMTB9LAotezc1LCA3NSwgMTAwLCA3NSwgMTB9LAotezc2LCA3NiwgMTAwLCA3NiwgMTB9LAotezc3LCA3NywgMTAwLCA3NywgMTB9LAotezc4LCA3OCwgMTAwLCA3OCwgMTB9LAotezc5LCA3OSwgMTAwLCA3OSwgMTB9LAotezgwLCA4MCwgMTAwLCA4MCwgMTB9LAotezgxLCA4MSwgMTAwLCA4MSwgMTB9LAotezgyLCA4MiwgMTAwLCA4MiwgMTB9LAotezgzLCA4MywgMTAwLCA4MywgMTB9LAotezg0LCA4NCwgMTAwLCA4NCwgMTB9LAotezg1LCA4NSwgMTAwLCA4NSwgMTB9LAotezg2LCA4NiwgMTAwLCA4NiwgMTB9LAotezg3LCA4NywgMTAwLCA4NywgMTB9LAotezg4LCA4OCwgMTAwLCA4OCwgMTB9LAotezg5LCA4OSwgMTAwLCA4OSwgMTB9LAotezkwLCA5MCwgMTAwLCA5MCwgMTB9LAotezkxLCA5MSwgMTAwLCA5MSwgOX0sCi17OTIsIDkyLCAxMDAsIDkyLCA4fSwKLXs5MywgOTMsIDEwMCwgOTMsIDd9LAotezk0LCA5NCwgMTAwLCA5NCwgNn0sCi17OTUsIDk1LCAxMDAsIDk1LCA1fSwKLXs5NiwgOTYsIDEwMCwgOTYsIDR9LAotezk3LCA5NywgMTAwLCA5NywgM30sCi17OTgsIDk4LCAxMDAsIDk4LCAyfSwKLXs5OSwgOTksIDEwMCwgOTksIDF9LAotezEwMCwgMTAsIDEwMCwgNTAsIDEwfSwgCi17MTAxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotezExNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsyLCAxMCwgMTAwLCA1MCwgMTB9LAotezMsIDEwLCAxMDAsIDUwLCAxMH0sCi17NCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1LCAxMCwgMTAwLCA1MCwgMTB9LAotezYsIDEwLCAxMDAsIDUwLCAxMH0sCi17NywgMTAsIDEwMCwgNTAsIDEwfSwKLXs4LCAxMCwgMTAwLCA1MCwgMTB9LAotezksIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDEwLCAxMSwgMTAsIDF9LAotezEyLCAxMCwgMTIsIDEwLCAyfSwKLXsxMywgMTAsIDEzLCAxMCwgM30sCi17MTQsIDEwLCAxNCwgMTAsIDR9LAotezE1LCAxMCwgMTUsIDEwLCA1fSwKLXsxNiwgMTAsIDE2LCAxMCwgNn0sCi17MTcsIDEwLCAxNywgMTAsIDd9LAotezE4LCAxMCwgMTgsIDEwLCA4fSwKLXsxOSwgMTAsIDE5LCAxMCwgOX0sCi17MjAsIDEwLCAyMCwgMTAsIDEwfSwKLXsyMSwgMTAsIDIxLCAxMSwgMTB9LAotezIyLCAxMCwgMjIsIDEyLCAxMH0sCi17MjMsIDEwLCAyMywgMTMsIDEwfSwKLXsyNCwgMTAsIDI0LCAxNCwgMTB9LAotezI1LCAxMCwgMjUsIDE1LCAxMH0sCi17MjYsIDEwLCAyNiwgMTYsIDEwfSwKLXsyNywgMTAsIDI3LCAxNywgMTB9LAotezI4LCAxMCwgMjgsIDE4LCAxMH0sCi17MjksIDEwLCAyOSwgMTksIDEwfSwKLXszMCwgMTAsIDMwLCAyMCwgMTB9LAotezMxLCAxMCwgMzEsIDIxLCAxMH0sCi17MzIsIDEwLCAzMiwgMjIsIDEwfSwKLXszMywgMTAsIDMzLCAyMywgMTB9LAotezM0LCAxMCwgMzQsIDI0LCAxMH0sCi17MzUsIDEwLCAzNSwgMjUsIDEwfSwKLXszNiwgMTAsIDM2LCAyNiwgMTB9LAotezM3LCAxMCwgMzcsIDI3LCAxMH0sCi17MzgsIDEwLCAzOCwgMjgsIDEwfSwKLXszOSwgMTAsIDM5LCAyOSwgMTB9LAotezQwLCAxMCwgNDAsIDMwLCAxMH0sCi17NDEsIDEwLCA0MSwgMzEsIDEwfSwKLXs0MiwgMTAsIDQyLCAzMiwgMTB9LAotezQzLCAxMCwgNDMsIDMzLCAxMH0sCi17NDQsIDEwLCA0NCwgMzQsIDEwfSwKLXs0NSwgMTAsIDQ1LCAzNSwgMTB9LAotezQ2LCAxMCwgNDYsIDM2LCAxMH0sCi17NDcsIDEwLCA0NywgMzcsIDEwfSwKLXs0OCwgMTAsIDQ4LCAzOCwgMTB9LAotezQ5LCAxMCwgNDksIDM5LCAxMH0sCi17NTAsIDEwLCA1MCwgNDAsIDEwfSwKLXs1MSwgMTAsIDUxLCA0MSwgMTB9LAotezUyLCAxMCwgNTIsIDQyLCAxMH0sCi17NTMsIDEwLCA1MywgNDMsIDEwfSwKLXs1NCwgMTAsIDU0LCA0NCwgMTB9LAotezU1LCAxMCwgNTUsIDQ1LCAxMH0sCi17NTYsIDEwLCA1NiwgNDYsIDEwfSwKLXs1NywgMTAsIDU3LCA0NywgMTB9LAotezU4LCAxMCwgNTgsIDQ4LCAxMH0sCi17NTksIDEwLCA1OSwgNDksIDEwfSwKLXs2MCwgMTAsIDYwLCA1MCwgMTB9LAotezYxLCAxMCwgNjEsIDUwLCAxMH0sCi17NjIsIDEwLCA2MiwgNTAsIDEwfSwKLXs2MywgMTAsIDYzLCA1MCwgMTB9LAotezY0LCAxMCwgNjQsIDUwLCAxMH0sCi17NjUsIDEwLCA2NSwgNTAsIDEwfSwKLXs2NiwgMTAsIDY2LCA1MCwgMTB9LAotezY3LCAxMCwgNjcsIDUwLCAxMH0sCi17NjgsIDEwLCA2OCwgNTAsIDEwfSwKLXs2OSwgMTAsIDY5LCA1MCwgMTB9LAotezcwLCAxMCwgNzAsIDUwLCAxMH0sCi17NzEsIDEwLCA3MSwgNTAsIDEwfSwKLXs3MiwgMTAsIDcyLCA1MCwgMTB9LAotezczLCAxMCwgNzMsIDUwLCAxMH0sCi17NzQsIDEwLCA3NCwgNTAsIDEwfSwKLXs3NSwgMTAsIDc1LCA1MCwgMTB9LAotezc2LCAxMCwgNzYsIDUwLCAxMH0sCi17NzcsIDEwLCA3NywgNTAsIDEwfSwKLXs3OCwgMTAsIDc4LCA1MCwgMTB9LAotezc5LCAxMCwgNzksIDUwLCAxMH0sCi17ODAsIDEwLCA4MCwgNTAsIDEwfSwKLXs4MSwgMTAsIDgxLCA1MCwgMTB9LAotezgyLCAxMCwgODIsIDUwLCAxMH0sCi17ODMsIDEwLCA4MywgNTAsIDEwfSwKLXs4NCwgMTAsIDg0LCA1MCwgMTB9LAotezg1LCAxMCwgODUsIDUwLCAxMH0sCi17ODYsIDEwLCA4NiwgNTAsIDEwfSwKLXs4NywgMTAsIDg3LCA1MCwgMTB9LAotezg4LCAxMCwgODgsIDUwLCAxMH0sCi17ODksIDEwLCA4OSwgNTAsIDEwfSwKLXs5MCwgMTAsIDkwLCA1MCwgMTB9LAotezkxLCAxMCwgOTEsIDUwLCAxMH0sCi17OTIsIDEwLCA5MiwgNTAsIDEwfSwKLXs5MywgMTAsIDkzLCA1MCwgMTB9LAotezk0LCAxMCwgOTQsIDUwLCAxMH0sCi17OTUsIDEwLCA5NSwgNTAsIDEwfSwKLXs5NiwgMTAsIDk2LCA1MCwgMTB9LAotezk3LCAxMCwgOTcsIDUwLCAxMH0sCi17OTgsIDEwLCA5OCwgNTAsIDEwfSwKLXs5OSwgMTAsIDk5LCA1MCwgMTB9LAotezEwMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDEsIDEwLCAxMDEsIDUwLCAxMH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgMTB9LAotezEwMywgMTAsIDEwMywgNTAsIDEwfSwKLXsxMDQsIDEwLCAxMDQsIDUwLCAxMH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgMTB9LAotezEwNiwgMTAsIDEwNiwgNTAsIDEwfSwKLXsxMDcsIDEwLCAxMDcsIDUwLCAxMH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgMTB9LAotezEwOSwgMTAsIDEwOSwgNTAsIDEwfSwKLXsxMTAsIDEwLCAxMTAsIDUwLCAxMH0sCi17MTExLCAxMCwgMTExLCA1MCwgMTB9LAotezExMiwgMTAsIDExMiwgNTAsIDEwfSwKLXsxMTMsIDEwLCAxMTMsIDUwLCAxMH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgMTB9LAotezExNSwgMTAsIDExNSwgNTAsIDEwfSwKLXsxMTYsIDEwLCAxMTYsIDUwLCAxMH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgMTB9LAotezExOCwgMTAsIDExOCwgNTAsIDEwfSwKLXsxMTksIDEwLCAxMTksIDUwLCAxMH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgMTB9LAotezEyMSwgMTAsIDEyMSwgNTAsIDEwfSwKLXsxMjIsIDEwLCAxMjIsIDUwLCAxMH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgMTB9LAotezEyNCwgMTAsIDEyNCwgNTAsIDEwfSwKLX07Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0KLQlzbGlkZXIuc2V0TWF4aW11bSgxMDApOwotCXNsaWRlci5zZXRNaW5pbXVtKDEwKTsKLQlzbGlkZXIuc2V0VGh1bWIoMTApOwotCXNsaWRlci5zZXRTZWxlY3Rpb24oNTApOwotCi19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTExLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNywgMTAsIDEwMCwgMTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXswLCAxMCwgMTAwLCAxMCwgMTB9LAotezEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MiwgMTAsIDEwMCwgMTAsIDEwfSwKLXszLCAxMCwgMTAwLCAxMCwgMTB9LAotezQsIDEwLCAxMDAsIDEwLCAxMH0sCi17NSwgMTAsIDEwMCwgMTAsIDEwfSwKLXs2LCAxMCwgMTAwLCAxMCwgMTB9LAotezcsIDEwLCAxMDAsIDEwLCAxMH0sCi17OCwgMTAsIDEwMCwgMTAsIDEwfSwKLXs5LCAxMCwgMTAwLCAxMCwgMTB9LAotezEwLCAxMCwgMTAwLCAxMCwgMTB9LAotezExLCAxMCwgMTAwLCAxMSwgMTB9LAotezEyLCAxMCwgMTAwLCAxMiwgMTB9LAotezEzLCAxMCwgMTAwLCAxMywgMTB9LAotezE0LCAxMCwgMTAwLCAxNCwgMTB9LAotezE1LCAxMCwgMTAwLCAxNSwgMTB9LAotezE2LCAxMCwgMTAwLCAxNiwgMTB9LAotezE3LCAxMCwgMTAwLCAxNywgMTB9LAotezE4LCAxMCwgMTAwLCAxOCwgMTB9LAotezE5LCAxMCwgMTAwLCAxOSwgMTB9LAotezIwLCAxMCwgMTAwLCAyMCwgMTB9LAotezIxLCAxMCwgMTAwLCAyMSwgMTB9LAotezIyLCAxMCwgMTAwLCAyMiwgMTB9LAotezIzLCAxMCwgMTAwLCAyMywgMTB9LAotezI0LCAxMCwgMTAwLCAyNCwgMTB9LAotezI1LCAxMCwgMTAwLCAyNSwgMTB9LAotezI2LCAxMCwgMTAwLCAyNiwgMTB9LAotezI3LCAxMCwgMTAwLCAyNywgMTB9LAotezI4LCAxMCwgMTAwLCAyOCwgMTB9LAotezI5LCAxMCwgMTAwLCAyOSwgMTB9LAotezMwLCAxMCwgMTAwLCAzMCwgMTB9LAotezMxLCAxMCwgMTAwLCAzMSwgMTB9LAotezMyLCAxMCwgMTAwLCAzMiwgMTB9LAotezMzLCAxMCwgMTAwLCAzMywgMTB9LAotezM0LCAxMCwgMTAwLCAzNCwgMTB9LAotezM1LCAxMCwgMTAwLCAzNSwgMTB9LAotezM2LCAxMCwgMTAwLCAzNiwgMTB9LAotezM3LCAxMCwgMTAwLCAzNywgMTB9LAotezM4LCAxMCwgMTAwLCAzOCwgMTB9LAotezM5LCAxMCwgMTAwLCAzOSwgMTB9LAotezQwLCAxMCwgMTAwLCA0MCwgMTB9LAotezQxLCAxMCwgMTAwLCA0MSwgMTB9LAotezQyLCAxMCwgMTAwLCA0MiwgMTB9LAotezQzLCAxMCwgMTAwLCA0MywgMTB9LAotezQ0LCAxMCwgMTAwLCA0NCwgMTB9LAotezQ1LCAxMCwgMTAwLCA0NSwgMTB9LAotezQ2LCAxMCwgMTAwLCA0NiwgMTB9LAotezQ3LCAxMCwgMTAwLCA0NywgMTB9LAotezQ4LCAxMCwgMTAwLCA0OCwgMTB9LAotezQ5LCAxMCwgMTAwLCA0OSwgMTB9LAotezUwLCAxMCwgMTAwLCA1MCwgMTB9LAotezUxLCAxMCwgMTAwLCA1MSwgMTB9LAotezUyLCAxMCwgMTAwLCA1MiwgMTB9LAotezUzLCAxMCwgMTAwLCA1MywgMTB9LAotezU0LCAxMCwgMTAwLCA1NCwgMTB9LAotezU1LCAxMCwgMTAwLCA1NSwgMTB9LAotezU2LCAxMCwgMTAwLCA1NiwgMTB9LAotezU3LCAxMCwgMTAwLCA1NywgMTB9LAotezU4LCAxMCwgMTAwLCA1OCwgMTB9LAotezU5LCAxMCwgMTAwLCA1OSwgMTB9LAotezYwLCAxMCwgMTAwLCA2MCwgMTB9LAotezYxLCAxMCwgMTAwLCA2MSwgMTB9LAotezYyLCAxMCwgMTAwLCA2MiwgMTB9LAotezYzLCAxMCwgMTAwLCA2MywgMTB9LAotezY0LCAxMCwgMTAwLCA2NCwgMTB9LAotezY1LCAxMCwgMTAwLCA2NSwgMTB9LAotezY2LCAxMCwgMTAwLCA2NiwgMTB9LAotezY3LCAxMCwgMTAwLCA2NywgMTB9LAotezY4LCAxMCwgMTAwLCA2OCwgMTB9LAotezY5LCAxMCwgMTAwLCA2OSwgMTB9LAotezcwLCAxMCwgMTAwLCA3MCwgMTB9LAotezcxLCAxMCwgMTAwLCA3MSwgMTB9LAotezcyLCAxMCwgMTAwLCA3MiwgMTB9LAotezczLCAxMCwgMTAwLCA3MywgMTB9LAotezc0LCAxMCwgMTAwLCA3NCwgMTB9LAotezc1LCAxMCwgMTAwLCA3NSwgMTB9LAotezc2LCAxMCwgMTAwLCA3NiwgMTB9LAotezc3LCAxMCwgMTAwLCA3NywgMTB9LAotezc4LCAxMCwgMTAwLCA3OCwgMTB9LAotezc5LCAxMCwgMTAwLCA3OSwgMTB9LAotezgwLCAxMCwgMTAwLCA4MCwgMTB9LAotezgxLCAxMCwgMTAwLCA4MSwgMTB9LAotezgyLCAxMCwgMTAwLCA4MiwgMTB9LAotezgzLCAxMCwgMTAwLCA4MywgMTB9LAotezg0LCAxMCwgMTAwLCA4NCwgMTB9LAotezg1LCAxMCwgMTAwLCA4NSwgMTB9LAotezg2LCAxMCwgMTAwLCA4NiwgMTB9LAotezg3LCAxMCwgMTAwLCA4NywgMTB9LAotezg4LCAxMCwgMTAwLCA4OCwgMTB9LAotezg5LCAxMCwgMTAwLCA4OSwgMTB9LAotezkwLCAxMCwgMTAwLCA5MCwgMTB9LAotezkxLCAxMCwgMTAwLCA5MCwgMTB9LAotezkyLCAxMCwgMTAwLCA5MCwgMTB9LAotezkzLCAxMCwgMTAwLCA5MCwgMTB9LAotezk0LCAxMCwgMTAwLCA5MCwgMTB9LAotezk1LCAxMCwgMTAwLCA5MCwgMTB9LAotezk2LCAxMCwgMTAwLCA5MCwgMTB9LAotezk3LCAxMCwgMTAwLCA5MCwgMTB9LAotezk4LCAxMCwgMTAwLCA5MCwgMTB9LAotezk5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA5MCwgMTB9LAotezExOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgOTAsIDEwfSwKLX07Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQXJyb3dTZWxlY3Rpb24oKSB7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHNsaWRlci5nZXRTaXplKCkueC0xMCwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDQ1LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDI3LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoOSwgNSwgMzAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWJmNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlN5bmNocm9uaXplcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3luY2hyb25pemVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKSB7Ci0JLy8gdGVzdGVkIGluIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS50ZXN0X3NldFN5bmNocm9uaXplckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTIxMjRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYkZvbGRlcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk9PWkpOwotCSAgCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArU3RyaW5nLnZhbHVlT2YoaSksIHRhYkZvbGRlci5nZXRJdGVtKGkpLmVxdWFscyhpdGVtc1tpXSkpOwotCX0KLQl0cnkgewotCQl0YWJGb2xkZXIuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYkZvbGRlci5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQl0YWJGb2xkZXIuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYkZvbGRlci5nZXRJdGVtcygpLmxlbmd0aCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotCQotCXRhYkZvbGRlci5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLQotCXRhYkZvbGRlci5nZXRJdGVtcygpWzNdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldEl0ZW1zKCkpOwotCi0JdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRhYkl0ZW1bXSB0aXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpWzBdID09IHRpc1swXSk7CQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaSk7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKClbMF09PXRpc1tpXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQkJCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTApOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydFRydWUoIjpiOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0yKTsKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09MCk7Ci0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtc1syXSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVGFiSXRlbVtdIHRpcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdGFiRm9sZGVyLmluZGV4T2YodGlzW2ldKT09aSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdHJ5IHsKLQkJCXRhYkZvbGRlci5pbmRleE9mKG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFiSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7CQotCW51bWJlciA9IDIwOwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JLy9hbm90aGVyIHRhYkZvbGRlcgotCVRhYkZvbGRlciB0YWJGb2xkZXJfMiA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCVRhYkl0ZW1bXSBpdGVtc18yID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXJfMiwgMCk7Ci0JCWl0ZW1zXzJbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRUcnVlKCI6YToiICsgU3RyaW5nLnZhbHVlT2YoaSksIHRhYkZvbGRlci5pbmRleE9mKGl0ZW1zXzJbaV0pPT0tMSk7Ci0JfQotCi0JLy8KLQlUYWJGb2xkZXIgdGFiRm9sZGVyMiA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQlUYWJJdGVtIHRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmluZGV4T2YodGFiSXRlbSkgPT0gLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCSAgCWFzc2VydEVxdWFscygiaT0iICsgaSwgMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQludW1iZXIgPSA1OwotCVRhYkl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oKFRhYkl0ZW0pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigoVGFiSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbNF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1syXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG51bWJlciArIDEpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzFdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLS8vCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oLTEpOwotLy8JYXNzZXJ0RXF1YWxzKDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwkKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotLy8JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigtMik7Ci0vLwlhc3NlcnRFcXVhbHMoMCwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpLmxlbmd0aCk7CQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXNbMF0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117fSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzNdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMl19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMV19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JdHJ5IHsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbiggbmV3IFRhYkl0ZW1bXXtpdGVtc1swXSwgbnVsbH0pOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKCBuZXcgVGFiSXRlbVtde251bGx9KTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzBdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpKSB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0YWJGb2xkZXIpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFiRm9sZGVyKFZlY3RvciBldmVudHMpIHsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRhYkl0ZW0gJiIgKyBpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVGFiSXRlbSBUb29sVGlwIiArIGkpOwotCQlUZXh0IGl0ZW1UZXh0ID0gbmV3IFRleHQodGFiRm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJaXRlbVRleHQuc2V0VGV4dCgiXG5UZXh0IGZvciBUYWJJdGVtICIgKyBpICsgIlxuXG5cbiIpOwotCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0JCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge3RhYkZvbGRlci5nZXRJdGVtKDApfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfUklHSFQsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHRhYkZvbGRlci5nZXRTaXplKCkueC8yLCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQ1RSTCwgMCwgU1dULlBBR0VfRE9XTiwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5DVFJMLCAwLCBTV1QuUEFHRV9VUCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDEpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDUsIDcwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYWQ3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIDApOwotCXRhYkl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXNldFdpZGdldCh0YWJJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJKCkgewotCVRhYkl0ZW0gdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAwKTsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVswXSA9PSB0SXRlbSk7Ci0JCi0JdEl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCQkJCQotCXRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIC0xKTsJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXSA9PSB0SXRlbSk7CQkJCi0JfQotCXRyeSB7Ci0JCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKSArIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0VHJ1ZSgiOmU6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwotCX0KLQl0cnkgewotCQluZXcgVGFiSXRlbShudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0UGFyZW50KCkgPT0gdGFiRm9sZGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9vbFRpcFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29udHJvbCBjb250cm9sID0gbmV3IFRhYmxlKHRhYkZvbGRlciwgU1dULk5VTEwpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwkKLQotCXRhYkl0ZW0uc2V0Q29udHJvbChjb250cm9sKTsKLQlhc3NlcnRUcnVlKCI6YjogIiwgdGFiSXRlbS5nZXRDb250cm9sKCkgPT0gY29udHJvbCk7Ci0KLQl0YWJJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpLmVxdWFscygiZnJlZCIpKTsKLQl0YWJJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKSk7Ci0JdGFiSXRlbS5zZXRUb29sVGlwVGV4dChudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzogIiwgdGFiSXRlbS5nZXRUb29sVGlwVGV4dCgpID09IG51bGwpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGFiRm9sZGVyIHRhYkZvbGRlcjsKLVRhYkl0ZW0gdGFiSXRlbTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4MmFlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsgLy8gYnkgZGVmYXVsdCwgdXNlIG11bHRpLXNlbGVjdCB0YWJsZS4JCi19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3QkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsxLCAzLCA1fSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHs5LCAzLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cnl7Ci0JCXRhYmxlLmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHstMSwgMTAwLCAtMTAwMH0pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsyLCAtMSwgMSwgMTAwLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0yLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10gezIsIC0xLCAxLCAxMDAsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MiwgLTEsIDMsIDEwMCwgMn0pOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezIsIDQsIDUsIDEwfSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDQsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLmRlc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDMpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgxMDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswLCAzLCA2fSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoNywgMTApOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDYsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgxLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMCwgMTApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgtMTAsIDIwMDApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDIwMDAsIC0xMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JCi0JdGFibGUuZGVzZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXItMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JdGFibGUuZGVzZWxlY3QoLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5Db3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uSSgpIHsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgdGFibGUuZ2V0Q29sdW1uKDApKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIHRhYmxlLmdldENvbHVtbigxKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbHVtbjAuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5zKCkgewotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hULCAxKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygyLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzFdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQljb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5PcmRlcigpIHsKLQkvL2luIHRlc3Rfc2V0QUNvbHVtbk9yZGVyJEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCkgewotCS8vIGV4ZWN1dGUgbWV0aG9kIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgdGhlIHZhbHVlIHNpbmNlIGl0IG1heSBiZSBhbnl0aGluZyBpbmNsdWRpbmcgMAotCXRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkgPiAwKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlYWRlclZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iKyBqLCBjYXNlc1tqXSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7CQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IisgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IEl0ZW0gaGVpZ2h0IDw9IDAiLCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlhc3NlcnRUcnVlKCI6YjogSXRlbSBoZWlnaHQgPD0gMCIsIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdGFibGUuZ2V0SXRlbShpKSk7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoImk9IiArIGksIGl0ZW1zW2ldLCB0YWJsZS5nZXRJdGVtKGkpKTsKLQl9Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQkJdGkuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImo9IiArIGogKyAiLCBpPSIgKyBpLCBTdHJpbmcudmFsdWVPZihpKSwgaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLQkJfQotCQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0JCi0JLy8gbm90ZSBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaj0iICsgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJqPSIgKyBqICsgIiwgaT0iICsgaSwgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVzVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRMaW5lc1Zpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1swXSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXNbMl0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1sxMF0pOwotCWFzc2VydEVxdWFscygxMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoLTEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhudW1iZXIgLSAxLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoLTEsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgMTAsIG51bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsgLy8gMTAgPCBudW1iZXIKLQotCWludFtdIGFsbCA9IG5ldyBpbnRbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXI7IGkrKykKLQkJYWxsW2ldPWk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGFsbCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117bnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcEluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCWludCBudW1iZXIgPSAyMDsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdGFibGUuaW5kZXhPZihpdGVtc1tpXSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdHJ5IHsKLQkJCXRhYmxlLmluZGV4T2YoKFRhYmxlSXRlbSludWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYmxlSXRlbSA9PSBudWxsIik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvLyBhbm90aGVyIHRhYmxlCi0JVGFibGUgdGFibGVfMiA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JVGFibGVJdGVtW10gaXRlbXNfMiA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCAtMSwgdGFibGUuaW5kZXhPZihpdGVtc18yW2ldKSk7Ci0JfQotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQludW1iZXIgPSAyMDsKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaSwgdGFibGUuaW5kZXhPZihpdGVtc1tpXSkpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0YWJsZS5pbmRleE9mKChUYWJsZUl0ZW0pbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0YWJsZUl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQlpdGVtc1tpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQkvLyBhbm90aGVyIHRhYmxlCi0JdGFibGVfMiA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JaXRlbXNfMiA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zXzJbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCAtMSwgdGFibGUuaW5kZXhPZihpdGVtc18yW2ldKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU2VsZWN0ZWRJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjphOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpZiAoaSA9PSAyIHx8IGkgPT0gbnVtYmVyLTEgfHwgaSA9PSAxMCkKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCB0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQkJZWxzZQotCQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksICF0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQl9Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zWzBdKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWlmIChpID09IDApCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6ZDoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzEwXX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaWYgKGkgPT0gMTApCi0JCQlhc3NlcnRUcnVlKCI6ZToiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjplOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjpmOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZSRJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtcyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIC0xMDAsIDUsIDUsIDIsIDEsIDAsIDAsIDB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudHMiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIG51bWJlciwgNSwgNSwgMiwgMSwgMCwgMCwgMH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50cyIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7fSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCAhaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgaXRlbXNbMl0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCWFzc2VydFRydWUoIjpjOiIsICFpdGVtc1tudW1iZXItMV0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHtudW1iZXItMn0pOwotCWFzc2VydFRydWUoIjpkOiIsIGl0ZW1zW251bWJlci0xXS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydEVxdWFscyhudW1iZXItMiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JYXNzZXJ0VHJ1ZSgiOmU6IiwgIWl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFRydWUoIjpmOiIsIGl0ZW1zWzNdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0zLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlhc3NlcnRUcnVlKCI6ZzoiLCAhaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgaXRlbXNbMF0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTQsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmVBbGwoKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZUFsbCgpOwotCXRhYmxlLnJlbW92ZUFsbCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgtbnVtYmVyLCBudW1iZXIgKyAxMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMiwgMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoMiwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDAsIDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10ge30pOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKC0yMCwgLTEwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhpdGVtcywgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIwLCA0MCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyMDAsIDQwKTsKLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoLTEwLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCXRhYmxlLnJlbW92ZSgxMCwgMik7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0JdGFibGUucmVtb3ZlKDAsIDIpOwotCWFzc2VydEVxdWFscyhudW1iZXIgLSAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDEsIDIwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKG51bWJlciwgbnVtYmVyICsgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQludW1iZXIgPSAxNTsKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7MiwgMSwgMCwgNSwgNX0pOwotCWFzc2VydEVxdWFscyhudW1iZXItNCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3QkSSgpIHsKLQl0cnkgewotCQl0YWJsZS5zZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MiwgMTAsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMCwgMiwgMTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MiwgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10ge251bWJlciwgMCwgbnVtYmVyLTF9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgbnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7bnVtYmVyLCAwLCAtMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MCwgMiwgMTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgCi0JCi0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRyeSB7Ci0JCXRhYmxlLnNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7NCwgNCwgNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMobmV3IGludFtde30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KDcpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgNywgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUJCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDEwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdElJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdCg3KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgMTQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgNyk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg5LCA1KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoLTEwMCwgMTAwMCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0KDAsIDEwMDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg0LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxMCwgMTApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdChudW1iZXItMSwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCBudW1iZXIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgNSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCg1LCA0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCkgewotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFsxXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCi0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXXswLCAxLCAyfSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFswXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLCAxLCAyLCAzfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsIDAsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MywgMCwgMX0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXsyLCAxLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbXSB7MiwgMSwgMH0pOwotCWNvbHVtbjIuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W10gezEsIDB9KTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MCwgMSwgMn0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W117MH0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50WzBdKTsKLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzFdKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUodGFibGUuZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlMi5nZXRDb2x1bW5PcmRlcigpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUyLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMF0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlYWRlclZpc2libGVaKCkgewotCWFzc2VydEZhbHNlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodGFibGUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotCQkvKiBvbmx5IGNhcmJvbiB2ZXJzaW9ucyA+PSAxMC40IHN1cHBvcnQgVGFibGUgbGluZXMgKi8KLQkJYXNzZXJ0RmFsc2UodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydEZhbHNlKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVkcmF3WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRJKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXswLCAzLCAyfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXszLCAyLCAxfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MSwgMiwgM30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezEsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezAsIDQsIDB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezIsIDMsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCi0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiByYW5nZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7bnVtYmVyLTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHtudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7LTF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MCwgMywgMn0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7MywgMiwgMX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7NCwgNCwgNCwgNCwgNCwgNCwgNH0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5zZXRTZWxlY3Rpb24oKFRhYmxlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uIHJhbmdlID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoVGFibGVJdGVtKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zWzBdKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbM10sIGl0ZW1zWzJdLCBpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMl19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCQkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0JdGFibGUuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXszfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigzLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXszLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDQpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIHRhYmxlCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDAsIDEpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigyLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oNSwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMiwgMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDEsIDQpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10gezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigwLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcEluZGV4SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0JdGFibGUuc2hvd1NlbGVjdGlvbigpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uT3JkZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyaWRMaW5lV2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU2VsZWN0ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmUkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lc1Zpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdCRJIikpIHRlc3RfZGVzZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdElJIikpIHRlc3RfZGVzZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uQ291bnQiKSkgdGVzdF9nZXRDb2x1bW5Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uSSIpKSB0ZXN0X2dldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbk9yZGVyIikpIHRlc3RfZ2V0Q29sdW1uT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbnMiKSkgdGVzdF9nZXRDb2x1bW5zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmlkTGluZVdpZHRoIikpIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVySGVpZ2h0IikpIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJWaXNpYmxlIikpIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZXNWaXNpYmxlIikpIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50IikpIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJbmRleCIpKSB0ZXN0X2dldFRvcEluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNTZWxlY3RlZEkiKSkgdGVzdF9pc1NlbGVjdGVkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlJEkiKSkgdGVzdF9yZW1vdmUkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJIikpIHRlc3RfcmVtb3ZlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSUkiKSkgdGVzdF9yZW1vdmVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdCRJIikpIHRlc3Rfc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0SSIpKSB0ZXN0X3NlbGVjdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdElJIikpIHRlc3Rfc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbk9yZGVyJEkiKSkgdGVzdF9zZXRDb2x1bW5PcmRlciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoiKSkgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpKSB0ZXN0X3NldExpbmVzVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kSSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSW5kZXhJIikpIHRlc3Rfc2V0VG9wSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIikpIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICh0YWJsZSAhPSBudWxsKSB0YWJsZS5kaXNwb3NlKCk7Ci0JdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIHNpbmdsZT9TV1QuU0lOR0xFOlNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRhYmxlKTsJCi19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZShWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sICIgKyBjb2wpOwotCQljb2x1bW4uc2V0V2lkdGgoNTApOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29sdW1uLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlmb3IgKGludCByb3cgPSAwOyByb3cgPCAzOyByb3crKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDMFIiICsgcm93LCAiQzFSIiArIHJvdywgIkMyUiIgKyByb3d9KTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSArIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSoyLCAKLSAgICAgICAgICAgIAkJIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkrIHRhYmxlLmdldEl0ZW1IZWlnaHQoKSArIDUsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIDI1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFjMjliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuU0lOR0xFKTsJCQotCXRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7CQotCXNldFdpZGdldCh0YWJsZUNvbHVtbik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbihudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl0YWJsZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBbGlnbm1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QWxpZ25tZW50SQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1vdmVhYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldE1vdmVhYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzaXphYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJlc2l6ZWFibGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0JaW50IHRlc3RXaWR0aCA9IDQyOwotCQotLy8JdHJ5IHsKLS8vCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgtMSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotLy8JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0KLQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKCI6YTogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgMCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSAwKTsKLQotCXRhYmxlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotCi0JdGFibGVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yzogd2lkdGg9IiArIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFjayBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fX07Ci0KLQl0YWJsZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRhYmxlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCXRhYmxlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJ5IHsKLQkJdGFibGVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpIHsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRhYmxlQ29sdW1uLnNldEFsaWdubWVudCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIjpjOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IGFsaWdubWVudCBvZiB0aGUgZmlyc3QgY29sdW1uIiwgCi0JCXRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCWNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULlJJR0hUKTsKLQkKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5DRU5URVIpOwkKLQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNb3ZlYWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IHRydWUpOwotCi0JdGFibGVDb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0YWJsZUNvbHVtbi5nZXRNb3ZlYWJsZSgpID09IGZhbHNlKTsKLQkKLQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGVDb2x1bW4uZ2V0UGFyZW50KCksIFNXVC5OT05FKTsKLQl0YWJsZUNvbHVtbjIuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uMi5nZXRNb3ZlYWJsZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGVDb2x1bW4yLnNldE1vdmVhYmxlKHRydWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB3aWRnZXQgaXMgRGlzcG9zZWQiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHt9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVzaXphYmxlWigpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJsZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgdGFibGVDb2x1bW4uZ2V0VGV4dCgpLCAiIik7Ci0KLQl0YWJsZUNvbHVtbi5zZXRUZXh0KCJ0ZXh0Iik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCB0YWJsZUNvbHVtbi5nZXRUZXh0KCksICJ0ZXh0Iik7Ci0KLQl0cnkgewotCQl0YWJsZUNvbHVtbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2x1bW4gaGVhZGVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TW92ZWFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVzaXphYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbGlnbm1lbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1vdmVhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVzaXphYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNb3ZlYWJsZSIpKSB0ZXN0X2dldE1vdmVhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlc2l6YWJsZSIpKSB0ZXN0X2dldFJlc2l6YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V2lkdGgiKSkgdGVzdF9nZXRXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFjayIpKSB0ZXN0X3BhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1vdmVhYmxlWiIpKSB0ZXN0X3NldE1vdmVhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVzaXphYmxlWiIpKSB0ZXN0X3NldFJlc2l6YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uOwotcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFjYzY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsJCi0JfQotCWFzc2VydEVxdWFscygxMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCA1KTsJCi0JYXNzZXJ0RXF1YWxzKDEyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHNJKCkgewotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8gbm8gY29sdW1ucwotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoxYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwKTsKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiIik7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQkvL2Fzc2VydFRydWUoIjoxZjoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsgLy8gVE9ETyBkb2Vzbid0IHNocmluaz8KLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWg6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotLy8JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOyAvLyBUT0RPIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLSAJCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMyID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoxazoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQkKLQkvLyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCVRhYmxlIHRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUYWJsZUl0ZW0gdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoyYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoyYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwKTsKLQl0YWJsZUl0ZW0yLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJmOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAvLyBUT0RPIGRvZXNuJ3Qgc2hyaW5rPwotCQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtMi5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6Mmk6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7ICAvLyBUT0RPIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLQkKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JdGFibGVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyajoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJrOiIsIGJvdW5kczIud2lkdGggPiBib3VuZHMud2lkdGgpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCS8vIHdpdGggY29sdW1ucwotCQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDIpOwotCWFzc2VydFRydWUoIjozZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozZjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozaToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdGFibGVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNsOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M206IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozbzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNwOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImhlbGxvIiwgIndvcmxkIn0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7bnVsbCwgbnVsbH0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNxOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3I6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoImhlbGxvIik7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNzOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDApOwotCQotCS8vIHdpdGggY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGg6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGo6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQl0YWJsZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGw6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdGFibGVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0gCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NG86IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHA6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImhlbGxvIiwgIndvcmxkIn0pOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHI6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dCgiaGVsbG8iKTsKLQluZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0czoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGVja2VkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldENoZWNrZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JheWVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEdyYXllZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUJvdW5kc0koKSB7Ci0vKioKLSAqIFRlc3Qgd2l0aG91dCBpdGVtIGltYWdlCi0gKi8KLQlSZWN0YW5nbGUgYm91bmRzOwotCVRhYmxlIHRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUYWJsZUl0ZW0gdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTlVMTCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjplOiIsIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7Ci0gCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsJCi0vLwlpbnQgaW1hZ2VXaWR0aCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOwotLy8JaW50IGltYWdlSGVpZ2h0OwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0vLwlpbWFnZUhlaWdodCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKSAtIHRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtLmdldEltYWdlQm91bmRzKDApOwotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA9PSBpbWFnZVdpZHRoICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwkKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsJCi0JCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMi5kaXNwb3NlKCk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTlVMTCk7Ci0vLwlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLS8vCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsgCXRhYmxlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0YWJsZTIuZ2V0SXRlbUhlaWdodCgpIC0gdGFibGUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIHRoZXkgYXJlIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotLy8gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIuZGlzcG9zZSgpOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotCWltYWdlID0gaW1hZ2VzWzFdOwotLy8JaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLS8vCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsKLSAJdGFibGVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0vLwlpbWFnZUhlaWdodCA9IHRhYmxlMi5nZXRJdGVtSGVpZ2h0KCkgLSB0YWJsZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0gCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIGNoZWNrIGJveCBpcyB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLSAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJbmRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlSW5kZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyh0YWJsZSwgdGFibGVJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0SUxKYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEJhY2tncm91bmQoKSwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEJhY2tncm91bmQoKSx0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0YWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotIAlUYWJsZSB0ID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0odCwgU1dULk5VTEwpOwotCXRpLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0aS5nZXRDaGVja2VkKCkpOwotCQotCXRpLnNldENoZWNrZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0Q2hlY2tlZCgpKTsKLQl0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gdGFibGVJdGVtLmdldEZvbnQoKTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdGFibGVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyggdGFibGVJdGVtLmdldEZvbnQoKSkpOwotCi0JdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0Rm9udChmb250KTsKLQkJdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQlhc3NlcnRUcnVlKHRhYmxlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JdGFibGVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCXRhYmxlSXRlbS5zZXRGb250KGZvbnQyKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZShmb250Mi5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250Mi5kaXNwb3NlKCk7Ci0JCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRhYmxlSXRlbS5nZXREaXNwbGF5KCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModGFibGVJdGVtLmdldEZvcmVncm91bmQoKSwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIGJsdWUpOwotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IodGFibGVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQl0cnkgeyAKLQkJdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0JVGFibGUgbmV3VGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRJdGVtID0gbmV3IFRhYmxlSXRlbShuZXdUYWJsZSwwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQluZXdUYWJsZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKHRhYmxlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UoLTEsIG51bGwpOwkJCi0JYXNzZXJ0TnVsbCh0YWJsZUl0ZW0uZ2V0SW1hZ2UoLTEpKTsJCi0JCQotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7CQotIAlTdHJpbmcgdGV4dHNbXSA9IG5ldyBTdHJpbmdbaW1hZ2VzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQl0ZXh0c1tpXSA9IFN0cmluZy52YWx1ZU9mKGkpOwotCX0KLQkKLQkvL3RhYmxlLnNldFRleHQodGV4dHMpOwkJCQkvLyBjcmVhdGUgZW5vdWdoIGNvbHVtbnMgZm9yIFRhYmxlSXRlbS5zZXRJbWFnZShJbWFnZVtdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCB0ZXh0cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KHRleHRzW2ldKTsKLQl9Ci0JdGFibGVJdGVtLnNldEltYWdlKDEsIGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdGFibGVJdGVtLmdldEltYWdlKDEpKTsJCi0gCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpbWFnZXNbaV0sIHRhYmxlSXRlbS5nZXRJbWFnZShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRJbWFnZSgoSW1hZ2UgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbWFnZXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQkJLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRhYmxlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZXNbMV0pOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JaW1hZ2VzWzBdLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQkJdGFibGVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJbmRlbnRJKCkgewotCWlmIChTd3RKdW5pdC5pc0NhcmJvbiB8fCBTd3RKdW5pdC5pc0dUSykgewotCQkvL3NldEltYWdlSW5kZW50IG5vdCBpbXBsZW1lbnRlZCBvbiBDYXJib24KLQkJdGFibGVJdGVtLnNldEltYWdlSW5kZW50KDEpOwotCQlyZXR1cm47IAotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotIAl0YWJsZUl0ZW0uc2V0SW1hZ2VJbmRlbnQoMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlSXRlbS5nZXRJbWFnZUluZGVudCgpKTsKLSAJdGFibGVJdGVtLnNldEltYWdlSW5kZW50KC0xKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGVJdGVtLmdldEltYWdlSW5kZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRUZXh0KChTdHJpbmcgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmdzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZ3NbMF0sIHRhYmxlSXRlbS5nZXRUZXh0KDApKTsKLQlmb3IgKGludCBpID0gMTsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dChpKS5sZW5ndGgoKSk7Ci0JfQotCQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotIAkJCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLSAJdGFibGVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMCkpOwotIAl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUYWJsZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQkvL3RhYmxlLnNldFRleHQoVGVzdFN0cmluZ3MpOwkJCQkvLyBjcmVhdGUgYW5vdWdoIGNvbHVtbnMgZm9yIFRhYmxlSXRlbS5zZXRUZXh0KFN0cmluZ1tdKSB0byB3b3JrCi0JaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLQotCi0JdGFibGVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRhYmxlSXRlbS5nZXRUZXh0KDEpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdGFibGVJdGVtLmdldFRleHQoMCkpOwotCi0KLQl0YWJsZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldFRleHQoLTEsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0VGV4dCgwLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCi0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmF5ZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUluZGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2hlY2tlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRHcmF5ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUluZGVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kSSIpKSB0ZXN0X2dldEJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHNJIikpIHRlc3RfZ2V0Qm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250SSIpKSB0ZXN0X2dldEZvbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUJvdW5kc0kiKSkgdGVzdF9nZXRJbWFnZUJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJbmRlbnQiKSkgdGVzdF9nZXRJbWFnZUluZGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SSIpKSB0ZXN0X2dldFRleHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEdyYXllZFoiKSkgdGVzdF9zZXRHcmF5ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSW5kZW50SSIpKSB0ZXN0X3NldEltYWdlSW5kZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRhYmxlIHRhYmxlOwotVGFibGVJdGVtIHRhYmxlSXRlbTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotCWlmICggdGFibGVJdGVtICE9IG51bGwgKSB0YWJsZUl0ZW0uZGlzcG9zZSgpOwotCWlmICggdGFibGUgIT0gbnVsbCApIHRhYmxlLmRpc3Bvc2UoKTsKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgMCk7Ci0JdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0Jc2V0V2lkZ2V0KHRhYmxlSXRlbSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2ZjAyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7IC8vIHVzZSBtdWx0aS1saW5lIGJ5IGRlZmF1bHQKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQl0ZXh0ID0gbmV3IFRleHQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5TSU5HTEUsIFNXVC5NVUxUSSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCwgCi0JCQkJCVNXVC5XUkFQfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQoIm5ldyB0ZXh0Iik7CQotCWFzc2VydFRydWUoInNldFRleHQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQoImxpbmUiKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdHJ5IHsKLQkJdGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JdHJ5IHsKLQkJdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQ1Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwzKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci0JdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJdGV4dC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJOZXdMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCQotCS8vIHRlc3QgbnVsbCBsaXN0ZW5lciBjYXNlCi0JdHJ5IHsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkKLQkvLyB0ZXN0IGFwcGVuZCBjYXNlCi0JVmVyaWZ5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LmFwcGVuZChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkvLyB0ZXN0IGluc2VydCBjYXNlCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDgsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDgsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0Lmluc2VydChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiaW5zZXJ0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lICsgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JLy8gdGVzdCBzZXRUZXh0IGNhc2UKLQlsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMTYsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsJCi0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0IHJlbW92ZSBjYXNlCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQl0ZXh0LmFwcGVuZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNDUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNCIgKyBkZWxpbWl0ZXJTdHJpbmcrICI1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI1IiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQuYXBwZW5kKCI2NyIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1NjciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNDUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JdGV4dC5zZXRUZXh0KCIwMSIpOwotCXRleHQuYXBwZW5kKCIyMyIpOwotCWFzc2VydEVxdWFscygiMDEyMyIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmFwcGVuZCgiNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjUiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyU2VsZWN0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JdGV4dC5jb3B5KCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjAwMDAwIiwgdGV4dC5nZXRUZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LmNvcHkoKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMDAwMDAiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCXRleHQuY3V0KCk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDUpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5jdXQoKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA1KTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiMDE1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0KLQl0ZXh0LmFwcGVuZCgiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDEpOwotCVN0cmluZyBuZXdUZXh0ID0gIkxpbmUtMVxyXG4iOwotCXRleHQuc2V0U2VsZWN0aW9uKDAsMCk7Ci0JdGV4dC5pbnNlcnQobmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAxKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDAsMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig4LDgpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRMb2NhdGlvbigpIHsKLQkvLyBhY2NvdW50IGZvciBpbnNldHMgd2hlbiBhc3NlcnRpbmcKLQl0ZXh0LnNldFNpemUoMjAwLDUwKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID49IDApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMVxyXG5MaW5lMiIpOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID49IDApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwxKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueSA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldFBvc2l0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiTGluZSIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpID09IDApOwotCXRleHQuYXBwZW5kKCIxMjMiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSA3KTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxLDMpOwotCXRleHQuaW5zZXJ0KCIxMjMiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSA0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGFyQ291bnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyI2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzRcdDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0KLQkvLwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyI2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzRcdDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNDUiKyBkZWxpbWl0ZXJTdHJpbmcgKyAiNjc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKDExICArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7IC8vbWlnaHQgYmUgYm9ndXMgb24gVU5JWAotCX0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlpZiAoIVN3dEp1bml0LmlzQUlYKSB7CQotCQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JLy8gdGhpcyBtZXRob2QgdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RWNob0NoYXIoKSB7Ci0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RWNob0NoYXIoJ2EnKTsKLQlhc3NlcnRFcXVhbHMoJ2EnLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUNvdW50KCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMywgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGFzZGFzZGFzZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCkgewotCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCVN0cmluZyBkZWxpbWl0ZXIgPSB0ZXh0LmdldExpbmVEZWxpbWl0ZXIoKTsKLQlpZiAocGxhdGZvcm0uZXF1YWxzKCJ3aW4zMiIpKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGRlbGltaXRlci5lcXVhbHMoIlxyXG4iKSk7Ci0JfSBlbHNlIGlmIChwbGF0Zm9ybS5lcXVhbHMoIm1vdGlmIikpIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZGVsaW1pdGVyLmVxdWFscygiXG4iKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVIZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmllbnRhdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0T3JpZW50YXRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDIpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDMpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMTEpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMywgMTEpKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCg0LCA0KSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDExKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAyKSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAzKSkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0wKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDExKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTkpOwotCXRleHQuc2V0VGV4dCgiMDEyM1xuNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMik7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0xMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYnMoKSB7Ci0JaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgewotCQkvLyBBUEkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zIChlLmcuLCBNb3RpZikKLQkJdGV4dC5zZXRUYWJzKDEpOwotCQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRhYnMoKSA9PSAxKTsKLQkJdGV4dC5zZXRUYWJzKDgpOwotCQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQkJdGV4dC5zZXRUZXh0KCJMaW5lXHQxXHJcbiIpOwotCQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQkJdGV4dC5zZXRUYWJzKDcpOwotCQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRhYnMoKSA9PSA3KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCVN0cmluZyBzdHJpbmcgPSAiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZyArICI2Nzg5MCI7Ci0JdGV4dC5zZXRUZXh0KHN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKHN0cmluZywgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJSSgpIHsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoImEiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtNCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC0yKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTIsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwtMSkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDEpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIzNDUiLCB0ZXh0LmdldFRleHQoMywgNSkpOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRUZXh0KC0xLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCg1LCAzKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEVjaG9DaGFyKCcqJyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJhIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JdGV4dC5zZXRUZXh0TGltaXQoMTApOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXRleHQuc2V0U2l6ZSg1MCx0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5hcHBlbmQoZGVsaW1pdGVyU3RyaW5nICsiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxNyk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUGl4ZWwoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRTaXplKDEwLCB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRleHQuc2V0Qm91bmRzKDAsIDAsIDUwMCwgNTAwKTsKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCXRleHQuaW5zZXJ0KCJoZWxtdXQiKTsKLQlhc3NlcnRFcXVhbHMoImZyaGVsbXV0ZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoImZyZWQiKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JdGV4dC5pbnNlcnQoImhlbG11dCIpOwotCWFzc2VydEVxdWFscygiZnJoZWxtdXRlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuaW5zZXJ0KFRleHQuREVMSU1JVEVSKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzVmlzaWJsZSgpIHsKLQkvLyBvdmVycmlkaW5nIHRlc3RfaXNWaXNpYmxlKCkgZnJvbSBDb250cm9sCi0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoY29udHJvbC5pc1Zpc2libGUoKSk7ICAKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc1Zpc2libGUoKSk7Ci0KLQlpZiAoIVN3dEp1bml0LmlzQUlYKSB7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBiZSB2aXNpYmxlIiwgY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwgIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYXN0ZSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDIzMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIgKyAiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAyMzEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LnBhc3RlKCk7Ci0KLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiICsgIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiLCB0ZXh0LmdldFRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkVmVyaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFRleHQoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCXRleHQuY3V0KCk7Ci0JCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaKCkgewotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUodGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci0JCi0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWNob0NoYXJDKCkgewotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspewotCQl0ZXh0LnNldEVjaG9DaGFyKChjaGFyKSBpKTsKLQkJYXNzZXJ0RXF1YWxzKChjaGFyKWksIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0JfQotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldEVjaG9DaGFyKCdhJyk7Ci0JYXNzZXJ0RXF1YWxzKCdhJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIDApOwotCWFzc2VydEVxdWFscygoY2hhcikwLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCi0JdGV4dC5zZXRFY2hvQ2hhcignXG4nKTsKLQlhc3NlcnRFcXVhbHMoJ1xuJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCWZvciAoaW50IGk9MDsgaTwxMjg7IGkrKyl7Ci0JCXRleHQuc2V0RWNob0NoYXIoKGNoYXIpIGkpOwotCQlhc3NlcnRFcXVhbHMoKGNoYXIpaSwgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdGFibGVaKCkgewotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDgsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JdGV4dC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCAxMiwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JdGV4dC5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gbGluZUhlaWdodCAmJiBmb250LmVxdWFscyh0ZXh0LmdldEZvbnQoKSkpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0JdGV4dC5zZXRPcmllbnRhdGlvbihTV1QuUklHSFRfVE9fTEVGVCk7Ci0JaWYgKCh0ZXh0LmdldFN0eWxlKCkgJiBTV1QuTUlSUk9SRUQpICE9IDApIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRPcmllbnRhdGlvbigpPT1TV1QuUklHSFRfVE9fTEVGVCk7Ci0JfQotCXRleHQuc2V0T3JpZW50YXRpb24oU1dULkxFRlRfVE9fUklHSFQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0T3JpZW50YXRpb24oKT09U1dULkxFRlRfVE9fUklHSFQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0JdGV4dC5zZXRSZWRyYXcoZmFsc2UpOwotCXRleHQuc2V0UmVkcmF3KHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JSSgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMyIgKyBkZWxpbWl0ZXJTdHJpbmcgKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTAwKTsKLQlhc3NlcnRFcXVhbHMoOSArIGRlbGltaXRlclN0cmluZy5sZW5ndGgoKSwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzIisgZGVsaW1pdGVyU3RyaW5nKyI0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyg5ICtkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDQsIDQpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxMSwgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJkc2RzZGFzZHNsYWFzZGFzIik7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRTZWxlY3Rpb24oKFBvaW50KSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgyLCAyKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMyksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMywgMTEpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCg0LCA0KSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGFic0koKSB7Ci0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQkJdGV4dC5zZXRUYWJzKGkpOwotCQkJYXNzZXJ0RXF1YWxzKDgsIHRleHQuZ2V0VGFicygpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCXRleHQuc2V0VGFicyhpKTsKLQkJCWFzc2VydEVxdWFscyhpLCB0ZXh0LmdldFRhYnMoKSk7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLQotCXRleHQuc2V0VGV4dExpbWl0KFRleHQuTElNSVQpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGV4dExpbWl0KCkgPT0gVGV4dC5MSU1JVCk7Ci0KLQl0cnkgewotCQl0ZXh0LnNldFRleHRMaW1pdCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCXRleHQuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nKyAiNjc4OTAiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTIzNDUiICsgZGVsaW1pdGVyU3RyaW5nICsiNjc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsIDApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgwLCAxMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDEsIDApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKSB7Ci0JaW50IG51bWJlciA9IDEwMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kKCIwMTIzNFxuIik7Ci0JfQotCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotCQotCXRleHQuc2V0VG9wSW5kZXgobnVtYmVyKzUpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LmFwcGVuZChUZXh0LkRFTElNSVRFUiArIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMTcpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LmFwcGVuZCgiMDEyMzQiICsgVGV4dC5ERUxJTUlURVIpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQkKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbGVhclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvcHkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2N1dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldFBvc2l0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGFyQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWNob0NoYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVkaXRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE9yaWVudGF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25UZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUYWJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRMaW1pdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFzdGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWNob0NoYXJDIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRhYnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGltaXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEluZGV4SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyIikpIHRlc3RfZ2V0Q2FyZXRMaW5lTnVtYmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDYXJldExvY2F0aW9uIikpIHRlc3RfZ2V0Q2FyZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRQb3NpdGlvbiIpKSB0ZXN0X2dldENhcmV0UG9zaXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIikpIHRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFY2hvQ2hhciIpKSB0ZXN0X2dldEVjaG9DaGFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFZGl0YWJsZSIpKSB0ZXN0X2dldEVkaXRhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSGVpZ2h0IikpIHRlc3RfZ2V0TGluZUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZW50YXRpb24iKSkgdGVzdF9nZXRPcmllbnRhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25UZXh0IikpIHRlc3RfZ2V0U2VsZWN0aW9uVGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFicyIpKSB0ZXN0X2dldFRhYnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SUkiKSkgdGVzdF9nZXRUZXh0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRMaW1pdCIpKSB0ZXN0X2dldFRleHRMaW1pdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUGl4ZWwiKSkgdGVzdF9nZXRUb3BQaXhlbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIikpIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWNob0NoYXJDIikpIHRlc3Rfc2V0RWNob0NoYXJDKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0YWJsZVoiKSkgdGVzdF9zZXRFZGl0YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYnNJIikpIHRlc3Rfc2V0VGFic0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vZGlmeSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVGV4dCB0ZXh0OwotU3RyaW5nIGRlbGltaXRlclN0cmluZzsKLQotLyoqCi0gKiBDbGVhbiB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIGEgbmV3IHRlc3QuCi0gKiAKLSAqIEBwYXJhbSBzaW5nbGUgdHJ1ZSBpZiB0aGUgbmV3IHRleHQgd2lkZ2V0IHNob3VsZCBiZSBzaW5nbGUtbGluZS4KLSAqLwotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KGJvb2xlYW4gc2luZ2xlKSB7Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci0JaWYgKCB0ZXh0ICE9IG51bGwgKSB0ZXh0LmRpc3Bvc2UoKTsKLQotCWlmICggc2luZ2xlID09IHRydWUgKQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TSU5HTEUpOwkKLQllbHNlCi0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0JZGVsaW1pdGVyU3RyaW5nID0gVGV4dC5ERUxJTUlURVI7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQl0ZXh0ID0gKFRleHQpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnYScsIDAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDUwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxODc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHRvb2xCYXIpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRvb2xCYXIobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlVHJpbUlJSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVUcmltSUlJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRvb2xCYXIuZ2V0SXRlbUNvdW50KCk9PWkpOwotCSAgCW5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIsIHRvb2xCYXIuZ2V0SXRlbShpKT09aXRlbXNbaV0pOwotCX0KLQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0JbnVtYmVyID0gNTsKLQlpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCXRyeSB7Ci0JCXRvb2xCYXIuZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUb29sSXRlbVtdIGl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0b29sQmFyLmdldEl0ZW1zKCkpOwotCQotCXRvb2xCYXIuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLQotCXRvb2xCYXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0b29sQmFyLmdldEl0ZW1zKCkpOwotCi0JdG9vbEJhci5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRvb2xJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb3dDb3VudCgpIHsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5XUkFQKTsKLQlpbnQgbnVtYmVyID0gNTsKLQlUb29sSXRlbVtdIGl0ZW1zID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAlpdGVtc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiArIHRvb2xCYXIuZ2V0Um93Q291bnQoKSwgdG9vbEJhci5nZXRSb3dDb3VudCgpPT1udW1iZXIpOyAgLy8/Pz8/ICBiZWNhdXNlIG9mIFNpemUoMCwgMCkKLQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgMCk7Ci0JbnVtYmVyID0gNTsKLQlpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIsIHRvb2xCYXIuZ2V0Um93Q291bnQoKT09MSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JVG9vbEl0ZW1bXSB0aXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRvb2xCYXIuaW5kZXhPZih0aXNbaV0pPT1pKTsKLQl9Ci0KLQludW1iZXIgPSAxMDsKLQl0aXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJdHJ5IHsKLQkJCXRvb2xCYXIuaW5kZXhPZihudWxsKTsJCQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdG9vbEl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVUcmltSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSb3dDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um93Q291bnQiKSkgdGVzdF9nZXRSb3dDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUb29sQmFyIHRvb2xCYXI7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKFZlY3RvciBldmVudHMpIHsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIlRvb2xCYXIiICsgaSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRvb2xJdGVtIFRvb2xUaXAiICsgaSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlzZXRXaWRnZXQodG9vbEJhcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAxNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMjAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI0YjAxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOyAKLQlzZXRXaWRnZXQodG9vbEl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJKCkgewotCXRyeSB7Ci0JCW5ldyBUb29sSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNhYmxlZEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREaXNhYmxlZEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RW5hYmxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhvdEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIb3RJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFyZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLmdldFNlbGVjdGlvbigpCi0Jd2FyblVuaW1wbCggIlRlc3QgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS50ZXN0XzVfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0JdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdG9vbEl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKTsKLQlhc3NlcnRUcnVlKCI6YTogIiwgdG9vbEl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdpZHRoIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNFbmFibGVkKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCBib29sZWFuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLmlzRW5hYmxlZCgpCi0Jd2FyblVuaW1wbCggIlRlc3QgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS50ZXN0XzdfaXNFbmFibGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JLy8gVGVzdCBmb3IgbWV0aG9kIHZvaWQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0uc2V0RW5hYmxlZChib29sZWFuKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF84X3NldEVuYWJsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNhYmxlZEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3RJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udHJvbCIpKSB0ZXN0X2dldENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKSkgdGVzdF9nZXREaXNhYmxlZEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG90SW1hZ2UiKSkgdGVzdF9nZXRIb3RJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpZHRoIikpIHRlc3RfZ2V0V2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbloiKSkgdGVzdF9zZXRTZWxlY3Rpb25aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXaWR0aEkiKSkgdGVzdF9zZXRXaWR0aEkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Ub29sQmFyIHRvb2xCYXI7Ci1Ub29sSXRlbSB0b29sSXRlbTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJkMTdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyYWNrZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyYWNrZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyYWNrZXIgPSBuZXcgVHJhY2tlcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHRyYWNrZXIpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlY3RhbmdsZXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJlY3RhbmdsZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGlwcGxlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RpcHBsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9vcGVuIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3RpcHBsZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTdGlwcGxlZFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZWN0YW5nbGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdGlwcGxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3RpcHBsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2UiKSkgdGVzdF9jbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVjdGFuZ2xlcyIpKSB0ZXN0X2dldFJlY3RhbmdsZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0aXBwbGVkIikpIHRlc3RfZ2V0U3RpcHBsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIikpIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTdGlwcGxlZFoiKSkgdGVzdF9zZXRTdGlwcGxlZFooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi0JVHJhY2tlciB0cmFja2VyOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTZmODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0cmVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXRyZWUgPSBuZXcgVHJlZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkJPUkRFUn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBjYXNlc1tpXSk7Ci0KLQljYXNlcyA9IG5ldyBpbnRbXXswLCAxMCwgMTAwfTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQl9Ci0JCWFzc2VydEVxdWFscyhjYXNlc1tqXSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s0XSwgaXRlbXNbNV0sIGl0ZW1zWzEwXX0pOwotCQotCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5Db3VudCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygyLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMywgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMiwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5JKCkgewotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQl0cnkgewotCQl0cmVlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgdHJlZS5nZXRDb2x1bW4oMCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgdHJlZS5nZXRDb2x1bW4oMSkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbHVtbjAuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbnMoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbHVtbnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgY29sdW1uc1swXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQsIDEpOwotCWNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1sxXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbnMoKS5sZW5ndGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyaWRMaW5lV2lkdGgoKSB7Ci0JdHJlZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEhlYWRlckhlaWdodCgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEhlYWRlckhlaWdodCgpID4gMCk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRIZWFkZXJWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQkvL3Rlc3RlZCBpbiB0ZXN0X3NldEl0ZW1Db3VudEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiBJdGVtIGhlaWdodCBpcyAwIiwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IEl0ZW0gaGVpZ2h0IGlzIDAiLCB0cmVlLmdldEl0ZW1IZWlnaHQoKSA+IDApOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdHJlZS5nZXRJdGVtKGkpKTsKLQl0cnkgewotCQl0cmVlLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZS5nZXRJdGVtKC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50W10gY2FzZXMgPSB7MCwgMTAsIDEwMH07Ci0JVHJlZUl0ZW0gW11bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbSBbY2FzZXMubGVuZ3RoXVtdOwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJaXRlbXMgW2pdID0gbmV3IFRyZWVJdGVtIFtjYXNlcyBbal1dOwotCX0KLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JCQlpdGVtcyBbal1baV0gPSB0aTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaXRlbXNbal0sIHRyZWUuZ2V0SXRlbXMoKSk7Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQkJdGkuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JCX0KLQkJVHJlZUl0ZW1bXSBpdGVtczIgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMyLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zMltpXS5nZXRUZXh0KCkpOwotCQl9Ci0JCXRyZWUucmVtb3ZlQWxsKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQlhc3NlcnROdWxsKHRyZWUuZ2V0UGFyZW50SXRlbSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JLy8gVGVzdGVkIGluIHNldFNlbGVjdGlvbi4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygzLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMTUsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgLy8gdXNlIHNpbmdsZS1zZWxlY3Rpb24gdHJlZS4KLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde30pOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEl0ZW0oKSB7Ci0vLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCi0JaW50IG51bWJlciA9IDIwOwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgLy8gc2luZ2xlLXNlbGVjdGlvbiB0cmVlCi0JCQotCWl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0cmVlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEhlYWRlclZpc2libGVaKCkgewotCWFzc2VydEZhbHNlKHRyZWUuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0cmVlLmdldEhlYWRlclZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUNvdW50SSgpIHsKLQl0cmVlLnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTlVMTCk7Ci0JCWFzc2VydEVxdWFscyhpKzEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQlhc3NlcnRFcXVhbHMoOCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHRyZWUuaW5kZXhPZih0cmVlLmdldEl0ZW1zKClbNF0pKTsKLQl0cmVlLmdldEl0ZW0oMSkuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyg3LCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OVUxMLCAwKTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5pbmRleE9mKHRyZWUuZ2V0SXRlbXMoKVsxXSkpOwotCWFzc2VydEVxdWFscyg4LCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLnNldEl0ZW1Db3VudCgwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoLTEpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLnNldEl0ZW1Db3VudCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLmdldEl0ZW0oMSkuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyg5LCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5pbmRleE9mKHRyZWUuZ2V0SXRlbXMoKVs0XSkpOwotCXRyZWUuc2V0SXRlbUNvdW50KDMpOwotCWFzc2VydEVxdWFscygzLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cnkgewotCQl0cmVlLmdldEl0ZW0oNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyZWUuc2V0SXRlbUNvdW50KDQwKTsKLQlhc3NlcnRFcXVhbHMoNDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUuZ2V0SXRlbSgzOSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpIHsKLQlpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJLy8gY2FyYm9uIGRvZXMgbm90IHN1cHBvcnQgbGluZXMKLQkJdHJlZS5nZXRMaW5lc1Zpc2libGUoKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRGYWxzZSh0cmVlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRGYWxzZSh0cmVlLmdldExpbmVzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWRyYXdaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWRyYXdaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKGl0ZW1zLCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbih0cmVlLmdldEl0ZW1zKCkpOwotCWFzc2VydFNhbWUodHJlZS5nZXRJdGVtcygpLCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cnkgewotCQl0cmVlLnNldFNlbGVjdGlvbigoVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde251bGx9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMTBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1tudW1iZXItMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbMTBdLCBpdGVtc1tudW1iZXIgLSAxXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOyAvLyBzaW5nbGUtc2VsZWN0aW9uIHRyZWUKLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s1XSwgaXRlbXNbMTZdLCBpdGVtc1sxOV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24odHJlZS5nZXRJdGVtcygpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRyeSB7Ci0JCXRyZWUuc2V0U2VsZWN0aW9uKChUcmVlSXRlbVtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbXMgPT0gbnVsbCIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zW251bWJlci0xXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCVRyZWVJdGVtIHRvcCA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIDApOwkKLQl9Ci0JdHJlZS5zZXRTaXplKDUwLDUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0JdHJlZS5zZXRUb3BJdGVtKHRvcCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCVRyZWVJdGVtIHRvcDIgPSB0cmVlLmdldFRvcEl0ZW0oKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHModG9wLCB0b3AyKTsKLQl0cnkgewotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldFRvcEl0ZW0obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJc2hlbGwuc2V0VmlzaWJsZSAoZmFsc2UpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXRyeSB7Ci0JCXRyZWUuc2hvd0l0ZW0obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50IG51bWJlciA9IDIwOwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQlmb3IoaW50IGk9MDsgaTxudW1iZXI7IGkrKykKLQkJdHJlZS5zaG93SXRlbShpdGVtc1tpXSk7Ci0KLQl0cmVlLnJlbW92ZUFsbCgpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCS8vc2hvd2luZyBzb21lYm9keSBlbHNlJ3MgaXRlbXMKLQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JfQotCi0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCAwKTsKLQlUcmVlSXRlbVtdIGl0ZW1zMiA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXMyW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUyLCAwKTsKLQl9Ci0KLQlmb3IoaW50IGk9MDsgaTxudW1iZXI7IGkrKykKLQkJdHJlZS5zaG93SXRlbShpdGVtczJbaV0pOwotCi0JdHJlZS5yZW1vdmVBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCVRyZWVJdGVtIGl0ZW07Ci0JCi0JdHJlZS5zaG93U2VsZWN0aW9uKCk7Ci0JaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtfSk7Ci0JdHJlZS5zaG93U2VsZWN0aW9uKCk7CQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmlkTGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Db3VudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZHJhd1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uQ291bnQiKSkgdGVzdF9nZXRDb2x1bW5Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29sdW1uSSIpKSB0ZXN0X2dldENvbHVtbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbnMiKSkgdGVzdF9nZXRDb2x1bW5zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmlkTGluZVdpZHRoIikpIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVySGVpZ2h0IikpIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJWaXNpYmxlIikpIHRlc3RfZ2V0SGVhZGVyVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZXNWaXNpYmxlIikpIHRlc3RfZ2V0TGluZXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb3BJdGVtIikpIHRlc3RfZ2V0VG9wSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpKSB0ZXN0X3NldEhlYWRlclZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWiIpKSB0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtQ291bnRJIikpIHRlc3Rfc2V0SXRlbUNvdW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpKSB0ZXN0X3NldExpbmVzVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlZHJhd1oiKSkgdGVzdF9zZXRSZWRyYXdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbiIpKSB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgVHJlZSB0cmVlOwotCi0vKioKLSAqIENsZWFuIHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBuZXcgdGVzdC4KLSAqIAotICogQHBhcmFtIHNpbmdsZSB0cnVlIGlmIHRoZSBuZXcgdHJlZSBzaG91bGQgYmUgYSBzaW5nbGUtc2VsZWN0aW9uIG9uZSwKLSAqIG90aGVyd2lzZSB1c2UgbXVsdGktc2VsZWN0aW9uLgotICovCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoYm9vbGVhbiBzaW5nbGUpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQlpZiAodHJlZSAhPSBudWxsKSB0cmVlLmRpc3Bvc2UoKTsKLQl0cmVlID0gbmV3IFRyZWUoc2hlbGwsIHNpbmdsZT9TV1QuU0lOR0xFOlNXVC5NVUxUSSk7Ci0Jc2V0V2lkZ2V0KHRyZWUpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVHJlZShWZWN0b3IgZXZlbnRzKSB7Ci0gICAgbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiVHJlZUl0ZW0iICsgaSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQl0aS5zZXRUZXh0KCJUcmVlSXRlbSIgKyBpICsgaik7Ci0JCQlob29rRXhwZWN0ZWRFdmVudHModGksIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JCX0KLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDMwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgaW50IGNvZGU9U1dULkFSUk9XX1JJR0hUOwotICAgIGlmKFN3dEp1bml0LmlzR1RLKQotICAgICAgICBjb2RlID0gU1dULktFWVBBRF9BREQ7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBjb2RlLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIHRyZWUuZ2V0SXRlbUhlaWdodCgpKjIsIDEsIDAsIAotICAgICAgICAgICAgCSAgICAgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNTAsIDI1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAzMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmYwZTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5TSU5HTEUpOwkJCi0JdHJlZUNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OVUxMKTsJCi0Jc2V0V2lkZ2V0KHRyZWVDb2x1bW4pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlQ29sdW1uKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbihudWxsLCBTV1QuTlVMTCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OVUxMLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OVUxMLCAyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXRyeSB7Ci0JCXRyZWVDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbGlnbm1lbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlc2l6YWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UmVzaXphYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2lkdGgoKSB7Ci0JaW50IHRlc3RXaWR0aCA9IDQyOwotCQotLy8JdHJ5IHsKLS8vCQl0cmVlQ29sdW1uLnNldFdpZHRoKC0xKTsKLS8vCQlhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gdGhyb3duIiwgZmFsc2UpOwotLy8JfQotLy8JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0vLwljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vCQlhc3NlcnRUcnVlKCJXcm9uZyBlcnJvciB0aHJvd246ICIgKyBlLCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkFyZ3VtZW50IG5vdCB2YWxpZCIpKTsKLS8vCX0KLQotCXRyZWVDb2x1bW4uc2V0V2lkdGgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IHdpZHRoPSIgKyB0cmVlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgMCwgdHJlZUNvbHVtbi5nZXRXaWR0aCgpID09IDApOwotCi0JdHJlZUNvbHVtbi5zZXRXaWR0aCh0ZXN0V2lkdGgpOwotCWFzc2VydFRydWUoIjpiOiB3aWR0aD0iICsgdHJlZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdHJlZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci0KLQl0cmVlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IHdpZHRoPSIgKyB0cmVlQ29sdW1uLmdldFdpZHRoKCkgKyAiIHNob3VsZCBiZT0iICsgdGVzdFdpZHRoLCB0cmVlQ29sdW1uLmdldFdpZHRoKCkgPT0gdGVzdFdpZHRoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYWNrKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9wYWNrIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9fTsKLQotCXRyZWVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkKLQl0cmVlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCQotCXRyZWVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkKLQl0cnkgewotCQl0cmVlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRyZWVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JdHJlZUNvbHVtbi5zZXRBbGlnbm1lbnQoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRyZWVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JdHJlZUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRUcnVlKAotCQkiOmM6IFNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBzZXQgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBjb2x1bW4iLCAKLQkJdHJlZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQljb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5VTEwpOwotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuUklHSFQpOwotCQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotCWFzc2VydFRydWUoIjplOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULkNFTlRFUik7CQotCi0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCWFzc2VydFRydWUoIjpmOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlc2l6YWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSB0cnVlKTsKLQotCXRyZWVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IGZhbHNlKTsKLQotCXRyZWVDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IGZhbHNlKTsKLQotCXRyZWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgdHJlZUNvbHVtbi5nZXRUZXh0KCksICIiKTsKLQotCXRyZWVDb2x1bW4uc2V0VGV4dCgidGV4dCIpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdHJlZUNvbHVtbi5nZXRUZXh0KCksICJ0ZXh0Iik7Ci0KLQl0cnkgewotCQl0cmVlQ29sdW1uLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbHVtbiBoZWFkZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2lkdGhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlc2l6YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3BhY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZXNpemFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpZHRoSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZXNpemFibGUiKSkgdGVzdF9nZXRSZXNpemFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpZHRoIikpIHRlc3RfZ2V0V2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhY2siKSkgdGVzdF9wYWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZXNpemFibGVaIikpIHRlc3Rfc2V0UmVzaXphYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXaWR0aEkiKSkgdGVzdF9zZXRXaWR0aEkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHJlZUNvbHVtbiB0cmVlQ29sdW1uOwotcHJvdGVjdGVkIFRyZWUgdHJlZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNmRjNWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUl0ZW0oKFRyZWVJdGVtKW51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JZm9yIChpbnQgaT0wOyBpPDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsJCi0JfQotCWFzc2VydEVxdWFscygxMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCA1KTsJCi0JYXNzZXJ0RXF1YWxzKDEyLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCA1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JKCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDEwLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSk7Ci0JbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSwgNSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JU3RyaW5nIHN0cmluZyA9ICJoZWxsbyI7Ci0JCi0JLy8gbm8gY29sdW1ucwotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgZXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxYjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IGV4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IGV4dGVudC54KTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IHJlY3QuaGVpZ2h0KTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGJvdW5kcy54ID49IGJvdW5kczIueCArIGJvdW5kczIud2lkdGgpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWc6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBleHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBleHRlbnQueCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCXN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxaToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSByZWN0LmhlaWdodCk7Ci0JYm91bmRzMiA9IHN1Ykl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGJvdW5kcy54ID49IGJvdW5kczIueCArIGJvdW5kczIud2lkdGgpOwotCQotCS8vIFRPRE8gbm8gY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQkvLyBUT0RPIHdpdGggY29sdW1ucwotCS8vIFRPRE8gd2l0aCBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotfQotdm9pZCB0ZXN0X2dldEJvdW5kc0lBKCkgewkKLQkvLyBubyBjb2x1bW5zIC0gcGxhaW4gc3R5bGUKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nID0gImhlbGxvIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0gCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoxYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JLy8gdW5leHBhbmRlZCBpdGVtCi0JVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFnOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7CQotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkvL2Fzc2VydFRydWUoIjoxbmV3OiIsIGJvdW5kcy5lcXVhbHMoYm91bmRzMikpOyAvLyBUT0RPIHNob3VsZCBib3VuZHMgYmUgZXF1YWw/Ci0JdHJlZUl0ZW0uc2V0VGV4dCgiIik7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWk6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoxajoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWs6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+PSBpbWFnZUJvdW5kcy53aWR0aCk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoKEltYWdlKW51bGwpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFsOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLS8vCWFzc2VydFRydWUoIjoxbToiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsgLy8gb25jZSBhbiBpbWFnZSBpcyBhZGRlZCB0aGUgc3BhY2UgZm9yIGl0IGlzIGFsd2F5cyB0aGVyZQotIAkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MW46IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoxbzoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQlhc3NlcnRUcnVlKCI6MXAiLCBib3VuZHMyLndpZHRoID49IHN0cmluZ0V4dGVudC54ICsgaW1hZ2VCb3VuZHMud2lkdGggJiYgYm91bmRzMi5oZWlnaHQgPj0gTWF0aC5tYXgoc3RyaW5nRXh0ZW50LnksIGltYWdlQm91bmRzLmhlaWdodCkpOwotfQotdm9pZCB0ZXN0X2dldEJvdW5kc0lCKCkgewotCS8vIG5vIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZyA9ICJoZWxsbyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JLy8gdW5leHBhbmRlZCBpdGVtCi0JVHJlZUl0ZW0gc3ViSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0yLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZDoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbTIuc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmc6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsJCi0KLQl0cmVlSXRlbTIuc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJoOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKCk7Ci0JLy9hc3NlcnRUcnVlKCI6Mm5ldzoiLCBib3VuZHMuZXF1YWxzKGJvdW5kczIpKTsgLy8gVE9ETyBzaG91bGQgYm91bmRzIGJlIGVxdWFsPwotCXRyZWVJdGVtMi5zZXRUZXh0KCIiKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmk6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoyajoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsKLQkKLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQkKLQl0cmVlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJrOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPj0gaW1hZ2VCb3VuZHMud2lkdGgpOwotCXRyZWVJdGVtMi5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJsOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQkvL2Fzc2VydFRydWUoIjoybToiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsgIC8vIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLQkKLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQkKLQl0cmVlSXRlbTIuc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JdHJlZUl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mm46IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoybzoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQlhc3NlcnRUcnVlKCI6MXAiLCBib3VuZHMyLndpZHRoID49IHN0cmluZ0V4dGVudC54ICsgaW1hZ2VCb3VuZHMud2lkdGggJiYgYm91bmRzMi5oZWlnaHQgPj0gTWF0aC5tYXgoc3RyaW5nRXh0ZW50LnksIGltYWdlQm91bmRzLmhlaWdodCkpOwotfQotdm9pZCB0ZXN0X2dldEJvdW5kc0lDKCkgewotCS8vIHdpdGggY29sdW1ucwotCQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcxID0gImhlbGxvIjsKLQlTdHJpbmcgc3RyaW5nMiA9ICJ3b3JsZCI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50MSA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcxKTsKLQkvL1BvaW50IHN0cmluZ0V4dGVudDIgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMik7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCi0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjozYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JLy8gdW5leHBhbmRlZCBpdGVtCi0JVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZToiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNnOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozaDoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA9PSAwKTsJCi0KLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozaToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M2o6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozazoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsJCi0KLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozbDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M206IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAyMDApOwotCQotCXRyZWVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozbjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbzoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdHJlZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyIiLCAiIn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3A6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3E6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNyOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozczoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0cmVlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7bnVsbCwgbnVsbH0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3Q6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjN1OiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQl0cmVlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozdjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozdzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nMSk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN4OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMCk7Ci19Ci0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJRCgpIHsKLQkvLyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZzEgPSAiaGVsbG8iOwotCVN0cmluZyBzdHJpbmcyID0gIndvcmxkIjsKLQlHQyBnYyA9IG5ldyBHQyh0cmVlKTsKLQlQb2ludCBzdHJpbmdFeHRlbnQxID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzEpOwotCS8vUG9pbnQgc3RyaW5nRXh0ZW50MiA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcyKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlSZWN0YW5nbGUgYm91bmRzMjsKLQkKLQlUcmVlIHRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0YjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JLy8gdW5leHBhbmRlZCBpdGVtCi0JVHJlZUl0ZW0gc3ViSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0yLCBTV1QuTk9ORSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZToiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCXRyZWVJdGVtMi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0ZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID09IDApOwkKLQkKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0ajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGs6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7CQotCi0JCi0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NG06IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAyMDApOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRuOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0bzoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdHJlZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0cDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHE6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0czoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0cmVlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0dDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjR1OiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0cmVlMi5kaXNwb3NlKCk7Ci0JdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5DRU5URVIpOwotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JdHJlZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtpbWFnZSwgaW1hZ2V9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0djoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHc6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nMSk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5SSUdIVCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHg6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzSSgpIHsKLQl0ZXN0X2dldEJvdW5kc0lBKCk7Ci0JdGVzdF9nZXRCb3VuZHNJQigpOwotCXRlc3RfZ2V0Qm91bmRzSUMoKTsKLQl0ZXN0X2dldEJvdW5kc0lEKCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldENoZWNrZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Q2hlY2tlZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFeHBhbmRlZCgpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCS8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN1Yml0ZW0gYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSB0cmVlaXRlbSBleHBhbmRlZAotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmF5ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0R3JheWVkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlQm91bmRzSSgpIHsKLS8qKgotICogVGVzdCB3aXRob3V0IGl0ZW0gaW1hZ2UKLSAqLwotCVJlY3RhbmdsZSBib3VuZHM7Ci0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5VTEwpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCS8vIFRPRE8gLSBzaG91bGQgdGhpcyB3aWR0aCBiZSAwIG9yIGEgdmFsdWU/Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLndpZHRoID09IDApOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCS8vIFRPRE8gLSBzaG91bGQgdGhpcyB3aWR0aCBiZSAwIG9yIGEgdmFsdWU/Ci0JLy9ib3VuZHMgPSB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JLy9hc3NlcnRUcnVlKCI6ZToiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7Ci0gCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsJCi0vLwlpbnQgaW1hZ2VXaWR0aCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOwotLy8JaW50IGltYWdlSGVpZ2h0OwotCQotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlKTsKLS8vCWltYWdlSGVpZ2h0ID0gdHJlZS5nZXRJdGVtSGVpZ2h0KCkgLSB0cmVlLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPT0gaW1hZ2VXaWR0aCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsJCi0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsJCi0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OVUxMKTsKLS8vCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotLy8JaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoOyAJdHJlZUl0ZW0yLnNldEltYWdlKDAsIGltYWdlKTsKLS8vCWltYWdlSGVpZ2h0ID0gdHJlZTIuZ2V0SXRlbUhlaWdodCgpIC0gdHJlZTIuZ2V0R3JpZExpbmVXaWR0aCgpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIHRoZXkgYXJlIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotLy8gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwkKLQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OVUxMKTsKLQlpbWFnZSA9IGltYWdlc1sxXTsKLS8vCWltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0vLwlpbWFnZVdpZHRoID0gaW1hZ2VCb3VuZHMud2lkdGg7Ci0gCXRyZWVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0vLwlpbWFnZUhlaWdodCA9IHRyZWUyLmdldEl0ZW1IZWlnaHQoKSAtIHRyZWUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsJLy8gYm91bmRzLndpZHRoIHNob3VsZCBiZSBjaGVjayBib3ggd2lkdGggaWYgY2hlY2sgYm94IGlzIHdpZGVyIHRoYW4gaW1hZ2UKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPT0gaW1hZ2VIZWlnaHQpOwotIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdHJlZUl0ZW0uZ2V0SXRlbShpKSk7Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uZ2V0SXRlbShudW1iZXIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0cmVlSXRlbS5nZXRJdGVtKG51bWJlcisxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpKTsKLQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiYjogIiwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCVRyZWVJdGVtIFtdW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzLmxlbmd0aF1bXTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWl0ZW1zIFtqXSA9IG5ldyBUcmVlSXRlbSBbY2FzZXMgW2pdXTsKLQl9Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQkJCWl0ZW1zIFtqXVtpXSA9IHRpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpdGVtc1tqXSwgdHJlZUl0ZW0uZ2V0SXRlbXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJaXRlbXMgW2pdW2ldLmRpc3Bvc2UoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUsIHRyZWVJdGVtLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCVRyZWVJdGVtIHRJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLCB0SXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRJTEphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdHJlZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0KLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIGJsdWUpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlhc3NlcnRFcXVhbHMoYmx1ZSwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEJhY2tncm91bmQoKSx0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQl0cnkgeyAKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRyZWVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRyZWVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwkJCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDaGVja2VkWigpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldENoZWNrZWQoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldENoZWNrZWQoKSk7Ci0KLQlUcmVlIHQgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0LCBTV1QuTlVMTCk7Ci0JdGkuc2V0Q2hlY2tlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRpLmdldENoZWNrZWQoKSk7Ci0JCi0JdGkuc2V0Q2hlY2tlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aS5nZXRDaGVja2VkKCkpOwotCXQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEV4cGFuZGVkWigpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCQotCS8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHN1Yml0ZW0gYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSB0cmVlaXRlbSBleHBhbmRlZAotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0KLQotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5VTEwpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JCQotCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTlVMTCk7Ci0JdGkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0RXhwYW5kZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSB0cmVlSXRlbS5nZXRGb250KCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQgPSBuZXcgRm9udCh0cmVlSXRlbS5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRyZWVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KCkpKTsKLQotCXRyZWVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHMoIHRyZWVJdGVtLmdldEZvbnQoKSkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEZvbnQoZm9udCk7Ci0JCXRyZWVJdGVtLnNldEZvbnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0cmVlSXRlbS5nZXREaXNwbGF5KCk7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JCi0JLy8gbm8gY29sdW1ucwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKCB0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQl0cmVlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9udCgxMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JLy8gd2l0aCBjb2x1bW5zCi0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDEwKSkpOwotCQotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMjAsIFNXVC5OT1JNQUwpOwotCQotCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JdHJlZUl0ZW0uc2V0Rm9udChmb250Mik7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQlhc3NlcnRUcnVlKGZvbnQyLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9udChudWxsKTsKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JCXRyZWVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGZvbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdHJlZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0KLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIGJsdWUpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQocmVkKTsKLQlhc3NlcnRFcXVhbHMoYmx1ZSwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0cmVlLmdldEZvcmVncm91bmQoKSx0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQl0cnkgeyAKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRyZWVJdGVtLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRyZWVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciBkaXNwb3NlZCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEdyYXllZFooKSB7Ci0JVHJlZSBuZXdUcmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdEl0ZW0gPSBuZXcgVHJlZUl0ZW0obmV3VHJlZSwwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQl0SXRlbS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRJdGVtLmdldEdyYXllZCgpKTsKLQluZXdUcmVlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCWFzc2VydE51bGwodHJlZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UoLTEsIG51bGwpOwkJCi0JYXNzZXJ0TnVsbCh0cmVlSXRlbS5nZXRJbWFnZSgtMSkpOwkKLQkJCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7CQotIAlTdHJpbmcgdGV4dHNbXSA9IG5ldyBTdHJpbmdbaW1hZ2VzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQl0ZXh0c1tpXSA9IFN0cmluZy52YWx1ZU9mKGkpOwotCX0KLQkKLQkvL3RyZWUuc2V0VGV4dCh0ZXh0cyk7CQkJCS8vIGNyZWF0ZSBlbm91Z2ggY29sdW1ucyBmb3IgVHJlZUl0ZW0uc2V0SW1hZ2UoSW1hZ2VbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCB0ZXh0cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGNvbHVtbkNvdW50OyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQodGV4dHNbaV0pOwotCX0KLQl0cmVlSXRlbS5zZXRJbWFnZSgxLCBpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRyZWVJdGVtLmdldEltYWdlKDEpKTsJCi0gCXRyZWVJdGVtLnNldEltYWdlKGltYWdlcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGltYWdlc1tpXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoaSkpOwotCX0KLQl0cnkgewotCQl0cmVlSXRlbS5zZXRJbWFnZSgoSW1hZ2UgW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbWFnZXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRJbWFnZSgxMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQlpbWFnZXNbMF0uZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JCXRyZWVJdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0VGV4dCgoU3RyaW5nIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5ncyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChUZXN0U3RyaW5ncyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmdzWzBdLCB0cmVlSXRlbS5nZXRUZXh0KDApKTsKLQlmb3IgKGludCBpID0gMTsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KGkpLmxlbmd0aCgpKTsKLQl9Ci0JCi0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBlbm91Z2ggCi0gCSogY29sdW1ucyB0byBmaXQgYWxsIHRlc3QgaXRlbSB0ZXh0cy4KLSAJKi8KLSAJCQotCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKXsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGhhcyBvbmx5IAotIAkqIHRoZSBkZWZhdWx0IGNvbHVtbi4KLSAJKi8KLQkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotIAl0cmVlSXRlbS5zZXRUZXh0KDEsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRyZWVJdGVtLnNldFRleHQoMCwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRyZWVJdGVtLmdldFRleHQoMCkpOwotIAl0cmVlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoLTEpLmxlbmd0aCgpKTsJCi0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVHJlZSB0aGF0IGVub3VnaCAKLSAJKiBjb2x1bW5zIHRvIGZpdCBhbGwgdGVzdCBpdGVtIHRleHRzLgotIAkqLwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQkvL3RyZWUuc2V0VGV4dChUZXN0U3RyaW5ncyk7CQkJCS8vIGNyZWF0ZSBhbm91Z2ggY29sdW1ucyBmb3IgVHJlZUl0ZW0uc2V0VGV4dChTdHJpbmdbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQlpZiAoY29sdW1uQ291bnQgPCBpbWFnZXMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKyl7Ci0JCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IFRlc3RTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dChUZXN0U3RyaW5nc1tpXSk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0KLQotCXRyZWVJdGVtLnNldFRleHQoMSwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRyZWVJdGVtLmdldFRleHQoMSkpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgwKS5sZW5ndGgoKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dCgwLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoVGVzdFN0cmluZywgdHJlZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0KLQotCXRyZWVJdGVtLnNldFRleHQoLTEsIFRlc3RTdHJpbmdzWzFdKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgtMSkubGVuZ3RoKCkpOwkKLQotCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0VGV4dCgtMSwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldFRleHQoMCwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQotCi19Ci0KLS8vcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0vLwl0cnkgewotLy8JCXRyZWVJdGVtLnNldFRleHQoKFN0cmluZyludWxsKTsJCQotLy8JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCX0KLS8vfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hlY2tlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXhwYW5kZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JheWVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENoZWNrZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRHcmF5ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1JSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kSSIpKSB0ZXN0X2dldEJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHNJIikpIHRlc3RfZ2V0Qm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGVja2VkIikpIHRlc3RfZ2V0Q2hlY2tlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXhwYW5kZWQiKSkgdGVzdF9nZXRFeHBhbmRlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnRJIikpIHRlc3RfZ2V0Rm9udEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kSSIpKSB0ZXN0X2dldEZvcmVncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmF5ZWQiKSkgdGVzdF9nZXRHcmF5ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlQm91bmRzSSIpKSB0ZXN0X2dldEltYWdlQm91bmRzSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJIikpIHRlc3RfZ2V0SW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSAgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudEl0ZW0iKSkgdGVzdF9nZXRQYXJlbnRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SSIpKSB0ZXN0X2dldFRleHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENoZWNrZWRaIikpIHRlc3Rfc2V0Q2hlY2tlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0R3JheWVkWiIpKSB0ZXN0X3NldEdyYXllZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRyZWVJdGVtIHRyZWVJdGVtOwotVHJlZSB0cmVlOwotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoKSB7Ci0JaWYgKCB0cmVlSXRlbSAhPSBudWxsICkgdHJlZUl0ZW0uZGlzcG9zZSgpOwotCWlmICggdHJlZSAhPSBudWxsICkgdHJlZS5kaXNwb3NlKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCAwKTsKLQl0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQlzZXRXaWRnZXQodHJlZUl0ZW0pOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGMyOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UeXBlZExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1R5cGVkTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50TGlzdGVuZXIoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBwdWJsaWMgbWV0aG9kcyAobm9uLUFQSSkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFdmVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lciIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFdmVudExpc3RlbmVyIikpIHRlc3RfZ2V0RXZlbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA0Y2Q3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JLy8gVXNlIHRoaXMgdmFyaWFibGUgdG8gaGVscCB2YWxpZGF0ZSBjYWxsYmFja3MKLQlib29sZWFuIGxpc3RlbmVyQ2FsbGVkOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLQlpZiAod2lkZ2V0ICE9IG51bGwpIHsKLQkJYXNzZXJ0VHJ1ZSh3aWRnZXQuaXNEaXNwb3NlZCgpKTsKLQl9Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCXRyeSB7Ci0JCXdpZGdldC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVhckRvd24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZygpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXkoKSB7Ci0JYXNzZXJ0RXF1YWxzKHdpZGdldC5nZXREaXNwbGF5KCksIHdpZGdldC5nZXREaXNwbGF5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIHRoaXMgdGVzdCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBsZWFmIHN1YmNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgd2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3aWRnZXQubm90aWZ5TGlzdGVuZXJzKDAsIG51bGwpOwotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JR0MgZ2MgPSBudWxsOwotCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCWdjID0gZXZlbnQuZ2MgPSBuZXcgR0MoKENvbnRyb2wpd2lkZ2V0KTsKLQl9Ci0Jd2lkZ2V0Lm5vdGlmeUxpc3RlbmVycyhTV1QuUGFpbnQsIGV2ZW50KTsKLQlpZiAoZ2MgIT0gbnVsbCkgZ2MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JLy8gdGhpcyBtZXRob2QgaXMgZnVydGhlciB0ZXN0ZWQgYnkgYWxsIG9mIHRoZSByZW1vdmVUeXBlZExpc3RlbmVyIHRlc3RzCi0JdHJ5IHsKLQkJd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCX0KLQl9KTsKLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQl9Ci0JfTsKLQl3aWRnZXQuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0Jd2lkZ2V0LnJlbW92ZUxpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQl3aWRnZXQuc2V0RGF0YSh3aWRnZXQpOwotCWFzc2VydEVxdWFscyh3aWRnZXQsIHdpZGdldC5nZXREYXRhKCkpOwotCi0Jd2lkZ2V0LnNldERhdGEobnVsbCk7Ci0JYXNzZXJ0TnVsbCh3aWRnZXQuZ2V0RGF0YSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpIHsKLQl3aWRnZXQuc2V0RGF0YSgidGhlIHdpZGdldCIsIHdpZGdldCk7Ci0JYXNzZXJ0RXF1YWxzKHdpZGdldCwgd2lkZ2V0LmdldERhdGEoInRoZSB3aWRnZXQiKSk7Ci0KLQl3aWRnZXQuc2V0RGF0YSgidGhlIHdpZGdldCIsIG51bGwpOwotCWFzc2VydE51bGwod2lkZ2V0LmdldERhdGEoInRoZSB3aWRnZXQiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JYXNzZXJ0Tm90TnVsbCh3aWRnZXQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZSh3aWRnZXQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc3BsYXkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpKSB0ZXN0X2FkZERpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfYWRkTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YSIpKSB0ZXN0X2dldERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzcGxheSIpKSB0ZXN0X2dldERpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLXByaXZhdGUgV2lkZ2V0IHdpZGdldDsKLQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0Jd2lkZ2V0ID0gdzsKLX0KLQotcHJvdGVjdGVkIHZvaWQgaG9va0xpc3RlbmVycyhXaWRnZXQgdywgaW50W10gdHlwZXMsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICB3LmFkZExpc3RlbmVyKHR5cGVzW2ldLCBsaXN0ZW5lcik7Ci0gICAgfQotfQotCi1wcm90ZWN0ZWQgU3RyaW5nW10gaG9va0V4cGVjdGVkRXZlbnRzKFN0cmluZyB0eXBlLCBmaW5hbCBqYXZhLnV0aWwuVmVjdG9yIGV2ZW50cykgewotICAgIHJldHVybiBob29rRXhwZWN0ZWRFdmVudHMod2lkZ2V0LCB0eXBlLCBldmVudHMpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nW10gaG9va0V4cGVjdGVkRXZlbnRzKFdpZGdldCB3LCBTdHJpbmcgdHlwZSwgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICBTdHJpbmdbXSBleHBlY3RlZEV2ZW50cyA9IChTdHJpbmdbXSlDb25zaXN0ZW5jeVV0aWxpdHkuZXZlbnRPcmRlcmluZy5nZXQodHlwZSk7Ci0gICAgaG9va0V4cGVjdGVkRXZlbnRzKHcsIGV4cGVjdGVkRXZlbnRzLCBldmVudHMpOwotICAgIHJldHVybiBleHBlY3RlZEV2ZW50czsKLX0KLQotcHJvdGVjdGVkIHZvaWQgaG9va0V4cGVjdGVkRXZlbnRzKFdpZGdldCB3LCBTdHJpbmdbXSB0eXBlcywgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICBob29rTGlzdGVuZXJzKHcsIENvbnNpc3RlbmN5VXRpbGl0eS5jb252ZXJ0RXZlbnROYW1lcyh0eXBlcyksIAotCSAgICAgICAgbmV3IExpc3RlbmVyKCkgewotCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBDb25zaXN0ZW5jeVV0aWxpdHkuZXZlbnROYW1lc1tlLnR5cGVdOwotCSAgICAgICAgICAgICAgICBpZihlLnR5cGUgPT0gU1dULlRyYXZlcnNlKQotCSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiOiIrQ29uc2lzdGVuY3lVdGlsaXR5LmdldFRyYXZlcnNhbFR5cGUoZS5kZXRhaWwpOwotCSAgICAgICAgICAgICAgICBlbHNlIGlmKGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotCSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiOiIrQ29uc2lzdGVuY3lVdGlsaXR5LmdldFNlbGVjdGlvblR5cGUoZS5kZXRhaWwpOwotICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKHRlbXApOwotCSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVtcCArIGUud2lkZ2V0KTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9KTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKLSAgICBTdHJpbmcgdGVzdCA9IGdldE5hbWUoKTsKLSAgICBpbnQgaW5kZXggPSB0ZXN0Lmxhc3RJbmRleE9mKCdfJyk7Ci0gICAgaWYoaW5kZXggIT0gLTEpCi0gICAgICAgIHRlc3QgPSB0ZXN0LnN1YnN0cmluZyhpbmRleCsxLCB0ZXN0Lmxlbmd0aCgpKTsKLSAgICBTdHJpbmcgY2xzcyA9IGdldENsYXNzTmFtZSgpOwotICAgIGlmKCghdGVzdC5lcXVhbHMoIk1lbnVEZXRlY3QiKSB8fCBjbHNzLmVxdWFscygiVGFibGUiKSB8fCBjbHNzLmVxdWFscygiVGFibGVUcmVlIikgfHwgdGVzdC5zdGFydHNXaXRoKCJDaGV2cm9uIikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiRHJhZ0RldGVjdCIpIHx8IGNsc3MuZXF1YWxzKCJUcmVlIikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlVHJlZSIpIHx8IHRlc3Quc3RhcnRzV2l0aCgiQ2hldnJvbiIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkRvdWJsZUNsaWNrIikgfHwgY2xzcy5lcXVhbHMoIkxpc3QiKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJLZXlTZWxlY3Rpb24iKSB8fCBjbHNzLmVxdWFscygiU2xpZGVyIikgfHwgY2xzcy5lcXVhbHMoIkNvbWJvIikgfHwgY2xzcy5lcXVhbHMoIkNDb21ibyIpIHx8IGNsc3MuZXF1YWxzKCJDVGFiRm9sZGVyIikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiRW50ZXJTZWxlY3Rpb24iKSB8fCBjbHNzLmVxdWFscygiQnV0dG9uIikgfHwgY2xzcy5lcXVhbHMoIlRvb2xCYXIiKSB8fCBjbHNzLmVxdWFscygiQ0NvbWJvIikgfHwgY2xzcy5lcXVhbHMoIkV4cGFuZEJhciIpKSkKLSAgICAgICAgdGVzdCA9IGNsc3MgKyB0ZXN0OwotICAgIHJldHVybiB0ZXN0OwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICBTdHJpbmcgY2xhenogPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBjbGF6ei5sYXN0SW5kZXhPZignXycpOwotICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICBjbGF6eiA9IGNsYXp6LnN1YnN0cmluZyhpbmRleCsxLCBjbGF6ei5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIGNsYXp6OwotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NjZiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjEgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nID4gTG9jYXRpb24uY2hhbmdlZCAodG9wIHRydWUpPiBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogY2VydGFpbiBicm93c2VycyBkbyBzZW5kIG11bHRpcGxlIGNoYW5naW5nIGV2ZW50cy4gU2FmYXJpIGRvZXMgdGhpcy4gKi8KLQkJCQkvKiB2ZXJpZnkgdGhlIHBhZ2UgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGFzIGJlaW5nIGxvYWRlZCAqLwotCQkJCXBhc3NlZCA9ICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogaWdub3JlIG5vbiB0b3AgZnJhbWUgbG9hZGluZyAqLwotCQkJCWlmICghZXZlbnQudG9wKSByZXR1cm47Ci0JCQkJLyogdmVyaWZ5IGEgY2hhbmdlZCBmb2xsb3dzIGF0IGxlYXN0IG9uZSBjaGFuZ2luZyAqLwotCQkJCS8qIHZlcmlmeSB0aGUgcGFnZSBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgYXMgYmVpbmcgbG9hZGVkICovCi0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQiKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmIGxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJCS8vIFRFTVBPUkFSSUxZIENPTU1FTlRFRCBPVVQKLQkJCQkvKmlmICghcGFzc2VkKSovIHNoZWxsLmNsb3NlKCk7Ci0vKgkJCQlpZiAocGFzc2VkKSB7Ci0JCQkJCSB3YWl0IGEgbGl0dGxlIGJpdCBtb3JlIGJlZm9yZSBkZWNsYXJpbmcgaXQgYSBzdWNjZXNzLAotCQkJCQkgKiBpbiBjYXNlIGJvZ3VzIGV2ZW50cyBmb2xsb3cgdGhpcyBvbmUuCi0JCQkJCSAKLQkJCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge307Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCQl9OwotCQkJCQl9LnN0YXJ0KCk7Ci0JCQkJfQotKi8JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZyBGaWx0ZXJpbmcgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSA+IG5vIExvY2F0aW9uLmNoYW5nZWQsIG5vIFByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2luZyAiK2V2ZW50LmxvY2F0aW9uKTsKLQkJCQlwYXNzZWQgPSAhbG9jYXRpb25DaGFuZ2luZyAmJiAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgewotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfQotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJcGFzc2VkID0gZXZlbnQubG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24rIiAiK3Bhc3NlZCk7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQgIitwYXNzZWQpOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJU3RyaW5nW10gdXJscyA9IHsiaHR0cDovL3d3dy5nb29nbGUuY29tIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmNjVhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjIgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsb2NhdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigic2V0VGV4dCAtIGFyZ3M6ICIraHRtbCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyA+IExvY2F0aW9uLmNoYW5nZWQgPiBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyogY2VydGFpbiBicm93c2VycyBkbyBzZW5kIG11bHRpcGxlIGNoYW5naW5nIGV2ZW50cy4gU2FmYXJpIGRvZXMgdGhpcy4gKi8KLQkJCQlwYXNzZWQgPSAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZWQgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlZCIpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQkJaWYgKHBhc3NlZCkgewotCQkJCQkvKiB3YWl0IGEgbGl0dGxlIGJpdCBtb3JlIGJlZm9yZSBkZWNsYXJpbmcgaXQgYSBzdWNjZXNzLAotCQkJCQkgKiBpbiBjYXNlIGJvZ3VzIGV2ZW50cyBmb2xsb3cgdGhpcyBvbmUuCi0JCQkJCSAqLwotCQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIHN0YXJ0Iik7Ci0JCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQkJfQotCQkJCQl9LnN0YXJ0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigic2V0VGV4dCBVUkwgTG9hZGluZyBGaWx0ZXJpbmcgLSBhcmdzOiAiK2h0bWwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgPiBubyBMb2NhdGlvbi5jaGFuZ2VkLCBubyBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJLyoKLQkJCQkqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuICBXaGVuIHBlbmRpbmcgcmVxdWVzdHMgYXJlIHN0b3BwZWQsIElFCi0JCQkJKiBlbWl0cyBhIExvY2F0aW9uLmNoYW5naW5nIHdpdGggcmVzOi8vQzpcV0lORE9XU1xTeXN0ZW0zMlxzaGRvY2xjLmRsbC9uYXZjYW5jbC5odG0uCi0JCQkJKiBQZW5kaW5nIHJlcXVlc3RzIGFyZSBzdG9wcGVkIGJlZm9yZSBnb2luZyB0byB0aGUgYmxhbmsgcGFnZSB0byBzZXQgSFRNTCBpbiBtZW1vcnkKLQkJCQkqIHdpdGggc2V0VGV4dC4KLQkJCQkqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBnZXQgbXVsdGlwbGUgTG9jYXRpb24uY2hhbmdpbmcgZXZlbnRzIGF0IHRoZSBjb25kaXRpb24KLQkJCQkqIHRoYXQgbm8gbG9jYXRpb25DaGFuZ2VkIGFuZCBwcm9ncmVzc0NvbXBsZXRlZCBhcmUgcmVwb3J0ZWQuCi0JCQkJKi8KLQkJCQlwYXNzZWQgPSAhbG9jYXRpb25DaGFuZ2VkICYmICFwcm9ncmVzc0NvbXBsZXRlZDsKLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgewotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgYXN5bmNleGVjIHNoZWxsLmNsb3NlIik7Ci0JCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJfQotCQkJCX0uc3RhcnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJcGFzc2VkID0gZXZlbnQubG9jYXRpb24ubGVuZ3RoKCkgPT0gMDsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24rIiAiK3Bhc3NlZCk7Ci0JCQkJLyogaWdub3JlIExvY2F0aW9uQ2hhbmdlZCB0aGF0IGFyZSBlbXB0eSAqLwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9ICFwYXNzZWQ7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGxvY2F0aW9uLCBJRSBzdGlsbCBmaXJlcyBhIERvY3VtZW50Q29tcGxldGUKLQkJCQkgKiBmb2xsb3dpbmcgdGhlIEJlZm9yZU5hdmlnYXRlMiBjYW5jZWwgZXZlbnQuIFRoaXMgRG9jdW1lbnRDb21wbGV0ZSBldmVudCBjb250YWlucyBhbiBlbXB0eSBVUkwKLQkJCQkgKiBzaW5jZSB0aGUgVVJMIGluIEJlZm9yZU5hdmlnYXRlMiB3YXMgY29ycmVjdGx5IGNhbmNlbGxlZC4KLQkJCQkgKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gc2VuZCBhIExvY2F0aW9uLmNoYW5nZWQgYW5kIGEgUHJvZ3Jlc3MuY29tcGxldGVkIGV2ZW50cyBhZnRlcgotCQkJCSAqIGEgTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgLSBhdCB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgZW1wdHksCi0JCQkJICogb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUgbG9jYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLiAKLQkJCQkgKi8KLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBicm93c2VyLmdldFVybCgpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkICIrcGFzc2VkKTsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJU3RyaW5nW10gaHRtbCA9IHtmaWxlMX07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MShodG1sW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QyKGh0bWxbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZTEgPSAiPEhUTUw+PEhFQUQ+IisKLQkJIjxNRVRBIEhUVFAtRVFVSVY9XCJDb250ZW50LVR5cGVcIiBDT05URU5UPVwidGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTFcIj4iKwotCQkiPFRJVExFPlRlc3Qgd2l0aCAyIGZyYW1lczwvVElUTEU+IisKLQkJIjwvSEVBRD48Qk9EWT5zb21lIHNpbXBsZSB0ZXN0IGNhc2UgaGVyZTwvQk9EWT48L0hUTUw+IjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhM2VlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjMgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbldpbmRvdywgbG9jYXRpb25DaGFuZ2luZywgbG9jYXRpb25DaGFuZ2VkLCB2aXNpYmlsaXR5U2hvdywgcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXNjcmlwdCB3aW5kb3cub3BlbiAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IEJyb3dzZXIxOk9wZW5XaW5kb3cub3BlbiA+IHsgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdpbmcsIEJyb3dzZXIyOlZpc2liaWxpdHkuc2hvdywgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdlZCB9ID4gQnJvd3NlcjI6UHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMSA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyMiA9IG5ldyBCcm93c2VyKHNoZWxsMiwgU1dULk5PTkUpOwotCQlicm93c2VyMS5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlvcGVuV2luZG93ID0gdHJ1ZTsKLQkJCQlCcm93c2VyIHNyYyA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlpZiAoc3JjICE9IGJyb3dzZXIxKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCAiK2Jyb3dzZXIxKyIsIGdvdCAiK3NyYyk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5icm93c2VyICE9IG51bGwpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkIG51bGwsIGdvdCAiK2V2ZW50LmJyb3dzZXIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjI7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93IHx8ICFsb2NhdGlvbkNoYW5naW5nKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbkV2ZW50LmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIExvY2F0aW9uRXZlbnQuY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBkaWQgbm90IGV4cGVjdCBWaXNpYmlsaXR5RXZlbnQuaGlkZSIpOwotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBWaXNpYmlsaXR5RXZlbnQuc2hvdyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47CQkJCQkKLQkJCQl9Ci0JCQkJc2hlbGwyLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCX0KLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyMS5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7CQkKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjMuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyMy5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsJCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjQzM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI0IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5XaW5kb3csIGxvY2F0aW9uQ2hhbmdpbmcsIGxvY2F0aW9uQ2hhbmdlZCwgdmlzaWJpbGl0eVNob3csIHByb2dyZXNzQ29tcGxldGVkLCBjbG9zZVdpbmRvdzsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhc2NyaXB0IHdpbmRvdy5vcGVuIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogQnJvd3NlcjE6T3BlbldpbmRvdy5vcGVuID4geyBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2luZywgQnJvd3NlcjI6VmlzaWJpbGl0eS5zaG93LCBCcm93c2VyMjpMb2NhdGlvbi5jaGFuZ2VkIH0gPiBCcm93c2VyMjpQcm9ncmVzcy5jb21wbGV0ZWQgPiBCcm93c2VyMi5DbG9zZVdpbmRvdy5jbG9zZSIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjEgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjIgPSBuZXcgQnJvd3NlcihzaGVsbDIsIFNXVC5OT05FKTsKLQkJYnJvd3NlcjEuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJb3BlbldpbmRvdyA9IHRydWU7Ci0JCQkJQnJvd3NlciBzcmMgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJaWYgKHNyYyAhPSBicm93c2VyMSkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIiticm93c2VyMSsiLCBnb3QgIitzcmMpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZXZlbnQuYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCBudWxsLCBnb3QgIitldmVudC5icm93c2VyKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXIyOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdyB8fCAhbG9jYXRpb25DaGFuZ2luZykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb24uY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb24uY2hhbmdpbmcgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlsb2NhdGlvbkNoYW5naW5nID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBkaWQgbm90IGV4cGVjdCBWaXNpYmlsaXR5RXZlbnQuaGlkZSIpOwotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBWaXNpYmlsaXR5LnNob3cgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQkJfQotCQkJCXNoZWxsMi5vcGVuKCk7Ci0JCQkJdmlzaWJpbGl0eVNob3cgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCWlmICghbG9jYXRpb25DaGFuZ2luZyB8fCAhbG9jYXRpb25DaGFuZ2VkIHx8ICF2aXNpYmlsaXR5U2hvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gUHJvZ3Jlc3MuY29tcGxldGVkIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFwcm9ncmVzc0NvbXBsZXRlZCkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gQ2xvc2VXaW5kb3cuY2xvc2UgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljbG9zZVdpbmRvdyA9IHRydWU7Ci0JCQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHBhcmVudCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQlwYXJlbnQuY2xvc2UoKTsKLQkJCQkKLQkJCQluZXcgVGhyZWFkKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJdHJ5IHsgc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCX0KLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyMS5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7CQkKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjQuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNC5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsJCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTkyMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI1IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQlzdGF0aWMgUG9pbnRbXVtdIHJlZ3Jlc3Npb25Cb3VuZHMgPSB7Ci0JCQkJe25ldyBQb2ludCgxMCwyMDApLCBuZXcgUG9pbnQoMzAwLDEwMCl9LAotCQkJCXtuZXcgUG9pbnQoMTAsMjAwKSwgbnVsbH0sCi0JCQkJe251bGwsIG5ldyBQb2ludCgzMDAsMTAwKX0sCi0JCQkJe251bGwsIG51bGx9fTsKLQlzdGF0aWMgaW50IGluZGV4ID0gMDsKLQlzdGF0aWMgaW50IGNudFBhc3NlZCA9IDA7Ci0Jc3RhdGljIGludCBjbnRDbG9zZWQgPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gd2l0aCBsb2NhdGlvbiBhbmQgc2l6ZSBwYXJhbWV0ZXJzIC0gYXJnczogIit1cmwrIlxuICBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogVmlzaWJpbGl0eS5zaG93Iik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5XaW5kb3cgIitpbmRleCk7Ci0JCQkJU2hlbGwgbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQkJbmV3U2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKG5ld1NoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJpbmRleCIsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQkJCVNoZWxsIHBhcmVudCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZXZlbnQubG9jYXRpb247Ci0JCQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSBwYXJlbnQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJaWYgKHNpemUgIT0gbnVsbCkgcGFyZW50LnNldFNpemUoc2l6ZSk7Ci0JCQkJCQlpbnQgaW5kZXggPSAoKEludGVnZXIpYnJvd3Nlci5nZXREYXRhKCJpbmRleCIpKS5pbnRWYWx1ZSgpOwotCQkJCQkJcGFyZW50LnNldFRleHQoIlNXVCBCcm93c2VyIHNoZWxsICIraW5kZXgpOwotCQkJCQkJcGFyZW50Lm9wZW4oKTsKLQkJCQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkJCQkvKiBDZXJ0YWluIGJyb3dzZXJzIGZpcmUgbXVsdGlwbGUgc2hvdyBldmVudHMgZm9yIG5vIGdvb2QgcmVhc29uLiBGdXJ0aGVyIHNob3cgZXZlbnRzCi0JCQkJCQkJICogYXJlIGNvbnNpZGVyZWQgJ2xlZ2FsJyBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgY29udGFpbiBzaXplIGFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQkJCQkJCQkgKi8KLQkJCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCB8fCBzaXplICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIEJyb3dzZXIgIitpbmRleCsiIGlzIHJlY2VpdmluZyBtdWx0aXBsZSBzaG93IGV2ZW50cyIpOwotCQkJCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVbm5lY2Vzc2FyeSAoYnV0IGhhcm1sZXNzKSB2aXNpYmlsaXR5LnNob3cgZXZlbnQgQnJvd3NlciAiK2luZGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHkuc2hvdyBicm93c2VyICIraW5kZXgrIiBsb2NhdGlvbiAiK2xvY2F0aW9uKyIgc2l6ZSAiK3NpemUpOwotCQkJCQkJCWJyb3dzZXIuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcigtMTAwLWluZGV4KSk7Ci0KLQkJCQkJCQkvKiBDZXJ0YWluIGJyb3dzZXJzIGluY2x1ZGUgZGVjb3JhdGlvbnMgaW4gYWRkaXRpb24gdG8gdGhlIGV4cGVjdGVkIHNpemUuCi0JCQkJCQkJICogQWNjZXB0IHNpemVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgc2l6ZS4KLQkJCQkJCQkgKiBDZXJ0YWluIGJyb3dzZXJzIGludmVudCBzaXplIG9yIGxvY2F0aW9uIHdoZW4gc29tZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLgotCQkJCQkJCSAqIElmIHdlIGV4cGVjdCBudWxsIGZvciBvbmUgb2Ygc2l6ZSBvciBsb2NhdGlvbiwgYWxzbyBhY2NlcHQgbm9uIG51bGwgYW5zd2Vycy4KLQkJCQkJCQkgKi8KLQkJCQkJCQlQb2ludCBleHBlY3RlZExvY2F0aW9uID0gcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMF07Ci0JCQkJCQkJUG9pbnQgZXhwZWN0ZWRTaXplID0gcmVncmVzc2lvbkJvdW5kc1tpbmRleF1bMV07Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9jYXRpb24gIitleHBlY3RlZExvY2F0aW9uKyIgc2l6ZSAiK2V4cGVjdGVkU2l6ZSk7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja0xvY2F0aW9uID0gKGxvY2F0aW9uID09IG51bGwgJiYgZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsKSB8fAotCQkJCQkJCQkobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5lcXVhbHMoZXhwZWN0ZWRMb2NhdGlvbikgfHwKLQkJCQkJCQkJKGxvY2F0aW9uICE9IG51bGwgJiYgZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsKSk7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja1NpemUgID0gKHNpemUgPT0gbnVsbCAmJiBleHBlY3RlZFNpemUgPT0gbnVsbCkgfHwgCi0JCQkJCQkJCShzaXplICE9IG51bGwgJiYgc2l6ZS5lcXVhbHMoZXhwZWN0ZWRTaXplKSkgfHwKLQkJCQkJCQkJKHNpemUgIT0gbnVsbCAmJiBleHBlY3RlZFNpemUgPT0gbnVsbCkgfHwKLQkJCQkJCQkJKHNpemUgIT0gbnVsbCAmJiBzaXplLnggPj0gZXhwZWN0ZWRTaXplLnggJiYgc2l6ZS55ID49IGV4cGVjdGVkU2l6ZS55KTsKLQkJCQkJCQlpZiAoIWNoZWNrU2l6ZSB8fCAhY2hlY2tMb2NhdGlvbikgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIJRmFpbHVyZSAiKTsKLQkJCQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgY250UGFzc2VkKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCQljbnRDbG9zZWQrKzsKLQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkNsb3NlIik7Ci0JCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCQlicm93c2VyLmdldFNoZWxsKCkuY2xvc2UoKTsKLQkJCQkJCWlmIChjbnRQYXNzZWQgPT0gcmVncmVzc2lvbkJvdW5kcy5sZW5ndGgpIHBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoY250Q2xvc2VkID09IHJlZ3Jlc3Npb25Cb3VuZHMubGVuZ3RoKSB7Ci0JCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsJCQotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNS5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI1Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0ge3VybH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI2LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwZDNmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjYgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJVUkwgTG9hZGluZywgdmVyaWZ5IGdldCB0aXRsZSBldmVudCAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFRpdGxlLmNoYW5nZWQiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgdXJsID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBjaGFuZ2VkIDwiK2V2ZW50LnRpdGxlKyI+IGZvciBsb2NhdGlvbiA8Iit1cmwrIj4iKTsKLQkJCQlwYXNzZWQgPSB0cnVlOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCA2MDApOwotCQlpZiAodGltZW91dCkgcGFzc2VkID0gZmFsc2U7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDIoU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkVGl0bGUpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcsIHZlcmlmeSBnZXQgdGl0bGUgZXZlbnQgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBUaXRsZS5jaGFuZ2VkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChUaXRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVN0cmluZyB1cmwgPSBicm93c2VyLmdldFVybCgpOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIGNoYW5nZWQgPCIrZXZlbnQudGl0bGUrIj4gZm9yIGxvY2F0aW9uIDwiK3VybCsiPiIpOwotCQkJCWlmIChldmVudC50aXRsZS5lcXVhbHMoZXhwZWN0ZWRUaXRsZSkpIHsKLQkJCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCQotCQlTdHJpbmdbXSB1cmxzID0geyJodHRwOi8vd3d3Lmdvb2dsZS5jb20ifTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjYuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjYuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNi5odG1sIjsKLQkJdXJscyA9IG5ldyBTdHJpbmdbXSB7dXJsfTsKLQkJU3RyaW5nW10gdGl0bGVzID0geyJUaGlzIGlzIGEgdGVzdCB0aXRsZSB0aGF0IG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQgd2hlbiB0aGF0IHBhZ2UgaXMgbG9hZGVkIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0Mih1cmxzW2ldLCB0aXRsZXNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQkKLQkJCi0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBjMWMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXN0YXRpYyBpbnQgY250T3BlbiA9IDA7Ci0Jc3RhdGljIGludCBjbnRTaG93ID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIndpbmRvdy5vcGVuLCB2ZXJpZnkgZ2V0IFdpbmRvdy5vcGVuIGFuZCBXaW5kb3cuc2hvdyBldmVudHMgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBXaW5kb3cub3BlbiwgV2luZG93LnNob3cgbXVsdGlwbGUgdGltZXMiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQotCQljbnRPcGVuID0gMDsKLQkJY250U2hvdyA9IDA7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCh1cmwpOwotCQkKLQkJYm9vbGVhbiB0aW1lb3V0ID0gcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCAxMCk7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIldpbmRvdyBvcGVuZWQ6ICIrY250T3BlbisiIFdpbmRvdyBzaG93bjogIitjbnRTaG93KTsKLQkJLyoKLQkJICogQnVnIGluIE1vemlsbGEuIE11bHRpcGxlIHNob3cgZXZlbnRzIGFyZSBmaXJlZCBieSBNb3ppbGxhLgotCQkgKi8KLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGNudE9wZW4gPT0gNCAmJiBjbnRTaG93ID49IDQ7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIub3BlbiIpOwotCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQkJCWNudE9wZW4rKzsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zaG93IGxvY2F0aW9uPSIrZXZlbnQubG9jYXRpb24rIiBzaXplPSIrZXZlbnQuc2l6ZSsiIGFkZHJlc3NCYXI9IitldmVudC5hZGRyZXNzQmFyKyIgbWVudUJhcj0iK2V2ZW50Lm1lbnVCYXIrIiBzdGF0dXNCYXI9IitldmVudC5zdGF0dXNCYXIrIiB0b29sQmFyPSIrZXZlbnQudG9vbEJhcik7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQkJCX0KLQkJCQljbnRTaG93Kys7Ci0JCQkJc2hlbGwub3BlbigpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci19Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyNy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdCh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjlmNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI4IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0Jc3RhdGljIFN0cmluZyBodG1sW10gPSB7IjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4ifTsKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdFtdID0gewotCQkidmFyIG5ld05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7IFxyXG4iKwotCQkidmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnQXQgbGVhc3Qgd2hlbiBJIGFtIGFyb3VuZCcpO1xyXG4iKwotCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiIrCi0JCSJcclxuIisKLQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7In07Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoZmluYWwgaW50IGluZGV4KSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFzY3JpcHQgLSB2ZXJpZnkgZXhlY3V0ZSgpIHdvcmtzIG9uIEhUTUwgcmVuZGVyZWQgZnJvbSBtZW1vcnkgd2l0aCBnZXRUZXh0IC0gc2NyaXB0IGluZGV4ICIraW5kZXgpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlwYXNzZWQgPSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0W2luZGV4XSk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sW2luZGV4XSk7Ci0JCQotCQlydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDEwKTsKLQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyOC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJicm93c2VyNy5odG1sIikudG9TdHJpbmcoKTsKLQkJZWxzZSB1cmwgPSBwbHVnaW5QYXRoICsgIi9kYXRhL2Jyb3dzZXI3Lmh0bWwiOwotCQlTdHJpbmdbXSB1cmxzID0gbmV3IFN0cmluZ1tdIHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdChpKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTRiMGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI5IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0Jc3RhdGljIFN0cmluZyBodG1sW10gPSB7ImJyb3dzZXI5Lmh0bWwifTsKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdFtdID0gewotCQkiY2hhbmdlU3RhdHVzKCduZXcgdGl0bGUnKTsifTsKLQlzdGF0aWMgU3RyaW5nIHN0YXR1c1tdID0geyJuZXcgdGl0bGUifTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdChTdHJpbmcgdXJsLCBmaW5hbCBTdHJpbmcgc2NyaXB0LCBmaW5hbCBTdHJpbmcgc3RhdHVzKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFzY3JpcHQgLSB2ZXJpZnkgZXhlY3V0ZSgiK3NjcmlwdCsiKSB3b3JrcyBvbiBhIHN0YXRpYyBIVE1MIGZpbGUgIit1cmwpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJxdWVyeSIsIGV2ZW50LnRleHQpOwotCQl9fSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZXhlY3V0ZShzY3JpcHQpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImV4ZWN1dGUgZmFpbGVkIGZvciAiK3NjcmlwdCk7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8qIFNjcmlwdCBtYXkgYWRkaXRpb25hbGx5IHNldCB0aGUgU3RhdHVzIHZhbHVlICovCi0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylicm93c2VyLmdldERhdGEoInF1ZXJ5Iik7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigid2luZG93LnN0YXR1cyBhZnRlciBzY3JpcHQ6ICIrdmFsdWUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlwYXNzZWQgPSBzdGF0dXMuZXF1YWxzKHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIitzY3JpcHQrIiwgbm90ICIrdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCXJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgMTApOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JIAotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkJCQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUExVR0lOX1BBVEggPCIrcGx1Z2luUGF0aCsiPiIpOwotCQlTdHJpbmcgdXJsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoaHRtbFtpXSkudG9TdHJpbmcoKTsKLQkJCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS8iK2h0bWxbaV07Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QodXJsLCBzY3JpcHRbaV0sIHN0YXR1c1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9UZXN0X0Jyb3dzZXJTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY2M2IxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9UZXN0X0Jyb3dzZXJTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X0Jyb3dzZXJTdWl0ZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi1wdWJsaWMgVGVzdF9Ccm93c2VyU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXIxKCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXIxICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyMS50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyMigpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyMiAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjIudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjMoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjMgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXIzLnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI0KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI0ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNC50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNSgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNSAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjUudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjYoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjYgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI2LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI3KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI3ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNy50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyOCgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyOCAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjgudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjkoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjkgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI5LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RfQnJvd3NlclN1aXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXIxIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyMyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyOSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCS8qCi0JICogVGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgbWFuYWdlIHRoZWlyIG93biBEaXNwbGF5IGFuZCBldmVudCBsb29wCi0JICogdG8gdmFsaWRhdGUgYXN5bmNocm9ub3VzIHVzZSBjYXNlcy4KLQkgKiBEaXNwb3NlIGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIGRpc3BsYXkgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAotCSAqIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdHMuCi0JICovCi0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JaWYgKGRpc3BsYXkgIT0gbnVsbCkgZGlzcGxheS5kaXNwb3NlKCk7Ci0JCi0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIxIikpIEJyb3dzZXIxKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIyIikpIEJyb3dzZXIyKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXIzIikpIEJyb3dzZXIzKCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI0IikpIEJyb3dzZXI0KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI1IikpIEJyb3dzZXI1KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI2IikpIEJyb3dzZXI2KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI3IikpIEJyb3dzZXI3KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI4IikpIEJyb3dzZXI4KCk7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoIkJyb3dzZXI5IikpIEJyb3dzZXI5KCk7Ci0KLQkvKgotCSAqIEVuc3VyZSB3ZSBkb24ndCBsZWF2ZSBhIERpc3BsYXkgZnJvbSB0aGUgdGVzdHMgd2UgcnVuLgotCSAqLwkKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JaWYgKGRpc3BsYXkgIT0gbnVsbCkgZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZDNhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGM4ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmdpZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdJRjg3YRIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMTlkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuanBnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot/9j/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODYwYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdEJhZEJpdERlcHRoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzY2I5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2VtcHR5LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZW1wdHkudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MzUxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTdjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcwMTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMmRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMTIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODg2YmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY4ODgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNmQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9pbnRlcmxhY2VkX3RhcmdldC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0NzQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ludGVybGFjZWRfdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvanVuaXRHZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlMDkxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2p1bml0R2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi0vKioKLSAqIENyZWF0ZSBTV1QgSnVuaXQgc3R1YnMgYmFzZWQgb24gYSBzd3QgamFyIHVzZWQgYXMgYSByZWZlcmVuY2UKLSAqIENvbW1hbmQgbGluZSB0b29sIC0gcnVuIHdpdGhvdXQgcGFyYW1ldGVycyB0byBnZXQgaGVscCBpbmZvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MganVuaXRHZW4gewotCVN0cmluZyBkZXN0Rm9sZGVyID0gbnVsbDsKLQlpbnQgY291bnRlciA9IDA7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGphcmZpbGUgdGhlIHVybCBvZiBhIGphciBmaWxlCi0JICogQHJldHVybiBhbGwgcHVibGljIGNsYXNzZXMgaW4gdGhlIGphcgotCSAqLwotCXB1YmxpYyBWZWN0b3IgZ2V0Q2xhc3NlcyhTdHJpbmcgamFyZmlsZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQl0cnkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoamFyZmlsZSk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShqYXJmaWxlKTsKLQkJCVVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0pOwotCi0JCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAiLmNsYXNzIi5sZW5ndGgoKSk7Ci0JCQkJCW5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGxvYWRlcik7Ci0JCQkJCWlmIChmaWx0ZXJDbGFzcyhjbGF6eikpIHZlY3Rvci5hZGQoY2xhenopOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uICIgKyBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB2ZWN0b3I7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhIEp1bml0IGphdmEgdGVzdCBmaWxlCi0JICogQHBhcmFtIGNsYXp6IGNsYXNzIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlVGVzdChDbGFzcyBjbGF6eikgewotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJbmFtZSA9IGRlc3RGb2xkZXIgKyAiLyIgKyBuYW1lICsgIi5qYXZhIjsKLQkJCUZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobmFtZSk7Ci0JCQljcmVhdGVTd3RUZXN0KHdyaXRlciwgY2xhenopOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiAiICsgZSk7Ci0JCX0KLQkJCi0JfQotCi0Jdm9pZCBjcmVhdGVTd3RUZXN0KEZpbGVXcml0ZXIgd3JpdGVyLCBDbGFzcyBjbGF6eikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3d0VGVzdCB0ZXN0ID0gbmV3IFN3dFRlc3Qod3JpdGVyLCBjbGF6eik7Ci0JCXRlc3Qud3JpdGVDb3B5UmlnaHRzKCk7Ci0JCXRlc3Qud3JpdGVQYWNrYWdlKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlSW1wb3J0cygpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZUNsYXNzQ29tbWVudHMoKTsKLQkJdGVzdC53cml0ZUNsYXNzRGVjbGFyYXRpb24oKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVDb25zdHJ1Y3RvcigpOwkJCi0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlTWFpbigpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVNldFVwKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlVGVhckRvd24oKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNZXRob2RzKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlU3VpdGUoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVNZXRob2ROYW1lcygpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVJ1blRlc3QoKTsKLQkJdGVzdC53cml0ZUNsYXNzQ2xvc3VyZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbkZvbGRlcihTdHJpbmcgZGVzdCkgewotCQlkZXN0Rm9sZGVyID0gZGVzdDsJCi0JfQotCi0JcHVibGljIHZvaWQgaW5jcmVtZW50Q291bnRlcigpIHsKLQkJY291bnRlcisrOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvdW50ZXIoKSB7Ci0JCXJldHVybiBjb3VudGVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGVzdHMoU3RyaW5nIGphcmZpbGUsIFN0cmluZyBkZXN0Rm9sZGVyKSB7Ci0JCWp1bml0R2VuIGdlbiA9IG5ldyBqdW5pdEdlbigpOwotCQlWZWN0b3IgY2xhc3NlcyA9IGdlbi5nZXRDbGFzc2VzKGphcmZpbGUpOwotCQlnZW4uc2V0RGVzdGluYXRpb25Gb2xkZXIoZGVzdEZvbGRlcik7Ci0JCWlmIChjbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZC4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gY2xhc3Nlcy5lbGVtZW50cygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZ2VuLmNyZWF0ZUZpbGVUZXN0KChDbGFzcyllbnRyaWVzLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBzdHVicyB3cml0dGVuOiAiICsgZ2VuLmdldENvdW50ZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlmZihWZWN0b3Igb2xkQ2xhc3NlcywgVmVjdG9yIG5ld0NsYXNzZXMpIHsKLQkJU3d0RGlmZiBkaWZmID0gbmV3IFN3dERpZmYob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7Ci0JCWRpZmYuY29tcHV0ZSgpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmVGVzdHMoU3RyaW5nIGphcmZpbGVPbGQsIFN0cmluZyBqYXJmaWxlTmV3KSB7Ci0JCWp1bml0R2VuIGdlbiA9IG5ldyBqdW5pdEdlbigpOwotCQlWZWN0b3Igb2xkQ2xhc3NlcyA9IGdlbi5nZXRDbGFzc2VzKGphcmZpbGVPbGQpOwotCQlpZiAob2xkQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNsYXNzZXMgZm91bmQgaW4gb2xkIGphciIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVZlY3RvciBuZXdDbGFzc2VzID0gZ2VuLmdldENsYXNzZXMoamFyZmlsZU5ldyk7Ci0JCWlmIChuZXdDbGFzc2VzID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBmb3VuZCBpbiBuZXcgamFyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2VuLmRpZmYob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEganVuaXRHZW4gZmxhZyBhcmcxIGFyZzIgLi4uIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB3aGVyZSBmbGFnIGlzIG9uZSBvZjoiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlOiBjcmVhdGUgdGhlIGp1bml0IHRlc3Qgc3R1YnMiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzE6IHNvdXJjZSBqYXIgZS5nLiBkOi9zd3QuamFyIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcyOiBkZXN0aW5hdGlvbiBlLmcuIGQ6L3Rlc3RzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImRpZmY6ICAgZGlmZiAyIGphcnMgc2hvd2luZyB3aGljaCB0ZXN0cyBtdXN0IGJlIHJlbW92ZWQsIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgYW5kIGFkZGVkIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcxOiBvbGQgamFyIGUuZy4gZDovb2xkL3N3dC5qYXIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIGFyZzI6IG5ldyBqYXIgZS5nLiBkOi9uZXcvc3d0LmphciIpOwkKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYXJnc1swXS5lcXVhbHMoImNyZWF0ZSIpKSBjcmVhdGVUZXN0cyhhcmdzWzFdLCBhcmdzWzJdKTsKLQkJZWxzZSBpZiAoYXJnc1swXS5lcXVhbHMoImRpZmYiKSkgZGlmZlRlc3RzKGFyZ3NbMV0sIGFyZ3NbMl0pOwotCX0KLQkKLQlib29sZWFuIGZpbHRlckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCS8qIEpVbml0IHRlc3RzIGZvciBwdWJsaWMgY2xhc3NlcyBvbmx5ICovCi0JCWludCBtb2RpZmllcnMgPSBjbGF6ei5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSByZXR1cm4gZmFsc2U7Ci0KLQkJLyogSlVuaXQgdGVzdHMgZm9yIGNsYXNzZXMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIGFuIGludGVybmFsIHBhY2thZ2UgKi8KLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xhenouZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJaWYgKHBhY2thZ2VOYW1lLmluZGV4T2YoImludGVybmFsIikgIT0gLTEpIHJldHVybiBmYWxzZTsKLQotCQkvKiBKVW5pdCB0ZXN0cyBmb3IgY2xhc3NlcyB3aXRoIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb3IgcHVibGljIG1ldGhvZHMgKi8KLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQlpZiAoY29uc3RydWN0b3JzLmxlbmd0aCA9PSAwICYmIG1ldGhvZHMubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCQlTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKLQkJbmFtZSA9ICJUZXN0XyIgKyBuYW1lLnJlcGxhY2UoJy4nLCAnXycpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWV0aG9kTmFtZShDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewotCQlTdHJpbmcgbmFtZSA9ICJ0ZXN0X0NvbnN0cnVjdG9yIjsKLQkJQ2xhc3NbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lICs9IGdldFR5cGVTaWduYXR1cmUocGFyYW1ldGVyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JU3RyaW5nIGdldE1ldGhvZE5hbWUoTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9ICJ0ZXN0XyIgKyBtZXRob2QuZ2V0TmFtZSgpOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lICs9IGdldFR5cGVTaWduYXR1cmUocGFyYW1ldGVyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQkKLQlTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZShDbGFzcyBjbGF6eikgewotCQlpZiAoY2xhenogPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gIkkiOwotCQlpZiAoY2xhenogPT0gQm9vbGVhbi5UWVBFKSByZXR1cm4gIloiOwotCQlpZiAoY2xhenogPT0gTG9uZy5UWVBFKSByZXR1cm4gIkoiOwotCQlpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkgcmV0dXJuICJTIjsKLQkJaWYgKGNsYXp6ID09IENoYXJhY3Rlci5UWVBFKSByZXR1cm4gIkMiOwotCQlpZiAoY2xhenogPT0gQnl0ZS5UWVBFKSByZXR1cm4gIkIiOwotCQlpZiAoY2xhenogPT0gRmxvYXQuVFlQRSkgcmV0dXJuICJGIjsKLQkJaWYgKGNsYXp6ID09IERvdWJsZS5UWVBFKSByZXR1cm4gIkQiOwotCQlpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0JCQlDbGFzcyBjb21wb25lbnRUeXBlID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJcmV0dXJuICIkIiArIGdldFR5cGVTaWduYXR1cmUoY29tcG9uZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuICJMIiArIGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJ18nKTsKLQl9Ci0KLQlDb25zdHJ1Y3RvcltdIGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKENsYXNzIGNsYXp6KSB7Ci0JCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gY2xhenouZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCUFycmF5cy5zb3J0KGNvbnN0cnVjdG9ycywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIChnZXRNZXRob2ROYW1lKChDb25zdHJ1Y3RvcilhKS5jb21wYXJlVG8oZ2V0TWV0aG9kTmFtZSgoQ29uc3RydWN0b3IpYikpKTsJCQkJCQotCQkJfQotCQl9KTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzW2ldOwotCQkJaW50IG1vZGlmaWVycyA9IGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKLQkJCQljb25zdHJ1Y3RvcnNbY291bnQrK10gPSBjb25zdHJ1Y3RvcnNbaV07Ci0JCQl9Ci0JCX0KLQkJQ29uc3RydWN0b3JbXSByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnN0cnVjdG9ycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkKLQlNZXRob2RbXSBnZXRGaWx0ZXJlZE1ldGhvZHMoQ2xhc3MgY2xhenopIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlBcnJheXMuc29ydChtZXRob2RzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gKGdldE1ldGhvZE5hbWUoKE1ldGhvZClhKS5jb21wYXJlVG8oZ2V0TWV0aG9kTmFtZSgoTWV0aG9kKWIpKSk7CQkJCQkKLQkJCX0KLQkJfSk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKLQkJCQltZXRob2RzW2NvdW50KytdID0gbWV0aG9kc1tpXTsKLQkJCX0KLQkJfQotCQlNZXRob2RbXSByZXN1bHQgPSBuZXcgTWV0aG9kW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQotCi0JcHVibGljIGNsYXNzIFN3dFRlc3QgewotCQlGaWxlV3JpdGVyIHdyaXRlcjsKLQkJQ2xhc3MgY2xheno7Ci0JCVN0cmluZyBsaW5lU2VwID0gIlxyXG4iOwotCQkKLQkJU3d0VGVzdChGaWxlV3JpdGVyIHdyaXRlciwgQ2xhc3MgY2xhenopIHsKLQkJCXRoaXMud3JpdGVyID0gd3JpdGVyOwotCQkJdGhpcy5jbGF6eiA9IGNsYXp6OwotCQl9Ci0JCQotCQl2b2lkIG5ld0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlUGFja2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoInBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ29weVJpZ2h0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiArIGxpbmVTZXAgKwotIAkJCQkiICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMiICsgbGluZVNlcCArCi0gCQkJCSIgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiICsgbGluZVNlcCArCi0gCQkJCSIgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIiArIGxpbmVTZXAgKwotIAkJCQkiICogIiArIGxpbmVTZXAgKwotIAkJCQkiICogQ29udHJpYnV0b3JzOiIgKyBsaW5lU2VwICsKLSAJCQkJIiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iICsgbGluZVNlcCArCi0JCQkJIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlSW1wb3J0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJImltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsiICsgbGluZVNlcCArCi0JCQkJImltcG9ydCBqdW5pdC50ZXh0dWkuKjsiKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNsYXNzQ29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSIvKioiICsgbGluZVNlcCArCi0JCQkJIiAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpICsgbGluZVNlcCArCi0JCQkJIiAqIiArIGxpbmVTZXAgKwotCQkJCSIgKiBAc2VlICIgKyBjbGF6ei5nZXROYW1lKCkgKyBsaW5lU2VwICsKLQkJCQkiICovIgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzU3d0SnVuaXRTdXBlckNsYXNzKENsYXNzIGNsYXp6KSB7Ci0JCQlDbGFzcyBzdXBlckNsYXNzID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc3VwZXJDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJaWYgKCFwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5zd3QiKSkgcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFmaWx0ZXJDbGFzcyhzdXBlckNsYXNzKSkgcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7CQkJCQkJCi0JCX0KLQkJCi0JCVN0cmluZyBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKENsYXNzIGNsYXp6KSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENsYXNzID0gIlN3dFRlc3RDYXNlIjsKLQkJCUNsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsKSByZXR1cm4gZGVmYXVsdENsYXNzOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc3VwZXJDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJaWYgKCFwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5zd3QiKSkgcmV0dXJuIGRlZmF1bHRDbGFzczsKLQkJCWlmICghZmlsdGVyQ2xhc3Moc3VwZXJDbGFzcykpIHJldHVybiBkZWZhdWx0Q2xhc3M7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKHN1cGVyQ2xhc3MpOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ2xhc3NEZWNsYXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBnZXRTd3RKdW5pdFN1cGVyQ2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIGNsYXNzICIgKyBuYW1lICsgIiBleHRlbmRzICIgKyBzdXBlckNsYXNzTmFtZSArIiB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljICIgKyBuYW1lICsgIihTdHJpbmcgbmFtZSkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCXN1cGVyKG5hbWUpOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0JCQotCQkKLQkJdm9pZCB3cml0ZU1haW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVTZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHNldFVwKCkgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCXdyaXRlci53cml0ZSgiCXN1cGVyLnNldFVwKCk7Iik7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQotCQl2b2lkIHdyaXRlVGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQl3cml0ZXIud3JpdGUoIglzdXBlci50ZWFyRG93bigpOyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlTWV0aG9kcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVNZXRob2QoY29uc3RydWN0b3JzW2ldKTsKLQkJCQlpZiAoaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggLSAxKSB3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggPiAwICYmIG1ldGhvZHMubGVuZ3RoID4gMCkgd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQkJaWYgKGkgPCBtZXRob2RzLmxlbmd0aCAtIDEpIHdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pZCB3cml0ZU1ldGhvZChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3Rvcik7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyB2b2lkICIgKyBuYW1lICsgIigpIHsiICsgbGluZVNlcCArCi0JCQkJIgl3YXJuVW5pbXBsKFwiVGVzdCAiICsgbmFtZSArICIgbm90IHdyaXR0ZW5cIik7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWluY3JlbWVudENvdW50ZXIoKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZU1ldGhvZChNZXRob2QgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKG1ldGhvZCk7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyB2b2lkICIgKyBuYW1lICsgIigpIHsiICsgbGluZVNlcCArCi0JCQkJIgl3YXJuVW5pbXBsKFwiVGVzdCAiICsgbmFtZSArICIgbm90IHdyaXR0ZW5cIik7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWluY3JlbWVudENvdW50ZXIoKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZVN1aXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsiICsgbGluZVNlcCArCQotCQkJCSIJamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7IiArIGxpbmVTZXAgKwotCQkJCSIJamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOyIgKyBsaW5lU2VwICsKLQkJCQkiCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJCXN1aXRlLmFkZFRlc3QobmV3ICIgKyBuYW1lICsgIigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOyIgKyBsaW5lU2VwICsKLQkJCQkiCX0iICsgbGluZVNlcCArCi0JCQkJIglyZXR1cm4gc3VpdGU7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCi0JCXZvaWQgd3JpdGVNZXRob2ROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsiICsgbGluZVNlcCArCi0JCQkJIglqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3RvcnNbaV0pOwotCQkJCXdyaXRlci53cml0ZSgKLQkJCQkJIgltZXRob2ROYW1lcy5hZGRFbGVtZW50KFwiIiArIG5hbWUgKyAiXCIpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRNZXRob2ROYW1lKG1ldGhvZHNbaV0pOwotCQkJCXdyaXRlci53cml0ZSgKLQkJCQkJIgltZXRob2ROYW1lcy5hZGRFbGVtZW50KFwiIiArIG5hbWUgKyAiXCIpOyIKLQkJCQkpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gZ2V0U3d0SnVuaXRTdXBlckNsYXNzTmFtZShjbGF6eik7Ci0JCQkJd3JpdGVyLndyaXRlKCIJbWV0aG9kTmFtZXMuYWRkQWxsKCIgKyBzdXBlckNsYXNzTmFtZSArICIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiCXJldHVybiBtZXRob2ROYW1lczsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JCQotCQl2b2lkIHdyaXRlUnVuVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCQlNZXRob2RbXSBtZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aCArIG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA9PSAwKSB3cml0ZXIud3JpdGUoIglpZiIpOyBlbHNlIHdyaXRlci53cml0ZSgiCWVsc2UgaWYiKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoID8gZ2V0TWV0aG9kTmFtZShjb25zdHJ1Y3RvcnNbaV0pIDogZ2V0TWV0aG9kTmFtZShtZXRob2RzW2kgLSBjb25zdHJ1Y3RvcnMubGVuZ3RoXSk7Ci0JCQkJd3JpdGVyLndyaXRlKAotCQkJCQkiIChnZXROYW1lKCkuZXF1YWxzKFwiIiArIG5hbWUgKyAiXCIpKSAiICsgbmFtZSArICIoKTsiCi0JCQkJKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCWlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoICsgbWV0aG9kcy5sZW5ndGggPiAwKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiCWVsc2UgIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVyLndyaXRlKCIJIik7Ci0JCQkJfQotCQkJCXdyaXRlci53cml0ZSgic3VwZXIucnVuVGVzdCgpOyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0JCQkKLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwkJCi0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDbGFzc0Nsb3N1cmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKCJ9Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIERpZmZDbGFzcyB7Ci0JCS8qIHRoZSBuZXdDbGFzcyBoYXMgYmVlbiBhZGRlZCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVcgPSAxOwotCQkvKiB0aGUgb2xkQ2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMjsKLQkJLyogdGhlIHJlbW92ZWRNZXRob2RzIGZyb20gb2xkQ2xhc3MgaGF2ZSBiZWVuIHJlbW92ZWQgKGlmIGFueSkKLQkJICogdGhlIG5ld01ldGhvZHMgZnJvbSBuZXdDbGFzcyBoYXZlIGJlZW4gYWRkZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVEID0gMzsKLQkJCi0JCWludCB0eXBlOwotCQlDbGFzcyBvbGRDbGFzczsKLQkJQ2xhc3MgbmV3Q2xhc3M7Ci0JCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzOwotCQlNZXRob2RbXSBuZXdNZXRob2RzOwotCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnM7Ci0JCUNvbnN0cnVjdG9yW10gbmV3Q29uc3RydWN0b3JzOwotCi0JCXB1YmxpYyBEaWZmQ2xhc3MoaW50IHR5cGUsIAotCQkJQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzLCAKLQkJCU1ldGhvZFtdIHJlbW92ZWRNZXRob2RzLCBNZXRob2RbXSBuZXdNZXRob2RzLAotCQkJQ29uc3RydWN0b3JbXSByZW1vdmVkQ29uc3RydWN0b3JzLCBDb25zdHJ1Y3RvcltdIG5ld0NvbnN0cnVjdG9ycykgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMub2xkQ2xhc3MgPSBvbGRDbGFzczsKLQkJCXRoaXMubmV3Q2xhc3MgPSBuZXdDbGFzczsKLQkJCXRoaXMucmVtb3ZlZE1ldGhvZHMgPSByZW1vdmVkTWV0aG9kczsKLQkJCXRoaXMubmV3TWV0aG9kcyA9IG5ld01ldGhvZHM7Ci0JCQl0aGlzLnJlbW92ZWRDb25zdHJ1Y3RvcnMgPSByZW1vdmVkQ29uc3RydWN0b3JzOwotCQkJdGhpcy5uZXdDb25zdHJ1Y3RvcnMgPSBuZXdDb25zdHJ1Y3RvcnM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIE5FVzogewotCQkJCQlyZXR1cm4gIk5FVzogIiArIGdldENsYXNzTmFtZShuZXdDbGFzcyk7Ci0JCQkJfQotCQkJCWNhc2UgUkVNT1ZFRDogewotCQkJCQlyZXR1cm4gIlJFTU9WRUQ6ICIgKyBnZXRDbGFzc05hbWUob2xkQ2xhc3MpOwotCQkJCX0KLQkJCQljYXNlIE1PRElGSUVEOiB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTU9ESUZJRUQ6ICIgKyBnZXRDbGFzc05hbWUob2xkQ2xhc3MpOwotCQkJCQlpZiAocmVtb3ZlZENvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyByZW1vdmVkQ29uc3RydWN0b3JzLmxlbmd0aCArICIgY29uc3RydWN0b3IocykgcmVtb3ZlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRDb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKHJlbW92ZWRDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld0NvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBuZXdDb25zdHJ1Y3RvcnMubGVuZ3RoICsgIiBjb25zdHJ1Y3RvcihzKSBhZGRlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUobmV3Q29uc3RydWN0b3JzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVtb3ZlZE1ldGhvZHMgIT0gbnVsbCkgewotCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoICsgIiBtZXRob2QocykgcmVtb3ZlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShyZW1vdmVkTWV0aG9kc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3TWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBuZXdNZXRob2RzLmxlbmd0aCArICIgbWV0aG9kKHMpIGFkZGVkIjsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3TWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUobmV3TWV0aG9kc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN0cmluZzsKLQkJCQl9Ci0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gImludmFsaWQgRGlmZkNsYXNzICIrdHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIFN3dERpZmYgewotCQlDbGFzc1tdIG9sZENsYXNzZXMsIG5ld0NsYXNzZXM7Ci0JCS8qIHJlbW92ZWRbaV0gdHJ1ZSBtZWFucyBvbGRDbGFzc2VzW2ldIGhhcyBiZWVuIHJlbW92ZWQgKi8KLQkJYm9vbGVhbltdIHJlbW92ZWQ7Ci0JCS8qIGFkZGVkW2ldIHRydWUgbWVhbnMgbmV3Q2xhc3Nlc1tpXSBoYXMgYmVlbiBhZGRlZCAqLwotCQlib29sZWFuW10gYWRkZWQ7Ci0JCS8qIG9sZDJOZXdbaV0gPT0gaiA+PSAwIG1lYW5zIG9sZENsYXNzZXNbaV0gY29ycmVzcG9uZHMgdG8gbmV3Q2xhc3Nlc1tqXSAqLwotCQlpbnRbXSBvbGQyTmV3OwotCQlpbnRbXSBuZXcyT2xkOwotCQlWZWN0b3IgZGlmZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCQotCQlwdWJsaWMgU3d0RGlmZihWZWN0b3Igb2xkQ2xhc3NlcywgVmVjdG9yIG5ld0NsYXNzZXMpIHsKLQkJCUVudW1lcmF0aW9uIG9sZENsYXNzZXNFbnVtID0gb2xkQ2xhc3Nlcy5lbGVtZW50cygpOwotCQkJdGhpcy5vbGRDbGFzc2VzID0gbmV3IENsYXNzW29sZENsYXNzZXMuc2l6ZSgpXTsKLQkJCWludCBjbnQgPSAwOwotCQkJd2hpbGUgKG9sZENsYXNzZXNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJdGhpcy5vbGRDbGFzc2VzW2NudCsrXSA9IChDbGFzcylvbGRDbGFzc2VzRW51bS5uZXh0RWxlbWVudCgpOwotCQkJfQotCi0JCQlFbnVtZXJhdGlvbiBuZXdDbGFzc2VzRW51bSA9IG5ld0NsYXNzZXMuZWxlbWVudHMoKTsKLQkJCXRoaXMubmV3Q2xhc3NlcyA9IG5ldyBDbGFzc1tuZXdDbGFzc2VzLnNpemUoKV07Ci0JCQljbnQgPSAwOwotCQkJd2hpbGUgKG5ld0NsYXNzZXNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJdGhpcy5uZXdDbGFzc2VzW2NudCsrXSA9IChDbGFzcyluZXdDbGFzc2VzRW51bS5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJb2xkMk5ldyA9IG5ldyBpbnRbdGhpcy5vbGRDbGFzc2VzLmxlbmd0aF07Ci0JCQluZXcyT2xkID0gbmV3IGludFt0aGlzLm5ld0NsYXNzZXMubGVuZ3RoXTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29tcHV0ZSgpIHsKLQkJCWNvbXBhcmVDbGFzc2VzKCk7Ci0JCQljcmVhdGVDbGFzc0RpZmYoKTsKLQkJCW91dHB1dENsYXNzRGlmZigpOwkJCi0JCX0KLQotCQl2b2lkIGNvbXBhcmVDbGFzc2VzKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2xkMk5ld1tpXSA9IC0xOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAob2xkQ2xhc3Nlc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5ld0NsYXNzZXNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQkJb2xkMk5ld1tpXSA9IGo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCW5ldzJPbGRbaV0gPSAtMTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZENsYXNzZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5ld0NsYXNzZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhvbGRDbGFzc2VzW2pdLmdldE5hbWUoKSkpIHsKLQkJCQkJCW5ldzJPbGRbaV0gPSBqOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl2b2lkIGNyZWF0ZUNsYXNzRGlmZigpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkMk5ldy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvbGQyTmV3W2ldIDwgMCkgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQgKi8KLQkJCQkJRGlmZkNsYXNzIGRpZmYgPSBuZXcgRGlmZkNsYXNzKAotCQkJCQkJRGlmZkNsYXNzLlJFTU9WRUQsCi0JCQkJCQlvbGRDbGFzc2VzW2ldLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCQlkaWZmcy5hZGQoZGlmZik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRm91bmQgYSBjbGFzcyB3aGljaCBpcyBlaXRoZXIgaWRlbnRpY2FsIG9yIHdoaWNoIGNvbnRhaW5zCi0JCQkJCSAqIG1vZGlmaWVkIG1ldGhvZHMKLQkJCQkJICovCi0JCQkJCUNsYXNzIG9sZENsYXNzID0gb2xkQ2xhc3Nlc1tpXTsKLQkJCQkJQ2xhc3MgbmV3Q2xhc3MgPSBuZXdDbGFzc2VzW29sZDJOZXdbaV1dOwotCQkJCQlNZXRob2RbXSByZW1vdmVkTWV0aG9kcyA9IGdldFJlbW92ZWRNZXRob2RzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCU1ldGhvZFtdIGFkZGVkTWV0aG9kcyA9IGdldEFkZGVkTWV0aG9kcyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlDb25zdHJ1Y3RvcltdIHJlbW92ZWRDb25zdHJ1Y3RvcnMgPSBnZXRSZW1vdmVkQ29uc3RydWN0b3JzKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCQkJCUNvbnN0cnVjdG9yW10gYWRkZWRDb25zdHJ1Y3RvcnMgPSBnZXRBZGRlZENvbnN0cnVjdG9ycyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlpZiAocmVtb3ZlZE1ldGhvZHMgIT0gbnVsbCB8fCBhZGRlZE1ldGhvZHMgIT0gbnVsbCB8fCAKLQkJCQkJCXJlbW92ZWRDb25zdHJ1Y3RvcnMgIT0gbnVsbCB8fCBhZGRlZENvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0JCQkJCQlEaWZmQ2xhc3MgZGlmZiA9IG5ldyBEaWZmQ2xhc3MoCi0JCQkJCSAJCURpZmZDbGFzcy5NT0RJRklFRCwKLQkJCQkJIAkJb2xkQ2xhc3MsCi0JCQkJCSAJCW5ld0NsYXNzLAotCQkJCQkgCQlyZW1vdmVkTWV0aG9kcywKLQkJCQkJIAkJYWRkZWRNZXRob2RzLAotCQkJCQkgCQlyZW1vdmVkQ29uc3RydWN0b3JzLAotCQkJCQkgCQlhZGRlZENvbnN0cnVjdG9ycwotCQkJCQkgCSk7Ci0JCQkJCSAJZGlmZnMuYWRkKGRpZmYpOwotCQkJCQkgfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Mk9sZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZXcyT2xkW2ldIDwgMCkgewotCQkJCQkvKiBGb3VuZCBhIGNsYXNzIHdoaWNoIGhhcyBiZWVuIGFkZGVkICovCi0JCQkJCURpZmZDbGFzcyBkaWZmID0gbmV3IERpZmZDbGFzcygKLQkJCQkJCURpZmZDbGFzcy5ORVcsCi0JCQkJCQludWxsLAotCQkJCQkJbmV3Q2xhc3Nlc1tpXSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwKLQkJCQkJKTsKLQkJCQkJZGlmZnMuYWRkKGRpZmYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZFtdIGdldFJlbW92ZWRNZXRob2RzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJTWV0aG9kW10gb2xkTWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhvbGRDbGFzcyk7Ci0JCQlNZXRob2RbXSBuZXdNZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKG5ld0NsYXNzKTsKLQkJCQotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBvbGROYW1lID0gZ2V0TWV0aG9kTmFtZShvbGRNZXRob2RzW2ldKTsKLQkJCQlib29sZWFuIHJlbW92ZWQgPSB0cnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3TWV0aG9kcy5sZW5ndGg7IGorKykgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE1ldGhvZE5hbWUobmV3TWV0aG9kc1tqXSk7Ci0JCQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlbW92ZWQpIG9sZE1ldGhvZHNbY291bnQrK10gPSBvbGRNZXRob2RzW2ldOwotCQkJfQotCQkJaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsOwotCQkJTWV0aG9kW10gcmVzdWx0ID0gbmV3IE1ldGhvZFtjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZE1ldGhvZHMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJTWV0aG9kW10gZ2V0QWRkZWRNZXRob2RzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJcmV0dXJuIGdldFJlbW92ZWRNZXRob2RzKG5ld0NsYXNzLCBvbGRDbGFzcyk7Ci0JCX0KLQkJCi0JCUNvbnN0cnVjdG9yW10gZ2V0UmVtb3ZlZENvbnN0cnVjdG9ycyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCUNvbnN0cnVjdG9yW10gb2xkQ29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMob2xkQ2xhc3MpOwotCQkJQ29uc3RydWN0b3JbXSBuZXdDb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhuZXdDbGFzcyk7Ci0JCQkKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZENvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBvbGROYW1lID0gZ2V0TWV0aG9kTmFtZShvbGRDb25zdHJ1Y3RvcnNbaV0pOwotCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuZXdDb25zdHJ1Y3RvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBnZXRNZXRob2ROYW1lKG5ld0NvbnN0cnVjdG9yc1tqXSk7Ci0JCQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlbW92ZWQpIG9sZENvbnN0cnVjdG9yc1tjb3VudCsrXSA9IG9sZENvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJCWlmIChjb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCUNvbnN0cnVjdG9yW10gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29uc3RydWN0b3JzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUNvbnN0cnVjdG9yW10gZ2V0QWRkZWRDb25zdHJ1Y3RvcnMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlyZXR1cm4gZ2V0UmVtb3ZlZENvbnN0cnVjdG9ycyhuZXdDbGFzcywgb2xkQ2xhc3MpOwotCQl9Ci0JCQotCQl2b2lkIG91dHB1dENsYXNzRGlmZigpIHsKLQkJCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gZGlmZnMuZWxlbWVudHMoKTsKLQkJCWludCBjaGFuZ2VzID0gMDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCURpZmZDbGFzcyBkaWZmID0gKERpZmZDbGFzcyllbGVtZW50cy5uZXh0RWxlbWVudCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiWyIrY2hhbmdlcysiXSAiKyBkaWZmKTsKLQkJCQljaGFuZ2VzKys7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAxM2FlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgU1dUIHBlcmZvcm1hbmNlIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgUGVyZm9ybWFuY2VUZXN0cygpOwotfQotCi1wdWJsaWMgUGVyZm9ybWFuY2VUZXN0cygpIHsKLQlzdXBlcigpOwotCWFkZFRlc3QoVGVzdF9zaXR1YXRpb25hbC5zdWl0ZSgpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjBlNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9Td3RQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBTd3RQZXJmb3JtYW5jZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCS8vIHVzZWQgdG8gc3BlY2lmeSB2ZXJib3NlIG1vZGUsIGlmIHRydWUgdW5pbXBsZW1lbnRlZCB3YXJuaW5nIG1lc3NhZ2VzIHdpbGwgCi0JLy8gYmUgd3JpdHRlbiB0byBTeXN0ZW0ub3V0Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0dUSyA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiZ3RrIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoIndpbjMyIik7Ci0JCi0JLy8gYWxsb3cgc3BlY2lmaWMgaW1hZ2UgZm9ybWF0cyB0byBiZSB0ZXN0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRm9ybWF0cyA9IG5ldyBTdHJpbmdbXSB7ImJtcCIsICJqcGciLCAiZ2lmIiwgInBuZyJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJmb2xkZXIiLCAiZm9sZGVyT3BlbiIsICJ0YXJnZXQifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zcGFyZW50SW1hZ2VGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10geyJ0cmFuc3BhcmVudC5wbmcifTsKLQotCQotcHVibGljIFN3dFBlcmZvcm1hbmNlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHJvdGVjdGVkIFBlcmZvcm1hbmNlTWV0ZXIgY3JlYXRlTWV0ZXIoU3RyaW5nIGlkKSB7Ci0JUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JU3RyaW5nIHNjZW5hcmlvSWQgPSAib3JnLmVjbGlwc2Uuc3d0LnRlc3QuIiArIGlkOwotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHNjZW5hcmlvSWQpOwotCXBlcmZvcm1hbmNlLnRhZ0FzU3VtbWFyeShtZXRlciwgaWQsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCXJldHVybiBtZXRlcjsKLX0KLQotcHJvdGVjdGVkIFBlcmZvcm1hbmNlTWV0ZXIgY3JlYXRlTWV0ZXJXaXRob3V0U3VtbWFyeShTdHJpbmcgaWQpIHsKLQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQlTdHJpbmcgc2NlbmFyaW9JZCA9ICJvcmcuZWNsaXBzZS5zd3QudGVzdC4iICsgaWQ7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIoc2NlbmFyaW9JZCk7Ci0JcmV0dXJuIG1ldGVyOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwb3NlTWV0ZXIoUGVyZm9ybWFuY2VNZXRlciBtZXRlcikgewotCXRyeSB7Ci0JCW1ldGVyLmNvbW1pdCgpOwotCQlQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCkuYXNzZXJ0UGVyZm9ybWFuY2UobWV0ZXIpOwotCX0gZmluYWxseSB7Ci0JCW1ldGVyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQlTdHJpbmcgdXJsUGF0aDsKLQkKLQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQl9Ci0JaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgewotCQlVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlmYWlsKCJVUkwgPT0gbnVsbCBmb3IgZmlsZSAiICsgZmlsZU5hbWUpOwotCQl9Ci0JCXVybFBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCX0gZWxzZSB7Ci0JCXVybFBhdGggPSBwbHVnaW5QYXRoICsgIi9kYXRhLyIgKyBmaWxlTmFtZTsKLQl9Ci0JCi0JaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwkKLQlpZiAoaXNXaW5kb3dzICYmIHVybFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IDApIHVybFBhdGggPSB1cmxQYXRoLnN1YnN0cmluZygxKTsKLQl1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlQWxsKCIlMjAiLCAiICIpOwkKLQkKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc29sdmVkIGZpbGUgbmFtZSBmb3IgIiArIGZpbGVOYW1lICsgIiA9ICIgKyB1cmxQYXRoKTsKLQl9Ci0JcmV0dXJuIHVybFBhdGg7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGlzSjJNRSgpIHsKLQl0cnkgewotCQlDb21wYXRpYmlsaXR5Lm5ld0ZpbGVJbnB1dFN0cmVhbSgiIik7Ci0JfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvVGVzdF9zaXR1YXRpb25hbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2Y4ZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9UZXN0X3NpdHVhdGlvbmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci0KLS8qKgotICogQXV0b21hdGVkIFBlcmZvcm1hbmNlIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X3NpdHVhdGlvbmFsIGV4dGVuZHMgU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X3NpdHVhdGlvbmFsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotCi0vKioKLSAqIFNpdHVhdGlvbnM6Ci0gKiAKLSAqIC0gV2lkZ2V0IGNyZWF0aW9uCi0gKiAtIHN5bmNFeGVjL2FzeW5jRXhlYyBwZXJmb3JtYW5jZQotICogLSBJbWFnZSBjcmVhdGlvbgotICogLSBEcmF3aW5nIG9wZXJhdGlvbnMKLSAqIC0gU3RyaW5nIG1lYXN1cmluZwotICogLSBTdHJpbmcgZHJhd2luZwotICogLSBSZWdpb24gb3BlcmF0aW9ucwotICogLSBGb250cwotICogLSBJbWFnZSBsb2FkaW5nCi0gKiAtIExheW91dHMKLSAqLwotcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb21wb3NpdGVzKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiQ3JlYXRlIGNvbXBvc2l0ZXMiKTsKLQlpbnQgc2FtcGxlczsKLQotICAgIFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkKLQkvLyBXYXJtIHVwLgotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDI7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCQluZXcgQ29tcG9zaXRlKGMsIFNXVC5OT05FKTsKLQkJCX0KLQkJfQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9Ci0KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDA7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDUwOyBqKyspIHsKLQkJCQluZXcgQ29tcG9zaXRlKGMsIFNXVC5OT05FKTsKLQkJCX0KLQkJfQotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXaWRnZXRzKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiQ3JlYXRlIGNvbXBvc2l0ZXMgYW5kIHdpZGdldHMiKTsKLQlpbnQgc2FtcGxlczsKLQotICAgIFBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIHBlcmZvcm1hbmNlLnRhZ0FzR2xvYmFsU3VtbWFyeShtZXRlciwgIkNyZWF0ZSBjb21wb3NpdGVzIGFuZCB3aWRnZXRzIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgewotCQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLQkJCQluZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQkJCQluZXcgTGFiZWwoYywgU1dULk5PTkUpOwotCQkJCW5ldyBTY2FsZShjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFByb2dyZXNzQmFyKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgTGlzdChjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFRleHQoYywgU1dULlNJTkdMRSk7Ci0JCQkJbmV3IFRleHQoYywgU1dULk1VTFRJKTsKLQkJCQluZXcgU2xpZGVyKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgVHJlZShjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFRhYmxlKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgVGFiRm9sZGVyKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgR3JvdXAoYywgU1dULkJPUkRFUik7CQkJCQotCQkJCW5ldyBDb21wb3NpdGUoYywgU1dULk5PTkUpOwotCQkJfQotCQl9Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dCgpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkxheW91dCBDb21wb3NpdGVzIik7Ci0JaW50IHNhbXBsZXM7Ci0KLQlpZiAoaXNXaW5kb3dzKSB7Ci0JCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlwZXJmb3JtYW5jZS5zZXRDb21tZW50KAotCQkJbWV0ZXIsCi0JCQlQZXJmb3JtYW5jZS5FWFBMQUlOU19ERUdSQURBVElPTl9DT01NRU5ULAotCQkJIkRlZ3JhZGF0aW9uIGlzIGEgcmVzdWx0IG9mIGZpeGluZyBidWcgMTg2MDcsIHdoaWNoIGVuYWJsZXMgY29ycmVjdCBYUC10aGVtZWQgYm9yZGVyIGRyYXdpbmcuICIgKwotCQkJIlRoZSByZXBvcnQgZm9yIHRoaXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gaXMgYnVnIDE0NDMxNC4iKTsKLQl9Ci0KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCVN0cmluZyBjdXJUZXh0ID0gIiI7Ci0JCUxhYmVsIGNoYW5nZWRMYWJlbDsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IHNoZWxsOwotCQlHcmlkRGF0YSBkYXRhOwotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJYy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCQotCQkJQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gZGF0YS5oZWlnaHRIaW50ID0gMjsKLQkJCWMxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLndpZHRoSGludCA9IGRhdGEuaGVpZ2h0SGludCA9IDI7Ci0JCQljMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlDb21wb3NpdGUgYzMgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSBkYXRhLmhlaWdodEhpbnQgPSAyOwotCQkJYzMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQ29tcG9zaXRlIGM0ID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWM0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljNC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlwYXJlbnQgPSBjNDsKLQkJfQotCQljaGFuZ2VkTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQljaGFuZ2VkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQl0cnkgeyBUaHJlYWQuc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCWZvcihpbnQgbnVtbGF5b3V0cyA9IDA7IG51bWxheW91dHMgPCAyMDsgbnVtbGF5b3V0cysrKSB7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCQljdXJUZXh0ID0gIiEhISIgKyBjdXJUZXh0ICsgIiEhIVxuISI7Ci0JCQljaGFuZ2VkTGFiZWwuc2V0VGV4dChjdXJUZXh0KTsKLQkJCS8vd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSk7Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW1hZ2VEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiRHJhdyBvbiBhbiBpbWFnZSIpOwotCWludCBzYW1wbGVzOwotCQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCQlnYy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgxLCB5MSwgMjAwLCAyMDApOwotCQkJZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHgyLCB5MiwgMjAwLCAyMDAsIDUwLCA1MCk7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JCQlnYy5kcmF3TGluZSh4MiwgeTEsIHgxLCB5Mik7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW5kb3dEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcigiRHJhdyBvbiBhIHdpbmRvdyIpOwotCWludCBzYW1wbGVzOwotCQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgNjAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCQlnYy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgxLCB5MSwgMjAwLCAyMDApOwotCQkJZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHgyLCB5MiwgMjAwLCAyMDAsIDUwLCA1MCk7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JCQlnYy5kcmF3TGluZSh4MiwgeTEsIHgxLCB5Mik7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdHJpbmdEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KCJEcmF3IHN0cmluZ3MgdXNpbmcgR0MuZHJhd1RleHQiKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMjAsIFNXVC5OT05FKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAxMCwgU1dULkJPTEQpOwotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgXHRiciZvd24gU1dUIGp1bSZwZWQgZm94aWx5IG9cbnZlciB0aGUgbGF6eSBkb2cuIjsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgNDAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldEZvbnQoKGkgJiAxKSA9PSAwID8gZm9udDEgOiBmb250Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy50ZXh0RXh0ZW50KHRlc3RTdHJpbmcpOwotCQkJZ2MuZHJhd1RleHQodGVzdFN0cmluZywgeDIsIHkxKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MS8yLCBTV1QuRFJBV19NTkVNT05JQyB8IFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MiwgdHJ1ZSk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmFzdFN0cmluZ0RyYXdpbmcoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyV2l0aG91dFN1bW1hcnkoIkRyYXcgc3RyaW5ncyB1c2luZyBHQy5kcmF3U3RyaW5nKCkiKTsKLQlpbnQgc2FtcGxlczsKLQotCWZvcihzYW1wbGVzID0gMDsgc2FtcGxlcyA8IDEwOyBzYW1wbGVzKyspIHsKLQkJaW50IHdpZHRoID0gNjQwOwotCQlpbnQgaGVpZ2h0ID0gNDgwOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDYW52YXMgYyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhmZiwgMCwgMHhmZik7Ci0JCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAweGZmKTsKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAyMCwgU1dULk5PTkUpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDEwLCBTV1QuQk9MRCk7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBTV1QganVtcGVkIGZveGlseSBvdmVyIHRoZSBsYXp5IGRvZy4iOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoYyk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKLQkJCXgxID0gKHgxICsgNSkgJSB3aWR0aDsgeTEgPSAoeTEgKyA1KSAlIGhlaWdodDsgeDIgPSAoeDIgKyA1KSAlIHdpZHRoOyB5MiA9ICh5MiArIDUpICUgaGVpZ2h0OwotCQkJZ2Muc2V0Rm9udCgoaSAmIDEpID09IDAgPyBmb250MSA6IGZvbnQyKTsKLQkJCWdjLnNldEZvcmVncm91bmQoKGkgJiAxKSA9PSAwID8gY29sb3IxIDogY29sb3IyKTsKLQkJCWdjLnN0cmluZ0V4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgeDEsIHkyKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgeDEsIHkxLCB0cnVlKTsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQljb2xvcjEuZGlzcG9zZSgpOwotCQljb2xvcjIuZGlzcG9zZSgpOwotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9zaXR1YXRpb25hbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVDb21wb3NpdGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jcmVhdGVXaWRnZXRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbWFnZURyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbmRvd0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0cmluZ0RyYXdpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY3JlYXRlQ29tcG9zaXRlcyIpKSB0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NyZWF0ZVdpZGdldHMiKSkgdGVzdF9jcmVhdGVXaWRnZXRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXQiKSkgdGVzdF9sYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ltYWdlRHJhd2luZyIpKSB0ZXN0X2ltYWdlRHJhd2luZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luZG93RHJhd2luZyIpKSB0ZXN0X3dpbmRvd0RyYXdpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0cmluZ0RyYXdpbmciKSkgdGVzdF9zdHJpbmdEcmF3aW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mYXN0U3RyaW5nRHJhd2luZyIpKSB0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGI1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkN2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjVmMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90cmFuc3BhcmVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGU5OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2Uuc3d0dGVzdHMuamFyPUpVbml0IFRlc3RzLwotCi1iaW4uaW5jbHVkZXM9Ki5qYXIscGx1Z2luLnhtbCx0ZXN0LnhtbCxhYm91dC5odG1sLHBsdWdpbi5wcm9wZXJ0aWVzLGRhdGEvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjMuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2EwYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGh0bWw+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+d2luZG93Lm9wZW4oImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIsICJEaWFsb2ciKTwvc2NyaXB0PgotPGJvZHk+Ci1UaGlzIHRlc3QgdXNlcyBqYXZhc2NyaXB0IHRvIG9wZW4gYSBuZXcgd2luZG93LgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTRiZjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxodG1sPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCXcgPSB3aW5kb3cub3BlbigiYnJvd3NlcjRhLmh0bWwiLCAiRGlhbG9nIik7Ci0Jc2V0VGltZW91dCgidy5jbG9zZSgpIiwgNTAwMCk7Ci08L3NjcmlwdD4KLTxib2R5PgotPHA+VGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdC4KLTxwPkl0IG9wZW5zIGEgbmV3IHdpbmRvdy4gU2V0cyBhIHRpbWVyLiBUaGVuIGNsb3NlIHRoZSBuZXcgd2luZG93IHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNGEuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0YS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM1ODU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0YS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiCi0gY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICA8dGl0bGU+c2ltcGxlIHBhZ2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDIwNCwgMCk7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IgotIGxpbms9IiMwMDAwZWUiIGFsaW5rPSIjMDAwMGVlIiB2bGluaz0iIzU1MWE4YiI+Ci08ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YmlnPjxiaWc+PGJpZz48YmlnPjxiaWc+PGJpZz48c3BhbgotIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlRoaXMgaXMgYSBzaW1wbGUgcGFnZTwvc3Bhbj48L2JpZz48L2JpZz48L2JpZz48L2JpZz48L2JpZz48L2JpZz48YnI+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI1Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzViZmNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQl2YXIgd2luOwotCWZ1bmN0aW9uIHRlc3RPcGVuKCkgewotCQl3aW4gPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93PC9oMj4iJywgIiIsICJsZWZ0PTEwLHRvcD0yMDAsaGVpZ2h0PTEwMCx3aWR0aD0zMDAiKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdFJlc2l6ZVRvKCkgewotCQl3aW4ucmVzaXplVG8oNjAwLDgwMCk7Ci0JfQotCWZ1bmN0aW9uIHRlc3RNb3ZlVG8oKSB7Ci0JCXdpbi5tb3ZlVG8oMjAwLDEwMCk7Ci0JfQotCWZ1bmN0aW9uIHRlc3RNb3ZlQnkoKSB7Ci0JCXdpbi5tb3ZlQnkoMiwyKTsKLQl9Ci0JZnVuY3Rpb24gdGVzdFNjcm9sbEJ5KCkgewotCQl3aW4uc2Nyb2xsQnkoMSwyMCk7Ci0JfQotCWZ1bmN0aW9uIHRlc3RSZXNpemVCeSgpIHsKLQkJd2luLnJlc2l6ZUJ5KDIsMyk7Ci0JfQotCWZ1bmN0aW9uIHRlc3RDbG9zZSgpIHsKLQkJd2luLmNsb3NlKCk7Ci0JfQotCi0Jd2luMSA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3cgMTwvaDI+PHA+Ym91bmRzOiBsZWZ0PTEwLHRvcD0yMDAsaGVpZ2h0PTEwMCx3aWR0aD0zMDA8cD4iJywgIiIsICJsZWZ0PTEwLHRvcD0yMDAsaGVpZ2h0PTEwMCx3aWR0aD0zMDAiKTsKLQl3aW4yID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyAyPC9oMj48cD5ib3VuZHM6IGxlZnQ9MTAsdG9wPTIwMDxwPiInLCAiIiwgImxlZnQ9MTAsdG9wPTIwMCIpOwotCXdpbjMgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93IDM8L2gyPjxwPmJvdW5kczogaGVpZ2h0PTEwMCx3aWR0aD0zMDA8cD4iJywgIiIsICJoZWlnaHQ9MTAwLHdpZHRoPTMwMCIpOwotCXdpbjQgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93IDQ8L2gyPjxwPmJvdW5kczogbm90IHNwZWNpZmllZDxwPiInLCAiIiwgIiIpOwotCQotCXNldFRpbWVvdXQoIndpbjEuY2xvc2UoKTt3aW4yLmNsb3NlKCk7d2luMy5jbG9zZSgpO3dpbjQuY2xvc2UoKSIsIDUwMDApOwotCQotPC9zY3JpcHQ+Ci0KLTxmb3JtPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJ3aW5kb3cub3BlbiIgb25DbGljaz0idGVzdE9wZW4oKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9InJlc2l6ZVRvIiBvbkNsaWNrPSJ0ZXN0UmVzaXplVG8oKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9Im1vdmVUbyIgb25DbGljaz0idGVzdE1vdmVUbygpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0ibW92ZUJ5IiBvbkNsaWNrPSJ0ZXN0TW92ZUJ5KCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJzY3JvbGxCeSIgb25DbGljaz0idGVzdFNjcm9sbEJ5KCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJyZXNpemVCeSIgb25DbGljaz0idGVzdFJlc2l6ZUJ5KCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJjbG9zZSIgb25DbGljaz0idGVzdENsb3NlKCkiPgotPC9GT1JNPgotPGJvZHk+Ci08cD5UaGlzIHRlc3QgdXNlcyBqYXZhc2NyaXB0LgotPHA+SXQgb3BlbnMgYSBuZXcgd2luZG93LiBTZXRzIGEgdGltZXIuIFRoZW4gY2xvc2UgdGhlIG5ldyB3aW5kb3cgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI2Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI3NTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPgotPHRpdGxlPlRoaXMgaXMgYSB0ZXN0IHRpdGxlIHRoYXQgbXVzdCBiZSBjYXJlZnVsbHkgY2hlY2tlZCB3aGVuIHRoYXQgcGFnZSBpcyBsb2FkZWQ8L3RpdGxlPgotPGJvZHk+Ci1UaGlzIHRlc3QgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBjb250ZW50IG9mIHRoZSB0aXRsZSB0YWcuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjcuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTdkNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxodG1sPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotd2luMSA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+VEVTVCB3aW5kb3cub3BlbjwvaDI+PHA+bGVmdD0wLHRvcD0wLGhlaWdodD0xMDAsd2lkdGg9MjAwPC9wPiInLCAiIiwgImxlZnQ9MCx0b3A9MCxoZWlnaHQ9MjAwLHdpZHRoPTMwMCIpOwkKLXdpbjIgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPm1lbnViYXI9bm8sc3RhdHVzPW5vLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPW5vLGxlZnQ9MzAxLHRvcD0wLGhlaWdodD02MDAsd2lkdGg9MjAwPC9wPiInLCAiIiwgIm1lbnViYXI9bm8sc3RhdHVzPW5vLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPW5vLGxlZnQ9MzAxLHRvcD0wLGhlaWdodD02MDAsd2lkdGg9MjAwIik7CQotd2luMyA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+VEVTVCB3aW5kb3cub3BlbjwvaDI+PHA+c3RhdHVzPW5vLGxvY2F0aW9uPW5vLHRvb2xiYXI9eWVzLHJlc2l6YWJsZT15ZXMsbGVmdD0wLHRvcD0yMDEsaGVpZ2h0PTQwMCx3aWR0aD0zMDA8L3A+IicsICIiLCAic3RhdHVzPW5vLGxvY2F0aW9uPW5vLHRvb2xiYXI9eWVzLHJlc2l6YWJsZT15ZXMsbGVmdD0wLHRvcD0yMDEsaGVpZ2h0PTQwMCx3aWR0aD0zMDAiKTsJCi13aW40ID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5URVNUIHdpbmRvdy5vcGVuPC9oMj48cD5tZW51YmFyPXllcyxzdGF0dXM9eWVzLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPW5vLGxlZnQ9MCx0b3A9NjAxLGhlaWdodD0yMDAsd2lkdGg9NTAwPC9wPiInLCAiIiwgIm1lbnViYXI9eWVzLHN0YXR1cz15ZXMsbG9jYXRpb249bm8sdG9vbGJhcj1ubyxyZXNpemFibGU9bm8sbGVmdD0wLHRvcD02MDEsaGVpZ2h0PTIwMCx3aWR0aD01MDAiKTsJCi08L3NjcmlwdD4KLTxib2R5PgotPHA+VGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdC4KLTxwPkl0IG9wZW5zIGEgc2VyaWVzIG9mIHdpbmRvd3Mgd2l0aCBkaWZmZXJlbnQgYXR0cmlidXRlcy4KLTxwPlRoZSBidXR0b25zIGJlbG93IGNhbiBiZSB1c2VkIGZvciBtYW51YWxseSB0ZXN0aW5nIHZhcmlvdXMgdHlwZXMgb2YgamF2YXNjcmlwdCB3aW5kb3dzLgotPGZvcm0+Ci08aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iYnJpbmcgYWxlcnQobWVzc2FnZSkiIG9uQ2xpY2s9ImFsZXJ0KCdtZXNzYWdlJykiPgotPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IndpbmRvdy5wcmludCIgb25DbGljaz0id2luZG93LnByaW50KCkiPgotPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImNvbmZpcm0iIG9uQ2xpY2s9ImlmIChjb25maXJtKCdQcmVzcyBPayBvciBDYW5jZWwgdG8gY29uZmlybScpKSB7YWxlcnQoJ1lvdSBwcmVzc2VkIE9LJyk7fSBlbHNlIHthbGVydCgnWW91IHByZXNzZWQgQ2FuY2VsJyk7fSI+Ci08L2Zvcm0+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjkuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTA2ZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5IZWxsbyBUaXRsZTwvdGl0bGU+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiBjaGFuZ2VTdGF0dXModHh0KSB7Ci0JZG9jdW1lbnQuYmdDb2xvciA9ICJ5ZWxsb3ciOwotCXdpbmRvdy5zdGF0dXMgPSB0eHQ7Ci19Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotSGVsbG8gYm9keQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZDNhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGM4ZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5naWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HSUY4N2ESClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMTlkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLf/Y/wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODYwYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0QmFkQml0RGVwdGgucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzY2I5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0QmFkQml0RGVwdGgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZW1wdHkudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZW1wdHkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MzUxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTdjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcwMTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMmRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMTIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODg2YmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY4ODgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNmQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOGI1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkN2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90cmFuc3BhcmVudC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90cmFuc3BhcmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjVmMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBhOGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFlODhmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiPgotCi08cmVxdWlyZXM+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSIvPgotPC9yZXF1aXJlcz4KLQotPHJ1bnRpbWU+Ci0gICAgPGxpYnJhcnkgbmFtZT0ic3d0dGVzdHMuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgIDwvbGlicmFyeT4KLSAgPC9ydW50aW1lPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDJlZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgbW9yZSB0aWdodGx5IGNvdXBsZWQgd2l0aCB0aGUgLS0+Ci0gIDwhLS0gb3JnLmVjbGlwc2UudWkgcGx1Z2luLCBmb3IgdGVzdGluZy4gLS0+Ci0KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtvcmcuZWNsaXBzZS5zd3QudGVzdHN9Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIiB1bmxlc3M9InBlcmZvcm1hbmNlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iZGF0YSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9zd3Rfc25pZmZfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7bG9jYXRpb24xfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8IS0tIFJ1biBhbGwgU1dUIHRlc3RzIG9uIFdpbmRvd3MsIGFuZCBlaXRoZXIgQ2FyYm9uIHRlc3RzIG9yIEd0ayB0ZXN0cyBvdGhlcndpc2UuIC0tPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNsYXNzLXRlc3RzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LkFsbEd0a1Rlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9ImxpbnV4Ii8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2xhc3MtdGVzdHMiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuQWxsQ2FyYm9uVGVzdHMiPgotICAgICAgPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0ibWFjb3N4Ii8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2xhc3MtdGVzdHMiIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuQWxsVGVzdHMiPgotICAgICAgPGVxdWFscyBhcmcxPSIke29zfSIgYXJnMj0id2luMzIiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7ZGF0YX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0iJHtjbGFzcy10ZXN0c30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIHRlc3RzIC0tPgotICA8IS0tIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSAgVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgcGVyZm9ybWFuY2UgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+IAotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlLXN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3d0LXBlcmZvcm1hbmNlLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9zd3RfcGVyZm9ybWFuY2VfZm9sZGVyIiAvPiAKLSAgICA8ZGVsZXRlIGRpcj0iJHtzd3QtcGVyZm9ybWFuY2UtZm9sZGVyfSIgcXVpZXQ9InRydWUiIC8+IAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9InRpbWVvdXQiIHZhbHVlPSIxNDQwMDAwMCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtzd3QtcGVyZm9ybWFuY2UtZm9sZGVyfSIgLz4gCi0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIgLz4gCi0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdHMiIC8+IAotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlLXN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIiAvPiAKLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIgLz4gCi0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiBhZnRlciBhbGwgLS0+Ci0gIDwhLS0gdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4K